From ba97d197f212a10d275238e1960e63434dd7fa7b Mon Sep 17 00:00:00 2001 From: Daniel Klabbers Date: Mon, 7 Jul 2025 13:52:22 +0200 Subject: [PATCH 01/39] feat: move to hetzner managed --- .github/workflows/deploy.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 64b21f718..2a38d5c8c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,9 +1,10 @@ name: Deploy to production on: + workflow_dispatch: push: branches: - - master + - main jobs: deploy: @@ -12,11 +13,19 @@ jobs: steps: - uses: actions/checkout@master - - name: executing remote upgrade - uses: appleboy/ssh-action@v1.0.3 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.x' + - run: npm ci + - run: npm run build --if-present + + - name: copy compiled assets to remote + uses: appleboy/scp-action@v4 with: host: ${{ secrets.DEPLOY_HOST }} username: ${{ secrets.DEPLOY_USERNAME }} key: ${{ secrets.DEPLOY_SSH_KEY }} port: ${{ secrets.DEPLOY_PORT }} - script: cd /var/www/docs.flarum.org && ./deploy.sh + source: build + target: public_html/docs.flarum.org From a8e7e2e91bdd89315053ab6b8b620a2a436db5bf Mon Sep 17 00:00:00 2001 From: Daniel Klabbers Date: Mon, 7 Jul 2025 13:53:20 +0200 Subject: [PATCH 02/39] fix: wrong scp action version --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2a38d5c8c..e12e5a0f2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,7 +21,7 @@ jobs: - run: npm run build --if-present - name: copy compiled assets to remote - uses: appleboy/scp-action@v4 + uses: appleboy/scp-action@v1 with: host: ${{ secrets.DEPLOY_HOST }} username: ${{ secrets.DEPLOY_USERNAME }} From e343f0183d95cd3d9d15479be73a451969b4e418 Mon Sep 17 00:00:00 2001 From: Daniel Klabbers Date: Mon, 7 Jul 2025 13:54:52 +0200 Subject: [PATCH 03/39] fix: use install instead of ci --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e12e5a0f2..34497758d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,7 +17,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: '20.x' - - run: npm ci + - run: npm i - run: npm run build --if-present - name: copy compiled assets to remote From ba55f3f402ae459618d5d67e4eaf1ffc414f7eb3 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Mon, 24 Nov 2025 08:16:39 +0000 Subject: [PATCH 04/39] [2.x] feat: database queue (#495) * feat: database queue * chore: add screenshot of db queue settings * chore: typo * chore: env vars --- docs/admin.md | 2 +- docs/config.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/admin.md b/docs/admin.md index 4956589bc..b2a8b754a 100644 --- a/docs/admin.md +++ b/docs/admin.md @@ -11,6 +11,6 @@ The Admin Dashboard has the following sections, being: - **Permissions** - Shows the permissions for each user group, and allows you to configure global and specific scopes. - **Appearance** - Allows you to customize the forum's colors, branding and add additional CSS for customization. - **Users** - Provides you with a paginated list of all the users in the forum, and grants you the ability to edit the user or take administrative actions. -- **Advanced** - Allows you to configure advanced settings such as Maintenance Mode, Search drivers, and more. +- **Advanced** - Allows you to configure advanced settings such as Maintenance Mode, Search drivers, Queue driver, and more. Apart from the above-mentioned sections, the Admin Dashboard also allows you to manage your Extensions (including the flarum core extensions such as Tags) under the _Features_ section. Extensions which modify the forum theme, or allow you to use multiple languages are categorized under the _Themes_ and _Languages_ section respectively. diff --git a/docs/config.md b/docs/config.md index fdfa195cf..0477205c9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -32,9 +32,40 @@ Here's a quick overview of what everything means with an example file: 'api' => 'api', // /api goes to the API 'admin' => 'admin', // /admin goes to the admin ), + 'queue' => + array ( + 'driver' => 'sync', // Use the standard sync queue. Omitting this will entirely will have the same effect + ) +); +``` + +### Configuration via environment variables + +Whilst the file based method described here is suitable for most Flarum installations, scaled Flarum instances or those deployed via CI/CD will probably benefit from being configured via the environment. Here's an example of how to do this: + +```php + env('DEBUG') + ... ); ``` +This provides Flarum with the static configuration file it expects, but pulls variables from the environment at runtime. + +### Queues + +Flarum ships with support for two queue types - `sync` and `database`. Many tasks, or 'jobs' can be offloaded to a seperate process in order to improve response times and provide a better user experience. +* `sync` - default behaviour +* `database` - stores jobs in a dedicated database table, which are then processed via the [scheduler](/2.x/scheduler) in a seperate process. It is strongly advised that the scheduler is configured to run _every minute_ + +When the `database` queue is active, additional configuration options are available under `advanced settings`. + +![Database Queue Settings](https://private-user-images.githubusercontent.com/16573496/511708325-c4e8c663-b98e-45a9-a32f-d3be9a8f1aa6.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjM5NzA5NTMsIm5iZiI6MTc2Mzk3MDY1MywicGF0aCI6Ii8xNjU3MzQ5Ni81MTE3MDgzMjUtYzRlOGM2NjMtYjk4ZS00NWE5LWEzMmYtZDNiZTlhOGYxYWE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTExMjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUxMTI0VDA3NTA1M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRhNDM0ZTNlMDc4NjU5ZjBkYzVlZGZjNTNmYzExMTU4ZmVhMDhkOTA5OGM2NTRjYTYxZjNlYWI0NWNkNWI5ZGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Q8_b4O04wzKtqkaVyjukeucaR05r9oRPdNNvjODd2ME) + +##### Other queue processors + +At this point in time, use of other schedulers is supported, but configuration via `config.php` is not required. Example [FoF Horizon](https://FriendsOfFlarum/horizon) or [Redis Queues](https://FriendsOfFlarum/redis). + ### Maintenance modes Flarum has a maintenance mode that can be enabled by setting the `offline` key in the `config.php` file to one of the following values: From 1038a82ad3841ffc392d0a25c7c042267444eb0a Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Mon, 24 Nov 2025 08:41:05 +0000 Subject: [PATCH 05/39] Fontawesome config (#496) --- docs/config.md | 34 ++++++++++++++++++++++++++++++++++ docs/themes.md | 4 ++++ 2 files changed, 38 insertions(+) diff --git a/docs/config.md b/docs/config.md index 0477205c9..b3935ab6d 100644 --- a/docs/config.md +++ b/docs/config.md @@ -35,6 +35,10 @@ Here's a quick overview of what everything means with an example file: 'queue' => array ( 'driver' => 'sync', // Use the standard sync queue. Omitting this will entirely will have the same effect + ), + 'fontawesome' => + array ( + 'source' => 'local', // Use the bundled FontAwesome Free v6 icons. See below for other config options ) ); ``` @@ -77,3 +81,33 @@ Flarum has a maintenance mode that can be enabled by setting the `offline` key i This can also be configured from the admin panel's advanced settings page: ![Toggle advanced page](https://user-images.githubusercontent.com/20267363/277113270-f2e9c91d-2a29-436b-827f-5c4d20e2ed54.png) + +### FontAwesome + +By default Flarum uses the bundled FontAwesome 'Free' v6 icons. These can be switched out to use either a CDN hosted icon bundle, or a custom kit. + +```php + 'https://example.com', + // ... other config + + // FontAwesome Kit (Pro features + custom icons) + 'fontawesome' => [ + 'source' => 'kit', + 'kit_url' => 'https://kit.fontawesome.com/YOUR_KIT_CODE.js', + ], + + // OR use a CDN + // 'fontawesome' => [ + // 'source' => 'cdn', + // 'cdn_url' => 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css', + // ], + + // OR keep local (default, no config needed) + // 'fontawesome' => [ + // 'source' => 'local', + // ], +]; +``` diff --git a/docs/themes.md b/docs/themes.md index ba0e46541..4b5983abb 100644 --- a/docs/themes.md +++ b/docs/themes.md @@ -12,6 +12,10 @@ The [admin dashboard](admin.md)'s Appearance page is a great first place to star - Add HTML for custom headers and footers - Add [custom LESS/CSS](#css-theming) to change how elements are displayed +## FontAwesome + +Flarum allows customization out-of-the-box to the FontAwesome icon sets used. By default we use FontAwesome 6 free icons, but this can be easily modified to use the `Pro` or even full Kits via the [advanced settings](admin.md) for configuration via the UI, or via [config.php](config.md) for code-based setups. + ## CSS Theming CSS is a style sheet language that tells browsers how to display elements of a webpage. From e210c603871991e376ba5f66f81d0626bd3c36e0 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:18:10 +0000 Subject: [PATCH 06/39] fix: incorrect example use of admin extender --- docs/extend/admin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/extend/admin.md b/docs/extend/admin.md index b7f0150f9..48be00808 100644 --- a/docs/extend/admin.md +++ b/docs/extend/admin.md @@ -41,7 +41,7 @@ Here's an example with a switch (boolean) item: import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .setting( () => ({ From 857395ae8a9b0695719bb99ef09a2fae296d4a0c Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:20:24 +0000 Subject: [PATCH 07/39] Refactor admin.md to use export default syntax --- docs/extend/admin.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/extend/admin.md b/docs/extend/admin.md index 48be00808..f6fa5e488 100644 --- a/docs/extend/admin.md +++ b/docs/extend/admin.md @@ -61,7 +61,7 @@ If you use `type: 'select'` the setting object looks a little bit different: import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .setting( () => ({ @@ -84,7 +84,7 @@ Also, note that additional items in the setting object will be used as component import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .setting( () => ({ @@ -104,7 +104,7 @@ If you want to add something to the settings like some extra text or a more comp import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .setting( () => function () { @@ -190,7 +190,7 @@ Back to our favorite rocket extension: import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .permission( () => ({ @@ -217,7 +217,7 @@ Remember these functions can all be chained like: import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .setting(...) .permission(...) @@ -255,7 +255,7 @@ import app from 'flarum/admin/app'; import StarPage from './components/StarPage'; -return [ +export default [ new Extend.Admin() .page(StarPage) ]; @@ -307,7 +307,7 @@ Here is an example of how to add an index item: import Extend from 'flarum/common/extenders'; import app from 'flarum/admin/app'; -return [ +export default [ new Extend.Admin() .generalIndexItems(() => [ { From 01db8909154e18b4b91626e4e134bde079210393 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Sun, 22 Feb 2026 10:39:10 +0000 Subject: [PATCH 08/39] chore: update db queue setup for 2.x (#499) --- docs/config.md | 15 ++++++++------- docs/queue.md | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/docs/config.md b/docs/config.md index b3935ab6d..e4dfb6472 100644 --- a/docs/config.md +++ b/docs/config.md @@ -58,17 +58,18 @@ This provides Flarum with the static configuration file it expects, but pulls va ### Queues -Flarum ships with support for two queue types - `sync` and `database`. Many tasks, or 'jobs' can be offloaded to a seperate process in order to improve response times and provide a better user experience. -* `sync` - default behaviour -* `database` - stores jobs in a dedicated database table, which are then processed via the [scheduler](/2.x/scheduler) in a seperate process. It is strongly advised that the scheduler is configured to run _every minute_ +Flarum ships with support for two queue drivers - `sync` and `database`. Many tasks, or 'jobs' can be offloaded to a separate process in order to improve response times and provide a better user experience. -When the `database` queue is active, additional configuration options are available under `advanced settings`. +The only configuration key read from `config.php` is `driver`. Omitting the `queue` block entirely is equivalent to setting `driver` to `sync`. -![Database Queue Settings](https://private-user-images.githubusercontent.com/16573496/511708325-c4e8c663-b98e-45a9-a32f-d3be9a8f1aa6.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjM5NzA5NTMsIm5iZiI6MTc2Mzk3MDY1MywicGF0aCI6Ii8xNjU3MzQ5Ni81MTE3MDgzMjUtYzRlOGM2NjMtYjk4ZS00NWE5LWEzMmYtZDNiZTlhOGYxYWE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTExMjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUxMTI0VDA3NTA1M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRhNDM0ZTNlMDc4NjU5ZjBkYzVlZGZjNTNmYzExMTU4ZmVhMDhkOTA5OGM2NTRjYTYxZjNlYWI0NWNkNWI5ZGYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Q8_b4O04wzKtqkaVyjukeucaR05r9oRPdNNvjODd2ME) +* `sync` - default behaviour; jobs run immediately inline during the request +* `database` - stores jobs in a dedicated `queue_jobs` database table, which are then processed via the [scheduler](/2.x/scheduler) in a separate process. It is strongly advised that the scheduler is configured to run _every minute_ -##### Other queue processors +When the `database` driver is active, additional tuning options (retries, memory limit, timeout, etc.) become available in the admin panel under **Admin > Advanced Settings**. -At this point in time, use of other schedulers is supported, but configuration via `config.php` is not required. Example [FoF Horizon](https://FriendsOfFlarum/horizon) or [Redis Queues](https://FriendsOfFlarum/redis). +##### Other queue drivers + +Extensions such as [FoF Redis](https://github.com/FriendsOfFlarum/redis) provide additional queue drivers. These do not require any `queue` entry in `config.php` — they are configured through their own extension settings. ### Maintenance modes diff --git a/docs/queue.md b/docs/queue.md index 6bb5ead6e..a37045d64 100644 --- a/docs/queue.md +++ b/docs/queue.md @@ -8,8 +8,18 @@ A Flarum installation that has no queue configured, will process a wide variety To resolve this increasing burden, you can run a Queue. A queue runs on your server, it does not interact with the user and their requests. A user request, however, can dispatch tasks to the queue. -## What extensions offer Queue functionality? +By default, Flarum uses the `sync` driver, which processes jobs immediately inline during the user's request — convenient, but it means the user waits for every job to complete before getting a response. -The best way currently to identify what extensions add a queue is by looking at the [Extensions directory at Flarum.org](https://flarum.org/extensions?tableSearch=queue). The simplest implementation currently is the [Database Queue](https://flarum.org/extension/blomstra/database-queue) which re-uses the [scheduler](scheduler.md). +## How do I set up a queue? -Understand that each extension requires some form of configuration before it can work, make sure to read the instructions. \ No newline at end of file +Since Flarum 2.x, the `database` queue driver is built into Flarum core — no additional extension is required. To enable it, set the `queue` driver to `database` in your `config.php`: + +```php +'queue' => [ + 'driver' => 'database', +], +``` + +The database queue re-uses the [scheduler](scheduler.md) to process jobs, so you must have the scheduler configured to run **every minute** for it to work. See the [scheduler guide](scheduler.md) for setup instructions. + +For more advanced queue solutions (e.g. Redis-backed queues), extensions such as [FoF Redis](https://github.com/FriendsOfFlarum/redis) are available. \ No newline at end of file From 5355e42d419790edd93184f89102a43147d47f0d Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:45:11 +0000 Subject: [PATCH 09/39] docs: update Laravel references from 11.x to 12.x (#502) Flarum 2.x has been upgraded to Laravel 12. Updates the 2.x upgrade guide to reflect the new version and adds notable Laravel 12 breaking changes (HasUuids v7, Schema multi-schema defaults, SVG image validation). Also updates all laravel.com/docs/11.x links to 12.x across the extension docs. Co-authored-by: Claude Sonnet 4.6 --- docs/extend/api.md | 4 ++-- docs/extend/backend-events.md | 4 ++-- docs/extend/console.md | 2 +- docs/extend/database.md | 2 +- docs/extend/filesystem.md | 4 ++-- docs/extend/i18n.md | 2 +- docs/extend/model-visibility.md | 4 ++-- docs/extend/models.md | 14 +++++++------- docs/extend/notifications.md | 2 +- docs/extend/routes.md | 4 ++-- docs/extend/service-provider.md | 6 +++--- docs/extend/settings.md | 2 +- docs/extend/start.md | 2 +- docs/extend/static-code-analysis.md | 2 +- docs/extend/testing.md | 4 ++-- docs/extend/update-2_0.md | 14 ++++++++++---- docs/extend/views.md | 6 +++--- 17 files changed, 42 insertions(+), 36 deletions(-) diff --git a/docs/extend/api.md b/docs/extend/api.md index ffcb47097..3364e50d6 100644 --- a/docs/extend/api.md +++ b/docs/extend/api.md @@ -666,7 +666,7 @@ public function fields(): array ### Validation -You can use the `rule` method to add a [Laravel validation rule](https://laravel.com/docs/11.x/validation#available-validation-rules) to an attribute. We've provided helper methods on some attributes for common validation rules. +You can use the `rule` method to add a [Laravel validation rule](https://laravel.com/docs/12.x/validation#available-validation-rules) to an attribute. We've provided helper methods on some attributes for common validation rules. ```php use Flarum\Api\Schema; @@ -821,7 +821,7 @@ Relationship linkage is the ID of the related model(s) in the API response. For ### Polymorphic Relationships -You use the `collection` method to define the resource types that a [polymorphic relationship](https://laravel.com/docs/11.x/eloquent-relationships#polymorphic-relationships) can point to. +You use the `collection` method to define the resource types that a [polymorphic relationship](https://laravel.com/docs/12.x/eloquent-relationships#polymorphic-relationships) can point to. ```php use Flarum\Api\Schema; diff --git a/docs/extend/backend-events.md b/docs/extend/backend-events.md index eac9f7120..c54332a66 100644 --- a/docs/extend/backend-events.md +++ b/docs/extend/backend-events.md @@ -1,6 +1,6 @@ # Backend Events -Often, an extension will want to react to some events occuring elsewhere in Flarum. For instance, we might want to increment a counter when a new discussion is posted, send a welcome email when a user logs in for the first time, or add tags to a discussion before saving it to the database. These events are known as **domain events**, and are broadcasted across the framework through [Laravel's event system](https://laravel.com/docs/11.x/events). +Often, an extension will want to react to some events occuring elsewhere in Flarum. For instance, we might want to increment a counter when a new discussion is posted, send a welcome email when a user logs in for the first time, or add tags to a discussion before saving it to the database. These events are known as **domain events**, and are broadcasted across the framework through [Laravel's event system](https://laravel.com/docs/12.x/events). For a full list of backend events, see our [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). Domain events classes are organized by namespace, usually `Flarum\TYPE\Event`. @@ -49,7 +49,7 @@ class PostDeletedListener } ``` -As shown above, a listener class can be used instead of a callback. This allows you to [inject dependencies](https://laravel.com/docs/11.x/container) into your listener class via constructor parameters. In this example we resolve a translator instance, but we can inject anything we want/need. +As shown above, a listener class can be used instead of a callback. This allows you to [inject dependencies](https://laravel.com/docs/12.x/container) into your listener class via constructor parameters. In this example we resolve a translator instance, but we can inject anything we want/need. You can also listen to multiple events at once via an event subscriber. This is useful for grouping common functionality; for instance, if you want to update some metadata on changes to posts: diff --git a/docs/extend/console.md b/docs/extend/console.md index 59613387a..a2007a595 100644 --- a/docs/extend/console.md +++ b/docs/extend/console.md @@ -67,4 +67,4 @@ return [ ]; ``` -In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/11.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/11.x/scheduling#scheduling-artisan-commands) for more information. +In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/11.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/12.x/scheduling#scheduling-artisan-commands) for more information. diff --git a/docs/extend/database.md b/docs/extend/database.md index abbf37300..254729677 100644 --- a/docs/extend/database.md +++ b/docs/extend/database.md @@ -1,6 +1,6 @@ # Database -Flarum supports a variety of database systems, including MySQL, MariaDB, PostgreSQL, and SQLite. Most extensions will not have to worry about the specifics of the database system, as [Laravel's query builder](https://laravel.com/docs/11.x/queries) handles the differences between them. However, you can still run into instances where you need to write certain database operations differently depending on the database system. This section aims to document some of the common pitfalls and solutions. +Flarum supports a variety of database systems, including MySQL, MariaDB, PostgreSQL, and SQLite. Most extensions will not have to worry about the specifics of the database system, as [Laravel's query builder](https://laravel.com/docs/12.x/queries) handles the differences between them. However, you can still run into instances where you need to write certain database operations differently depending on the database system. This section aims to document some of the common pitfalls and solutions. :::warning diff --git a/docs/extend/filesystem.md b/docs/extend/filesystem.md index 6a6c7a0e3..3b9f616a4 100644 --- a/docs/extend/filesystem.md +++ b/docs/extend/filesystem.md @@ -2,7 +2,7 @@ Flarum core integrates with the filesystem to store and serve assets (like compiled JS/CSS or upload logos/favicons) and avatars. -Extensions can use Flarum's provided utils for their own filesystem interaction and file storage needs. This system is based around [Laravel's filesystem tools](https://laravel.com/docs/11.x/filesystem), which are in turn based on the [Flysystem library](https://github.com/thephpleague/flysystem). +Extensions can use Flarum's provided utils for their own filesystem interaction and file storage needs. This system is based around [Laravel's filesystem tools](https://laravel.com/docs/12.x/filesystem), which are in turn based on the [Flysystem library](https://github.com/thephpleague/flysystem). ## Disks @@ -100,7 +100,7 @@ return [ Since all disks use the local filesystem by default, you'll need to provide a base path and base URL for the local filesystem. -The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/11.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. +The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/12.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. ## Storage drivers diff --git a/docs/extend/i18n.md b/docs/extend/i18n.md index cab3f7694..63a898852 100644 --- a/docs/extend/i18n.md +++ b/docs/extend/i18n.md @@ -212,7 +212,7 @@ Support for grammatical gender will be added in a future version of Flarum. Deta Translation is generally handled by Flarum's front-end client. However, you can use translations in your PHP code if you need to. -First, you'll need to get an instance of the `Flarum\Locale\Translator` class. You'll usually do this by typehinting this class in the constructor of your class so a translator instance is injected by the [IoC Container](https://laravel.com/docs/11.x/container). If dependency injection is not available, you can use `resolve(Translator::class)`. Don't forget a `use Flarum\Locale\Translator;` statement at the top of your PHP file! +First, you'll need to get an instance of the `Flarum\Locale\Translator` class. You'll usually do this by typehinting this class in the constructor of your class so a translator instance is injected by the [IoC Container](https://laravel.com/docs/12.x/container). If dependency injection is not available, you can use `resolve(Translator::class)`. Don't forget a `use Flarum\Locale\Translator;` statement at the top of your PHP file! Then, the API is similar to the JavaScript Translator class. You can use `$translator->trans` like you'd use `app.translator.trans` in JavaScript. You can learn more about the Translator's methods in [Symfony's `Translator` documentation](https://symfony.com/doc/5.2/translation/message_format.html), which Flarum's `Translator` extends. diff --git a/docs/extend/model-visibility.md b/docs/extend/model-visibility.md index e5fb6c08e..181626ea8 100644 --- a/docs/extend/model-visibility.md +++ b/docs/extend/model-visibility.md @@ -3,7 +3,7 @@ This article concerns authorization, and uses some concepts from the [authorization](authorization.md) system. You should familiarize yourself with that first. When a user visits the **All Discussions** page, we want to quickly show them the recent discussions that the user has access to. -We do this via the `whereVisibleTo` method, which is defined in `Flarum\Database\ScopeVisibilityTrait`, and available to [Eloquent models and queries](https://laravel.com/docs/11.x/queries) through [Eloquent scoping](https://laravel.com/docs/11.x/eloquent#local-scopes). +We do this via the `whereVisibleTo` method, which is defined in `Flarum\Database\ScopeVisibilityTrait`, and available to [Eloquent models and queries](https://laravel.com/docs/12.x/queries) through [Eloquent scoping](https://laravel.com/docs/12.x/eloquent#local-scopes). For example: ```php @@ -41,7 +41,7 @@ This call is handled by Flarum's general model visibility scoping system, which The query will be run through all applicable scopers registered for the model of the query. Note that visibility scopers registered for a parent class (like `Flarum\Post\Post`) will also be applied to any child classes (like `Flarum\Post\CommentPost`). -Scopers don't need to return anything, but rather should perform in-place mutations on the [Eloquent query object](https://laravel.com/docs/11.x/queries). +Scopers don't need to return anything, but rather should perform in-place mutations on the [Eloquent query object](https://laravel.com/docs/12.x/queries). ## Custom Scopers diff --git a/docs/extend/models.md b/docs/extend/models.md index 76851cf22..93851bc21 100644 --- a/docs/extend/models.md +++ b/docs/extend/models.md @@ -32,7 +32,7 @@ Migrations live inside a folder suitably named `migrations` in your extension's ### Migration Structure -In Flarum, migration files should **return an array** with two functions: `up` and `down`. The `up` function is used to add new tables, columns, or indexes to your database, while the `down` function should reverse these operations. These functions receive an instance of the [Laravel schema builder](https://laravel.com/docs/11.x/migrations#creating-tables) which you can use to alter the database schema: +In Flarum, migration files should **return an array** with two functions: `up` and `down`. The `up` function is used to add new tables, columns, or indexes to your database, while the `down` function should reverse these operations. These functions receive an instance of the [Laravel schema builder](https://laravel.com/docs/12.x/migrations#creating-tables) which you can use to alter the database schema: ```php -If you need to define any attribute [casts](https://laravel.com/docs/11.x/eloquent-mutators#attribute-casting), or [default values](https://laravel.com/docs/11.x/eloquent#default-attribute-values) on an existing model, you can use the `Model` extender: +If you need to define any attribute [casts](https://laravel.com/docs/12.x/eloquent-mutators#attribute-casting), or [default values](https://laravel.com/docs/12.x/eloquent#default-attribute-values) on an existing model, you can use the `Model` extender: ```php use Flarum\Extend; @@ -178,7 +178,7 @@ return [ ### Relationships -You can also add [relationships](https://laravel.com/docs/11.x/eloquent-relationships) to existing models using the `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`and `relationship` methods on the `Model` extender. The first argument is the relationship name; the rest of the arguments are passed into the equivalent method on the model, so you can specify the related model name and optionally override table and key names: +You can also add [relationships](https://laravel.com/docs/12.x/eloquent-relationships) to existing models using the `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`and `relationship` methods on the `Model` extender. The first argument is the relationship name; the rest of the arguments are passed into the equivalent method on the model, so you can specify the related model name and optionally override table and key names: ```php new Extend\Model(User::class) diff --git a/docs/extend/notifications.md b/docs/extend/notifications.md index a0060b715..bb9626021 100644 --- a/docs/extend/notifications.md +++ b/docs/extend/notifications.md @@ -97,7 +97,7 @@ In addition to registering our notification to send by email, if we actually wan To do this, your notification blueprint should implement [`Flarum\Notification\MailableInterface`](https://api.docs.flarum.org/php/master/flarum/notification/mailableinterface) in addition to [`Flarum\Notification\Blueprint\BlueprintInterface`](https://api.docs.flarum.org/php/master/flarum/notification/blueprint/blueprintinterface). This comes with 2 additional methods: -- `getEmailViews()` should return an array of email types (both `text` and `html`) to [Blade View](https://laravel.com/docs/11.x/blade) names. The namespaces for these views must [first be registered](routes.md#views). These will be used to generate the body of the email. +- `getEmailViews()` should return an array of email types (both `text` and `html`) to [Blade View](https://laravel.com/docs/12.x/blade) names. The namespaces for these views must [first be registered](routes.md#views). These will be used to generate the body of the email. - `getEmailSubject(TranslatorInterface $translator)` should return a string for the email subject. An instance of the translator is passed in to enable translated notification emails. Let's take a look at an example from [Flarum Mentions](https://github.com/flarum/mentions/blob/master/src/Notification/PostMentionedBlueprint.php) diff --git a/docs/extend/routes.md b/docs/extend/routes.md index 6ca895b22..fb701bc2e 100644 --- a/docs/extend/routes.md +++ b/docs/extend/routes.md @@ -68,7 +68,7 @@ class HelloWorldController implements RequestHandlerInterface } ``` -Controllers are resolved from the [container](https://laravel.com/docs/11.x/container) so you can inject dependencies into their constructors. +Controllers are resolved from the [container](https://laravel.com/docs/12.x/container) so you can inject dependencies into their constructors. :::tip What are Controllers? @@ -108,7 +108,7 @@ $url = $this->url->to('forum')->route('acme.user', ['id' => 123, 'foo' => 'bar'] ### Views -You can inject Laravel's [View](https://laravel.com/docs/11.x/views) factory into your controller. This will allow you to render a [Blade template](https://laravel.com/docs/11.x/blade) into your controller's response. +You can inject Laravel's [View](https://laravel.com/docs/12.x/views) factory into your controller. This will allow you to render a [Blade template](https://laravel.com/docs/12.x/blade) into your controller's response. First, you will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: diff --git a/docs/extend/service-provider.md b/docs/extend/service-provider.md index dbd70976c..620bc163c 100644 --- a/docs/extend/service-provider.md +++ b/docs/extend/service-provider.md @@ -1,7 +1,7 @@ # Service Provider -As noted throughout this documentation, Flarum uses [Laravel's service container](https://laravel.com/docs/11.x/container) (or IoC container) for dependency injection. -[Service Providers](https://laravel.com/docs/11.x/providers) allow low-level configuration and modification of the Flarum backend. +As noted throughout this documentation, Flarum uses [Laravel's service container](https://laravel.com/docs/12.x/container) (or IoC container) for dependency injection. +[Service Providers](https://laravel.com/docs/12.x/providers) allow low-level configuration and modification of the Flarum backend. The most common use case for service providers is to create, modify, or replace container bindings. That being said, service providers allow you full access to run whatever logic you need during application boot with access to the container. @@ -50,7 +50,7 @@ class CustomServiceProvider extends AbstractServiceProvider The `register` method will run during step (3) above, and the `boot` method will run during step (5) above. In the `register` method, the container is available via `$this->container`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/11.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/11.x/octane#dependency-injection-and-octane) for more information. +Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/12.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/12.x/octane#dependency-injection-and-octane) for more information. To actually register your custom service provider, you can use the `ServiceProvider` extender in `extend.php`: diff --git a/docs/extend/settings.md b/docs/extend/settings.md index 0a26b3c75..9958ebce6 100644 --- a/docs/extend/settings.md +++ b/docs/extend/settings.md @@ -5,7 +5,7 @@ At some point while making an extension, you might want to read some of the foru ## The Settings Repository Reading or changing settings can be done using an implementation of the `SettingsRepositoryInterface`. -Because Flarum uses [Laravel's service container](https://laravel.com/docs/11.x/container) (or IoC container) for dependency injection, you don't need to worry about where to obtain such a repository, or how to instantiate one. +Because Flarum uses [Laravel's service container](https://laravel.com/docs/12.x/container) (or IoC container) for dependency injection, you don't need to worry about where to obtain such a repository, or how to instantiate one. Instead, you can rely on the container to instantiate your class and inject the correct dependencies. ```php diff --git a/docs/extend/start.md b/docs/extend/start.md index 7c13ac3db..1fddc0578 100644 --- a/docs/extend/start.md +++ b/docs/extend/start.md @@ -10,7 +10,7 @@ Be aware that Flarum uses some _modern_ languages and tools. If you've only ever Flarum is made up of three layers: -* First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/11.x/container), which is used throughout our backend. +* First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/12.x/container), which is used throughout our backend. * Second, the backend exposes a **public API** which allows frontend clients to interface with your forum's data. This is built according to the [JSON:API specification](https://jsonapi.org/). diff --git a/docs/extend/static-code-analysis.md b/docs/extend/static-code-analysis.md index c2f887630..b88d5ed62 100644 --- a/docs/extend/static-code-analysis.md +++ b/docs/extend/static-code-analysis.md @@ -78,7 +78,7 @@ You can also run the analysis using GitHub Actions. Checkout the page on [GitHub PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/11.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. +For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/12.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. ```php (new Extend\Model(User::class)) diff --git a/docs/extend/testing.md b/docs/extend/testing.md index 2131f9625..596127d11 100644 --- a/docs/extend/testing.md +++ b/docs/extend/testing.md @@ -160,7 +160,7 @@ There are several important utilities available for your test cases: - Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. - The `extension($extensionId)` method will take Flarum IDs of extensions to enable as arguments. Your extension should always call this with your extension's ID at the start of test cases, unless the goal of the test case in question is to confirm some behavior present without your extension, and compare that to behavior when your extension is enabled. If your extension is dependent on other extensions, make sure they are included in the composer.json `require` field (or `require-dev` for [optional dependencies](extending-extensions.md)), and also list their composer package names when calling `extension()`. Note that you must list them in a valid order. - The `extend($extender)` method takes instances of extenders as arguments, and is useful for testing extenders introduced by your extension for other extensions to use. -- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/11.x/queries#insert-statements). +- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/12.x/queries#insert-statements). If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. @@ -236,7 +236,7 @@ class SomeTest extends TestCase #### Model Factories -When preparing database data for tests, you can also use the [model factories to fill default data](https://laravel.com/docs/11.x/database-testing#model-factories). By using the model class as table key instead of the table name. When doing so, other model values will be generated by the factory of the model. +When preparing database data for tests, you can also use the [model factories to fill default data](https://laravel.com/docs/12.x/database-testing#model-factories). By using the model class as table key instead of the table name. When doing so, other model values will be generated by the factory of the model. ```php Notable * Flarum 2.0 upgrades Symfony components to version 6. Most extensions will not need to make any changes. -#### Laravel (updated from 8.x to 11.x) +#### Laravel (updated from 8.x to 12.x) -Flarum 2.0 uses Laravel 11 components, depending on your extension you may need to adapt your code. Here are some notable highlights. +Flarum 2.0 uses Laravel 12 components, depending on your extension you may need to adapt your code. Here are some notable highlights. ##### Breaking * The `$dates` property on models has been removed. You should now use the `$casts` property instead as such: @@ -203,9 +203,15 @@ Flarum 2.0 uses Laravel 11 components, depending on your extension you may need 'example_at' => 'datetime', ]; ``` -* When changing columns in migrations, you must always include the entirety of the column definition. For example, if you are changing a nullable column from `string` to `text`, you must include the `->nullable()` method in the new column definition. You will have to update your migrations accordingly. (https://laravel.com/docs/11.x/upgrade#modifying-columns) +* When changing columns in migrations, you must always include the entirety of the column definition. For example, if you are changing a nullable column from `string` to `text`, you must include the `->nullable()` method in the new column definition. You will have to update your migrations accordingly. (https://laravel.com/docs/12.x/upgrade#modifying-columns) +* The `HasUuids` trait now generates UUIDv7 (ordered) instead of UUIDv4. If your extension uses this trait and relies on UUIDv4, use `HasVersion4Uuids` instead: + ```php + use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids; + ``` +* `Schema::getTables()`, `Schema::getViews()`, and `Schema::getTypes()` now return results across all schemas by default. Pass the `schema` parameter to limit results to a specific schema. +* The `image` validation rule no longer allows SVGs by default. To allow SVGs, use `'image:allow_svg'`. -For more details, see the [Laravel 9](https://laravel.com/docs/9.x/upgrade), [Laravel 10](https://laravel.com/docs/10.x/upgrade) and [Laravel 11](https://laravel.com/docs/11.x/upgrade) upgrade guides. +For more details, see the [Laravel 9](https://laravel.com/docs/9.x/upgrade), [Laravel 10](https://laravel.com/docs/10.x/upgrade), [Laravel 11](https://laravel.com/docs/11.x/upgrade) and [Laravel 12](https://laravel.com/docs/12.x/upgrade) upgrade guides. #### Flysystem (updated from 1.x to 3.x) diff --git a/docs/extend/views.md b/docs/extend/views.md index 4d90e3f83..736612cc8 100644 --- a/docs/extend/views.md +++ b/docs/extend/views.md @@ -3,9 +3,9 @@ Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. -[Blade](https://laravel.com/docs/11.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. +[Blade](https://laravel.com/docs/12.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). -[Views](https://laravel.com/docs/11.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. +[Views](https://laravel.com/docs/12.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). @@ -26,7 +26,7 @@ return [ ## Blade Templates -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/11.x/blade). +To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/12.x/blade). Once you've set up your views, you can render them to strings: From 8c93f7b179d462c6c849a7a94d78accb87492467 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:30:04 +0000 Subject: [PATCH 10/39] docs: document PHPStan 2.x and Larastan 3.x upgrade changes (#503) Adds a detailed PHPStan/Larastan section to the 2.x upgrade guide covering the version bumps, recommended level 6 increase, removed config parameters, and Larastan 3.x breaking changes (explicit relation generics, annotation renames). Updates the static-code-analysis setup guide to reflect level 6 and remove the now-invalid checkMissingIterableValueType parameter. Co-authored-by: Claude Sonnet 4.6 --- docs/extend/static-code-analysis.md | 4 +- docs/extend/update-2_0.md | 59 +++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/docs/extend/static-code-analysis.md b/docs/extend/static-code-analysis.md index b88d5ed62..358940da2 100644 --- a/docs/extend/static-code-analysis.md +++ b/docs/extend/static-code-analysis.md @@ -29,14 +29,12 @@ includes: - vendor/flarum/phpstan/extension.neon parameters: - # The level will be increased in Flarum 2.0 - level: 5 + level: 6 paths: - src - extend.php excludePaths: - *.blade.php - checkMissingIterableValueType: false databaseMigrationsPath: ['migrations'] ``` diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index 62a51684c..fbab3258e 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -371,6 +371,65 @@ Checkout this example from the mentions extension: ## Infrastructure +### PHPStan (updated from ^1.10 to ^2.1) and Larastan (updated from 2.9 to ^3.8) + +Flarum 2.0 upgrades its static analysis tooling to PHPStan 2.x and Larastan 3.x. Extensions using `flarum/phpstan` will need to update their configuration and may need to fix newly reported errors. + +#### flarum/phpstan dependency + +Update your `composer.json` to require the latest `flarum/phpstan`: + +```bash +composer require --dev flarum/phpstan:^2.0 +``` + +#### Recommended level increase + +Flarum core now runs PHPStan at **level 6**. We recommend all extensions do the same. Update your `phpstan.neon`: + +```neon +parameters: + level: 6 +``` + +Level 6 checks for missing return types on all methods and properties. You may encounter new errors on your first run after increasing the level — work through them incrementally. + +#### Removed config parameters + +PHPStan 2.x removed several parameters that were commonly used in Flarum extension configs. Remove these from your `phpstan.neon` if present — they will cause an error if left in: + +* `checkMissingIterableValueType` — replaced by the `missingType.iterableValue` error identifier. If you need to suppress these errors, use `ignoreErrors` with the identifier instead. +* `checkGenericClassInNonGenericObjectType` — replaced by `missingType.generics`. +* `checkAlwaysTrueCheckTypeFunctionCall`, `checkAlwaysTrueInstanceof`, `checkAlwaysTrueStrictComparison`, `checkAlwaysTrueLooseComparison` — these checks are now always enabled and can no longer be disabled. + +#### Larastan 3.x: explicit relation return types required + +Larastan 3.x no longer infers generic types for Eloquent relation methods by parsing the method body. You must now annotate return types explicitly: + +```php +// Before (Larastan 2.x would infer the generic type automatically) +public function posts(): HasMany +{ + return $this->hasMany(Post::class); +} + +// After (explicit generic annotation required) +/** @return HasMany */ +public function posts(): HasMany +{ + return $this->hasMany(Post::class); +} +``` + +A [Rector rule](https://github.com/larastan/larastan/blob/3.x/UPGRADE.md) is available to automate this migration. + +#### Larastan 3.x: template annotation renames + +If your extension uses Larastan's template type annotations, two names have changed: + +* `TModelClass` → `TModel` +* `TChildModel` → `TDeclaringModel` + ### Reusable GitHub Workflows ##### Breaking From 0e178ab367266e7c114b50877f3df035e2c360aa Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:35:13 +0000 Subject: [PATCH 11/39] docs: document wikimedia/less.php 4.x to 5.x upgrade (#504) Adds a less.php dependency entry under the Dependencies section and a breaking change bullet under LESS Preprocessing for the math expression behaviour change in CSS custom properties introduced with Less.js 3.5+. Co-authored-by: Claude Sonnet 4.6 --- docs/extend/update-2_0.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index fbab3258e..3aa7e9400 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -180,6 +180,10 @@ In `composer.json`: * If you have a `php` requirement, make sure it is not below `^8.2`. * If you have `blomstra/gdpr` as a requirement, change it to `"flarum/gdpr": "*"`. +#### wikimedia/less.php (updated from 4.x to 5.x) + +Flarum 2.0 upgrades the LESS compiler to less.php 5.x. Most extensions will not need to make any changes to their PHP code, as the breaking changes were handled internally by Flarum core. However, there is one LESS language behaviour change that may affect your stylesheets — see [LESS Preprocessing](#less-preprocessing) below. + #### Carbon 3 ##### Breaking @@ -339,6 +343,21 @@ Checkout the [database documentation](./database) for more details. } ``` +* Math expressions inside CSS custom properties are no longer evaluated by the LESS compiler (this aligns with Less.js 3.5+ behaviour). If your extension performs arithmetic inside a custom property declaration, it will now be output as a literal string instead of a computed value: + ```less + // before: outputs --spacing: 32px + @base: 16px; + --spacing: @base * 2; + + // after: use a regular LESS variable for the calculation, then assign + @base: 16px; + @spacing: @base * 2; + --spacing: @spacing; + + // or use calc() if the calculation must remain in CSS + --spacing: calc(@base * 2); + ``` + ##### Notable * New high contrast color schemes have been added. * You can register more color schemes through the new frontend `Theme` extender and equivalent CSS code `[data-theme=your-scheme]`. From 1ecf458e91b7a4b3a2d6160492176d85a773a563 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:45:12 +0000 Subject: [PATCH 12/39] docs: document Conditional extender, ApplicationBooted event, and LaravelServiceProvider support (#505) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Covers three undocumented additions from the beta.4–beta.7 cycle: - settings.md: new Conditional Extenders section documenting all four methods (whenExtensionEnabled, whenExtensionDisabled, whenSetting, when) with examples including invokable class strings and strict comparison - backend-events.md: new Notable Core Events section with ApplicationBooted documented — timing, use case, and a warning that it fires every request - service-provider.md: add step 6 to boot process (ApplicationBooted event), note that Illuminate\Support\ServiceProvider is now also accepted by the ServiceProvider extender, with a third-party package example Co-authored-by: Claude Sonnet 4.6 --- docs/extend/backend-events.md | 28 ++++++++++++++ docs/extend/service-provider.md | 21 +++++++++- docs/extend/settings.md | 68 +++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 2 deletions(-) diff --git a/docs/extend/backend-events.md b/docs/extend/backend-events.md index c54332a66..1447b408e 100644 --- a/docs/extend/backend-events.md +++ b/docs/extend/backend-events.md @@ -128,6 +128,34 @@ class SomeClass } ``` +## Notable Core Events + +Most of Flarum's domain events are listed in the [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). A few lifecycle events are worth calling out specifically. + +### `Flarum\Foundation\Event\ApplicationBooted` + +Fired after the application has finished booting — all service providers have registered and booted, and all extension extenders have been applied — but before any HTTP request is handled. This is the earliest reliable point at which all bindings, extensions, and settings are fully available. + +This is useful for one-time setup that must happen after the entire extension system is ready but before any request is processed: + +```php +use Flarum\Extend; +use Flarum\Foundation\Event\ApplicationBooted; + +return [ + (new Extend\Event()) + ->listen(ApplicationBooted::class, function () { + // Everything is booted. Safe to resolve any binding or read any setting. + }), +]; +``` + +:::tip + +This event fires on every request. If you are doing work that should only happen once (e.g. warming a cache), make sure to guard against repeated execution yourself. + +::: + ## Custom Events As an extension developer you can define your own events to allow yourself (or other extensions) to react to events in your extension. diff --git a/docs/extend/service-provider.md b/docs/extend/service-provider.md index 620bc163c..a4d4f7da5 100644 --- a/docs/extend/service-provider.md +++ b/docs/extend/service-provider.md @@ -20,10 +20,13 @@ To understand service providers, you must first understand the order in which Fl 3. The `extend` methods of all extenders used by all enabled extensions are run. 4. The `extend` methods of all extenders used in the Flarum site's local `extend.php` are run. 5. The `boot` methods of all core service providers are run. +6. The `Flarum\Foundation\Event\ApplicationBooted` event is fired. See [backend events](backend-events.md#applicationbooted) for details. ## Custom Service Providers -A custom service provider should extend `Flarum\Foundation\AbstractServiceProvider`, and can have a `boot` and a `register` method. For example: +A custom service provider should extend `Flarum\Foundation\AbstractServiceProvider`, and can have a `boot` and a `register` method. Third-party Laravel packages that ship their own service providers (extending `Illuminate\Support\ServiceProvider`) can also be registered directly — see [below](#registering-a-service-provider). + +For example: ```php container` should be used. See the [Octane documentation](https://laravel.com/docs/12.x/octane#dependency-injection-and-octane) for more information. -To actually register your custom service provider, you can use the `ServiceProvider` extender in `extend.php`: +## Registering a Service Provider + +To register a service provider, use the `ServiceProvider` extender in `extend.php`: ```php register(SomePackageServiceProvider::class), +]; +``` diff --git a/docs/extend/settings.md b/docs/extend/settings.md index 9958ebce6..905f235a4 100644 --- a/docs/extend/settings.md +++ b/docs/extend/settings.md @@ -117,3 +117,71 @@ Sometimes you might want a setting's value to be reset to its default value base return $value === ''; }) ``` + +## Conditional Extenders + +The `Conditional` extender allows you to apply other extenders only when a certain condition is met. This is useful for optional integrations — for example, adding extra API fields only when a companion extension is enabled, or changing behaviour based on a settings value. + +```php +use Flarum\Extend; + +return [ + (new Extend\Conditional()) + ->whenExtensionEnabled('some-extension-id', fn () => [ + // extenders to apply when the extension is enabled + (new Extend\ApiResource(SomeResource::class)) + ->fields(fn () => [ /* ... */ ]), + ]) + ->whenExtensionDisabled('some-extension-id', fn () => [ + // extenders to apply when the extension is disabled + ]), +]; +``` + +The extenders argument can also be an invokable class string, which will be resolved from the container: + +```php +(new Extend\Conditional()) + ->whenExtensionEnabled('some-extension-id', MyConditionalExtenders::class) +``` + +### Available conditions + +#### `whenExtensionEnabled(string $extensionId, ...)` + +Applies extenders only if the given extension is currently enabled. + +#### `whenExtensionDisabled(string $extensionId, ...)` + +Applies extenders only if the given extension is currently disabled. + +#### `whenSetting(string $key, mixed $expected, ..., strict: false)` + +Applies extenders only if a settings value matches an expected value. Uses loose comparison (`==`) by default, so a stored string `'1'` will match a boolean `true`. Pass `strict: true` to use strict comparison (`===`): + +```php +// Loose comparison (default) - stored '1' matches true +(new Extend\Conditional()) + ->whenSetting('my_extension.feature_enabled', true, fn () => [ + // ... + ]) + +// Strict comparison - stored '1' does NOT match integer 1 +(new Extend\Conditional()) + ->whenSetting('my_extension.mode', 'advanced', fn () => [ + // ... + ], strict: true) +``` + +#### `when(bool|callable $condition, ...)` + +The general-purpose method that all the above convenience methods are built on. Accepts a boolean or a callable. If a callable is given, it is resolved through the container so you can typehint any service: + +```php +(new Extend\Conditional()) + ->when(function (\Flarum\Settings\SettingsRepositoryInterface $settings) { + return $settings->get('my_extension.driver') === 'custom'; + }, fn () => [ + // ... + ]) +``` From 983a77bfe194b0c21326e7b7cea8eeff445a8b04 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:12:12 +0000 Subject: [PATCH 13/39] docs: document admin extension categories, health widget, and abandoned package support (#506) Documents changes introduced in flarum/framework#4392: - Extension Categories: new section in admin.md covering how to declare a category in composer.json, the full table of built-in categories with keys, labels and icons, and how to register custom categories via app.extensionCategories. - Extension Health Widget: new section in admin.md covering the three widget sections (abandoned, suggested, disabled), how Packagist's abandoned field works, how to use Composer's suggest field, and the flarum.abandoned_overrides forward-compatibility hook for future scheduled checking. - update-2_0.md: notable entry for the new admin dashboard (old extension grid removed, health widget added); notable entry for the collapsible sidebar overhaul with count badges, icons, and search auto-expand. Co-authored-by: Claude Sonnet 4.6 --- docs/extend/admin.md | 124 ++++++++++++++++++++++++++++++++++++++ docs/extend/update-2_0.md | 14 +++++ 2 files changed, 138 insertions(+) diff --git a/docs/extend/admin.md b/docs/extend/admin.md index f6fa5e488..dbf906d69 100644 --- a/docs/extend/admin.md +++ b/docs/extend/admin.md @@ -319,6 +319,130 @@ export default [ ]; ``` +## Extension Categories + +The admin sidebar groups extensions into collapsible categories. Each category has an icon, a count badge, and can be expanded or collapsed independently. When searching, categories with matching results expand automatically. + +### Declaring a Category + +Declare your extension's category in `composer.json` under `extra.flarum-extension.category`: + +```json +{ + "extra": { + "flarum-extension": { + "title": "My Extension", + "category": "moderation", + "icon": { + "name": "fas fa-shield-alt", + "backgroundColor": "#dc3626", + "color": "#fff" + } + } + } +} +``` + +If no category is declared, or the declared category is not recognised, the extension is placed in the **feature** category. + +Language packs (extensions with an `extra.flarum-locale` key) are always placed in the **language** category regardless of any declared category. + +### Available Categories + +| Key | Label | Icon | +|------------------|----------------|-------------------------| +| `feature` | Features | `fas fa-star` | +| `moderation` | Moderation | `fas fa-shield-alt` | +| `discussion` | Discussion | `fas fa-comments` | +| `authentication` | Authentication | `fas fa-lock` | +| `formatting` | Formatting | `fas fa-paragraph` | +| `infrastructure` | Infrastructure | `fas fa-server` | +| `analytics` | Analytics | `fas fa-chart-bar` | +| `other` | Other | `fas fa-cube` | +| `theme` | Themes | `fas fa-paint-brush` | +| `language` | Languages | `fas fa-language` | + +### Registering a Custom Category + +Third-party extensions can register additional categories by extending `app.extensionCategories` in an admin initializer. The value is the sort priority — higher numbers appear first in the sidebar: + +```js +import app from 'flarum/admin/app'; + +app.initializers.add('acme-interstellar', () => { + app.extensionCategories['space'] = 45; +}); +``` + +Then declare `"category": "space"` in your `composer.json`, and add a translation key `core.admin.nav.categories.space` (or provide your own translation via your extension's locale files — the sidebar will fall back to the raw key if no translation exists). + +## Extension Health Widget + +The admin dashboard includes an **Extension Health Widget** that gives forum administrators an at-a-glance view of the health of their installed extensions. It replaces the old categorised extension grid that duplicated the sidebar. + +The widget has three sections: + +### Abandoned Extensions + +Extensions whose Composer package has been marked as abandoned on Packagist will appear here. Flarum reads the `abandoned` field from the extension's payload and surfaces it prominently so administrators know to take action. + +- If the package specifies a **replacement** (e.g. `"abandoned": "vendor/new-package"`), the item is shown in **red** with an exclamation circle and the replacement package name. +- If there is **no replacement** (e.g. `"abandoned": true`), the item is shown in **orange** with a warning triangle. + +The same warning badge is duplicated on the extension's entry in the admin sidebar so it is visible even when the dashboard widget is not in view. + +#### Marking your package as abandoned + +This is a Packagist/Composer concept, not a Flarum-specific one. If your extension has been superseded by another package, update your `composer.json`: + +```json +{ + "abandoned": "vendor/replacement-package" +} +``` + +Or if there is no replacement: + +```json +{ + "abandoned": true +} +``` + +Packagist will then mark the package abandoned, and Flarum will surface the warning to administrators. + +:::info Abandoned status is determined at install time + +Flarum reads the `abandoned` field from `vendor/composer/installed.json`, which is populated by Composer when packages are installed or updated. This means: + +- The status reflects what was current when `composer install` or `composer update` was last run. +- If a package is marked abandoned after that point, the warning will not appear until Composer is run again. +- **Private Packagist, Satis, Toran Proxy, and other custom Composer repositories are fully supported** — Composer writes the `abandoned` field from whatever repository served the package, so the data is repository-agnostic. + +Automatic periodic checking via a scheduled task is planned for a future version of Flarum 2.x. Because installations may use private or custom repositories rather than Packagist, the scheduled checker will need to be repository-aware. In preparation for this, Flarum already supports a `flarum.abandoned_overrides` settings key that a future task can write to after querying the appropriate repository API. Its value is a JSON object mapping extension IDs to their abandoned status (`false`, `true`, or a replacement package name string). This decouples the checking logic from core's install-time parsing, and means the override mechanism will work regardless of which Composer repository a package came from. + +::: + +### Suggested Extensions + +If your extension has optional integrations with other packages, you can advertise them via the standard Composer `suggest` field in `composer.json`: + +```json +{ + "suggest": { + "vendor/package-name": "Adds support for XYZ feature" + } +} +``` + +Flarum reads the `suggest` map from every **enabled** extension and surfaces any `vendor/package` entries that are not already installed. The widget links directly to the package on Packagist. PHP extension requirements (e.g. `ext-gd`) are ignored. + +Only suggestions from **enabled** extensions are shown, so administrators are not overwhelmed by suggestions from extensions they haven't activated. + +### Disabled Extensions + +All installed-but-disabled extensions are shown as a compact icon grid so administrators can quickly spot extensions they may have forgotten about. Each icon links to the extension's settings page. + ## Composer.json Metadata Extension pages make room for extra info which is pulled from extensions' composer.json. diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index 3aa7e9400..d6f00cc92 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -110,6 +110,19 @@ Familiarize yourself with the new [Code Splitting](./code-splitting) feature to * The admin dashboard now has a search feature, as long as you register your settings/permissions using the `Admin` extender, then they will be automatically picked up. * If your settings/permissions are too custom to be added through the `Admin.setting` and `Admin.permission` extenders, then you can use `Admin.generalIndexItems` to add custom search index entries. +### Admin Dashboard + +##### Breaking +* The old extension grid widget on the admin dashboard, which displayed all installed extensions grouped by category, has been removed. It duplicated the information already available in the sidebar and provided no additional value. + +##### Notable +* A new **Extension Health Widget** has been added to the admin dashboard. It surfaces actionable information about installed extensions: + * **Abandoned** — extensions whose Composer package is marked abandoned on Packagist, with or without a suggested replacement. + * **Suggested** — packages listed in the `suggest` field of any enabled extension's `composer.json` that are not yet installed. + * **Disabled** — a compact icon grid of all installed-but-disabled extensions. + * Abandoned extensions also display a warning badge on their entry in the admin sidebar. + * See the [Extension Health Widget](./admin.md#extension-health-widget) docs for how to use the `abandoned` and `suggest` fields in your own extension's `composer.json`. + ### Locale ##### Breaking @@ -150,6 +163,7 @@ There have been many changes to the core frontend codebase, including renamed or * `app.extensionData` has been removed. You must now use the `Admin` extender to register settings, permissions and custom extension pages. ##### Notable +* The admin sidebar navigation has been overhauled. Extension categories are now collapsible groups with count badges and category icons. Categories start collapsed by default, and searching auto-expands categories with matching results. The active extension's category is pre-expanded on page load. Extensions should declare their category in `composer.json` under `extra.flarum-extension.category`. See the [Extension Categories](./admin.md#extension-categories) section in the admin docs for the full list of available categories and how to register custom ones. * All forum pages now use the same page structure through the new `PageStructure` component. You should use this component in your extension if you are creating a new forum page. * A `HeaderDropdown` component has been added which is used for the `NotificationsDropdown` and `FlagsDropdown` your component should extend that instead of the `NotificationsDropdown`. Along with it has been also added the following components: `HeaderList` and `HeaderListItem`. * A `DetailedDropdownItem` has been added. Checkout the [`SubsriptionsDropdown`](https://github.com/flarum/framework/blob/2.x/extensions/subscriptions/js/src/forum/components/SubscriptionMenu.tsx#L83-L87) component to see how it is used. From 5fa37491f18b084fa075356c39067e1ea3cb827a Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:12:29 +0000 Subject: [PATCH 14/39] docs: add FontAwesome 7 upgrade documentation (#501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add dedicated FontAwesome page covering Local/CDN/Kit sources, icon class name reference, renamed icons table, and extension dev notes - Add FontAwesome page to Management sidebar - Update config.md: prose and CDN example URL to FA7 - Update themes.md: version reference and link to new FA page - Update extend/i18n.md: replace dead fortawesome.github.io URL - Update extend/update-2_0.md: add FontAwesome 5→7 upgrade section under Backend > Dependencies Relates to flarum/framework#4388 Co-authored-by: Claude Sonnet 4.6 --- docs/config.md | 12 ++-- docs/extend/i18n.md | 2 +- docs/extend/update-2_0.md | 21 +++++++ docs/fontawesome.md | 122 ++++++++++++++++++++++++++++++++++++++ docs/themes.md | 4 +- sidebars.js | 1 + 6 files changed, 154 insertions(+), 8 deletions(-) create mode 100644 docs/fontawesome.md diff --git a/docs/config.md b/docs/config.md index e4dfb6472..10e7d4e50 100644 --- a/docs/config.md +++ b/docs/config.md @@ -38,7 +38,7 @@ Here's a quick overview of what everything means with an example file: ), 'fontawesome' => array ( - 'source' => 'local', // Use the bundled FontAwesome Free v6 icons. See below for other config options + 'source' => 'local', // Use the bundled FontAwesome Free v7 icons. See below for other config options ) ); ``` @@ -85,7 +85,7 @@ This can also be configured from the admin panel's advanced settings page: ### FontAwesome -By default Flarum uses the bundled FontAwesome 'Free' v6 icons. These can be switched out to use either a CDN hosted icon bundle, or a custom kit. +By default Flarum uses the bundled FontAwesome Free v7 icons. These can be switched out to use either a CDN hosted icon bundle, or a custom kit. See the [FontAwesome](fontawesome.md) page for full details on each source. ```php 'https://example.com', // ... other config - + // FontAwesome Kit (Pro features + custom icons) 'fontawesome' => [ 'source' => 'kit', 'kit_url' => 'https://kit.fontawesome.com/YOUR_KIT_CODE.js', ], - + // OR use a CDN // 'fontawesome' => [ // 'source' => 'cdn', - // 'cdn_url' => 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css', + // 'cdn_url' => 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css', // ], - + // OR keep local (default, no config needed) // 'fontawesome' => [ // 'source' => 'local', diff --git a/docs/extend/i18n.md b/docs/extend/i18n.md index 63a898852..cde793e87 100644 --- a/docs/extend/i18n.md +++ b/docs/extend/i18n.md @@ -162,7 +162,7 @@ You begin by adding a key to the parameters argument for each element that you w ```jsx harmony
{app.translator.trans('icon_text', { - a: + a: })}
``` diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index d6f00cc92..dda8bca9c 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -265,6 +265,27 @@ The Intervention Image library (`intervention/image`) has been updated to versio You may also check out the core pull request that updated the library [here](https://github.com/flarum/framework/pull/3947/files). +#### FontAwesome (updated from 5.x to 7.x) + +Flarum 2.0 upgrades the bundled icon library from **FontAwesome Free 5** (Flarum 1.x) to **FontAwesome Free 7**. For most extensions and themes this requires **no changes**, but there are a few things to be aware of. + +##### Notable +* The legacy shorthand class names (`fas`, `far`, `fab`) remain fully supported in FA7 — existing icon strings like `"fas fa-house"` or `"far fa-envelope"` continue to work without modification. +* Only `.woff2` webfonts are shipped. FA5 bundled several font formats; FA7 ships only `.woff2`. All modern browsers support WOFF2. +* The underlying Composer package changed from `components/font-awesome` (a third-party mirror) to `fortawesome/font-awesome` (the official package). If your extension references the vendor path directly — e.g. for custom asset publishing — update the path from `vendor/components/font-awesome` to `vendor/fortawesome/font-awesome`. +* FA7 introduces `fa-solid`, `fa-regular`, and `fa-brands` as the preferred canonical class names alongside the legacy aliases. You may start using these in new code, but the old names remain valid. + +:::tip Upgrading existing installs + +After upgrading Flarum, old font files in `public/assets/fonts/` are not automatically removed. Clear the directory and re-publish assets: + +```bash +rm -rf public/assets/fonts +php flarum assets:publish +``` + +::: + ### JSON:API Flarum 2.0 completely refactors the JSON:API implementation. The way resource CRUD operations, serialization and extending other resources is done has completely changed. diff --git a/docs/fontawesome.md b/docs/fontawesome.md new file mode 100644 index 000000000..ae9e06207 --- /dev/null +++ b/docs/fontawesome.md @@ -0,0 +1,122 @@ +# FontAwesome Icons + +Flarum uses [FontAwesome](https://fontawesome.com) for icons throughout the interface. By default the **Free** tier is bundled with Flarum and served from your own server. You can switch to a CDN-hosted stylesheet or a FontAwesome Kit to unlock Pro icons, custom icons, and other features. + +The active source can be changed from the admin dashboard (**Admin → Advanced**) or directly in [`config.php`](config.md). + +## Sources + +### Local (default) + +Flarum ships FontAwesome Free and publishes the webfonts to `public/assets/fonts/` during installation and whenever you run: + +```bash +php flarum assets:publish +``` + +No external requests are made. Only the **Free** icon set is available (`fas`, `far`, `fab`). + +This is the recommended default for most installations. + +:::tip After upgrading Flarum + +If you upgrade Flarum and the new release ships a different FontAwesome version, old font files in `public/assets/fonts/` are not automatically removed. Clear the directory and re-publish: + +```bash +rm -rf public/assets/fonts +php flarum assets:publish +``` + +::: + +### CDN + +Load FontAwesome from a third-party CDN by providing a CSS URL. This replaces the local stylesheet and webfonts entirely — no fonts are published to your server. + +In `config.php`: + +```php +'fontawesome' => [ + 'source' => 'cdn', + 'cdn_url' => 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css', +], +``` + +You can point `cdn_url` at any compatible FontAwesome stylesheet, including Pro CSS files hosted on a private CDN. + +### Kit + +A [FontAwesome Kit](https://fontawesome.com/kits) is a personalised bundle configured on the FontAwesome website. Kits are loaded via a JavaScript snippet and unlock features not available with the Free tier: + +- **Pro icons** — thousands of additional icons across Solid, Regular, Light, Thin, and Duotone styles +- **Custom icons** — upload your own SVGs and use them like any FA icon +- **Icon uploads** — manage icons directly from the FontAwesome dashboard + +To use a Kit, create one at [fontawesome.com/kits](https://fontawesome.com/kits), then add the kit URL to `config.php`: + +```php +'fontawesome' => [ + 'source' => 'kit', + 'kit_url' => 'https://kit.fontawesome.com/YOUR_KIT_CODE.js', +], +``` + +The kit URL can be found on your kit's page in the FontAwesome dashboard. + +:::caution + +Kit scripts are loaded from FontAwesome's servers. This means user browsers will make a request to `kit.fontawesome.com` on every page load. If you have strict data-residency requirements, use the CDN or Local source instead. + +::: + +## Icon Class Names + +Flarum uses FontAwesome 7. Icon classes follow the `{style} {icon}` pattern: + +| Style | FA7 class | Legacy alias (also valid) | +|---|---|---| +| Solid | `fa-solid fa-house` | `fas fa-house` | +| Regular | `fa-regular fa-envelope` | `far fa-envelope` | +| Brands | `fa-brands fa-github` | `fab fa-github` | +| Light *(Pro)* | `fa-light fa-house` | `fal fa-house` | +| Thin *(Pro)* | `fa-thin fa-house` | `fat fa-house` | +| Duotone *(Pro)* | `fa-duotone fa-house` | `fad fa-house` | + +The legacy shorthand aliases (`fas`, `far`, `fab`, etc.) are fully supported and do not need to be changed. New code may use either style. + +Browse the free icon catalogue at [fontawesome.com/icons](https://fontawesome.com/icons). + +## Renamed Icons in FA7 + +FontAwesome 7 renamed a number of icons. The old names continue to work via CSS aliases that FA7 ships, so **nothing breaks**. However, if you are writing new code or updating an existing extension you should prefer the current canonical names. + +The following FA5/FA6 icon names used in Flarum core and bundled extensions have been renamed in FA7: + +| Old name (FA5/FA6) | FA7 canonical name | +|---|---| +| `fa-cog` | `fa-gear` | +| `fa-edit` | `fa-pen-to-square` | +| `fa-ellipsis-h` | `fa-ellipsis` | +| `fa-exclamation-triangle` | `fa-triangle-exclamation` | +| `fa-file-alt` | `fa-file-lines` | +| `fa-search` | `fa-magnifying-glass` | +| `fa-sync` / `fa-sync-alt` | `fa-arrows-rotate` / `fa-rotate` | +| `fa-times` | `fa-xmark` | +| `fa-times-circle` | `fa-circle-xmark` | +| `fa-trash-alt` | `fa-trash-can` | +| `fa-user-edit` | `fa-user-pen` | +| `fa-vote-yea` | `fa-check-to-slot` | + +The style prefix (`fas`, `far`, etc.) is unchanged for all of the above. + +For the full list of changes, see the [FontAwesome upgrade guide](https://docs.fontawesome.com/web/setup/upgrade/). + +## Extension Development + +When registering an icon from an extension (e.g. in `composer.json` or a settings registration), use the full class string: + +```json +"icon": "fas fa-puzzle-piece" +``` + +Extensions do not need to bundle FontAwesome themselves — it is provided by Flarum core and available on every page. diff --git a/docs/themes.md b/docs/themes.md index 4b5983abb..f27c3c338 100644 --- a/docs/themes.md +++ b/docs/themes.md @@ -14,7 +14,9 @@ The [admin dashboard](admin.md)'s Appearance page is a great first place to star ## FontAwesome -Flarum allows customization out-of-the-box to the FontAwesome icon sets used. By default we use FontAwesome 6 free icons, but this can be easily modified to use the `Pro` or even full Kits via the [advanced settings](admin.md) for configuration via the UI, or via [config.php](config.md) for code-based setups. +Flarum uses FontAwesome 7 for icons throughout the interface. By default the Free icon set is bundled and served locally, but this can be switched to a CDN or a FontAwesome Kit (which unlocks Pro icons and custom icons) via the [advanced settings](admin.md) in the admin dashboard, or directly in [config.php](config.md). + +See the [FontAwesome](fontawesome.md) page for full details on configuration options and available icon styles. ## CSS Theming diff --git a/sidebars.js b/sidebars.js index 80f78afe6..23cea8e81 100644 --- a/sidebars.js +++ b/sidebars.js @@ -51,6 +51,7 @@ module.exports = { 'extensions', 'languages', 'themes', + 'fontawesome', 'mail', 'scheduler', 'console', From e5c47e6dfe1181552405fad5810b6877a1502da8 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca <146922689+DavideIadeluca@users.noreply.github.com> Date: Sun, 8 Mar 2026 00:01:54 +0100 Subject: [PATCH 15/39] docs: add notable change for WelcomeHero (#500) --- docs/extend/update-2_0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index dda8bca9c..d6ef2e2fe 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -172,6 +172,7 @@ There have been many changes to the core frontend codebase, including renamed or * A `Form` component has been added to ensure consistent styling across forms. You should use this component in your extension if you are creating a form. * An API for frontend gambits has been introduced, [checkout the full documentation](./search#gambits). * A `FormGroup` component has been added that allows you to add any supported type of input similar to the admin panel's settings registration. [checkout the documentation for more details](./forms). +* `WelcomeHero.prototype.viewItems` has been moved to `WelcomeHero.prototype.bodyItems`. ## Backend From f592d572391891df773c518ca82502b5bed52325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Sun, 8 Mar 2026 21:00:59 +0700 Subject: [PATCH 16/39] docs: add avatar drivers guide for User extender (#498) * docs: add avatar drivers guide for User extender Documents the new avatar driver system introduced in flarum/framework#4130. Includes implementation guide, examples, and admin configuration. * wip * docs: add avatar drivers guide for User extender Documents the new avatar driver system introduced in flarum/framework#4130. Includes implementation guide, examples, and admin configuration. * docs: update avatars.md to match Flarum documentation style - Use more direct, technical language - Remove verbose explanations and marketing-style wording - Simplify code examples with minimal comments - Remove redundant sections - Match tone and word choices from mail.md, filesystem.md, notifications.md - Reduce file length from ~300 to ~75 lines * wip * wip * wip * docs: address PR review feedback for avatar drivers guide - Correct intro to reflect only DefaultDriver exists (Gravatar is planned) - Add note about raw driver identifier and BasicsPage.driverLocale override - Link to existing DefaultDriver instead of non-existent GravatarDriver --- docs/extend/avatars.md | 76 ++++++++++++++++++++++++++++++++++++++++++ sidebars.js | 1 + 2 files changed, 77 insertions(+) create mode 100644 docs/extend/avatars.md diff --git a/docs/extend/avatars.md b/docs/extend/avatars.md new file mode 100644 index 000000000..7e6f3c0d0 --- /dev/null +++ b/docs/extend/avatars.md @@ -0,0 +1,76 @@ +# Avatar Drivers + +Flarum allows new avatar drivers to be added through extenders. By default, Flarum includes one driver: the Default driver (which returns null when no uploaded avatar is present). A Gravatar driver will be available as part of the core extension suite. + +To create your own avatar driver, you will need to create a class implementing `Flarum\User\Avatar\DriverInterface`. This allows extensions to integrate custom avatar providers from external services like Discord, GitHub, Steam, or any custom service. + +## How It Works + +When Flarum needs to display a user's avatar, it resolves the avatar URL through a fallback chain: + +1. **Custom uploaded avatar** - If the user has uploaded an avatar, use that file +2. **Custom avatar URL** - If a full URL (with `://`) is set in the database +3. **Configured avatar driver** - Call the active driver's `avatarUrl()` method +4. **Null** - Falls back to default UI avatar (initials) + +Your driver is only called when the user has no uploaded avatar or custom URL. This means users can always override your driver by uploading their own avatar. The `$user->avatar_url` accessor handles this resolution automatically. You can check if a user has a custom avatar using `$user->original_avatar_url`. + +## Creating a Driver + +The `DriverInterface` has a single method which receives a `User` model and returns either a URL string or null: + +```php +namespace Acme\Avatars\Driver; + +use Flarum\User\Avatar\DriverInterface; +use Flarum\User\User; + +class DiscordAvatarDriver implements DriverInterface +{ + public function avatarUrl(User $user): ?string + { + $discordId = $user->discord_id; + $avatarHash = $user->discord_avatar_hash; + + if (! $discordId || ! $avatarHash) { + return null; + } + + return "https://cdn.discordapp.com/avatars/{$discordId}/{$avatarHash}.png?size=200"; + } +} +``` + +The `avatarUrl()` method receives the full User model, so you can access any user properties including custom attributes you have added via [migrations](database.md). + +Drivers should return `null` when they cannot provide an avatar URL. This allows Flarum to fall back to the default avatar display. + +## Registering a Driver + +To register avatar drivers, use the `Flarum\Extend\User` extender in your extension's `extend.php` file: + +```php +use Flarum\Extend; +use Acme\Avatars\Driver\DiscordAvatarDriver; + +return [ + // Other extenders + (new Extend\User()) + ->avatarDriver('discord', DiscordAvatarDriver::class), + // Other extenders +]; +``` + +The first parameter is a unique identifier for your driver. This identifier is stored in the `avatar_driver` setting when an administrator selects it from the admin panel, so it should be unique across all extensions. + +## Admin Configuration + +Once registered, avatar drivers will automatically appear in the admin dashboard under **Basics → Avatar Driver**. The dropdown will only appear when two or more drivers are registered. Administrators can select which driver should be active for users who have not uploaded custom avatars. + +Flarum automatically adds your driver to the admin settings page when you register it. + +> **Note:** The admin dropdown will display the raw driver identifier by default. To show a human-readable label, override `BasicsPage.driverLocale` in your extension's frontend code. + +The selected driver identifier is stored in the `avatar_driver` setting. If the setting is empty or refers to an unregistered driver, Flarum will use the Default driver as a fallback. + +For a minimal example, see Flarum's built-in [DefaultDriver](https://github.com/flarum/framework/blob/main/framework/core/src/User/Avatar/DefaultDriver.php). diff --git a/sidebars.js b/sidebars.js index 23cea8e81..ff01b8c19 100644 --- a/sidebars.js +++ b/sidebars.js @@ -129,6 +129,7 @@ module.exports = { items: [ 'extend/api-throttling', 'extend/assets', + 'extend/avatars', 'extend/console', 'extend/database', 'extend/extending-extensions', From 3b2e7d3bd704a6b2049f85b275b5e56372b1f6a9 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Thu, 12 Mar 2026 01:29:21 +0100 Subject: [PATCH 17/39] docs: add haptic feedback guide for extension developers (#507) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: add haptic feedback guide for extension developers Documents the haptic() utility added in flarum/framework#: - Named presets, custom patterns, isHapticSupported - User gesture requirement (Android + iOS) — must call synchronously before async - Where core uses haptics (reference table) - Extension integration examples: buttons, API saves, extend(), reactions, settings Co-Authored-By: Claude Sonnet 4.6 * fix(haptic-feedback): correct custom pattern iOS support and update type refs - Custom patterns do work on iOS — web-haptics simulates them via repeated checkbox clicks using rAF; previous claim they were Android-only was wrong - Replace HapticPreset/HapticPattern type references with HapticInput, matching the updated haptic.ts in flarum/framework Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- docs/extend/haptic-feedback.md | 279 +++++++++++++++++++++++++++++++++ sidebars.js | 1 + 2 files changed, 280 insertions(+) create mode 100644 docs/extend/haptic-feedback.md diff --git a/docs/extend/haptic-feedback.md b/docs/extend/haptic-feedback.md new file mode 100644 index 000000000..43d09a797 --- /dev/null +++ b/docs/extend/haptic-feedback.md @@ -0,0 +1,279 @@ +# Haptic Feedback + +Flarum core provides a `haptic()` utility for triggering tactile feedback on supported mobile devices. When users perform significant actions — liking a post, submitting a reply, deleting a discussion — a brief vibration reinforces the interaction, making the app feel more responsive and native. + +Haptics are supported on: + +- **Android** — via the [Web Vibration API](https://developer.mozilla.org/en-US/docs/Web/API/Vibration_API) (`navigator.vibrate`) +- **iOS** — via a hidden `` element that triggers the Taptic Engine (powered by the [`web-haptics`](https://github.com/lochie/web-haptics) package) + +On desktop browsers and unsupported devices, `haptic()` is a silent no-op — it is always safe to call unconditionally. + +:::caution User gesture requirement + +Both Android and iOS require `haptic()` to be called within a synchronous user gesture context. Call it before any `await` or `.then()` — once execution goes async, the browser's gesture token expires and the haptic will be silently ignored on both platforms. + +::: + +## Basic Usage + +Import and call `haptic()` from `flarum/common/utils/haptic`: + +```js +import haptic from 'flarum/common/utils/haptic'; + +// Trigger the default preset (light) +haptic(); + +// Trigger a named preset +haptic('success'); +``` + +### Named Presets + +Flarum ships with a set of named presets designed to match the feel of common UI interactions: + +| Preset | Feel | Suggested use | +|---|---|---| +| `'light'` | Gentle tap | Toggles, checkbox changes, selections | +| `'medium'` | Moderate tap | General confirmations, secondary actions | +| `'heavy'` | Strong tap | Destructive or irreversible actions | +| `'success'` | Double tap | Positive outcomes (post submitted, liked) | +| `'warning'` | Double pulse | Cautionary actions (flagging content) | +| `'error'` | Triple pulse | Validation failures, errors | +| `'nudge'` | Long + short | Attention, reminders | + +```js +haptic('light'); // gentle tap — toggles, selections +haptic('medium'); // moderate tap — confirmations +haptic('heavy'); // strong tap — destructive actions +haptic('success'); // double tap — positive actions (e.g. likes) +haptic('warning'); // double pulse — caution +haptic('error'); // triple pulse — validation errors +haptic('nudge'); // long + short — attention, reminders +``` + +### Custom Patterns + +You can also pass a raw vibration duration in milliseconds, or an alternating vibrate/pause sequence: + +```js +haptic(50); // single vibration, 50ms +haptic([100, 50, 100]); // vibrate 100ms, pause 50ms, vibrate 100ms +``` + +:::info + +Custom patterns work on both platforms. On Android they use the Web Vibration API directly. On iOS, `web-haptics` simulates the pattern by clicking the hidden checkbox repeatedly via `requestAnimationFrame`, producing distinct Taptic Engine taps at the correct intervals. Intensity values are ignored on iOS. + +::: + +## Detecting Support + +Use `isHapticSupported` to conditionally show haptic-related UI (e.g. a settings toggle): + +```js +import { isHapticSupported } from 'flarum/common/utils/haptic'; + +if (isHapticSupported) { + // Show haptic preference toggle +} +``` + +`isHapticSupported` is a boolean evaluated once at page load. It is `true` on Android (Web Vibration API) and iOS (Taptic Engine via checkbox trick), and `false` on desktop browsers. + +## Where Core Uses Haptics + +Flarum core and its bundled extensions apply haptics at the following interaction points: + +| Action | Preset | Location | +|---|---|---| +| Reply posted successfully | `success` | `ReplyComposer` | +| New discussion posted | `success` | `DiscussionComposer` | +| Post hidden (after confirm) | `heavy` | `PostControls` | +| Post permanently deleted (after confirm) | `heavy` | `PostControls` | +| Discussion hidden | `heavy` | `DiscussionControls` | +| Discussion restored | `success` | `DiscussionControls` | +| Discussion permanently deleted (after confirm) | `heavy` | `DiscussionControls` | +| Post liked | `success` | `flarum/likes` — `addLikeAction` | +| Flag submitted | `warning` | `flarum/flags` — `FlagPostModal` | +| Post approved | `success` | `flarum/approval` — `PostControls` | +| Notification preference toggled | `light` | `NotificationGrid` | + +## Using Haptics in Extensions + +### Simple action buttons + +The most common use case is triggering haptics when a user completes an action from a button or control: + +```js +import haptic from 'flarum/common/utils/haptic'; +import Button from 'flarum/common/components/Button'; + +// In a component view: + +``` + +### Before an API save + +For actions that involve a server round-trip, trigger the haptic **before** the async call, while still in the synchronous user gesture context. Calling it inside `.then()` will be silently ignored on both Android and iOS: + +```js +import haptic from 'flarum/common/utils/haptic'; + +bookmarkAction() { + haptic('success'); // must be synchronous — before any await/.then() + return this.save({ isBookmarked: true }).then(() => m.redraw()); +} +``` + +### Extending core controls with `extend()` + +Use Flarum's `extend()` helper to add haptics to existing core action methods without modifying them directly. This is the recommended pattern for extensions: + +```js +import { extend } from 'flarum/common/extend'; +import haptic from 'flarum/common/utils/haptic'; +import PostControls from 'flarum/forum/utils/PostControls'; +import DiscussionControls from 'flarum/forum/utils/DiscussionControls'; + +app.initializers.add('my-extension', () => { + // Fire haptic when a post is restored + extend(PostControls, 'restoreAction', function () { + haptic('success'); + }); + + // Fire haptic when a discussion is renamed + extend(DiscussionControls, 'renameAction', function () { + haptic('light'); + }); +}); +``` + +:::tip + +`extend()` runs your callback **after** the original method. For haptics, this is usually fine — the vibration fires at the moment the action is confirmed. If you need it to fire **before** the original (e.g. to cancel it conditionally), use `override()` instead. + +::: + +### Extending component methods + +To add haptics to a component method, use `extend()` on the prototype: + +```js +import { extend } from 'flarum/common/extend'; +import haptic from 'flarum/common/utils/haptic'; +import CommentPost from 'flarum/forum/components/CommentPost'; + +app.initializers.add('my-extension', () => { + // Example: haptic when user expands a collapsed post + extend(CommentPost.prototype, 'toggleCollapse', function () { + haptic('light'); + }); +}); +``` + +### Reactions extension example (`fof/reactions`) + +Here is how a reactions extension might integrate haptics — triggering different presets depending on the chosen reaction: + +```js +import haptic from 'flarum/common/utils/haptic'; + +// Map reaction types to haptic presets +const reactionHaptics = { + like: 'success', + love: 'success', + haha: 'light', + angry: 'heavy', + sad: 'medium', +}; + +function onReactionSelected(reactionType, post) { + const preset = reactionHaptics[reactionType] ?? 'light'; + haptic(preset); + + post.save({ reaction: reactionType }); +} +``` + +### Settings toggle (with `isHapticSupported`) + +If your extension adds a user preference to enable/disable haptics, conditionally render the setting using `isHapticSupported`: + +```js +import { extend } from 'flarum/common/extend'; +import haptic, { isHapticSupported } from 'flarum/common/utils/haptic'; +import SettingsPage from 'flarum/forum/components/SettingsPage'; +import Switch from 'flarum/common/components/Switch'; + +app.initializers.add('my-extension', () => { + extend(SettingsPage.prototype, 'settingsItems', function (items) { + // Only show the toggle on devices that support haptics + if (!isHapticSupported) return; + + items.add( + 'hapticFeedback', + { + haptic('light'); // demonstrate the effect as they toggle + this.attrs.user.savePreferences({ myExtensionHaptics: value }); + }} + > + {app.translator.trans('my-extension.forum.settings.haptic_feedback_label')} + + ); + }); +}); +``` + +### Respecting user preferences + +If your extension exposes a haptic preference, gate calls behind it: + +```js +import haptic, { isHapticSupported } from 'flarum/common/utils/haptic'; + +function maybeHaptic(preset = 'light') { + const enabled = app.session.user?.preferences()?.myExtensionHaptics ?? true; + + if (isHapticSupported && enabled) { + haptic(preset); + } +} +``` + +## TypeScript + +The `HapticInput` type is re-exported from `flarum/common/utils/haptic` (sourced from `web-haptics`): + +```ts +import haptic, { isHapticSupported } from 'flarum/common/utils/haptic'; +import type { HapticInput } from 'flarum/common/utils/haptic'; + +// HapticInput accepts a preset name, a duration in ms, or a vibrate/pause array +const preset: HapticInput = 'success'; +const duration: HapticInput = 50; +const pattern: HapticInput = [100, 50, 100]; + +// haptic(pattern?: HapticInput): void +haptic(preset); +haptic(pattern); +haptic(); // defaults to 'light' +``` + +## API Reference + +| Export | Type | Description | +|---|---|---| +| `haptic` (default) | `(pattern?: HapticInput) => void` | Trigger haptic feedback | +| `isHapticSupported` | `boolean` | Whether the device supports haptics | +| `HapticInput` | type | Re-exported from `web-haptics` — preset name, ms duration, or pattern array | diff --git a/sidebars.js b/sidebars.js index ff01b8c19..2fd08ce80 100644 --- a/sidebars.js +++ b/sidebars.js @@ -109,6 +109,7 @@ module.exports = { 'extend/authorization', 'extend/frontend-pages', 'extend/interactive-components', + 'extend/haptic-feedback', 'extend/i18n', 'extend/language-packs', 'extend/forms', From ba67768258a3618350cbfb5215829ce108053692 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Thu, 12 Mar 2026 02:31:37 +0100 Subject: [PATCH 18/39] docs: document WebP avatar conversion and animated GIF support in 2.0 changes (#508) Co-authored-by: Claude Sonnet 4.6 --- docs/extend/update-2_0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index d6ef2e2fe..c4593e510 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -423,6 +423,7 @@ Checkout this example from the mentions extension: #### Notable * The `Frontend` extender now allows passing extra attributes and classes that will be added to the root `html` tag, through the `extraDocumentAttributes` and `extraDocumentClasses` methods. * When preparing data in tests, you should use the model class name instead of the table name, this will ensure the factory of the model is used and basic data is autofilled for you. +* Avatar upload processing has been improved: static images (JPEG, PNG, BMP, WebP) are now converted to **WebP** (previously PNG), and animated GIFs are now preserved as `.gif` rather than being flattened. Extensions that read `avatar_url` and assume a `.png` extension should be updated to handle `.webp` as well. A new CLI command `php flarum avatars:convert-to-webp` is available to batch-convert any existing avatars. WebP is also now accepted as a valid upload format. ## Infrastructure From 4a10d9356e2344de371d2d149cd6a94eee5f5b89 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Fri, 13 Mar 2026 00:13:38 +0100 Subject: [PATCH 19/39] docs: update haptic guide for built-in user preference toggle (#509) Flarum core now ships a Device settings toggle for haptic feedback. Update the guide to reflect that haptic() gates on the preference automatically and extensions don't need to manage this themselves. Co-authored-by: Claude Sonnet 4.6 --- docs/extend/haptic-feedback.md | 57 +++++----------------------------- 1 file changed, 8 insertions(+), 49 deletions(-) diff --git a/docs/extend/haptic-feedback.md b/docs/extend/haptic-feedback.md index 43d09a797..482ba113e 100644 --- a/docs/extend/haptic-feedback.md +++ b/docs/extend/haptic-feedback.md @@ -70,18 +70,24 @@ Custom patterns work on both platforms. On Android they use the Web Vibration AP ## Detecting Support -Use `isHapticSupported` to conditionally show haptic-related UI (e.g. a settings toggle): +Use `isHapticSupported` to conditionally show haptic-related UI in your extension: ```js import { isHapticSupported } from 'flarum/common/utils/haptic'; if (isHapticSupported) { - // Show haptic preference toggle + // e.g. show a mobile-only tip or UI affordance } ``` `isHapticSupported` is a boolean evaluated once at page load. It is `true` on Android (Web Vibration API) and iOS (Taptic Engine via checkbox trick), and `false` on desktop browsers. +## User preference + +Flarum core includes a built-in haptic feedback toggle in the user's **Settings → Device** panel. Logged-in users can disable haptics at any time; guests always receive haptic feedback. + +`haptic()` checks this preference automatically — extensions can call it unconditionally without any extra gating. + ## Where Core Uses Haptics Flarum core and its bundled extensions apply haptics at the following interaction points: @@ -204,53 +210,6 @@ function onReactionSelected(reactionType, post) { } ``` -### Settings toggle (with `isHapticSupported`) - -If your extension adds a user preference to enable/disable haptics, conditionally render the setting using `isHapticSupported`: - -```js -import { extend } from 'flarum/common/extend'; -import haptic, { isHapticSupported } from 'flarum/common/utils/haptic'; -import SettingsPage from 'flarum/forum/components/SettingsPage'; -import Switch from 'flarum/common/components/Switch'; - -app.initializers.add('my-extension', () => { - extend(SettingsPage.prototype, 'settingsItems', function (items) { - // Only show the toggle on devices that support haptics - if (!isHapticSupported) return; - - items.add( - 'hapticFeedback', - { - haptic('light'); // demonstrate the effect as they toggle - this.attrs.user.savePreferences({ myExtensionHaptics: value }); - }} - > - {app.translator.trans('my-extension.forum.settings.haptic_feedback_label')} - - ); - }); -}); -``` - -### Respecting user preferences - -If your extension exposes a haptic preference, gate calls behind it: - -```js -import haptic, { isHapticSupported } from 'flarum/common/utils/haptic'; - -function maybeHaptic(preset = 'light') { - const enabled = app.session.user?.preferences()?.myExtensionHaptics ?? true; - - if (isHapticSupported && enabled) { - haptic(preset); - } -} -``` - ## TypeScript The `HapticInput` type is re-exported from `flarum/common/utils/haptic` (sourced from `web-haptics`): From 962f6b43d7aa88c40112a33ae29457178a3a0766 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Sun, 15 Mar 2026 00:41:10 +0100 Subject: [PATCH 20/39] docs: document logout route change from GET to POST (flarum/framework#4448) (#510) The /logout route is now a POST action. The GET route is renamed to logoutPage and only shows a no-JS confirmation page. Extension authors generating logout URLs or submitting logout requests directly need to update their code. Co-authored-by: Claude Sonnet 4.6 --- docs/extend/update-2_0.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index c4593e510..bce168276 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -418,7 +418,8 @@ Checkout this example from the mentions extension: ##### Breaking * The `(Extend\Notification)->type()` extender no longer accepts a serializer as second argument. * Notification Blueprints must now implement the `Flarum\Notification\AlertableInterface` interface in order them to be sent as alerts. This allows for email-only notifications for example. -* The [`staudenmeir/eloquent-eager-limit`](https://github.com/staudenmeir/eloquent-eager-limit) package has been removed. If you are using the `Staudenmeir\EloquentEagerLimit\HasEagerLimit` trait in any of your models, you can simply remove it as it is native to Laravel now. +* The [`staudenmeir/eloquent-eager-limit`](https://github.com/staudenmeir/eloquent-eager-limit) package has been removed. If you are using the `Staudenmeir\EloquentEagerLimit\HasEagerLimit` trait in any of your models, you can simply remove it as it is native to Laravel now. +* The `/logout` route has changed from `GET` to `POST`. The named route `logout` now refers to the `POST` action endpoint. A new `GET /logout` route named `logoutPage` shows a no-JS confirmation page. If your extension generates a logout URL using `$url->to('forum')->route('logout')`, update it to `route('logoutPage')` for the confirmation page, or submit a `POST` to `route('logout')` with a `csrfToken` body field for a direct logout. Extensions calling `app.session.logout()` on the frontend require no changes. #### Notable * The `Frontend` extender now allows passing extra attributes and classes that will be added to the root `html` tag, through the `extraDocumentAttributes` and `extraDocumentClasses` methods. From de0a3ed0fe4f2dada1963baf1eb015784b0291e4 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Sun, 15 Mar 2026 21:38:22 +0000 Subject: [PATCH 21/39] docs: document OAuth/forum auth changes in 2.0 upgrade guide (#511) Covers ResponseFactory::make() signature change, removal of authenticationComplete(), makeLoggedInResponse/makeRegistrationResponse promoted to protected, the new POST /api/registration-token endpoint, _flarum_auth and _flarum_linked query params, and SignUpModal label additions. Includes a warning pointing developers to the fof/oauth upgrade notes for the companion package changes. --- docs/extend/update-2_0.md | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index bce168276..60a8c6934 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -413,6 +413,74 @@ Checkout this example from the mentions extension: ::: +### OAuth / Forum Auth + +##### Breaking + +**`ResponseFactory::make()` — new `$returnTo` argument and return type change** + +`Flarum\Forum\Auth\ResponseFactory::make()` now requires a fourth argument `string $returnTo = '/'` and always returns a `RedirectResponse` instead of an `HtmlResponse`. The old popup-based HTML response has been removed entirely. + +```php +// Before +$this->response->make($provider, $identifier, $configureRegistration); + +// After — pass a validated same-origin returnTo URL +$this->response->make($provider, $identifier, $configureRegistration, $returnTo); +``` + +The `$returnTo` value must be a validated same-origin relative path (starting with `/`). Passing an absolute URL is a security risk — validate it before passing it in. + +**`ForumApplication::authenticationComplete()` removed** + +`authenticationComplete()` existed solely to close the old popup window. It has been removed. Extensions that called it can drop the call entirely — the new redirect flow handles everything server-side. + +**`makeLoggedInResponse()` and `makeRegistrationResponse()` are now `protected`** + +Both helper methods on `ResponseFactory` are now `protected`, making them official extension points. Subclass `ResponseFactory` and override either method to customise login redirect behaviour or the registration handoff mechanism. + +```php +class MyResponseFactory extends ResponseFactory +{ + protected function makeLoggedInResponse(User $user, string $returnTo): ResponseInterface + { + // Custom behaviour — e.g. append your own query params + return parent::makeLoggedInResponse($user, $returnTo); + } +} +``` + +Bind your subclass in a service provider: + +```php +$this->container->extend(ResponseFactory::class, fn () => new MyResponseFactory(...)); +``` + +**New `POST /api/registration-token` endpoint** + +A new unauthenticated endpoint accepts a short-lived registration token in the POST body and returns only `username`, `email`, and `provided[]`. Sensitive fields (provider name, identifier, payload internals) are never exposed. The token is submitted in the body — not the URL — so it never appears in server access logs, browser history, or Referer headers. + +This endpoint is CSRF-exempt (token possession is the credential) and is primarily used by the frontend to pre-populate the sign-up modal after an OAuth redirect. + +**`_flarum_auth` and `_flarum_linked` query parameters** + +The new redirect flow uses two query parameters appended to the `returnTo` URL: + +* `_flarum_auth=` — set when a new user arrives via OAuth and must complete registration. The frontend detects this on boot, strips it, fetches `username`/`email`/`provided` from `POST /api/registration-token`, and opens the `SignUpModal` pre-populated. +* `_flarum_linked=` — set when an existing user's account is linked to an OAuth provider for the first time (either via email-match during login, or a manual link from the security page). The frontend detects this on boot and shows a confirmation modal. + +Both parameters are stripped from the URL immediately on the client without a page reload. + +:::warning fof/oauth also updated + +If your extension extends or depends on **FriendsOfFlarum/oauth**, that package has been significantly updated alongside these core changes. The popup flow has been removed, `AbstractOAuthController` has moved from `fof/extend` into `fof/oauth` itself, and several other breaking changes apply. See the fof/oauth upgrade notes for the full migration guide. + +::: + +#### Notable + +* `SignUpModal` fields (Username, Email, Password) now render a visible `
diff --git a/docs/extend/interactive-components.md b/docs/extend/interactive-components.md index bb46fc633..fc3834dc8 100644 --- a/docs/extend/interactive-components.md +++ b/docs/extend/interactive-components.md @@ -38,8 +38,10 @@ As opposed to alerts, most modals will use a custom class, inheriting `flarum/co import Modal from 'flarum/common/components/Modal'; export default class CustomModal extends Modal { - // True by default, dictates whether the modal can be dismissed by clicking on the background or in the top right corner. - static isDismissible = true; + // All true by default. These control whether the modal can be dismissed via the close button, the Esc key, and clicking the backdrop, respectively. + static isDismissibleViaCloseButton = true; + static isDismissibleViaEscKey = true; + static isDismissibleViaBackdropClick = true; className() { // Custom CSS classes to apply to the modal @@ -64,8 +66,10 @@ Modals with forms inherit `flarum/common/components/FormModal`. This class provi import FormModal from 'flarum/common/components/FormModal'; export default class CustomFormModal extends FormModal { - // True by default, dictates whether the modal can be dismissed by clicking on the background or in the top right corner. - static isDismissible = true; + // All true by default. These control whether the modal can be dismissed via the close button, the Esc key, and clicking the backdrop, respectively. + static isDismissibleViaCloseButton = true; + static isDismissibleViaEscKey = true; + static isDismissibleViaBackdropClick = true; className() { // Custom CSS classes to apply to the modal diff --git a/docs/extend/notifications.md b/docs/extend/notifications.md index bb9626021..2b45d342e 100644 --- a/docs/extend/notifications.md +++ b/docs/extend/notifications.md @@ -12,7 +12,7 @@ To define a notification type, you will need to create a new class which impleme * `getSubject()` The model that the notification is about (eg. the `Post` that was liked). * `getData()` Any other data you might wish to include for access on the frontend (eg. the old discussion title when renamed). * `getType()` This is where you name your notification, this will be important for later steps. -* `getSubjectModal()`: Specify the type of model the subject is (from `getSubject`). +* `getSubjectModel()`: Specify the type of model the subject is (from `getSubject`). Lets take a look at an example from [Flarum Likes](https://github.com/flarum/likes/blob/master/src/Notification/PostLikedBlueprint.php): @@ -107,10 +107,12 @@ Let's take a look at an example from [Flarum Mentions](https://github.com/flarum namespace Flarum\Mentions\Notification; +use Flarum\Database\AbstractModel; use Flarum\Notification\AlertableInterface; use Flarum\Notification\Blueprint\BlueprintInterface; use Flarum\Notification\MailableInterface; use Flarum\Post\Post; +use Flarum\User\User; use Symfony\Contracts\Translation\TranslatorInterface; class PostMentionedBlueprint implements BlueprintInterface, AlertableInterface, MailableInterface @@ -263,7 +265,7 @@ First, create a class that extends the notification component. Then, there are 4 * `icon()`: The [Font Awesome](https://fontawesome.com/) icon that will appear next to the notification text (example: `fas fa-code-branch`). * `href()`: The link that should be opened when the notification is clicked (example: `app.route.post(this.attrs.notification.subject())`). * `content()`: What the notification itself should show. It should say the username and then the action. It will be followed by when the notification was sent (make sure to use translations). -* `exerpt()`: (optional) A little excerpt that is shown below the notification (commonly an excerpt of a post). +* `excerpt()`: A little excerpt that is shown below the notification (commonly an excerpt of a post). *Let take a look at our example shall we?* @@ -355,7 +357,6 @@ From [Flarum Likes](https://github.com/flarum/likes/blob/master/src/Listener/Sen namespace Flarum\Likes\Listener; -use Flarum\Event\ConfigureNotificationTypes; use Flarum\Likes\Event\PostWasLiked; use Flarum\Likes\Event\PostWasUnliked; use Flarum\Likes\Notification\PostLikedBlueprint; diff --git a/docs/extend/routes.md b/docs/extend/routes.md index 853266187..7cd5750b5 100644 --- a/docs/extend/routes.md +++ b/docs/extend/routes.md @@ -166,7 +166,7 @@ import FoobarPage from './components/FoobarPage'; export default [ new Extend.Routes() - .add('acme.foobar', '/foobar', ), + .add('acme.foobar', '/foobar', FoobarPage), ]; ``` @@ -190,7 +190,7 @@ Frontend routes also allow you to capture segments of the URI: ```jsx new Extend.Routes() - .add('acme.user', '/user/:id', ) + .add('acme.user', '/user/:id', UsersPage) ``` Route parameters will be passed into the `attrs` of the route's component. They will also be available through [`m.route.param`](https://mithril.js.org/route.html#mrouteparam) diff --git a/docs/extend/search.md b/docs/extend/search.md index b78a1d40a..2e3cb3bce 100644 --- a/docs/extend/search.md +++ b/docs/extend/search.md @@ -63,7 +63,7 @@ We can use a *search mutator* for this: namespace YourPackage\Filter; use Flarum\Search\Database\DatabaseSearchState; -use Flarum\Seach\SeachCriteria; +use Flarum\Search\SearchCriteria; class OnlySameCountrySearchMutator { @@ -144,7 +144,7 @@ return [ (new Extend\SearchDriver(DatabaseSearchDriver::class)) ->addSearcher(Acme::class, AcmeSearcher::class) - ->setFullText(AcmeSearcher::class, AcmeFulltextFilter::class), + ->setFulltext(AcmeSearcher::class, AcmeFulltextFilter::class), // Other extenders.. ]; @@ -184,7 +184,7 @@ return [ (new Extend\SearchDriver(AcmeSearchDriver::class)) ->addSearcher(Acme::class, AcmeSearcher::class) // Optionally, you can set a fulltext filter for your searcher, a filter and/or a mutator. - ->setFullText(AcmeSearcher::class, AcmeFulltextFilter::class) + ->setFulltext(AcmeSearcher::class, AcmeFulltextFilter::class) ->addFilter(AcmeSearcher::class, AcmeFilter::class) ->addMutator(AcmeSearcher::class, AcmeMutator::class), diff --git a/docs/extend/settings.md b/docs/extend/settings.md index 905f235a4..45a0f64f6 100644 --- a/docs/extend/settings.md +++ b/docs/extend/settings.md @@ -89,7 +89,7 @@ return [ // In this example, we'll append a string to it. return "My Cool Setting: $retrievedValue"; - }, "default value!"), + }), ] ``` diff --git a/docs/extend/testing.md b/docs/extend/testing.md index a25b15da5..3633477f0 100644 --- a/docs/extend/testing.md +++ b/docs/extend/testing.md @@ -442,7 +442,7 @@ For example: namespace CoolExtension\Tests\integration; -use Flarum\Tests\integration\ConsoleTestCase; +use Flarum\Testing\integration\ConsoleTestCase; use PHPUnit\Framework\Attributes\Test; class ConsoleTest extends ConsoleTestCase @@ -598,7 +598,7 @@ Integration tests are used to test the components of your frontend code and the Here's a simple example of an integration test for core's `Alert` component: ```ts -import bootstrapForum from '@flarum/jest-config/src/boostrap/forum'; +import bootstrapForum from '@flarum/jest-config/src/bootstrap/forum'; import Alert from '../../../../src/common/components/Alert'; import m from 'mithril'; import mq from 'mithril-query'; @@ -677,7 +677,7 @@ You cannot bootstrap both the forum and admin app in the same test file. If you ###### Examples ```ts -import bootstrapForum from '@flarum/jest-config/src/boostrap/forum'; +import bootstrapForum from '@flarum/jest-config/src/bootstrap/forum'; describe('Forum tests', () => { beforeAll(() => bootstrapForum()); @@ -689,7 +689,7 @@ describe('Forum tests', () => { ``` ```ts -import bootstrapAdmin from '@flarum/jest-config/src/boostrap/admin'; +import bootstrapAdmin from '@flarum/jest-config/src/bootstrap/admin'; describe('Admin tests', () => { beforeAll(() => bootstrapAdmin()); diff --git a/docs/extend/update-2_0-api.md b/docs/extend/update-2_0-api.md index b79c50af4..b04d120f4 100644 --- a/docs/extend/update-2_0-api.md +++ b/docs/extend/update-2_0-api.md @@ -279,7 +279,7 @@ class DraftResource extends Resource\AbstractDatabaseResource } // insert-start - public function creating(object $model, OriginalContext $context): ?object + public function creating(object $model, Context $context): ?object { $model->user_id = $context->getActor()->id; $model->ip_address = $context->request->getAttribute('ipAddress'); @@ -458,7 +458,7 @@ class DraftResource extends Resource\AbstractDatabaseResource ]; } - public function creating(object $model, OriginalContext $context): ?object + public function creating(object $model, Context $context): ?object { $model->user_id = $context->getActor()->id; $model->ip_address = $context->request->getAttribute('ipAddress'); @@ -468,7 +468,7 @@ class DraftResource extends Resource\AbstractDatabaseResource } // insert-start - public function updating(object $model, OriginalContext $context): ?object + public function updating(object $model, Context $context): ?object { $model->ip_address = $context->request->getAttribute('ipAddress'); $model->updated_at = Carbon::now(); @@ -595,7 +595,7 @@ class DraftResource extends Resource\AbstractDatabaseResource ]; } - public function creating(object $model, OriginalContext $context): ?object + public function creating(object $model, Context $context): ?object { $model->user_id = $context->getActor()->id; $model->ip_address = $context->request->getAttribute('ipAddress'); @@ -604,7 +604,7 @@ class DraftResource extends Resource\AbstractDatabaseResource return $model; } - public function updating(object $model, OriginalContext $context): ?object + public function updating(object $model, Context $context): ?object { $model->ip_address = $context->request->getAttribute('ipAddress'); $model->updated_at = Carbon::now(); @@ -665,7 +665,7 @@ class DraftResource extends Resource\AbstractDatabaseResource } // insert-start - public function scope(Builder $query, OriginalContext $context): void + public function scope(Builder $query, Context $context): void { $query->where('user_id', $context->getActor()->id); } @@ -728,7 +728,7 @@ class DraftResource extends Resource\AbstractDatabaseResource ]; } - public function creating(object $model, OriginalContext $context): ?object + public function creating(object $model, Context $context): ?object { $model->user_id = $context->getActor()->id; $model->ip_address = $context->request->getAttribute('ipAddress'); @@ -737,7 +737,7 @@ class DraftResource extends Resource\AbstractDatabaseResource return $model; } - public function updating(object $model, OriginalContext $context): ?object + public function updating(object $model, Context $context): ?object { $model->ip_address = $context->request->getAttribute('ipAddress'); $model->updated_at = Carbon::now(); @@ -808,7 +808,7 @@ class DraftResource extends Resource\AbstractDatabaseResource return Draft::class; } - public function scope(Builder $query, OriginalContext $context): void + public function scope(Builder $query, Context $context): void { $query->where('user_id', $context->getActor()->id); } @@ -877,7 +877,7 @@ class DraftResource extends Resource\AbstractDatabaseResource ]; } - public function creating(object $model, OriginalContext $context): ?object + public function creating(object $model, Context $context): ?object { $model->user_id = $context->getActor()->id; $model->ip_address = $context->request->getAttribute('ipAddress'); @@ -886,7 +886,7 @@ class DraftResource extends Resource\AbstractDatabaseResource return $model; } - public function updating(object $model, OriginalContext $context): ?object + public function updating(object $model, Context $context): ?object { $model->ip_address = $context->request->getAttribute('ipAddress'); $model->updated_at = Carbon::now(); @@ -917,7 +917,7 @@ class DraftResource extends Resource\AbstractDatabaseResource { ... - public function scope(Builder $query, OriginalContext $context): void + public function scope(Builder $query, Context $context): void { $query->whereVisibleTo($context->getActor()); } @@ -1658,7 +1658,7 @@ class FlagResource extends AbstractDatabaseResource ... // insert-start - public function scope(Builder $query, OriginalContext $context): void + public function scope(Builder $query, Context $context): void { $query->whereVisibleTo($actor); diff --git a/docs/extend/update-2_0.md b/docs/extend/update-2_0.md index 5fb4fdb1a..9e05d6ef7 100644 --- a/docs/extend/update-2_0.md +++ b/docs/extend/update-2_0.md @@ -101,7 +101,7 @@ Familiarize yourself with the new [Code Splitting](./code-splitting) feature to * The forum search UI has been refactored to use a new `SearchModal` component. * The `flarum/forum/components/Search` component is no longer the global search component, it can still be used for custom search purposes. * Custom global search sources should be registered in `flarum/forum/components/GlobalSearch` `sourceItems` method. -* Custom global search sources should now implement the `GlobalSearchSource` interface instead of `SearchSource`, see https://github.com/flarum/framework/blob/2.x/framework/core/js/src/common/components/AbstractSearch.tsx#L26-L69. +* Custom global search sources should now implement the `GlobalSearchSource` interface instead of `SearchSource`, see https://github.com/flarum/framework/blob/2.x/framework/core/js/src/common/components/AbstractGlobalSearch.tsx#L26-L69. * The `flarum/forum/states/SearchState` class has been moved to `flarum/common/states/SearchState`. ### Admin Search @@ -317,7 +317,7 @@ Flarum 2.0 completely refactors the JSON:API implementation. The way resource CR * The `AbstractSerializer` has been removed. * The `ApiController` and `ApiSerializer` extenders have been removed. * The `Saving` are dispatched after the validation process instead of before. -* The various validators have been removed. This includes the `DiscussionValidator`, `PostValidator`, `TagValidator`, `SuspendValidator`, `GroupValidator`, `UserValidator`. +* Several validators have been removed. This includes the `DiscussionValidator`, `PostValidator`, `TagValidator`, `SuspendValidator`, and `GroupValidator`. (`UserValidator` is still present.) * Many command handlers have been removed. Use the `JsonApi` class if you wish to execute logic from an existing endpoint internally instead. * The `flarum.forum.discussions.sortmap` singleton has been removed. Instead, you can define an `ascendingAlias` and `descendingAlias` [on your added `SortColumn` sorts](./api#adding-sort-columns). * The `show` discussion endpoint no longer includes the `posts` relationship, so any `posts.*` relation includes or eager loads added to that endpoint must be removed. You can move those to the `list` posts endpoint if you are not already doing the same on that endpoint. diff --git a/docs/extend/views.md b/docs/extend/views.md index 736612cc8..92c9a3653 100644 --- a/docs/extend/views.md +++ b/docs/extend/views.md @@ -47,7 +47,7 @@ Note that all Blade templates rendered this way automatically have access to the - `$url`: a [URL generator](routes#generating-urls) instance. - `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. +- `$settings`: a [SettingsRepositoryInterface](settings) instance. - `$slugManager`: a [SlugManager](slugging) instance. Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/2.x/framework/core/src/Api/Resource/ForumResource.php). diff --git a/docs/install.md b/docs/install.md index 7ab99a65f..84120caad 100644 --- a/docs/install.md +++ b/docs/install.md @@ -25,6 +25,18 @@ Before you install Flarum, it's important to check that your server meets the re * PostgreSQL 10.0+ * **SSH (command-line) access** to run potentially necessary software maintenance commands, and Composer if you intend on using the command-line to install and manage Flarum extensions. +:::tip Recommended database versions + +The versions above are the minimums Flarum supports, but older releases such as **MySQL 5.7** and **MariaDB 10.x** are approaching (or past) their upstream end-of-life and are **not recommended** for new installs. For the best performance and longest support window, we recommend running a current LTS-grade release: + +* **MySQL 8.4 LTS** +* **MariaDB 11.8 LTS** +* **PostgreSQL 15, 16, or 17** + +These are the versions Flarum is actively developed and tested against. Note that Flarum treats **MySQL and MariaDB as distinct database drivers** — make sure your `config.php` `driver` matches the server you're actually connecting to. + +::: + ## Installing ### Installing by unpacking an archive diff --git a/docs/rest-api.md b/docs/rest-api.md index 9ede50b63..fc7433529 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -85,7 +85,7 @@ At the moment, 3 token types exist, although only 2 types can be created via the - `session_remember` tokens expire after 5 years of inactivity. They can be obtained by specifying `remember=1` in the request attributes. - `developer` tokens never expire. They can only be created manually in the database at the moment. -**All access tokens are deleted when the user logs out** (this includes `developer` tokens, although it is planned to change it). +**Logging out deletes only the access token used by that session.** A global logout (`POST /logout` with `?global=1`), and changing the user's password, delete *all* of the user's access tokens — including `developer` tokens. #### Usage diff --git a/docs/update.md b/docs/update.md index 92c2d041c..a9581d6f8 100644 --- a/docs/update.md +++ b/docs/update.md @@ -32,6 +32,12 @@ Flarum 2.0 requires **PHP 8.3 or higher**. Check your current version with `php Also confirm you're on Composer 2: `composer --version`. +:::tip Check your database version too + +Flarum 2.0 still supports older databases, but releases such as **MySQL 5.7** and **MariaDB 10.x** are at or near upstream end-of-life and are **not recommended**. If you're planning maintenance anyway, this is a good moment to move to a current LTS-grade release: **MySQL 8.4 LTS**, **MariaDB 11.8 LTS**, or **PostgreSQL 15/16/17** — the versions Flarum is actively tested against. + +::: + **3. Check for incompatible or superseded extensions.** Some extensions are no longer compatible with v2, and some have been superseded: From 2ebfc905db8b12242f7c201c9a93dec34fc1cde6 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Tue, 9 Jun 2026 16:13:47 +0100 Subject: [PATCH 37/39] docs: rewrite mail and middleware extend pages for 2.x (#531) Both pages were carried over verbatim from the 1.x docs and described APIs that no longer exist in 2.x. mail.md: - buildTransport() now returns a Symfony Mailer TransportInterface, not a Swift_Transport (Swiftmailer was replaced by Symfony Mailer) - validate() must return its MessageBag - model the example on core's real MailgunDriver (Symfony transport factory + Dsn), and note the symfony/*-mailer bridge packages - Extend\Mail::driver() takes (identifier, class), not just the class middleware.md: - the Middleware extender has no 'frontend' stack; only forum/admin/api - replace the removed Tobscure JsonApi Document/ResponseBag example with the 2.x approach: throw Flarum\Foundation\ValidationException, or build a JsonApiResponse from a plain document array --- docs/extend/mail.md | 70 +++++++++++++++++++++++++++++---------- docs/extend/middleware.md | 55 ++++++++++++++++++++---------- 2 files changed, 89 insertions(+), 36 deletions(-) diff --git a/docs/extend/mail.md b/docs/extend/mail.md index 2e3f050d4..24ca0db75 100644 --- a/docs/extend/mail.md +++ b/docs/extend/mail.md @@ -1,35 +1,51 @@ # Mail Drivers -In addition to the [default drivers in core](../mail.md), Flarum allows new mail drivers to be added through extenders. To create your own mail driver, you'll need to create a class implementing `\Flarum\Mail\DriverInterface`. Flarum actually takes care of the frontend for providing email settings: just declare which settings you need, and any default values, in `availableSettings`. +In addition to the [default drivers in core](../mail.md), Flarum allows new mail drivers to be added through extenders. To create your own mail driver, you'll need to create a class implementing `\Flarum\Mail\DriverInterface`. Flarum takes care of the frontend for providing email settings: just declare which settings you need, and any default values, in `availableSettings()`. -For example: +:::info Symfony Mailer + +Flarum 2.0 uses [Symfony Mailer](https://symfony.com/doc/current/mailer.html) under the hood (Flarum 1.x used Swiftmailer). A driver's `buildTransport()` therefore returns a `Symfony\Component\Mailer\Transport\TransportInterface`, which you typically obtain from one of Symfony's transport factories. + +::: + +The `DriverInterface` declares the following methods: + +- **`availableSettings(): array`** — the settings this driver needs. Each key is a setting name; the value is either an empty string `''` for a free-text field, or an array of `value => label` pairs for a dropdown. Flarum renders these automatically on the admin mail page. +- **`validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag`** — validate the configured settings and **return** the resulting `MessageBag`. Return an empty `MessageBag` when everything is valid; if validation fails, Flarum falls back to the no-op `NullDriver`. +- **`canSend(): bool`** — whether this driver can actually send mail with its current configuration. +- **`buildTransport(SettingsRepositoryInterface $settings): TransportInterface`** — build and return the Symfony Mailer transport. + +Here is core's own Mailgun driver as a complete example: ```php use Flarum\Mail\DriverInterface; +use Flarum\Settings\SettingsRepositoryInterface; use Illuminate\Contracts\Validation\Factory; -use Illuminate\Mail\Transport\MailgunTransport; use Illuminate\Support\MessageBag; -use Swift_Transport; +use Symfony\Component\Mailer\Bridge\Mailgun\Transport\MailgunTransportFactory; +use Symfony\Component\Mailer\Transport\Dsn; +use Symfony\Component\Mailer\Transport\TransportInterface; class MailgunDriver implements DriverInterface { public function availableSettings(): array { return [ - 'setting_one' => '', - 'setting_two' => 'defaultValue', - 'dropdown_setting' => [ - 'option_one_val' => 'Option One Display', - 'option_two_val' => 'Option Two Display', + 'mail_mailgun_secret' => '', // the secret key + 'mail_mailgun_domain' => '', // the sending domain + 'mail_mailgun_region' => [ // region's endpoint (dropdown) + 'api.mailgun.net' => 'US', + 'api.eu.mailgun.net' => 'EU', ], ]; } public function validate(SettingsRepositoryInterface $settings, Factory $validator): MessageBag { - $validator->make($settings->all(), [ - 'setting_one' => 'required', - 'setting_two' => 'nullable|integer', + return $validator->make($settings->all(), [ + 'mail_mailgun_secret' => ['required'], + 'mail_mailgun_domain' => ['required'], + 'mail_mailgun_region' => 'required|in:api.mailgun.net,api.eu.mailgun.net', ])->errors(); } @@ -38,22 +54,40 @@ class MailgunDriver implements DriverInterface return true; } - public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport + public function buildTransport(SettingsRepositoryInterface $settings): TransportInterface { - // Return a mail transport that implements Swift Transport + $factory = new MailgunTransportFactory(); + + return $factory->create(new Dsn( + 'mailgun+api', + $settings->get('mail_mailgun_region'), + $settings->get('mail_mailgun_secret'), + $settings->get('mail_mailgun_domain') + )); } } ``` -To register mail drivers, use the `Flarum\Extend\Mail` extender in your extension's `extend.php` file: +:::tip + +Symfony ships transport factories for many providers (Amazon SES, Mailgun, Postmark, Sendgrid, and more) as separate `symfony/*-mailer` bridge packages. Require the bridge you need in your extension's `composer.json` and use its `TransportFactory` inside `buildTransport()`, exactly as the example does for Mailgun. For a plain SMTP server, build a `Symfony\Component\Mailer\Transport\Dsn` with the `smtp`/`smtps` scheme — see core's `Flarum\Mail\SmtpDriver` for a reference implementation. + +::: + +## Registering the driver + +To register a mail driver, use the `Flarum\Extend\Mail` extender in your extension's `extend.php` file. The `driver()` method takes **two** arguments: a string identifier (used as the value of the `mail_driver` setting) and the driver's class-string. ```php use Flarum\Extend; use YourNamespace\Mail\CustomDriver; return [ - // Other extenders - (new Extend\Mail())->driver(CustomDriver::class) - // Other extenders + // Other extenders + (new Extend\Mail()) + ->driver('custom', CustomDriver::class), + // Other extenders ]; ``` + +The identifier (`'custom'` above) is what an administrator selects on the admin mail page to activate your driver. diff --git a/docs/extend/middleware.md b/docs/extend/middleware.md index 09300e96a..284fb52b0 100644 --- a/docs/extend/middleware.md +++ b/docs/extend/middleware.md @@ -40,7 +40,7 @@ return [ // API frontend (new Extend\Middleware('api'))->add(YourMiddleware::class), - (new Extend\Middleware('frontend')) + (new Extend\Middleware('forum')) // remove a middleware (e.g. remove CSRF token check 😱) ->remove(CheckCsrfToken::class) // insert before another middleware (e.g. before a CSRF token check) @@ -54,6 +54,12 @@ return [ Tada! Middleware registered. Remember that order matters. +:::info Available stacks + +The `Middleware` extender accepts one of three stacks: `'forum'`, `'admin'`, or `'api'`. There is no single combined `'frontend'` stack — if you need your middleware on both the forum and admin frontends, register it against each. + +::: + Now that we've got the basics down, let's run through a few more things: ## Restricting Middleware to Certain Routes @@ -93,36 +99,49 @@ Of course, you can use any condition, not just the current route. Simple, right? ## Returning Your Own Response -Let's refer back to the example and say you're checking a user against an external database during registration. One user registers and they are found in this database. Uh-oh! Let's keep them from registering: +Let's refer back to the example and say you're checking a user against an external database during registration. One user registers and they are found in this database. Uh-oh! Let's keep them from registering. + +The simplest way to reject input with a field-scoped error is to throw a `Flarum\Foundation\ValidationException`. Flarum's error handler turns it into a properly-formatted JSON:API `422` error response for you: ```php -use Flarum\Api\JsonApiResponse; -use Tobscure\JsonApi\Document; -use Tobscure\JsonApi\Exception\Handler\ResponseBag; +use Flarum\Foundation\ValidationException; public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if ($userFoundInDatabase) { - $error = new ResponseBag('422', [ - [ - 'status' => '422', - 'code' => 'validation_error', - 'source' => [ - 'pointer' => '/data/attributes/email', - ], - 'detail' => 'Yikes! Your email can\'t be used.', - ], + // Keys are attribute names; values are the error messages. + throw new ValidationException([ + 'email' => 'Yikes! Your email can\'t be used.', ]); - $document = new Document(); - $document->setErrors($error->getErrors()); - - return new JsonApiResponse($document, $error->getStatus()); } return $handler->handle($request); } ``` +:::info JSON:API in 2.0 + +Flarum 2.0 replaced the Tobscure JSON:API library with [`flarum/json-api-server`](https://github.com/flarum/json-api-server). The old `Tobscure\JsonApi\Document` / `ResponseBag` classes no longer exist. Throwing an exception (as above) is the recommended way to return errors from middleware. + +::: + +If you need full control over the body, `Flarum\Api\JsonApiResponse` now accepts a plain document array (rather than a Tobscure `Document`) and sets the `application/vnd.api+json` content type for you: + +```php +use Flarum\Api\JsonApiResponse; + +return new JsonApiResponse([ + 'errors' => [ + [ + 'status' => '422', + 'code' => 'validation_error', + 'source' => ['pointer' => '/data/attributes/email'], + 'detail' => 'Yikes! Your email can\'t be used.', + ], + ], +], 422); +``` + Phew! Crisis avoided. To learn more about the request and response objects, see the [PSR HTTP message interfaces](https://www.php-fig.org/psr/psr-7/#1-specification) documentation. From ea2a9d84165c70de414e1f64a245964c43b865ae Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Tue, 9 Jun 2026 17:14:58 +0100 Subject: [PATCH 38/39] Upgrade to Docusaurus 3, standardize on Yarn, improve SEO, invalidate stale 2.x translations (#532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docusaurus 3 upgrade: - @docusaurus/* 2.3.1 -> 3.10.1, React 17 -> 18, MDX 1 -> 3, prism-react-renderer 1 -> 2 (named-export theme import), clsx/@svgr bumps - drop the webpack 5.88.2 `overrides` pin (no longer needed on v3; the webpackbar/ProgressPlugin schema mismatch that forced it is gone) - migrate onBrokenMarkdownLinks to markdown.hooks (v3 location) - escape MDX-v3-breaking literals ({user}, <=0.1.0, stray <) in English, versioned, and locale content so all 7 builds compile Tooling: - standardize on Yarn (regenerate yarn.lock, remove package-lock.json); CI uses `yarn install --frozen-lockfile` + `yarn build` with yarn cache - bump workflow Node 20 -> 24; pin actions/checkout to @v4 - README: Node >=20, Yarn commands, and a Translations section documenting the Crowdin workflow SEO: - fix `url` to https://docs.flarum.org (was flarum.org) — corrects canonical, og:url, sitemap domain, and hreflang across the site - set themeConfig.image to a Flarum banner for og:image/twitter:image - site-level WebSite/Organization JSON-LD via headTags - per-page TechArticle + BreadcrumbList JSON-LD via a local postBuild plugin (no theme swizzle; works across all locales) - onBrokenAnchors: 'warn' Translations: - invalidate the 2.x (current) translations for all locales: they were frozen at a Dec-2024 snapshot, ~18 months and 40+ commits behind, and translated since-corrected content (e.g. the pre-Symfony mail API). Docusaurus falls back to English for untranslated 2.x pages. - 1.x translations, code.json, and theme translations are kept - disable the 2.x source mapping in crowdin.yml so it isn't regenerated --- .github/workflows/deploy.yml | 9 +- README.md | 31 +- crowdin.yml | 8 +- docs/extend/notifications.md | 2 +- docusaurus.config.js | 43 +- .../current/README.md | 45 - .../current/admin.md | 13 - .../current/bugs.md | 28 - .../current/code-of-conduct.md | 51 - .../current/composer.md | 152 - .../current/config.md | 35 - .../current/console.md | 77 - .../current/contributing-docs-translations.md | 26 - .../current/contributing.md | 170 - .../current/extend/README.md | 40 - .../current/extend/admin.md | 214 - .../current/extend/api-throttling.md | 58 - .../current/extend/api.md | 353 - .../current/extend/assets.md | 7 - .../current/extend/authorization.md | 206 - .../current/extend/backend-events.md | 172 - .../current/extend/cli.md | 15 - .../current/extend/console.md | 70 - .../current/extend/distribution.md | 40 - .../current/extend/extending-extensions.md | 122 - .../current/extend/extensibility.md | 65 - .../current/extend/filesystem.md | 129 - .../current/extend/formatting.md | 42 - .../current/extend/forms.md | 108 - .../current/extend/frontend-pages.md | 218 - .../current/extend/frontend.md | 422 - .../current/extend/github-actions.md | 119 - .../current/extend/i18n.md | 467 - .../current/extend/interactive-components.md | 93 - .../current/extend/language-packs.md | 56 - .../current/extend/mail.md | 59 - .../current/extend/middleware.md | 156 - .../current/extend/model-visibility.md | 266 - .../current/extend/models.md | 334 - .../current/extend/notifications.md | 413 - .../current/extend/permissions.md | 73 - .../current/extend/post-types.md | 1 - .../current/extend/routes.md | 281 - .../current/extend/search.md | 202 - .../current/extend/service-provider.md | 65 - .../current/extend/settings.md | 90 - .../current/extend/slugging.md | 1 - .../current/extend/start.md | 153 - .../current/extend/static-code-analysis.md | 86 - .../current/extend/testing.md | 565 - .../current/extend/theme.md | 27 - .../current/extend/update-1_0.md | 257 - .../current/extend/update-1_x.md | 139 - .../current/extend/update-b10.md | 53 - .../current/extend/update-b12.md | 34 - .../current/extend/update-b13.md | 40 - .../current/extend/update-b14.md | 757 - .../current/extend/update-b15.md | 60 - .../current/extend/update-b16.md | 138 - .../current/extend/update-b8.md | 114 - .../current/extend/views.md | 63 - .../current/extenders.md | 23 - .../current/extensions.md | 118 - .../current/faq.md | 35 - .../current/install.md | 198 - .../current/internal/README.md | 7 - .../internal/bundled-extensions-policy.md | 28 - .../current/internal/extension-manager.md | 87 - .../current/internal/merging-policy.md | 38 - .../current/internal/merging.md | 29 - .../current/internal/package-manager.md | 89 - .../current/languages.md | 29 - .../current/mail.md | 29 - .../current/releases.md | 15 - .../current/rest-api.md | 375 - .../current/scheduler.md | 55 - .../current/themes.md | 29 - .../current/troubleshoot.md | 56 - .../current/update.md | 110 - .../version-1.x/extend/notifications.md | 2 +- .../version-1.x/update.md | 4 +- .../current/README.md | 45 - .../current/admin.md | 13 - .../current/bugs.md | 28 - .../current/code-of-conduct.md | 51 - .../current/composer.md | 152 - .../current/config.md | 35 - .../current/console.md | 77 - .../current/contributing-docs-translations.md | 26 - .../current/contributing.md | 170 - .../current/current.json | 42 - .../current/extend/README.md | 40 - .../current/extend/admin.md | 217 - .../current/extend/api-throttling.md | 62 - .../current/extend/api.md | 353 - .../current/extend/assets.md | 7 - .../current/extend/authorization.md | 235 - .../current/extend/backend-events.md | 215 - .../current/extend/cli.md | 15 - .../current/extend/console.md | 79 - .../current/extend/data.md | 562 - .../current/extend/distribution.md | 40 - .../current/extend/extending-extensions.md | 122 - .../current/extend/extensibility.md | 65 - .../current/extend/filesystem.md | 129 - .../current/extend/formatting.md | 42 - .../current/extend/forms.md | 108 - .../current/extend/frontend-pages.md | 215 - .../current/extend/frontend.md | 418 - .../current/extend/github-actions.md | 119 - .../current/extend/i18n.md | 467 - .../current/extend/interactive-components.md | 93 - .../current/extend/language-packs.md | 56 - .../current/extend/mail.md | 59 - .../current/extend/middleware.md | 166 - .../current/extend/model-visibility.md | 265 - .../current/extend/models.md | 334 - .../current/extend/notifications.md | 413 - .../current/extend/permissions.md | 73 - .../current/extend/post-types.md | 1 - .../current/extend/routes.md | 281 - .../current/extend/search.md | 202 - .../current/extend/service-provider.md | 65 - .../current/extend/settings.md | 90 - .../current/extend/slugging.md | 1 - .../current/extend/start.md | 153 - .../current/extend/static-code-analysis.md | 86 - .../current/extend/testing.md | 565 - .../current/extend/theme.md | 27 - .../current/extend/translate.md | 39 - .../current/extend/update-1_0.md | 257 - .../current/extend/update-1_x.md | 139 - .../current/extend/update-b10.md | 53 - .../current/extend/update-b12.md | 34 - .../current/extend/update-b13.md | 40 - .../current/extend/update-b14.md | 757 - .../current/extend/update-b15.md | 60 - .../current/extend/update-b16.md | 138 - .../current/extend/update-b8.md | 114 - .../current/extend/views.md | 63 - .../current/extenders.md | 23 - .../current/extensions.md | 118 - .../current/faq.md | 35 - .../current/install.md | 198 - .../current/internal/README.md | 7 - .../internal/bundled-extensions-policy.md | 28 - .../current/internal/extension-manager.md | 87 - .../current/internal/merging-policy.md | 38 - .../current/internal/merging.md | 29 - .../current/internal/package-manager.md | 89 - .../current/languages.md | 29 - .../current/mail.md | 29 - .../current/releases.md | 15 - .../current/rest-api.md | 375 - .../current/scheduler.md | 55 - .../current/themes.md | 29 - .../current/troubleshoot.md | 56 - .../current/update.md | 110 - .../version-1.x/extend/notifications.md | 2 +- .../version-1.x/update.md | 4 +- .../current/README.md | 45 - .../current/admin.md | 13 - .../current/bugs.md | 28 - .../current/code-of-conduct.md | 51 - .../current/composer.md | 152 - .../current/config.md | 35 - .../current/console.md | 77 - .../current/contributing-docs-translations.md | 26 - .../current/contributing.md | 170 - .../current/current.json | 42 - .../current/extend/README.md | 40 - .../current/extend/admin.md | 214 - .../current/extend/api-throttling.md | 58 - .../current/extend/api.md | 353 - .../current/extend/assets.md | 7 - .../current/extend/authorization.md | 206 - .../current/extend/backend-events.md | 215 - .../current/extend/cli.md | 15 - .../current/extend/console.md | 70 - .../current/extend/data.md | 568 - .../current/extend/distribution.md | 40 - .../current/extend/extending-extensions.md | 122 - .../current/extend/extensibility.md | 65 - .../current/extend/filesystem.md | 129 - .../current/extend/formatting.md | 42 - .../current/extend/forms.md | 108 - .../current/extend/frontend-pages.md | 226 - .../current/extend/frontend.md | 502 - .../current/extend/github-actions.md | 119 - .../current/extend/i18n.md | 475 - .../current/extend/interactive-components.md | 93 - .../current/extend/language-packs.md | 56 - .../current/extend/mail.md | 59 - .../current/extend/middleware.md | 156 - .../current/extend/model-visibility.md | 265 - .../current/extend/models.md | 334 - .../current/extend/notifications.md | 413 - .../current/extend/permissions.md | 73 - .../current/extend/post-types.md | 1 - .../current/extend/routes.md | 281 - .../current/extend/search.md | 202 - .../current/extend/service-provider.md | 65 - .../current/extend/settings.md | 90 - .../current/extend/slugging.md | 1 - .../current/extend/start.md | 153 - .../current/extend/static-code-analysis.md | 86 - .../current/extend/testing.md | 565 - .../current/extend/theme.md | 27 - .../current/extend/translate.md | 40 - .../current/extend/update-1_0.md | 257 - .../current/extend/update-1_x.md | 139 - .../current/extend/update-b10.md | 53 - .../current/extend/update-b12.md | 34 - .../current/extend/update-b13.md | 40 - .../current/extend/update-b14.md | 757 - .../current/extend/update-b15.md | 60 - .../current/extend/update-b16.md | 138 - .../current/extend/update-b8.md | 114 - .../current/extend/views.md | 63 - .../current/extenders.md | 23 - .../current/extensions.md | 118 - .../current/faq.md | 35 - .../current/install.md | 198 - .../current/internal/README.md | 7 - .../internal/bundled-extensions-policy.md | 28 - .../current/internal/extension-manager.md | 87 - .../current/internal/merging-policy.md | 38 - .../current/internal/merging.md | 29 - .../current/internal/package-manager.md | 89 - .../current/languages.md | 29 - .../current/mail.md | 29 - .../current/releases.md | 15 - .../current/rest-api.md | 375 - .../current/scheduler.md | 55 - .../current/themes.md | 29 - .../current/troubleshoot.md | 56 - .../current/update.md | 110 - .../version-1.x/extend/model-visibility.md | 2 +- .../version-1.x/extend/notifications.md | 2 +- .../version-1.x/update.md | 4 +- .../current/README.md | 45 - .../current/admin.md | 13 - .../current/bugs.md | 28 - .../current/code-of-conduct.md | 51 - .../current/composer.md | 152 - .../current/config.md | 35 - .../current/console.md | 77 - .../current/contributing-docs-translations.md | 26 - .../current/contributing.md | 170 - .../current/current.json | 42 - .../current/extend/README.md | 40 - .../current/extend/admin.md | 214 - .../current/extend/api-throttling.md | 58 - .../current/extend/api.md | 353 - .../current/extend/assets.md | 7 - .../current/extend/authorization.md | 206 - .../current/extend/backend-events.md | 172 - .../current/extend/cli.md | 15 - .../current/extend/console.md | 70 - .../current/extend/data.md | 3 - .../current/extend/distribution.md | 40 - .../current/extend/extending-extensions.md | 122 - .../current/extend/extensibility.md | 65 - .../current/extend/filesystem.md | 129 - .../current/extend/formatting.md | 42 - .../current/extend/forms.md | 108 - .../current/extend/frontend-pages.md | 218 - .../current/extend/frontend.md | 422 - .../current/extend/github-actions.md | 119 - .../current/extend/i18n.md | 467 - .../current/extend/interactive-components.md | 93 - .../current/extend/language-packs.md | 56 - .../current/extend/mail.md | 59 - .../current/extend/middleware.md | 156 - .../current/extend/model-visibility.md | 266 - .../current/extend/models.md | 334 - .../current/extend/notifications.md | 413 - .../current/extend/permissions.md | 73 - .../current/extend/post-types.md | 1 - .../current/extend/routes.md | 281 - .../current/extend/search.md | 202 - .../current/extend/service-provider.md | 65 - .../current/extend/settings.md | 90 - .../current/extend/slugging.md | 1 - .../current/extend/start.md | 153 - .../current/extend/static-code-analysis.md | 86 - .../current/extend/testing.md | 565 - .../current/extend/theme.md | 27 - .../current/extend/translate.md | 3 - .../current/extend/update-1_0.md | 257 - .../current/extend/update-1_x.md | 139 - .../current/extend/update-b10.md | 53 - .../current/extend/update-b12.md | 34 - .../current/extend/update-b13.md | 40 - .../current/extend/update-b14.md | 757 - .../current/extend/update-b15.md | 60 - .../current/extend/update-b16.md | 138 - .../current/extend/update-b8.md | 114 - .../current/extend/views.md | 63 - .../current/extenders.md | 23 - .../current/extensions.md | 118 - .../current/faq.md | 35 - .../current/install.md | 198 - .../current/internal/README.md | 7 - .../internal/bundled-extensions-policy.md | 28 - .../current/internal/extension-manager.md | 87 - .../current/internal/merging-policy.md | 38 - .../current/internal/merging.md | 29 - .../current/internal/package-manager.md | 89 - .../current/languages.md | 29 - .../current/mail.md | 29 - .../current/releases.md | 15 - .../current/rest-api.md | 375 - .../current/scheduler.md | 55 - .../current/themes.md | 29 - .../current/troubleshoot.md | 56 - .../current/update.md | 110 - .../version-1.x/extend/notifications.md | 2 +- .../version-1.x/update.md | 4 +- .../current/README.md | 45 - .../current/admin.md | 13 - .../current/bugs.md | 28 - .../current/code-of-conduct.md | 51 - .../current/composer.md | 152 - .../current/config.md | 35 - .../current/console.md | 77 - .../current/contributing-docs-translations.md | 26 - .../current/contributing.md | 170 - .../current/extend/README.md | 40 - .../current/extend/admin.md | 214 - .../current/extend/api-throttling.md | 58 - .../current/extend/api.md | 353 - .../current/extend/assets.md | 7 - .../current/extend/authorization.md | 206 - .../current/extend/backend-events.md | 172 - .../current/extend/cli.md | 15 - .../current/extend/console.md | 70 - .../current/extend/distribution.md | 40 - .../current/extend/extending-extensions.md | 122 - .../current/extend/extensibility.md | 65 - .../current/extend/filesystem.md | 129 - .../current/extend/formatting.md | 42 - .../current/extend/forms.md | 108 - .../current/extend/frontend-pages.md | 218 - .../current/extend/frontend.md | 422 - .../current/extend/github-actions.md | 119 - .../current/extend/i18n.md | 467 - .../current/extend/interactive-components.md | 93 - .../current/extend/language-packs.md | 56 - .../current/extend/mail.md | 59 - .../current/extend/middleware.md | 156 - .../current/extend/model-visibility.md | 266 - .../current/extend/models.md | 334 - .../current/extend/notifications.md | 413 - .../current/extend/permissions.md | 73 - .../current/extend/post-types.md | 1 - .../current/extend/routes.md | 281 - .../current/extend/search.md | 202 - .../current/extend/service-provider.md | 65 - .../current/extend/settings.md | 90 - .../current/extend/slugging.md | 1 - .../current/extend/start.md | 153 - .../current/extend/static-code-analysis.md | 86 - .../current/extend/testing.md | 565 - .../current/extend/theme.md | 27 - .../current/extend/update-1_0.md | 257 - .../current/extend/update-1_x.md | 139 - .../current/extend/update-b10.md | 53 - .../current/extend/update-b12.md | 34 - .../current/extend/update-b13.md | 40 - .../current/extend/update-b14.md | 757 - .../current/extend/update-b15.md | 60 - .../current/extend/update-b16.md | 138 - .../current/extend/update-b8.md | 114 - .../current/extend/views.md | 63 - .../current/extenders.md | 23 - .../current/extensions.md | 118 - .../current/faq.md | 35 - .../current/install.md | 198 - .../current/internal/README.md | 7 - .../internal/bundled-extensions-policy.md | 28 - .../current/internal/extension-manager.md | 87 - .../current/internal/merging-policy.md | 38 - .../current/internal/merging.md | 29 - .../current/internal/package-manager.md | 89 - .../current/languages.md | 29 - .../current/mail.md | 29 - .../current/releases.md | 15 - .../current/rest-api.md | 375 - .../current/scheduler.md | 55 - .../current/themes.md | 29 - .../current/troubleshoot.md | 56 - .../current/update.md | 110 - .../version-1.x/extend/notifications.md | 2 +- .../version-1.x/update.md | 4 +- .../current/README.md | 45 - .../current/admin.md | 13 - .../current/appearance.md | 3 - .../current/bugs.md | 28 - .../current/code-of-conduct.md | 51 - .../current/composer.md | 152 - .../current/config.md | 35 - .../current/console.md | 77 - .../current/contributing-docs-translations.md | 26 - .../current/contributing.md | 170 - .../current/extend/README.md | 40 - .../current/extend/admin.md | 214 - .../current/extend/api-throttling.md | 58 - .../current/extend/api.md | 353 - .../current/extend/assets.md | 7 - .../current/extend/authorization.md | 206 - .../current/extend/backend-events.md | 172 - .../current/extend/cli.md | 15 - .../current/extend/console.md | 77 - .../current/extend/distribution.md | 40 - .../current/extend/extending-extensions.md | 122 - .../current/extend/extensibility.md | 65 - .../current/extend/filesystem.md | 129 - .../current/extend/formatting.md | 42 - .../current/extend/forms.md | 108 - .../current/extend/frontend-pages.md | 218 - .../current/extend/frontend.md | 422 - .../current/extend/github-actions.md | 119 - .../current/extend/i18n.md | 467 - .../current/extend/interactive-components.md | 93 - .../current/extend/language-packs.md | 56 - .../current/extend/mail.md | 59 - .../current/extend/middleware.md | 156 - .../current/extend/model-visibility.md | 266 - .../current/extend/models.md | 334 - .../current/extend/notifications.md | 413 - .../current/extend/permissions.md | 73 - .../current/extend/post-types.md | 1 - .../current/extend/routes.md | 281 - .../current/extend/search.md | 202 - .../current/extend/service-provider.md | 65 - .../current/extend/settings.md | 90 - .../current/extend/slugging.md | 1 - .../current/extend/start.md | 153 - .../current/extend/static-code-analysis.md | 86 - .../current/extend/testing.md | 565 - .../current/extend/theme.md | 27 - .../current/extend/update-1_0.md | 257 - .../current/extend/update-1_x.md | 139 - .../current/extend/update-b10.md | 53 - .../current/extend/update-b12.md | 34 - .../current/extend/update-b13.md | 40 - .../current/extend/update-b14.md | 757 - .../current/extend/update-b15.md | 60 - .../current/extend/update-b16.md | 138 - .../current/extend/update-b8.md | 114 - .../current/extend/views.md | 63 - .../current/extenders.md | 23 - .../current/extensions.md | 118 - .../current/faq.md | 35 - .../current/install.md | 198 - .../current/internal/README.md | 7 - .../internal/bundled-extensions-policy.md | 28 - .../current/internal/extension-manager.md | 87 - .../current/internal/merging-policy.md | 38 - .../current/internal/merging.md | 29 - .../current/internal/package-manager.md | 89 - .../current/languages.md | 29 - .../current/mail.md | 29 - .../current/permissions.md | 3 - .../current/releases.md | 15 - .../current/rest-api.md | 375 - .../current/scheduler.md | 55 - .../current/tags.md | 3 - .../current/themes.md | 29 - .../current/troubleshoot.md | 56 - .../current/update.md | 110 - .../version-1.x/extend/notifications.md | 2 +- .../version-1.x/update.md | 4 +- package-lock.json | 15409 ---------------- package.json | 24 +- plugins/structured-data/index.js | 136 + static/img/flarum-banner.png | Bin 0 -> 174872 bytes .../version-1.x/extend/notifications.md | 2 +- versioned_docs/version-1.x/update.md | 4 +- yarn.lock | 11228 +++++------ 481 files changed, 6327 insertions(+), 78532 deletions(-) delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/README.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/admin.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/bugs.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/code-of-conduct.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/composer.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/config.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/console.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/contributing-docs-translations.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/contributing.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/README.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/admin.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/api-throttling.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/api.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/assets.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/authorization.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/backend-events.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/cli.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/console.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/distribution.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/extending-extensions.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/extensibility.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/filesystem.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/formatting.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/forms.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/frontend-pages.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/frontend.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/github-actions.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/i18n.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/interactive-components.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/language-packs.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/mail.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/middleware.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/model-visibility.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/models.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/notifications.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/permissions.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/post-types.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/routes.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/search.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/service-provider.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/settings.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/slugging.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/start.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/testing.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/theme.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_0.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_x.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b10.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b12.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b13.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b14.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b15.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b16.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/update-b8.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extend/views.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extenders.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/extensions.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/faq.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/install.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/internal/README.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/internal/extension-manager.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/internal/merging-policy.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/internal/merging.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/internal/package-manager.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/languages.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/mail.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/releases.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/rest-api.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/scheduler.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/themes.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/troubleshoot.md delete mode 100644 i18n/de/docusaurus-plugin-content-docs/current/update.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/README.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/admin.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/bugs.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/code-of-conduct.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/composer.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/config.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/console.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/contributing-docs-translations.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/contributing.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/current.json delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/README.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/admin.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/api-throttling.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/api.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/assets.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/authorization.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/backend-events.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/cli.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/console.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/data.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/distribution.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/extending-extensions.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/extensibility.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/filesystem.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/formatting.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/forms.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/frontend-pages.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/frontend.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/github-actions.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/i18n.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/interactive-components.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/language-packs.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/mail.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/middleware.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/model-visibility.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/models.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/notifications.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/permissions.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/post-types.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/routes.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/search.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/service-provider.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/settings.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/slugging.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/start.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/testing.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/theme.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/translate.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-1_0.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-1_x.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b10.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b12.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b13.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b14.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b15.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b16.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/update-b8.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extend/views.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extenders.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/extensions.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/faq.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/install.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/internal/README.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/internal/extension-manager.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/internal/merging-policy.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/internal/merging.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/internal/package-manager.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/languages.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/mail.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/releases.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/rest-api.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/scheduler.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/themes.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/troubleshoot.md delete mode 100644 i18n/es/docusaurus-plugin-content-docs/current/update.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/README.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/admin.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/bugs.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/code-of-conduct.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/composer.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/config.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/console.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/contributing-docs-translations.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/contributing.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/current.json delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/README.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/admin.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/api-throttling.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/api.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/assets.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/authorization.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/backend-events.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/cli.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/console.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/data.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/distribution.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/extending-extensions.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/extensibility.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/filesystem.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/formatting.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/forms.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/frontend-pages.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/frontend.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/github-actions.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/i18n.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/interactive-components.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/language-packs.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/mail.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/middleware.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/model-visibility.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/models.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/notifications.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/permissions.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/post-types.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/routes.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/search.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/service-provider.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/settings.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/slugging.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/start.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/testing.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/theme.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/translate.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-1_0.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-1_x.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b10.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b12.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b13.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b14.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b15.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b16.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/update-b8.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extend/views.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extenders.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/extensions.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/faq.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/install.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/internal/README.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/internal/extension-manager.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/internal/merging-policy.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/internal/merging.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/internal/package-manager.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/languages.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/mail.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/releases.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/rest-api.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/scheduler.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/themes.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/troubleshoot.md delete mode 100644 i18n/it/docusaurus-plugin-content-docs/current/update.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/README.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/admin.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/bugs.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/code-of-conduct.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/composer.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/config.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/console.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/contributing-docs-translations.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/contributing.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/current.json delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/README.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/admin.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/api-throttling.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/api.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/assets.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/authorization.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/backend-events.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/cli.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/console.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/data.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/distribution.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/extending-extensions.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/extensibility.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/filesystem.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/formatting.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/forms.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend-pages.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/github-actions.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/i18n.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/interactive-components.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/language-packs.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/mail.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/middleware.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/model-visibility.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/models.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/notifications.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/permissions.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/post-types.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/routes.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/search.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/service-provider.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/settings.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/slugging.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/start.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/testing.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/theme.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/translate.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_0.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_x.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b10.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b12.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b13.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b14.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b15.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b16.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b8.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extend/views.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extenders.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/extensions.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/faq.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/install.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/internal/README.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/internal/extension-manager.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/internal/merging-policy.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/internal/merging.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/internal/package-manager.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/languages.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/mail.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/releases.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/rest-api.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/scheduler.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/themes.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/troubleshoot.md delete mode 100644 i18n/tr/docusaurus-plugin-content-docs/current/update.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/README.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/admin.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/bugs.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/code-of-conduct.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/composer.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/config.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/console.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/contributing-docs-translations.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/contributing.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/README.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/admin.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/api-throttling.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/api.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/assets.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/authorization.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/backend-events.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/cli.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/console.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/distribution.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/extending-extensions.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/extensibility.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/filesystem.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/formatting.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/forms.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend-pages.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/github-actions.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/i18n.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/interactive-components.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/language-packs.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/mail.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/middleware.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/model-visibility.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/models.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/notifications.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/permissions.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/post-types.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/routes.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/search.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/service-provider.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/settings.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/slugging.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/start.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/testing.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/theme.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_0.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_x.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b10.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b12.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b13.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b14.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b15.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b16.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b8.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extend/views.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extenders.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/extensions.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/faq.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/install.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/internal/README.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/internal/extension-manager.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/internal/merging-policy.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/internal/merging.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/internal/package-manager.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/languages.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/mail.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/releases.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/rest-api.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/scheduler.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/themes.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/troubleshoot.md delete mode 100644 i18n/vi/docusaurus-plugin-content-docs/current/update.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/README.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/admin.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/appearance.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/bugs.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/code-of-conduct.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/composer.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/config.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/console.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/contributing-docs-translations.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/contributing.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/README.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/admin.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/api-throttling.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/api.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/assets.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/authorization.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/backend-events.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/cli.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/console.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/distribution.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/extending-extensions.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/extensibility.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/filesystem.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/formatting.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/forms.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend-pages.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/github-actions.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/i18n.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/interactive-components.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/language-packs.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/mail.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/middleware.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/model-visibility.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/models.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/notifications.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/permissions.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/post-types.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/routes.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/search.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/service-provider.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/settings.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/slugging.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/start.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/testing.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/theme.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_0.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_x.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b10.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b12.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b13.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b14.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b15.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b16.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b8.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extend/views.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extenders.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/extensions.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/faq.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/install.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/internal/README.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/internal/extension-manager.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/internal/merging-policy.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/internal/merging.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/internal/package-manager.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/languages.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/mail.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/permissions.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/releases.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/rest-api.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/scheduler.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/tags.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/themes.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/troubleshoot.md delete mode 100644 i18n/zh/docusaurus-plugin-content-docs/current/update.md delete mode 100644 package-lock.json create mode 100644 plugins/structured-data/index.js create mode 100644 static/img/flarum-banner.png diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e12e5a0f2..0937f3d81 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,14 +11,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v4 - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: '20.x' - - run: npm ci - - run: npm run build --if-present + node-version: '24.x' + cache: 'yarn' + - run: yarn install --frozen-lockfile + - run: yarn build - name: copy compiled assets to remote uses: appleboy/scp-action@v1 diff --git a/README.md b/README.md index 574c6f22c..014497d7d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,25 @@ This repository contains the source code for [Flarum's docs site](https://docs.flarum.org). -In order to avoid conflicts and corruption during translation synchronization, we only currently accept content contributions in English, and translations are only accepted through [crowdin](https://crowdin.com/project/flarum-docs). We really appreciate all contributions, and these measures help ensure that documentation is up to date and avoids breaking unexpectedly. See [our docs](https://docs.flarum.org/contributing-docs-translations) for more information. +In order to avoid conflicts and corruption during translation synchronization, we only currently accept content contributions in English, and translations are only accepted through [Crowdin](https://crowdin.com/project/flarum-docs). We really appreciate all contributions, and these measures help ensure that documentation is up to date and avoids breaking unexpectedly. See [our docs](https://docs.flarum.org/contributing-docs-translations) for more information. + +## Translations + +Translations are managed with [Crowdin](https://crowdin.com/project/flarum-docs), **not** by editing files in this repository directly. + +**English is the only source.** The `docs/` and `versioned_docs/` directories are the source of truth; every file under `i18n//` is a translation managed by Crowdin and **should not be edited by hand** — manual edits there will be overwritten on the next sync. + +### How to contribute a translation + +1. Go to the [Flarum Docs Crowdin project](https://crowdin.com/project/flarum-docs) and sign in (a free Crowdin account is required). +2. Pick your language. If it isn't listed, request it via the project. +3. Translate strings in Crowdin's web editor. Source strings come from the English Markdown; keep Markdown structure, code blocks, and placeholders (e.g. `` `{user}` ``) intact. + +### How translations reach the site + +Crowdin's GitHub integration periodically pushes approved translations to the `l10n_master2` branch and opens a **"New Crowdin updates"** pull request. A maintainer reviews and merges it, after which the normal [deploy workflow](.github/workflows/deploy.yml) publishes the translated pages. Crowdin does **not** commit to `main` or publish anything on its own — a human merge is always required. + +> **Maintainers:** when reviewing a "New Crowdin updates" PR, build it locally first (`yarn build`) — translated content can contain Markdown that fails the MDX compiler (e.g. unescaped `{` or `<`), which would break the production build for **all** languages. ## Search @@ -17,10 +35,17 @@ To manually trigger a re-index after a significant content addition, use the Alg ## Testing locally -Our documentation is generated with [Docusaurus](https://docusaurus.io/docs). +Our documentation is generated with [Docusaurus](https://docusaurus.io/docs). It requires **Node.js 20 or newer**. + Use Yarn to install the dependencies and start Docusaurus in a local webserver: ```bash yarn install -yarn run start +yarn start +``` + +To produce a production build (as the deploy workflow does): + +```bash +yarn build ``` \ No newline at end of file diff --git a/crowdin.yml b/crowdin.yml index e06eba6da..a43eb1f01 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,7 +1,11 @@ files: - source: /i18n/en/**/* translation: /i18n/%two_letters_code%/**/%original_file_name% - - source: /docs/**/* - translation: /i18n/%two_letters_code%/docusaurus-plugin-content-docs/current/**/%original_file_name% + # 2.x (current) translations are intentionally not synced. They were frozen at + # a Dec-2024 snapshot, fell ~18 months behind, and translated since-corrected + # content (e.g. the pre-Symfony mail driver API). They were removed ahead of the + # 2.0 release. Re-enable this mapping to resume 2.x translation from current English. + # - source: /docs/**/* + # translation: /i18n/%two_letters_code%/docusaurus-plugin-content-docs/current/**/%original_file_name% - source: /versioned_docs/version-1.x/**/* translation: /i18n/%two_letters_code%/docusaurus-plugin-content-docs/version-1.x/**/%original_file_name% diff --git a/docs/extend/notifications.md b/docs/extend/notifications.md index 2b45d342e..042d67e55 100644 --- a/docs/extend/notifications.md +++ b/docs/extend/notifications.md @@ -294,7 +294,7 @@ export default class NewPostNotification extends Notification { } ``` -In the example, the icon is a star, the link will go to the new post, and the content will say that "{user} posted". +In the example, the icon is a star, the link will go to the new post, and the content will say that "`{user}` posted". Next, we need to tell Flarum that the notification you send in the backend corresponds to the frontend notification we just created. diff --git a/docusaurus.config.js b/docusaurus.config.js index 0f798c8d9..6ae068cef 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,18 +1,45 @@ -const lightCodeTheme = require('prism-react-renderer/themes/dracula'); -const darkCodeTheme = require('prism-react-renderer/themes/dracula'); +const { themes: prismThemes } = require('prism-react-renderer'); +const lightCodeTheme = prismThemes.dracula; +const darkCodeTheme = prismThemes.dracula; // With JSDoc @type annotations, IDEs can provide config autocompletion /** @type {import('@docusaurus/types').DocusaurusConfig} */ (module.exports = { title: 'Flarum Documentation', tagline: 'Forums made simple.', - url: 'https://flarum.org', + url: 'https://docs.flarum.org', baseUrl: '/', onBrokenLinks: 'warn', - onBrokenMarkdownLinks: 'warn', + onBrokenAnchors: 'warn', favicon: 'img/favicon.ico', + markdown: { + hooks: { + onBrokenMarkdownLinks: 'warn', + }, + }, organizationName: 'flarum', projectName: 'flarum', + headTags: [ + // Site-level JSON-LD structured data (WebSite + Organization). Docusaurus + // does not emit structured data for doc pages by default, so we provide it + // here at the site level for richer search-engine understanding. + { + tagName: 'script', + attributes: { type: 'application/ld+json' }, + innerHTML: JSON.stringify({ + '@context': 'https://schema.org', + '@type': 'WebSite', + name: 'Flarum Documentation', + url: 'https://docs.flarum.org', + publisher: { + '@type': 'Organization', + name: 'Flarum', + url: 'https://flarum.org', + logo: 'https://docs.flarum.org/img/flarum-banner.png', + }, + }), + }, + ], i18n: { defaultLocale: 'en', @@ -42,6 +69,11 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); } }, + plugins: [ + // Injects per-page TechArticle + BreadcrumbList JSON-LD for rich search results. + require.resolve('./plugins/structured-data'), + ], + presets: [ [ '@docusaurus/preset-classic', @@ -76,6 +108,9 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ + // Default social-card image used for og:image / twitter:image on pages + // that don't define their own. Path is relative to the static/ directory. + image: 'img/flarum-banner.png', navbar: { logo: { alt: 'Flarum Docs Logo', diff --git a/i18n/de/docusaurus-plugin-content-docs/current/README.md b/i18n/de/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index 1fb6df7c7..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,45 +0,0 @@ -- - - -slug: / -- - - - -# Über Flarum - -Flarum ist eine herrlich einfache Diskussionsplattform für deine Website. Es ist schnell, kostenlos und benutzerfreundlich und bietet alle Funktionen, die du für den Betrieb einer erfolgreichen Community benötigst. Zudem ist Flarum äußerst erweiterbar und lässt sich optimal anpassen. - -![Flarum Startseite Screenshot](/en/img/home_screenshot.png) - -## Ziele - -Flarum ist der kombinierte Nachfolger von [esoTalk](https://github.com/esotalk/esoTalk) und [FluxBB](https://fluxbb.org). Flarum ist: - -* **Schnell und einfach.** Kein Durcheinander, kein Ballast, keine komplexen Abhängigkeiten. Flarum wurde mit PHP erstellt, sodass es schnell und einfach bereitgestellt werden kann. Die Oberfläche wird mit [Mithril](https://mithril.js.org) betrieben, einem leistungsstarken JavaScript-Framework mit geringem Platzbedarf. - -* **Schön und responsiv.** Dies ist eine Forensoftware für Menschen. Flarum wurde sorgfältig entwickelt, um plattformübergreifend konsistent und intuitiv zu sein, und zwar sofort nach der Installation. - -* **Leistungsstark und erweiterbar.** Passe Flarum an, erweitere es und integriere es in deine Community. Die Architektur von Flarum ist erstaunlich flexibel, mit einer [leistungsfähigen Erweiterungs-API](/extend/README.md). - -* **Kostenlos und Open Source.** Flarum wird unter der [MIT-Lizenz](https://github.com/flarum/flarum/blob/master/LICENSE) veröffentlicht. - -Mehr über unsere [Philosophie und Werte für Flarum kannst du hier lesen](https://discuss.flarum.org/d/28869-flarum-philosophy-and-values). - -## Unterstütze das Flarum-Projekt - -Flarum ist eine [kostenlose, quelloffene](https://github.com/flarum/core) Software, die von Freiwilligen gepflegt und verwaltet wird. Wir sind auf die Beiträge der Community angewiesen, damit wir Flarum verbessern und erweitern können. - -🧑💻 Wenn du ein Entwickler bist, solltest du in Erwägung ziehen, [zum Kern oder den gebündelten Erweiterungen von Flarum beizutragen](contributing.md). Dies ist **die** effizienteste Art, Flarum zu helfen, und Ihre Arbeit kann viel bewirken: Es gibt Tausende von Flarum-Seiten mit insgesamt Millionen von Endnutzern. - -🧩 Wenn du eine Funktion vermisst oder eine Idee für ein Thema hast, [schreibe eine individuelle Erweiterung](extend/README.md), um Flarum für dich und andere zu verbessern. - -✒️ Wenn du Erfahrung im technischen Schreiben hast, könnten deine Beiträge zu [unserer Dokumentation](https://github.com/flarum/docs/issues) zukünftigen Benutzern, Administratoren und Entwicklern helfen, das Beste aus Flarum zu machen. - -🌐 Wenn du mehrere Sprachen sprichst, könntest du [Übersetzungen](extend/language-packs.md) beisteuern, um Flarum für unzählige Nutzer auf der ganzen Welt zugänglich zu machen. - -💸 Die Flarum Foundation verdient kein Geld mit Flarum, hat aber Rechnungen zu bezahlen. Spenden über [GitHub Sponsors](https://github.com/sponsors/flarum) oder [OpenCollective](https://opencollective.com/flarum) werden immer dankbar angenommen. In der Vergangenheit konnten wir auch einige unserer Hauptentwickler finanziell unterstützen, damit sie in Teilzeit an Flarum arbeiten konnten. Dies wäre ohne eure finanzielle Unterstützung nicht möglich gewesen. - -🧑🤝🧑 Tritt [unserer Community](https://discuss.flarum.org) bei, um über die Entwicklung von Flarum zu sprechen, Hilfe für deine Instanz zu bekommen oder einfach coole Leute zu treffen! Wenn du Erfahrung mit Flarum hast, kannst du auch gerne Anfängern helfen! - -🐛 Wenn ein Fehler existiert, der dich stört, oder eine Idee für eine neue Funktion, die dir durch den Kopf geht, können wir es nicht wissen, wenn du es uns nicht sagst! Wir verfolgen Bugs, Vorschläge und zukünftige Entwicklungspläne [über GitHub](https://github.com/flarum/core/issues). Wenn bereits ein offenes Problem existiert, können Likes und (konstruktive) Zusatzinformationen sehr hilfreich sein! - -📣 Und wenn dir Flarum gefällt, dann erwäge doch darüber zu bloggen/twittern/reden! Mehr Aufmerksamkeit für Flarum führt zu mehr Nutzern, die sich mit Flarum beschäftigen, und damit zu mehr Aktivität, besseren Erweiterungen und einer schnelleren Entwicklung. - -Flarum wäre ohne unsere phänomenale Community nicht möglich. Wenn du daran interessiert bist, einen Beitrag zu leisten, findest du weitere Informationen in den Dokumenten für [Entwicklerbeiträge](contributing.md) und andere [Beiträge](contributing-docs-translations.md). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/admin.md b/i18n/de/docusaurus-plugin-content-docs/current/admin.md deleted file mode 100644 index c56641a66..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/admin.md +++ /dev/null @@ -1,13 +0,0 @@ -# Admin-Dashboard - -Das Flarum Admin Dashboard ist eine benutzerfreundliche Oberfläche zur Verwaltung deines Forums. Es ist nur für Benutzer in der Gruppe „Admin“ verfügbar. Um auf das Admin-Dashboard zuzugreifen, klicke oben rechts auf dem Bildschirm auf deinen **Namen** und wähle **Administration** aus. - -Das Admin-Dashboard hat die folgenden Abschnitte: -- **Dashboard** – Zeigt das Haupt-Admin-Dashboard an, das Statistiken und andere relevante Informationen enthält. -- **Basics** - Zeigt die Optionen zum Festlegen grundlegender Forumsdetails wie Name, Beschreibung und Willkommensbanner. -- **E-Mail** - Ermöglicht die Konfiguration von E-Mail-Einstellungen. Siehe [hier](https://docs.flarum.org/mail) für weitere Informationen. -- **Berechtigungen** - Zeigt die Berechtigungen für jede Benutzergruppe an und ermöglicht dir, globale und spezifische Bereiche zu konfigurieren. -- **Erscheinungsbild** - Ermöglicht es, die Farben und das Branding des Forums anzupassen und zusätzliches CSS zur Anpassung hinzuzufügen. -- **Benutzer** – Stellt dir eine paginierte Liste aller Benutzer im Forum zur Verfügung und gibt die Möglichkeit, den Benutzer zu bearbeiten oder administrative Aktionen durchzuführen. - -Abgesehen von den oben genannten Abschnitten ermöglicht das Admin-Dashboard auch die Verwaltung deiner Erweiterungen (einschließlich der Flarum-Core-Erweiterungen wie Tags) im Abschnitt _Features_. Erweiterungen, die das Forum-Thema ändern oder Ihnen erlauben, mehrere Sprachen zu verwenden, werden unter den Abschnitten _Themes_ bzw. _Sprachen_ kategorisiert. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/bugs.md b/i18n/de/docusaurus-plugin-content-docs/current/bugs.md deleted file mode 100644 index df6e7b142..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/bugs.md +++ /dev/null @@ -1,28 +0,0 @@ -# Fehler melden - -:::danger Sicherheitslücken - -Wenn Du eine Sicherheitslücke in Flarum entdeckst, befolge bitte unsere [Sicherheitsrichtlinie](https://github.com/flarum/core/security/policy), damit wir sie umgehend beheben können. - -::: - -Vielen Dank, dass Du uns beim Testen von Flarum geholfen hast. Wir freuen uns, dich im Team zu haben! Wir brauchen Leute, die *Probleme geduldig lösen* und *sie klar kommunizieren* können. Wie Du wahrscheinlich weißt, erfordert eine gute Fehlerberichterstattung einige Zeit und Mühe. Wenn Du damit einverstanden bist, dann fangen wir an! - -## Duplikate - -Schon einen Fehler gefunden? Wundervoll! Wir würden gerne davon hören — doch zuerst solltest Du dich umsehen, um sicherzustellen, dass Du deine Zeit nicht mit einem bekannten Problem verschwendest: - -- Durchsuche unser [Support-Forum](https://discuss.flarum.org/t/support), um zu sehen, ob es bereits gemeldet wurde. -- Wir könnten an einer Lösung arbeiten, also durchsuche auch unseren [Probleme-Tracker](https://github.com/flarum/core/issues). - -Wenn Du *gründlich* gesucht hast und leer ausgegangen bist, freuen wir uns über deinen Bericht. Wenn es sich nur um ein einfaches Problem handelt (z. B. ein falsch geschriebenes Wort oder ein Grafikfehler), fahre mit dem nächsten Absatz fort. Wenn Du jedoch Fehler siehst oder etwas eindeutig defekt ist, musst Du zuerst einige Informationen sammeln. Bitte gehe zu unserem Leitfaden [Fehlerbehebung](troubleshoot.md) und befolge die dortigen Anweisungen. Sammel so viele Informationen wie möglich! - -## Melden - -Wir verfolgen Probleme auf GitHub. Stelle sicher, dass Du dein Problem im [richtigen Repository](https://github.com/flarum) öffnest und alle Informationen in der Fehlerberichtsvorlage ausfüllst. - -Überprüfe nach Möglichkeit, ob das Problem mit der neuesten Version von Flarum reproduzierbar ist. Wenn Du eine Vorabversion oder eine Entwicklungsversion verwendest, gebe bitte die spezifische Version an, die Du verwendest. - -Bedenke: Das Ziel eines Fehlerberichts ist es, es uns leicht zu machen, den Fehler zu replizieren und zu beheben. Vielleicht möchtest Du [diesen Artikel](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) lesen, um einige nützliche Tipps zum Schreiben eines effektiven Fehlerberichts zu erhalten. Es ist **erforderlich**, dass Du die notwendigen Schritte zum Reproduzieren des aufgetretenen Problems klar beschreibst. Probleme ohne eindeutige Reproduktionsschritte werden nicht gesichtet. Wenn ein Problem mit der Bezeichnung "Bestätigung erforderlich" länger als 5 Tage keine weiteren Eingaben vom Autor des Problems erhält, wird es geschlossen. - -Sobald Du deinen Bericht gepostet hast, bitten wir dich, *der Diskussion zu folgen* und geduldig zu warten. Möglicherweise müssen wir um weitere Einzelheiten oder Klarstellungen bitten; Doch wir haben immer viel zu tun, und es kann eine Weile dauern, bis wir deinem Bericht die Zeit geben können, die er verdient. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/code-of-conduct.md b/i18n/de/docusaurus-plugin-content-docs/current/code-of-conduct.md deleted file mode 100644 index af3197ed1..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/code-of-conduct.md +++ /dev/null @@ -1,51 +0,0 @@ -# Verhaltenskodex - -### _Willkommen in der Flarum-Community!_ - -... Und danke, dass du dabei bist! Wir sind begeistert von Flarum und freuen uns immer, Menschen zu treffen, denen es genauso geht. Wir möchten, dass *jeder* das Beste aus Flarum und der Flarum-Community herausholt, daher bitten wir Dich, diese Richtlinien zu lesen und zu befolgen. Diese gelten unabhängig davon, ob Du unser Forum, den Discord-Chat, die Kommunikation auf GitHub oder eine andere Form der Kommunikation ohne die Flarum-Community verwendest. - -### Sei vor allem cool! - -Wir sind alle hier, um über Flarum zu sprechen und gemeinsam daran zu arbeiten, es zu einer noch besseren Anwendung zu machen. Ideen zu kritisieren (natürlich durch begründete Argumente) ist ein wichtiger Teil davon. Aber lassen wir uns nicht hinreißen und verfallen in persönliche Angriffe, denn Negativität steht nur im Weg. Wir bitten Dich, Folgendes zu vermeiden: - -- Beleidigende oder beleidigende Sprache sowie jede Art von Hassrede -- Beiträge, die darauf abzielen, andere zu belästigen, sich auszugeben oder zu diffamieren -- Unnötiges Löschen von geposteten Inhalten -- Versuche, die privaten Informationen anderer zu missbrauchen oder offenzulegen -- Obszöne oder sexuell explizite Inhalte -- Spam, Phishing-Posts und alle Aktionen, die darauf abzielen, diese Website zu verunstalten -- Diskussion über Softwarepiraterie und ähnliche Themen - -*Alles oben Genannte sind Gründe für Moderatormaßnahmen.* Wenn Duein Problem mit einem anderen Mitglied habst, bitten wir Dich, dieses nicht selbst zu konfrontieren. Wenn es sich um das Forum handelt, verwende bitte den Befehl *Melden* für den betreffenden Beitrag und überlasse es dann den Mitarbeitern, sich mit der Situation zu befassen. Otherwise, report the violation using our [contact page](https://flarum.org/foundation/contact), option Legal. - -Unsere Moderatoren können Inhalte bearbeiten oder löschen, die anstößig sind oder den Kommunikationsfluss stören. Unsere Moderatoren können Inhalte bearbeiten oder löschen, die anstößig sind oder den Kommunikationsfluss stören. Also, weißt du, *sei cool*. 😎 - -### Verschaffe Dir Gehör - -Möchtest Du eine neue Diskussion beginnen? Lese zuerst unsere [FAQ](faq.md) und folge den Links, um sicherzustellen, dass Du vollständig über das Projekt informiert bist. Dann verbringe einige Zeit damit, das Forum zu durchsuchen, mache Dich mit [dem Tag-System](https://discuss.flarum.org/tags) vertraut und führe ein paar Suchen nach Schlüsselwörtern durch, die mit Deinem Thema zu tun haben: *Es könnte sein, dass jemand bereits eine Diskussion darüber begonnen hat!* - -Wenn Du sicher bist, dass Du bereit bist, eine Diskussion zu beginnen, beachte bitte die folgenden Punkte: - -- Gib ihm einen guten Titel! Die besten Ergebnisse erzielst Du, wenn Dein Titel deutlich macht, worüber Du sprechen möchtest. -- Richtige Tags auswählen. Dies erhöht die Wahrscheinlichkeit, dass dein Beitrag gelesen und zeitnah beantwortet wird. -- *Poste nicht* wiederholt über dasselbe Thema, da dies eher den gegenteiligen Effekt hat. -- If not using a tag set aside for multilingual use, *post in English only.* We can't help you if we don't understand your posts. -- Denken daran, dass du deine Beiträge nicht unterschreiben musst. Wir haben dein Profil, damit wir wissen, wer du bist. - -Bitte bemühen dich, uns bei der Organisation zu helfen. Die Zeit, die wir mit Aufräumen verbringen, ist Zeit, die wir nicht damit verbringen können, dich kennenzulernen, deine Probleme zu besprechen und über Flarum zu sprechen. Und dafür sind wir schließlich alle hier! - -### Lasse deine Antwort zählen - -Du nimmst dir die Zeit, an einer Diskussion teilzunehmen, in der Hoffnung, dass andere deine Ideen lesen und berücksichtigen. Warum sich also nicht die Mühe machen, deine Antwort lesenswert zu machen? - -- Antworte nicht auf einen Titel. Nehmen dir etwas Zeit, um das OP zu *lesen*, und mindestens den Rest des Gesprächs zuerst zu *scannen*. -- Fragen dich, ob deine Antwort zur Diskussion beiträgt. Wenn dies nicht der Fall ist, denke vor dem Posten noch einmal darüber nach. -- Vermeide Ein-Wort-Beiträge, nur um jemandem zuzustimmen; Du kannst dafür den 'Gefällt mir'-Button verwenden. -- Vermeide mehrere Posts hintereinander, wenn einer ausreichen würde. Dies ist ein Forum, kein Chatroom. -- Wenn deine Antwort wahrscheinlich den Verlauf der Diskussion ablenken wird, solltest du stattdessen eine neue Diskussion beginnen. -- Wenn du nur testweise ein bisschen Unsinn posten möchtest, tu dies bitte stattdessen im [Test-Posting](https://discuss.flarum.org/t/sandbox)-Tag. -- Stelle sicher, dass deine Antworten konstruktives Feedback und Unterstützung bieten, um eine integrative Community zu ermöglichen. - -Niemand wird sich über den gelegentlichen Witz oder die kluge Bemerkung beschweren. Wir mögen es, die Stimmung leicht zu halten! Aber auch um die Dinge produktiv zu halten, bitten wir dich, zu vermeiden, dass eine Diskussion insgesamt entgleist. - -> Vielen Dank an Dominion für seine Hilfe bei der Zusammenstellung dieser Richtlinien. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/composer.md b/i18n/de/docusaurus-plugin-content-docs/current/composer.md deleted file mode 100644 index d1178edcb..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/composer.md +++ /dev/null @@ -1,152 +0,0 @@ - -# Composer - -Flarum uses a program called [Composer](https://getcomposer.org) to manage its dependencies and extensions. You'll need to use composer if you want to: - -- Install or update Flarum through the command line -- Install, update, or remove Flarum extensions through the command line - -This guide is provided as a brief explanation of Composer. We highly recommend consulting the [official documentation](https://getcomposer.org/doc/00-intro.md) for more information. - -:::tip Geteiltes Hosting - -On shared hosting it is recommended to use the Extension Manager extension instead of Composer. It is a graphical interface for Composer that allows you to install, update and remove extensions without the need for SSH access. You can directly install Flarum using an archive file, without the need for Composer. With the extension manager pre-installed, check the [installation guide](install.md#installing-by-unpacking-an-archive) for more information. - -::: - -## What is Composer? - -> Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. — [Composer Introduction](https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) - -Each Flarum installation consists primarily of Flarum core and a set of [extensions](extensions.md). Each of these has its own dependencies and releases. - -Back in the day, forum frameworks would manage extensions by having users upload zip files with the extension code. That seems simple enough, but issues quickly become evident: - -- Uploading random zip files from the internet tends to be a bad idea. Requiring that extensions be downloaded from a central source like [Packagist](https://packagist.org/) makes it somewhat more tedious to spam malicious code, and ensures that source code is available on GitHub for free/public extensions. -- Let's say Extension A requires v4 of some library, and Extension B requires v5 of that same library. With a zip-based solution, either one of the two dependencies could override the other, causing all sorts of inconsistent problems. Or both would attempt to run at once, which would cause PHP to crash (you can't declare the same class twice). -- Zip files can cause a lot of headache if trying to automate deployments, run automated tests, or scale to multiple server nodes. -- There is no good way to ensure conflicting extension versions can't be installed, or that system PHP version and extension requirements are met. -- Sure, we can upgrade extensions by replacing the zip file. But what about upgrading Flarum core? And how can we ensure that extensions can declare which versions of core they're compatible with? - -Composer takes care of all these issues, and more! - -## Flarum and Composer - -When you go to [install Flarum](install.md#installing), you're actually doing 2 things: - -1. Downloading a boilerplate "skeleton" for Flarum. This includes an `index.php` file that handles web requests, a `flarum` file that provides a CLI, and a bunch of web server config and folder setup. This is taken from the [`flarum/flarum` github repository](https://github.com/flarum/flarum), and doesn't actually contain any of the code necessary for Flarum to run. -2. Installing `composer` packages necessary for Flarum, namely Flarum core, and several bundled extensions. These are called by the `index.php` and `flarum` files from step 1, and are the implementation of Flarum. These are specified in a `composer.json` file included in the skeleton. - -When you want to update Flarum or add/update/remove extensions, you'll do so by running `composer` commands. Each command is different, but all commands follow the same general process: - -1. Update the `composer.json` file to add/remove/update the package. -2. Do a bunch of math to get the latest compatible versions of everything if possible, or figure out why the requested arrangement is impossible. -3. If everything works, download new versions of everything that needs to be updated. If not, revert the `composer.json` changes - -When running `composer.json` commands, make sure to pay attention to the output. If there's an error, it'll probably tell you if it's because of extension incompatibilities, an unsupported PHP version, missing PHP extensions, or something else. - -### The `composer.json` File - -As mentioned above, the entire composer configuration for your Flarum site is contained inside the `composer.json` file. You can consult the [composer documentation](https://getcomposer.org/doc/04-schema.md) for a specific schema, but for now, let's go over an annotated `composer.json` from `flarum/flarum`: - -```json -{ - // This following section is mostly just metadata about the package. - // For forum admins, this doesn't really matter. - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // End of metadata - - // This next section is the one we care about the most. - // It's a list of packages we want, and the versions for each. - // We'll discuss this shortly. - "require": { - "flarum/core": "^1.0", - "flarum/approval": "*", - "flarum/bbcode": "*", - "flarum/emoji": "*", - "flarum/lang-english": "*", - "flarum/flags": "*", - "flarum/likes": "*", - "flarum/lock": "*", - "flarum/markdown": "*", - "flarum/mentions": "*", - "flarum/nicknames": "*", - "flarum/pusher": "*", - "flarum/statistics": "*", - "flarum/sticky": "*", - "flarum/subscriptions": "*", - "flarum/suspend": "*", - "flarum/tags": "*" - }, - - // Various composer config. The ones here are sensible defaults. - // See https://getcomposer.org/doc/06-config.md for a list of options. - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // If composer can find a stable (not dev, alpha, or beta) version - // of a package, it should use that. Generally speaking, production - // sites shouldn't run beta software unless you know what you're doing. - "prefer-stable": true -} -``` - -Let's focus on that `require` section. Each entry is the name of a composer package, and a version string. To read more about version strings, see the relevant [composer documentation](https://semver.org/). - -For Flarum projects, there's several types of entries you'll see in the `require` section of your root install's `flarum/core`: - -- You MUST have a `flarum/core` entry. This should have an explicit version string corresponding to the major release you want to install. For Flarum 1.x versions, this would be `^1.0`. -- You should have an entry for each extension you've installed. Some bundled extensions are included by default (e.g. `flarum/tags`, `flarum/suspend`, etc), [others you'll add via composer commands](extensions.md). Unless you have a reason to do otherwise (e.g. you're testing a beta version of a package), we recommend using an asterisk as the version string for extensions (`*`). This means "install the latest version compatible with my flarum/core". -- Some extensions / features might require PHP packages that aren't Flarum extensions. For example, you need the guzzle library to use the [Mailgun mail driver](mail.md). In these cases, the instructions for the extension/feature in question should explain which version string to use. - -## How to install Composer? - -As with any other software, Composer must first be [installed](https://getcomposer.org/download/) on the server where Flarum is running. There are several options depending on the type of web hosting you have. - -### Dedicated Web Server - -In this case you can install composer as recommended in the Composer [guide](https://getcomposer.org/doc/00-intro.md#system-requirements) - -### Managed / Shared hosting - -If Composer is not preinstalled (you can check this by running `composer --version`), you can use a [manual installation](https://getcomposer.org/composer-stable.phar). Just upload the composer.phar to your folder and run `/path/to/your/php7 composer.phar COMMAND` for any command documented as `composer COMMAND`. - -:::danger - -Some articles on the internet will mention that you can use tools like a PHP shell. If you are not sure what you are doing or what they are talking about - be careful! An unprotected web shell is **extremely** dangerous. - -::: - -## How do I use Composer? - -You'll need to use Composer over the **C**ommand-**l**ine **i**nterface (CLI). Be sure you can access your server over **S**ecure **Sh**ell (SSH). - -Once you have Composer installed, you should be able to run Composer commands in your SSH terminal via `composer COMMAND`. - -:::info Optimierungen - -After most commands, you'll want to run `composer dump-autoload -a`. Essentially, this caches PHP files so they run faster. - -::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/config.md b/i18n/de/docusaurus-plugin-content-docs/current/config.md deleted file mode 100644 index 9dd3cedda..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/config.md +++ /dev/null @@ -1,35 +0,0 @@ -# Konfigurationsdatei - -Es existiert nur ein Ort, an dem die Flarum-Konfiguration nicht über das Flarum-Admin-Dashboard (mit Ausnahme der Datenbank) geändert werden kann, und das ist die Datei `config.php`, die sich im Stammverzeichnis deiner Flarum-Installation befindet. - -Diese Datei ist zwar klein, enthält aber Details, die für das Funktionieren deiner Flarum-Installation entscheidend sind. - -Wenn die Datei existiert, teilt es Flarum mit, dass es bereits installiert wurde. Es versorgt Flarum auch mit Datenbankinformationen und mehr. - -Hier ist ein kurzer Überblick darüber, was alles mit einer Beispieldatei bedeutet: - -```php - false, // aktiviert oder deaktiviert den Debug-Modus, der zum Beheben von Problemen verwendet wird - 'offline' => false, // aktiviert oder deaktiviert den Site-Wartungsmodus. Dadurch wird deine Website für alle Benutzer (einschließlich Administratoren) unzugänglich. - 'database' => - array ( - 'driver' => 'mysql', // der Datenbanktreiber, d.h. MySQL, MariaDB... - 'host' => 'localhost', // der Host der Verbindung, in den meisten Fällen localhost, es sei denn, es wird ein externer Dienst verwendet - 'database' => 'flarum', // der Name der Datenbank in der Instanz - 'username' => 'root', // Datenbank-Benutzername - 'password' => '', // Datenbank Passwort - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', // das Präfix für die Tabellen, nützlich, wenn du dieselbe Datenbank mit einem anderen Dienst teilst - 'port' => '3306', // der Port der Verbindung, standardmäßig 3306 bei MySQL - 'strict' => false, - ), - 'url' => 'https://flarum.localhost', // die URL-Installation, du solltest dies ändern, wenn du die Domain wechselst - 'paths' => - array ( - 'api' => 'api', // /api geht zur API - 'admin' => 'admin', // /admin geht zum Admin - ), -); -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/console.md b/i18n/de/docusaurus-plugin-content-docs/current/console.md deleted file mode 100644 index b7dc5d7bf..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# Konsole - -Zusätzlich zum Admin-Dashboard bietet Flarum mehrere Konsolenbefehle, mit denen du dein Forum über das Terminal verwalten kannst. - -Using the console: - -1. `ssh` in den Server, auf dem deine Flarum-Installation gehostet wird -2. `cd` to the folder that contains the file `flarum` -3. Befehl über `php flarum [command]` ausführen - -## Standardbefehle - -### list - -Listet alle verfügbaren Verwaltungsbefehle sowie Anweisungen zur Verwendung von Verwaltungsbefehlen auf - -### help - -`php flarum help [command_name]` - -Zeigt die Hilfeausgabe für einen bestimmten Befehl an. - -Du kannst die Hilfe auch in anderen Formaten ausgeben, indem du die Option --format verwendest: - -`php flarum help --format=xml list` - -Um die Liste der verfügbaren Befehle anzuzeigen, verwende bitte den list-Befehl. - -### info - -`php flarum info` - -Get information about Flarum's core and installed extensions. Dies ist sehr nützlich zum Debuggen von Problemen und sollte bei Supportanfragen mitgeteilt werden. - -### cache:clear - -`php flarum cache:clear` - -Löscht den Flarum-Cache des Backends, einschließlich generierter js/css, Textformatierer-Cache und zwischengespeicherter Übersetzungen. Dies sollte nach dem Installieren oder Entfernen von Erweiterungen ausgeführt werden, und das Ausführen sollte der erste Schritt sein, wenn Probleme auftreten. - -### assets:publish - -`php flarum assets:publish` - -Assets aus Kern und Erweiterungen veröffentlichen (z. B. kompiliertes JS/CSS, Bootstrap-Symbole, Logos usw.). Dies ist nützlich, wenn deine Assets beschädigt wurden oder wenn du [filesystem drivers](extend/filesystem.md) für die `flarum-assets`-Festplatte ausgetauscht hast. - -### migrate - -`php flarum migrate` - -Führt alle ausstehenden Migrationen aus. Dies sollte verwendet werden, wenn eine Erweiterung hinzugefügt oder aktualisiert wird, die die Datenbank ändert. - -### migrate:reset - -`php flarum migrate:reset --extension [extension_id]` - -Alle Migrationen für eine Erweiterung zurücksetzen. Dies wird hauptsächlich von Erweiterungsentwicklern verwendet, doch gelegentlich musst du dies möglicherweise ausführen, wenn du eine Erweiterung entfernst und alle deine Daten aus der Datenbank löschen möchtest. Bitte beachte, dass die betreffende Erweiterung derzeit installiert (jedoch nicht unbedingt aktiviert) sein muss, damit dies funktioniert. - -### schedule:run - -`php flarum schedule:run` - -Viele Erweiterungen verwenden geplante Jobs, um Aufgaben in regelmäßigen Abständen auszuführen. Dies kann Datenbankbereinigungen, das Posten geplanter Entwürfe, das Erstellen von Sitemaps usw. umfassen. Wenn eine deiner Erweiterungen geplante Jobs verwendet, solltest du einen [Cron-Job](https://ostechnix.com/a-beginners-guide-to-cron-jobs/) hinzufügen, um diesen Befehl in regelmäßigen Abständen auszuführen: - -``` -* * * * * cd /path-to-your-flarum-install && php flarum schedule:run >> /dev/null 2>&1 -``` - -Dieser Befehl sollte im Allgemeinen nicht manuell ausgeführt werden. - -Beachte, dass einige Hosts es dir nicht erlauben, die Cron-Konfiguration direkt zu bearbeiten. In diesem Fall solltest du dich an deinen Host wenden, um weitere Informationen zum Planen von Cron-Jobs zu erhalten. - -### schedule:list - -`php flarum schedule:list` - -Dieser Befehl gibt eine Liste geplanter Befehle zurück (weitere Informationen findest du unter `schedule:run`). Dies ist nützlich, um zu bestätigen, dass die von deinen Erweiterungen bereitgestellten Befehle ordnungsgemäß registriert sind. Dies **kann nicht** überprüfen, ob Cron-Jobs erfolgreich geplant wurden oder ausgeführt werden. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/contributing-docs-translations.md b/i18n/de/docusaurus-plugin-content-docs/current/contributing-docs-translations.md deleted file mode 100644 index 9b81efc48..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/contributing-docs-translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# Dokumente und Übersetzung - -## Dokumentation hinzufügen - -Das Hinzufügen von Dokumentation kann unzähligen zukünftigen Flarum-Benutzern helfen. Ein paar Ideen, woran man arbeiten könnte: - -- Benutzerhandbücher, um Flarum-Endbenutzern mit einigen erweiterten Flarum-Funktionen zu helfen. -- Mehr [häufig gestellte Fragen](faq.md). -- Erweiterte [Fehlerbehebung](troubleshoot.md)s Schritte. -- Schritt-für-Schritt-Tutorials für die Entwicklung oder Installation von Flarum. -- [Technische Referenzhandbücher](extend/README.md) für Entwickler von Erweiterungen. -- Wir verbessern buchstäblich alles andere, von dem Du glaubst, dass wir es näher erläutern oder besser erklären sollten. - -Eine gute Möglichkeit, Themen zu finden, über die Sie schreiben können, besteht darin, im [Support-Tag](https://discuss.flarum.org/t/support) unserer Community nach häufig gestellten Fragen zu suchen. - -## Flarum übersetzen - -Wir möchten, dass Flarum für alle zugänglich ist, unabhängig von der Sprache! Indem Du Übersetzungen beisteuerst, tust Du es viel mehr Menschen möglich, Flarum zu genießen. Das Beste ist, dass wir benutzerfreundliche GUIs für Übersetzungen verwenden, sodass keine technischen Kenntnisse erforderlich sind, um zu helfen! - -Übersetzungen für Flarum Core, gebündelte Erweiterungen und Community-Erweiterungen werden über [Weblate](https://weblate.rob006.net/projects/flarum/) verwaltet. - -Übersetzungen für diese Dokumentation werden über [Crowdin](https://crowdin.com/project/flarum-docs) verwaltet. - -Die Flarum Foundation hat die Organisation "flarum-lang" gegründet, um Übersetzer zu unterstützen und die kontinuierliche Verfügbarkeit von Sprachpaketen sicherzustellen. Du kannst mehr darüber erfahren, indem Du das [GitHub-Repository](https://github.com/flarum-lang/about) besuchst. - -Wenn Du ein vorhandenes Sprachpaket unterstützen, eine neue Übersetzung starten möchtest oder bei der Verwendung von Weblate oder Crowdin auf Probleme stößt, [wende dich am besten an das `flarum-lang`-Team](https://discuss.flarum.org/d/27519-the-flarum-language-project). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/contributing.md b/i18n/de/docusaurus-plugin-content-docs/current/contributing.md deleted file mode 100644 index 2c870c07e..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/contributing.md +++ /dev/null @@ -1,170 +0,0 @@ -# Hilf Flarum aufzubauen - -Interested in contributing to Flarum development? That's great! From [opening a bug report](bugs.md) to creating a pull request: every single one is appreciated and welcome. Flarum wouldn't be possible without our community contributions. - -Before contributing, please read the [code of conduct](code-of-conduct.md). - -This document is a guide for developers who want to contribute code to Flarum. If you're just getting started, we recommend that you read the [Getting Started](/extend/start.md) documentation in the Extension docs to understand a bit more about how Flarum works. - -## Why Contribute to Flarum? - -⚡ **Have Real Impact.** There are thousands of Flarum instances, with millions of aggregate end users. By contributing to Flarum, your code will have a positive impact on all of them. - -🔮 **Shape the Future of Flarum.** We have a long backlog, and limited time. If you're willing to champion a feature or change, it's much more likely to happen, and you'll be able to enact your vision for it. Plus, our roadmap and milestones are set by our [core development team](https://flarum.org/team), and all of us started as contributors. The best road to influence is contributing. - -🧑‍💻 **Become a Better Engineer.** Our codebase is modern, and we heavily value good engineering and clean code. There's also a lot of interesting, challenging problems to solve regarding design, infrastructure, performance, and extensibility. Especially if you're a student or early in your career, working on Flarum is a great opportunity to build development skills. - -🎠 **It's Fun!** We really enjoy working on Flarum: there's a lot of interesting challenges and fun features to build. We also have an active community on [our forums](https://discuss.flarum.org) and [Discord server](https://flarum.org/chat). - -## What to Work On - -Check out our upcoming [Milestones](https://github.com/flarum/core/milestones) for an overview of what needs to be done. See the [Good first issue](https://github.com/flarum/core/labels/Good%20first%20issue) label for a list of issues that should be relatively easy to get started with. If there's anything you're unsure of, don't hesitate to ask! All of us were just starting out once. - -If you're planning to go ahead and work on something, please comment on the relevant issue or create a new one first. This way we can ensure that your precious work is not in vain. - -Since Flarum is so extension-driven, we highly recommend [our extension docs](extend/README.md) as a reference when working on core, as well as for bundled extensions. You should start with [the introduction](extend/README.md) for a better understanding of our extension philosophy. - -## Development Setup - -### Setting Up a Local Codebase - -[flarum/flarum](https://github.com/flarum/flarum) is a "skeleton" application which uses Composer to download the core package and a bunch of extensions. Source code for Flarum core, extensions, and all packages used by the aforementioned is located in the Flarum monorepo [flarum/framework](https://github.com/flarum/framework). In order to contribute to these, you'll need to fork and clone the monorepo repository locally, and then add it to your dev environment as a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path): - -```bash -git clone https://github.com/flarum/flarum.git -cd flarum - -# Or, when you want to clone directly into the current directory -git clone https://github.com/flarum/flarum.git . -# Note, the directory must be empty - -# Set up a Composer path repository for Flarum monorepo packages -composer config repositories.0 path "PATH_TO_MONOREPO/*/*" -git clone https://github.com//framework.git PATH_TO_MONOREPO -``` - -Next, ensure that Composer accepts unstable releases from your local copies by setting the `minimum-stability` key to `dev` in `composer.json`. - -Finally, run `composer install` to complete the installation from the path repositories. - -After your local installation is set up, make sure you've enabled `debug` mode in **config.php**, and set `display_errors` to `On` in your php config. This will allow you to see error details for both Flarum and PHP. Debug mode also forces a re-compilation of Flarum's asset files on each request, removing the need to call `php flarum cache:clear` after each change to the extension's JavaScript or CSS. - -Flarum's front-end code is written in ES6 and transpiled into JavaScript. During development you will need to recompile the JavaScript using [Node.js](https://nodejs.org/) and [`yarn`](https://yarnpkg.com/). **Please do not commit the resulting `dist` files when sending PRs**; this is automatically taken care of when changes are merged into the `main` branch. - -To contribute to the frontend, first install the JavaScript dependencies. The monorepo uses [yarn workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) to easily install JS dependencies across all packages within. - -```bash -cd packages/framework -yarn install -``` - -Then you can watch JavaScript files for changes during development: - -```bash -cd framework/core/js -yarn dev -``` - -The process is the same for extensions. - -```bash -cd extensions/tags/js -yarn dev -``` - -### Development Tools - -After you've forked and cloned the repositories you'll be working on, you'll need to set up local hosting so you can test out your changes. Flarum doesn't currently come with a development server, so you'll need to set up Apache/NGINX/Caddy/etc to serve this local Flarum installation. - -Alternatively, you can use tools like, [Laravel Valet](https://laravel.com/docs/master/valet) (Mac), [XAMPP](https://www.apachefriends.org/index.html) (Windows), or [Docker-Flarum](https://github.com/mondediefr/docker-flarum) (Linux) to serve a local forum. - -Most Flarum contributors develop with [PHPStorm](https://www.jetbrains.com/phpstorm/download/) or [Visual Studio Code](https://code.visualstudio.com/). - -## Development Workflow - -A typical contribution workflow looks like this: - -0. 🧭 **Plan** out your contribution - * Figure out [which issue you want to tackle](#what-to-work-on) - * Set up a [development environment](#setting-up-a-local-codebase) - -1. 🌳 **Branch** off the appropriate branch into a new feature branch. - * *Bug fixes* should be sent to the latest stable branch. - * *Minor* features that are fully backwards compatible with the current Flarum release may be sent to the latest stable branch. - * *Major* features should always be sent to the `main` branch, which contains the upcoming Flarum release. - * Internally we use the naming scheme `/` (eg. `tz/refactor-frontend`). - -2. 🔨 **Write** some code. - * See below about [Coding Style](#coding-style). - -3. 🚦 **Test** your code. - * Add unit tests as necessary when fixing bugs or adding features. - * Run the test suite with `vendor/bin/phpunit` in the relevant package folder. - * See [here](extend/testing.md) for more information about testing in Flarum. - -4. 💾 **Commit** your code with a descriptive message. - * If your change resolves an existing issue (usually, it should) include "Fixes #123" on a newline, where 123 is the issue number. - * Follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) specification. - * *Fix* commits should describe the issue fixed, not how it was fixed. - -5. 🎁 **Submit** a Pull Request on GitHub. - * Fill out the pull request template. - * If your change is visual, include a screenshot or GIF demonstrating the change. - * Do NOT check-in the JavaScript `dist` files. These will be compiled automatically on merge. - -6. 🤝 **Engage** with the Flarum team for approval. - * Team members will review your code. We may suggest some changes or improvements or alternatives, but for small changes your pull request should be accepted quickly. - * When addressing feedback, push additional commits instead of overwriting or squashing (we will squash on merge). - -7. 🕺 **Dance** like you just contributed to Flarum. - -## Coding Style - -In order to keep the Flarum codebase clean and consistent, we have a number of coding style guidelines that we follow. When in doubt, read the source code. - -Don't worry if your code styling isn't perfect! StyleCI and Prettier will automatically check formatting for every pull request. This allows us to focus on the content of the contribution, not the code style. - -### PHP - -Flarum follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard. On top of this, we conform to a number of [other style rules](https://github.com/flarum/framework/blob/main/.styleci.yml). We use PHP 7 type hinting and return type declarations where possible, and [PHPDoc](https://docs.phpdoc.org/) to provide inline documentation. Try and mimic the style used by the rest of the codebase in your contributions. - -* Namespaces should be singular (eg. `Flarum\Discussion`, not `Flarum\Discussions`) -* Interfaces should be suffixed with `Interface` (eg. `MailableInterface`) -* Abstract classes should be prefixed with `Abstract` (eg. `AbstractModel`) -* Traits should be suffixed with `Trait` (eg. `ScopeVisibilityTrait`) - -### JavaScript - -Flarum's JavaScript mostly follows the [Airbnb Style Guide](https://github.com/airbnb/javascript). We use [ESDoc](https://esdoc.org/manual/tags.html) to provide inline documentation. - -### Database - -**Columns** should be named according to their data type: -* DATETIME or TIMESTAMP: `{verbed}_at` (eg. created_at, read_at) or `{verbed}_until` (eg. suspended_until) -* INT that is a count: `{noun}_count` (eg. comment_count, word_count) -* Foreign key: `{verbed}_{entity}_id` (eg. hidden_user_id) - * Verb can be omitted for primary relationship (eg. post author is just `user_id`) -* BOOL: `is_{adjective}` (eg. is_locked) - -**Tables** should be named as follows: -* Use plural form (`discussions`) -* Separate multiple words with underscores (`access_tokens`) -* For relationships tables, join the two table names in singular form with an underscore in alphabetical order (eg. `discussion_user`) - -### CSS - -Flarum's CSS classes roughly follow the [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) using the format `.ComponentName-descendentName--modifierName`. - -### Übersetzungen - -We use a [standard key format](/extend/i18n.md#appendix-a-standard-key-format) to name translation keys descriptively and consistently. - -## Contributor License Agreement - -By contributing your code to Flarum you grant the Flarum Foundation (Stichting Flarum) a non-exclusive, irrevocable, worldwide, royalty-free, sublicensable, transferable license under all of Your relevant intellectual property rights (including copyright, patent, and any other rights), to use, copy, prepare derivative works of, distribute and publicly perform and display the Contributions on any licensing terms, including without limitation: (a) open source licenses like the MIT license; and (b) binary, proprietary, or commercial licenses. Except for the licenses granted herein, You reserve all right, title, and interest in and to the Contribution. - -You confirm that you are able to grant us these rights. You represent that You are legally entitled to grant the above license. If Your employer has rights to intellectual property that You create, You represent that You have received permission to make the Contributions on behalf of that employer, or that Your employer has waived such rights for the Contributions. - -You represent that the Contributions are Your original works of authorship, and to Your knowledge, no other person claims, or has the right to claim, any right in any invention or patent related to the Contributions. You also represent that You are not legally obligated, whether by entering into an agreement or otherwise, in any way that conflicts with the terms of this license. - -The Flarum Foundation acknowledges that, except as explicitly described in this Agreement, any Contribution which you provide is on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/README.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/README.md deleted file mode 100644 index 1f10bb747..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/README.md +++ /dev/null @@ -1,40 +0,0 @@ -- - - -slug: '/extend' -- - - - -# Extending Flarum - -Flarum ist minimalistisch, aber auch sehr erweiterbar. Tatsächlich sind die meisten Funktionen, die mit Flarum geliefert werden, tatsächlich Erweiterungen! - -This approach makes Flarum extremely customizable. A user can disable any features they don't use on their forum, and install other extensions to make a forum perfect for their community. - -In order to achieve this extensibility, Flarum has been built with rich APIs and extension points. With some programming knowledge, you can leverage these APIs to add just about any feature you want. This section of the documentation aims to teach you how Flarum works, and how to use the APIs so that you can build your own extensions. - -## Core vs. Extensions - -Where do we draw the line between Flarum's core and its extensions? Why are some features included in the core, and others aren't? It is important to understand this distinction so that we can maintain consistency and quality within Flarum's ecosystem. - -**Flarum's core** is not intended to be packed full of features. Rather, it is a scaffold, or a framework, which provides a reliable foundation on which extensions can build. It contains only basic, unopinionated functionality that is essential to a forum: discussions, posts, users, groups, and notifications. - -**Bundled extensions** are features that are packaged with Flarum and enabled by default. They are extensions just like any other, and may be disabled and uninstalled. While their scope is not intended to address all use-cases, the idea is to make them generic and configurable enough that they can satisfy the majority. - -**Third-party extensions** are features which are made by others and are not officially supported by the Flarum team. They can be built and used to address more specific use-cases. - -If you are aiming to address a bug or shortcoming of the core, or of an existing bundled extension, it may be appropriate to *contribute to the respective project* rather than disperse effort on a new third-party extension. It is a good idea to start a discussion on the [Flarum Community](https://discuss.flarum.org/) to get the perspective of the Flarum developers. - -## Useful Resources - -- [This Documentation](start.md) -- [Tips for Beginning Developers](https://discuss.flarum.org/d/5512-extension-development-tips) -- [Flarum CLI](https://github.com/flarum/cli) -- [Developers explaining their workflow for extension development](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) -- [Extension namespace tips](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) -- [Mithril js documentation](https://mithril.js.org/) -- [Laravel API Docs](https://laravel.com/api/8.x/) -- [Flarum API Docs](https://api.flarum.org) -- [ES6 cheatsheet](https://github.com/DrkSephy/es6-cheatsheet) - -### Getting help - -- [Official Flarum Dev Community](https://discuss.flarum.org/t/dev) -- [Join us on #extend in our discord chat](https://flarum.org/discord/) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/admin.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/admin.md deleted file mode 100644 index fba49cd30..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/admin.md +++ /dev/null @@ -1,214 +0,0 @@ -# Admin-Dashboard - -Beta 15 führte ein komplett neu gestaltetes Admin-Panel und eine Frontend-API ein. Es ist jetzt einfacher denn je, deiner Erweiterung Einstellungen oder Berechtigungen hinzuzufügen. - -Before beta 15, extension settings were either added in a `SettingsModal` or they added a new page for more complex settings. Now, every extension has a page containing info, settings, and the extension's own permissions. - -You can simply register settings, extend the base [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage), or provide your own completely custom page. - -## Erweiterungsdaten-API - -This new API allows you to add settings to your extension with very few lines of code. - -### Informiere die API über Deine Erweiterung - -Before you can register anything, you need to tell `ExtensionData` what extension it is about to get data for. - -Simply run the `for` function on `app.extensionData` passing in the id of your extension. To find you extension id, take the composer name and replace any slashes with dashes (example: 'fof/merge-discussions' becomes 'fof-merge-discussions'). Extensions with the `flarum-` and `flarum-ext-` will omit those from the name (example: 'webbinaro/flarum-calendar' becomes 'webbinaro-calendar'). - -For the following example, we will use the fictitious extension 'acme/interstellar': - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') -}); -``` - -Once that is done, you can begin adding settings and permissions. - -:::tip Hinweis - -All registration functions on `ExtensionData` are chainable, meaning you can call them one after another without running `for` again. - -::: - -### Registering Settings - -Adding settings fields in this way is recommended for simple items. As a rule of thumb, if you only need to store things in the settings table, this should be enough for you. - -To add a field, call the `registerSetting` function after `for` on `app.extensionData` and pass a 'setting object' as the first argument. Behind the scenes `ExtensionData` actually turns your settings into an [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), you can pass a priority number as the second argument. - -Here's an example with a switch (boolean) item: - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // This is the key the settings will be saved under in the settings table in the database. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // The label to be shown letting the admin know what the setting does. - help: app.translator.trans('acme-interstellar.admin.coordinates_help'), // Optional help text where a longer explanation of the setting can go. - type: 'boolean', // What type of setting this is, valid options are: boolean, text (or any other tag type), and select. - }, - 30 // Optional: Priority - ) -}); -``` - -If you use `type: 'select'` the setting object looks a little bit different: - -```js -{ - setting: 'acme-interstellar.fuel_type', - label: app.translator.trans('acme-interstellar.admin.fuel_type_label'), - type: 'select', - options: { - 'LOH': 'Liquid Fuel', // The key in this object is what the setting will be stored as in the database, the value is the label the admin will see (remember to use translations if they make sense in your context). - 'RDX': 'Solid Fuel', - }, - default: 'LOH', -} -``` - -Also, note that additional items in the setting object will be used as component attrs. This can be used for placeholders, min/max restrictions, etc: - -```js -{ - setting: 'acme-interstellar.crew_count', - label: app.translator.trans('acme-interstellar.admin.crew_count_label'), - type: 'number', - min: 1, - max: 10 -} -``` - -If you want to add something to the settings like some extra text or a more complicated input, you can also pass a callback as the first argument that returns JSX. This callback will be executed in the context of [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) and setting values will not be automatically serialized. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( -
-

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

- -
- ); - } - }) -}); -``` - -### Registering Permissions - -New in beta 15, permissions can now be found in 2 places. Now, you can view each extension's individual permissions on their page. All permissions can still be found on the permissions page. - -In order for that to happen, permissions must be registered with `ExtensionData`. This is done in a similar way to settings, call `registerPermission`. - -Arguments: - * Permission object - * What type of permission - see [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid)'s functions for types (remove items from the name) - * `ItemList` priority - -Back to our favorite rocket extension: - -```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Font-Awesome Icon - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Permission Label - permission: 'discussion.rocket_fly', // Actual permission name stored in database (and used when checking permission). - tagScoped: true, // Whether it be possible to apply this permission on tags, not just globally. Explained in the next paragraph. - }, - 'start', // Category permission will be added to on the grid - 95 // Optional: Priority - ); -}); -``` - -If your extension interacts with the [tags extension](https://github.com/flarum/tags) (which is fairly common), you might want a permission to be tag scopable (i.e. applied on the tag level, not just globally). You can do this by including a `tagScoped` attribute, as seen above. Permissions starting with `discussion.` will automatically be tag scoped unless `tagScoped: false` is indicated. - -To learn more about Flarum permissions, see [the relevant docs](permissions.md). - -### Chaining Reminder - -Remember these functions can all be chained like: - -```js -app.extensionData - .for('acme-interstellar') - .registerSetting(...) - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); -``` - -### Extending/Overriding the Default Page - -Sometimes you have more complicated settings that mess with relationships, or just want the page to look completely different. In this case, you will need to tell `ExtensionData` that you want to provide your own page. Note that `buildSettingComponent`, the util used to register settings by providing a descriptive object, is available as a method on `ExtensionPage` (extending from `AdminPage`, which is a generic base for all admin pages with some util methods). - -Create a new class that extends the `Page` or `ExtensionPage` component: - -```js -import ExtensionPage from 'flarum/admin/components/ExtensionPage'; - -export default class StarPage extends ExtensionPage { - content() { - return ( -

Hello from the settings section!

- ) - } -} - -``` - -Then, simply run `registerPage`: - -```js - -import StarPage from './components/StarPage'; - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); -}); -``` - -This page will be shown instead of the default. - -You can extend the [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) or extend the base `Page` and design your own! - -## Composer.json Metadata - -In beta 15, extension pages make room for extra info which is pulled from extensions' composer.json. - -For more information, see the [composer.json schema](https://getcomposer.org/doc/04-schema.md). - -| Description | Where in composer.json | -| ---------------------------------- | ------------------------------------------------------------ | -| discuss.flarum.org discussion link | "forum" key inside "support" | -| Documentation | "docs" key inside "support" | -| Support (email) | "email" key inside "support" | -| Website | "homepage" key | -| Donate | "funding" key block (Note: Only the first link will be used) | -| Source | "source" key inside "support" | diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/api-throttling.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/api-throttling.md deleted file mode 100644 index 9c039fe49..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/api-throttling.md +++ /dev/null @@ -1,58 +0,0 @@ -# API Throttling - -Flarum comes with a builtin `Flarum\Api\Middleware\ThrottleApi` [middleware](middleware.md) for throttling requests to the API. This runs on every API route, and extensions can add their own custom logic to throttle requests. - -:::caution Forumsrouten - -Some forum routes (login, register, forgot password, etc) work by calling an API route under the surface. The `ThrottleApi` middleware does not currently run for these requests, but that is planned for the future. - -::: - -## Custom Throttlers - -The format for a custom throttler is extremely simple: all you need is a closure or invokable class that takes the current request as an argument, and returns one of: - -- `false`: This explicitly bypasses throttling for this request, overriding all other throttlers -- `true`: This marks the request as to be throttled. -- `null`: This means that this throttler doesn't apply. Any other outputs will be ignored, with the same effect as `null`. - -Throttlers will be run on EVERY request, and are responsible for figuring out whether or not they apply. For example, consider Flarum's post throttler: - -```php -use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; -``` - -Throttlers can be added or removed via the `ThrottleApi` middleware in `extend.php`. For example: - -```php -set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders -]; -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/api.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/api.md deleted file mode 100644 index 073d858e1..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/api.md +++ /dev/null @@ -1,353 +0,0 @@ -# API and Data Flow - -In the [previous article](models.md), we learned how Flarum uses models to interact with data. Here, we'll learn how to get that data from the database to the JSON-API to the frontend, and all the way back again. - -:::info - -To use the built-in REST API as part of an integration, see [Consuming the REST API](../rest-api.md). - -::: - -## API Request Lifecycle - -Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical API request: - -![Flarum API Flowchart](/en/img/api_flowchart.png) - -1. An HTTP request is sent to Flarum's API. Typically, this will come from the Flarum frontend, but external programs can also interact with the API. Flarum's API mostly follows the [JSON:API](https://jsonapi.org/) specification, so accordingly, requests should follow [said specification](https://jsonapi.org/format/#fetching). -2. The request is run through [middleware](middleware.md), and routed to the proper controller. You can learn more about controllers as a whole on our [routes and content documentation](routes.md). Assuming the request is to the API (which is the case for this section), the controller that handles the request will be a subclass of `Flarum\Api\AbstractSerializeController`. -3. Any modifications done by extensions to the controller via the [`ApiController` extender](#extending-api-controllers) are applied. This could entail changing sort, adding includes, changing the serializer, etc. -4. The `$this->data()` method of the controller is called, yielding some raw data that should be returned to the client. Typically, this data will take the form of a Laravel Eloquent model collection or instance, which has been retrieved from the database. That being said, the data could be anything as long as the controller's serializer can process it. Each controller is responsible for implementing its own `data` method. Note that for `PATCH`, `POST`, and `DELETE` requests, `data` will perform the operation in question, and return the modified model instance. -5. That data is run through any pre-serialization callbacks that extensions register via the [`ApiController` extender](#extending-api-controllers). -6. The data is passed through a [serializer](#serializers), which converts it from the backend, database-friendly format to the JSON:API format expected by the frontend. It also attaches any related objects, which are run through their own serializers. As we'll explain below, extensions can [add / override relationships and attributes](#attributes-and-relationships) at the serialization level. -7. The serialized data is returned as a JSON response to the frontend. -8. If the request originated via the Flarum frontend's `Store`, the returned data (including any related objects) will be stored as [frontend models](#frontend-models) in the frontend store. - -## API Endpoints - -We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. - -As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: - -- Listing instances of a model (possibly including searching/filtering) -- Getting a single model instance -- Creating a model instance -- Updating a model instance -- Deleting a single model instance - -We'll go over each type of controller shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -:::caution - -Paths to API endpoints are not arbitrary! To support interactions with frontend models: - -- The path should either be `/prefix/{id}` for get/update/delete, or `/prefix` for list/create. -- the prefix (`tags` in the example above) must correspond to the JSON:API model type. You'll also use this model type in your serializer's `$type` attribute, and when registering the frontend model (`app.store.models.TYPE = MODEL_CLASS`). -- The methods must match the example above. - -Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! - -::: - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your endpoint controllers: -```bash -$ flarum-cli make backend api-controller -``` - -::: - -### Listing Resources - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -#### Pagination - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // The number of records included by default. - public $limit = 20; - - // The maximum number of records that can be requested. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. - -#### Sorting - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // The default sort field and order to use. - public $sort = ['name' => 'asc']; - - // The fields that are available to be sorted by. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -use Illuminate\Support\Str; - -// ... - -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(Str::snake($field), $order); -} - -return $query->get(); -``` - -#### Searching and Filtering - -Read our [searching and filtering](search.md) guide for more information! - -### Showing a Resource - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creating a Resource - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Updating a Resource - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Deleting a Resource - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Including Relationships - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Extending API Controllers - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -The `ApiController` extender can also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Serializers - -Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your serializer: -```bash -$ flarum-cli make backend api-serializer -``` - -::: - -### Attributes and Relationships - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -### Extending Serializers - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -### Non-Model Serializers and `ForumSerializer` - -Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/assets.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/assets.md deleted file mode 100644 index 16b401fc3..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/assets.md +++ /dev/null @@ -1,7 +0,0 @@ -# Extension Assets - -Some extensions might want to include assets like images or JSON files in their source code (note that this is not the same as uploads, which would probably require a [filesystem disk](filesystem.md)). - -This is actually very easy to do. Just create an `assets` folder at the root of your extension, and place any asset files there. Flarum will then automatically copy those files to its own `assets` directory (or other storage location if [one is offered by extensions](filesystem.md)) every time the extension is enabled or [`php flarum assets:publish`](../console.md) is executed. - -If using the default storage driver, assets will be available at `https://FORUM_URL/assets/extensions/EXTENSION_ID/file.path`. However, since other extensions might use remote filesystems, we recommend serializing the url to assets you need in the backend. See [Flarum's serialization of the logo and favicon URLs](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Serializer/ForumSerializer.php#L85-L86) for an example. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/authorization.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/authorization.md deleted file mode 100644 index 338bbd06f..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/authorization.md +++ /dev/null @@ -1,206 +0,0 @@ -# Authorization - -As with any framework, Flarum allows certain actions and content to be restricted to certain users. There are 2 parallel systems for this: - -- The authorization process dictates whether a user can take a certain action. -- Visibility scoping can be applied to a database query to efficiently restrict the records that users can access. This is documented in our [model visibility](model-visibility.md) article. - -## Authorization Process - -The authorization process is used to check whether a person is allowed to perform certain actions. For instance, we want to check if a user is authorized before they: - -- Access the admin dashboard -- Start a discussion -- Edit a post -- Update another user's profile - -Each of these is determined by unique criteria: in some cases a flag is sufficient; otherwise, we might need custom logic. - -## How It Works - -Authorization queries are made with 3 parameters, with logic contained in [`Flarum\User\Gate`](https://api.docs.flarum.org/php/master/flarum/user/access/gate): - -1. The actor: the user attempting to perform the action -2. The ability: a string representing the action the actor is attempting -3. The arguments: usually an instance of a database model which is the subject of the attempted ability, but could be anything. - -First, we run the entire request (all three parameters) through all [policies](#policies) registered by extensions and core. Policies are blocks of logic provided by core and extensions that determine whether the actor can perform the ability on the arguments. Policies can return one of the following: - -- `Flarum\User\Access\AbstractPolicy::ALLOW` (via `$this->allow()`) -- `Flarum\User\Access\AbstractPolicy::DENY` (via `$this->deny()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (via `$this->forceAllow()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (via `$this->forceDeny()`) - -Policy results are considered in the priority `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. For example, if a single policy returns `FORCE_DENY`, all other policies will be ignored. If one policy returns `DENY` and 10 policies return `ALLOW`, the request will be denied. This allows decisions to be made regardless of the order in which extensions are booted. Note that policies are extremely powerful: if access is denied at the policy stage, that will override group permissions and even admin privileges. - -Secondly, if all policies return null (or don't return anything), we check if the user is in a group that has a permission equal to the ability (note that both permissions and abilities are represented as strings). If so, we authorize the action. See our [Groups and Permissions documentation](permissions.md) for more information on permissions. - -Then, if the user is in the admin group, we will authorize the action. - -Finally, as we have exhausted all checks, we will assume that the user is unauthorized and deny the request. - -## How To Use Authorization - -Flarum's authorization system is accessible through public methods of the `Flarum\User\User` class. The most important ones are listed below; others are documented in our [PHP API documentation](https://api.docs.flarum.org/php/master/flarum/user/user). - - -In this example, we will use `$actor` as an instance of `Flarum\User\User`, `'viewForum'` and `'reply'` as examples of abilities, and `$discussion` (instance of `Flarum\Discussion\Discussion`) as an example argument. - -```php -// Check whether a user can perform an action. -$canDoSomething = $actor->can('viewForum'); - -// Check whether a user can perform an action on a subject. -$canDoSomething = $actor->can('reply', $discussion); - -// Raise a PermissionDeniedException if a user cannot perform an action. -$actor->assertCan('viewForum'); -$actor->assertCan('reply', $discussion); - -// Raise a NotAuthenticatedException if the user is not logged in. -$actor->assertRegistered(); - -// Raise a PermissionDeniedException if the user is not an admin. -$actor->assertAdmin(); - -// Check whether one of the user's groups have a permission. -// WARNING: this should be used with caution, as it doesn't actually -// run through the authorization process, so it doesn't account for policies. -// It is, however, useful in implementing custom policies. -$actorHasPermission = $actor->hasPermission(`viewForum`); -``` - -## Custom Policies - -Policies allow us to use custom logic beyond simple groups and permissions when evaluating authorization for an ability with a subject. For instance: - -- We want to allow users to edit posts even if they aren't moderators, but only their own posts. -- Depending on settings, we might allow users to rename their own discussions indefinitely, for a short period of time after posting, or not at all. - -As described [above](#how-it-works), on any authorization check, we query all policies registered for the target's model, or any parent classes of the target's model. If no target is provided, any policies registered as `global` will be applied. - -So, how does a policy get "checked"? - -First, we check if the policy class has a method with the same name as the ability being evaluated. If so, we run it with the actor and subject as parameters. If that method returns a non-null value, we return that result. Otherwise, we continue to the next step (not necessarily the next policy). - -Then, we check if the policy class has a method called `can`. If so, we run it with the actor, ability, and subject, and return the result. - -If `can` doesn't exist or returns null, we are done with this policy, and we proceed to the next one. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate policies: -```bash -$ flarum-cli make backend policy -``` - -::: - -### Example Policies - -Let's take a look at an example policy from [Flarum Tags](https://github.com/flarum/tags/blob/master/src/Access): - -```php -is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); - } -} -``` - -We can also have global policies, which are run when `$user->can()` is called without a target model instance. Again from Tags: - -```php -settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewForum', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } - } -} -``` - -### Registering Policies - -Both model-based and global policies can be registered with the `Policy` extender in your `extend.php` file: - -```php -use Flarum\Extend; -use Flarum\Tags\Tag; -use YourNamespace\Access; - -return [ - // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), - // Other extenders -]; -``` - -## Frontend Authorization - -Commonly, you'll want to use authorization results in frontend logic. For example, if a user doesn't have permission to see search users, we shouldn't send requests to that endpoint. And if a user doesn't have permission to edit users, we shouldn't show menu items for that. - -Because we can't do authorization checks in the frontend, we have to perform them in the backend, and attach them to serialization of data we're sending. Global permissions (`viewForum`, `viewUserList`) can be included on the `ForumSerializer`, but for object-specific authorization, we may want to include those with the subject object. For instance, when we return lists of discussions, we check whether the user can reply, rename, edit, and delete them, and store that data on the frontend discussion model. It's then accessible via `discussion.canReply()` or `discussion.canEdit()`, but there's nothing magic there: it's just another attribute sent by the serializer. - -For an example of how to attach data to a serializer, see a [similar case for transmitting settings](settings.md#accessing-settings). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/backend-events.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/backend-events.md deleted file mode 100644 index 25142b030..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/backend-events.md +++ /dev/null @@ -1,172 +0,0 @@ -# Backend Events - -Often, an extension will want to react to some events occuring elsewhere in Flarum. For instance, we might want to increment a counter when a new discussion is posted, send a welcome email when a user logs in for the first time, or add tags to a discussion before saving it to the database. These events are known as **domain events**, and are broadcasted across the framework through [Laravel's event system](https://laravel.com/docs/8.x/events). - -For a full list of backend events, see our [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). Domain events classes are organized by namespace, usually `Flarum\TYPE\Event`. - - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate event listeners: -```bash -$ flarum-cli make backend event-listener -``` - -::: - -## Listening to Events - -You can attach a listener to an event using the [`Event`](https://api.docs.flarum.org/php/master/flarum/extend/event) [extender](start.md#extenders): - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) -]; -``` -```php -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -As shown above, a listener class can be used instead of a callback. This allows you to [inject dependencies](https://laravel.com/docs/8.x/container) into your listener class via constructor parameters. In this example we resolve a translator instance, but we can inject anything we want/need. - -You can also listen to multiple events at once via an event subscriber. This is useful for grouping common functionality; for instance, if you want to update some metadata on changes to posts: - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Flarum\Post\Event\Saving; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; -``` -```php -class PostEventSubscriber -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function subscribe($events) - { - $events->listen(Deleted::class, [$this, 'handleDeleted']); - $events->listen(Saving::class, [$this, 'handleSaving']); - } - - public function handleDeleted(Deleted $event) - { - // Your logic here - } - - public function handleSaving(Saving $event) - { - // Your logic here - } -} -``` - -## Dispatching Events - -Dispatching events is very simple. All you need to do is inject `Illuminate\Contracts\Events\Dispatcher` into your class, and then call its `dispatch` method. For instance: - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` - -## Custom Events - -As an extension developer you can define your own events to allow yourself (or other extensions) to react to events in your extension. Events are generally instances of simple classes (no need to extend anything). When defining a new event, you'll typically want to use public properties, and maybe some methods for convenience of users. For example, if we take a look at `Flarum\Post\Event\Deleted`, it's just a wrapping around some data: - -```php -post = $post; - $this->actor = $actor; - } -} -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/cli.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/cli.md deleted file mode 100644 index ee92962b8..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# Flarum CLI - -The Flarum development ecosystem is oriented around many small, modules, interacting extensions. This is a very powerful and flexible paradigm, but it also brings the maintenance cost of creating and maintaining all these extensions. - -We've created the Flarum CLI (command line interface) as a tool to help developers by automating some repetitive and menial tasks, and allow them to get into the actual work without much hassle. - -Major updates about Flarum CLI will be published [on this discussion](https://discuss.flarum.org/d/28427-flarum-cli-v10). - -See the [package's readme](https://github.com/flarum/cli#readme) for information on: - -- Installation -- Usage -- Upgrading -- Available commands -- Some implementation details, if you're interested diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/console.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/console.md deleted file mode 100644 index 31aa2b87d..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/console.md +++ /dev/null @@ -1,70 +0,0 @@ -# Konsole - -Flarum allows extension developers to add custom console commands in addition to the [default ones](../console.md) provided by flarum core. - -All console command development is done in the backend using PHP. To create a custom console command, you'll need to create a class that extends `\Flarum\Console\AbstractCommand`. - -```php -use Flarum\Console\AbstractCommand; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -class YourCommand extends AbstractCommand { - protected function configure() - { - $this - ->setName('YOUR COMMAND NAME') - ->setDescription('YOUR COMMAND DESCRIPTION'); - } - protected function fire() - { - // Your logic here! - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate and register a console command: -```bash -$ flarum-cli make backend command -``` - -::: - -## Registering Console Commands - -To register console commands, use the `Flarum\Extend\Console` extender in your extension's `extend.php` file: - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Other extenders - (new Extend\Console())->command(CustomCommand::class) - // Other extenders -]; -``` - -## Scheduled Commands - -The `Flarum\Extend\Console`'s `schedule` method allows extension developers to create scheduled commands that run on an interval: - - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; -use Illuminate\Console\Scheduling\Event; - -return [ - // Other extenders - (new Extend\Console())->schedule('cache:clear', function (Event $event) { - $event->everyMinute(); - }, ['Arg1', '--option1', '--option2']), - // Other extenders -]; -``` - -In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/8.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands) for more information. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/distribution.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/distribution.md deleted file mode 100644 index 7061d5aa0..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/distribution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Distribution - -You've written a great extension — and now you want the whole world to be able to use it. This document will take you through the process of distribution, from setting up a Git repository for your extension, to publishing it on Packagist. - -## Setting Up Git - -The first thing you'll need to do is set up a version control system (VCS). The most popular VCS is [Git](https://git-scm.com/). In this guide we'll be using Git, so make sure you have it [installed](https://git-scm.com/downloads) before continuing. If you don't have much Git knowledge, you may want to check out [these learning resources](https://try.github.io/). - -After you have installed Git, you'll need to initialize your repository. You can use `git init` on the command line if you're comfortable, or use a GUI tool like [SourceTree](https://www.sourcetreeapp.com/) or [GitKraken](https://www.gitkraken.com/). - -Then, you'll need an account in a Git hosting server, the most popular being [GitHub](https://github.com) and [GitLab](https://gitlab.com). These will instruct you on how to hook up your local repository with the online "remote" repository. - -## Tagging a Release - -As you are going to be publishing this extension, you'll want to make sure that the information is up to date. Take a minute to revisit `composer.json` and make sure package name, description, and Flarum extension information are all correct. It is recommended to have a `README.md` file in your repository to explain what the extension is, so create one if you haven't already. - -When you're ready to release, commit your extension's files to the repo and tag your first version: - -```bash -git tag v0.1.0 -git push && git push --tags -``` - -## Publishing on Packagist - -Composer packages are published to a Composer repository, usually [Packagist](https://packagist.org/). You will need an account to proceed. - -If this is the first release you are publishing of your extension, you will need to [submit your package](https://packagist.org/packages/submit) using its public repository URL. If your extension is located on GitHub, this URL will look something like `https://github.com/AUTHOR/NAME.git`. - -### Future Releases - -You can set up Packagist to [auto-update packages](https://packagist.org/about#how-to-update-packages). Then for future releases, all you will need to do with Git is commit, tag, and push it to the remote server. - -## Promoting Your Extension - -You will most likely want to create a discussion on the Flarum Community in the [Extensions tag](https://discuss.flarum.org/t/extensions). Other people can install your extension using the following command: - -```bash -composer require vendor/package -``` \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/extending-extensions.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/extending-extensions.md deleted file mode 100644 index 7a8db4f8c..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/extending-extensions.md +++ /dev/null @@ -1,122 +0,0 @@ -# Extending Extensions - -Flarum extensions aren't just for adding features to core: extensions can extend other extensions! - -:::tip - -To learn how to make your extension extensible, see the [relevant documentation](extensibility.md) - -::: - -## Dependencies - -If your extension relies on another extension, you'll want to ensure that: - -- The other extension is installed and enabled before yours can be. -- The other extension can't be disabled while yours is enabled. -- The other extension is booted before your extension. - -Flarum makes this very easy: just add the other extension to your extension's `composer.json`'s `require` section. - -For example, if you were building a new theme for the Flarum Tags extension, your `composer.json` would look like this: - -```json -{ - // ... - "require": { - "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. - "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. - }, - // ... -} -``` - -## Optional Dependencies - -Sometimes, extension A might want to extend extension B only if extension B is enabled. In this case, we call B an "Optional Dependency" of A. For instance, a drafts extension might want to add support for saving private discussion drafts, but only if the private discussion extension is enabled. - -The first step here is detecting whether extension B is enabled. In the frontend, this is easy: if extension B does anything in the frontend, its extension ID will appear as a key in the `flarum.extensions` global object. For instance: - -```js -if ('some-extension-id' in flarum.extensions) { - // do something -} -``` - -In the backend, you'll need to inject an instance of `Flarum\Extension\ExtensionManager`, and use its `isEnabled()` method. For instance: - -```php -extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // do something. - } - } -} -``` - -Generally, if your extension has optional dependencies, you'll want it to be booted after said optional dependencies. You can also do this by specifying composer package names (NOT flarum extension IDs) in an array for the `extra.flarum-extension.optional-dependencies` key of your composer.json. - -For instance: - -```json -{ - // ... - "extra": { - "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] - } - }, - // ... -} -``` - -## Importing from Extensions - -In the backend, you can import the classes you need via regular PHP `use` statements: - -```php - { - // Your Extension Code Here -}) - -export { - // Put all the stuff you want to export here. -} -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/filesystem.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/filesystem.md deleted file mode 100644 index ef202b2c7..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/filesystem.md +++ /dev/null @@ -1,129 +0,0 @@ -# Filesystem - -Flarum core integrates with the filesystem to store and serve assets (like compiled JS/CSS or upload logos/favicons) and avatars. - -Extensions can use Flarum's provided utils for their own filesystem interaction and file storage needs. This system is based around [Laravel's filesystem tools](https://laravel.com/docs/8.x/filesystem), which are in turn based on the [Flysystem library](https://github.com/thephpleague/flysystem). - -## Disks - -Filesystem **disks** represent storage locations, and are backed by storage drivers, which we'll cover later. Flarum core has 2 disks: `flarum-assets` and `flarum-avatars`. - -### Using existing disks - -To access a disk, you'll need to retrieve it from the [Filesystem Factory](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Factory.html). To do so, you should inject the factory contract in your class, and access the disks you need. - -Let's take a look at core's [`DeleteLogoController`](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Controller/DeleteLogoController.php#L19-L58) for an example: - -```php -settings = $settings; - $this->uploadDir = $filesystemFactory->disk('flarum-assets'); - } - - /** - * {@inheritdoc} - */ - protected function delete(ServerRequestInterface $request) - { - RequestUtil::getActor($request)->assertAdmin(); - - $path = $this->settings->get('logo_path'); - - $this->settings->set('logo_path', null); - - if ($this->uploadDir->exists($path)) { - $this->uploadDir->delete($path); - } - - return new EmptyResponse(204); - } -} -``` - -The object returned by `$filesystemFactory->disk(DISK_NAME)` implements the [Illuminate\Contracts\Filesystem\Cloud](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Cloud.html) interface, and can be used to create/get/move/delete files, and to get the URL to a resource. - -### Declaring new disks - -Some extensions will want to group their resources / uploads onto a custom disk as opposed to using `flarum-assets` or `flarum-avatars`. - -This can be done via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->disk('flarum-uploads', function (Paths $paths, UrlGenerator $url) { - return [ - 'root' => "$paths->public/assets/uploads", - 'url' => $url->to('forum')->path('assets/uploads') - ]; - }); -``` - -Since all disks use the local filesystem by default, you'll need to provide a base path and base URL for the local filesystem. - -The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/8.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. - -## Storage drivers - -Flarum selects the active driver for each disk by checking the `disk_driver.DISK_NAME` key in the [settings repository](settings.md) and [config.php file](../config.md). If no driver is configured, or the configured driver is unavailable, Flarum will default to the `local` driver. - -You can define new storage drivers by implementing the [`Flarum\Filesystem\DriverInterface` interface](https://github.com/flarum/framework/blob/main/framework/core/src/Filesystem/DriverInterface.php#L16), and registering it via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->driver('aws-with-cdn', AwsWithCdnDriver::class); -``` - -Filesystem storage drivers are a very powerful tool that allows you to completely customize file storage locations, attach arbitrary CDNs, and otherwise extend the filesystem / cloud storage integration layer. - -:::danger - -Some drivers might try to index their filesystem every time the driver is instantiated, even if only the `url` method is needed. This can have serious performance implications. In most cases, you'll want to ensure that your driver's `url` method does not ping the remote filesystem. Similarly, the remote filesystem should usually not be accessed until operations are actually executed. - -::: - -## GUI and Admin Configuration - -Flarum does not currently provide a GUI for selecting drivers for disks, or for entering settings for drivers. This might be added in the future. For now, extensions are responsible for providing a GUI for their disks and drivers. - -As noted [above](#storage-drivers), if your extension provides a GUI for selecting drivers for a disk, it should modify the `disk_driver.DISK_NAME` key in settings. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/formatting.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/formatting.md deleted file mode 100644 index d4ea23b12..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/formatting.md +++ /dev/null @@ -1,42 +0,0 @@ -# Formatting - -Flarum uses the powerful [s9e TextFormatter](https://github.com/s9e/TextFormatter) library to format posts from plain markup into HTML. You should become familiar with [how TextFormatter works](https://s9etextformatter.readthedocs.io/Getting_started/How_it_works/) before you attempt to extend it. - -In Flarum, post content is formatted with a minimal TextFormatter configuration by default. The bundled **Markdown** and **BBCode** extensions simply enable the respective plugins on this TextFormatter configuration. - -## Configuration - -You can configure the TextFormatter `Configurator` instance, as well as run custom logic during parsing and rendering, using the `Formatter` extender: - -```php -use Flarum\Extend; -use Psr\Http\Message\ServerRequestInterface as Request; -use s9e\TextFormatter\Configurator; -use s9e\TextFormatter\Parser; -use s9e\TextFormatter\Renderer; - -return [ - (new Extend\Formatter) - // Add custom text formatter configuration - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modify raw text before it is parsed. - // This callback should return the modified text. - ->parse(function (Parser $parser, $context, $text) { - // custom logic here - return $newText; - }) - // Modify the XML to be rendered before rendering. - // This callback should return the new XML. - // For example, in the mentions extension, this is used to - // provide the username and display name of the user being mentioned. - // Make sure that the last $request argument is nullable (or omitted entirely). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // custom logic here - return $newXml; - }) -]; -``` - -With a good understanding of TextFormatter, this will allow you to achieve anything from simple BBCode tag additions to more complex formatting tasks like Flarum's **Mentions** extension. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/forms.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/forms.md deleted file mode 100644 index af8d74fb6..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/forms.md +++ /dev/null @@ -1,108 +0,0 @@ -# Forms and Requests - -In this article, we'll go over some frontend tools that are available to us for building and managing forms, as well how to send HTTP requests via Flarum. - -## Form Components - -As with any interactive site, you will likely want to include forms in some pages and modals. Flarum provides some components to make building (and styling!) these forms easier. Please see the linked API documentation for each of these to learn more about its accepted attrs. - -- The [`flarum/common/components/FieldSet` component](https://api.docs.flarum.org/js/master/class/src/common/components/fieldset.js~fieldset) wraps its children in a HTML fieldset tag, with a legend. -- The [`flarum/common/components/Select` component](https://api.docs.flarum.org/js/master/class/src/common/components/select.js~select) is a stylized select input. -- The [`flarum/common/components/Switch`](https://api.docs.flarum.org/js/master/class/src/common/components/switch.js~switch) and [`flarum/common/components/Checkbox` components](https://api.docs.flarum.org/js/master/class/src/common/components/checkbox.js~checkbox) are stylized checkbox input components. Their `loading` attr can be set to `true` to show a loading indicator. -- The [`flarum/common/components/Button` component](https://api.docs.flarum.org/js/master/class/src/common/components/button.js~button) is a stylized button, and is used frequently throughout Flarum. - -You'll typically want to assign logic for reacting to input changes via Mithril's `on*` attrs, not external listeners (as is common with jQuery or plain JS). For example: - -```jsx -import Component from 'flarum/common/Component'; -import FieldSet from 'flarum/common/components/FieldSet'; -import Button from 'flarum/common/components/Button'; -import Switch from 'flarum/common/components/Switch'; - - -class FormComponent extends Component { - oninit(vnode) { - this.textInput = ""; - this.booleanInput = false; - } - - view() { - return ( -
-
- this.textInput = e.target.value}> - - this.booleanInput = val}> - -
- -
- ) - } - - onsubmit() { - // Some form handling logic here - } -} -``` - -Don't forget to use [translations](i18n.md)! - - -## Streams, bidi, and withAttr - -Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/common/util/Stream`. This is a very powerful reactive data structure, but is most commonly used in Flarum as a wrapper for form data. Its basic usage is: - -```js -import Stream from 'flarum/common/utils/Stream'; - - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true -``` - -In Flarum forms, streams are frequently used together with the bidi attr. Bidi stands for bidirectional binding, and is a common pattern in frontend frameworks. Flarum patches Mithril with the [`m.attrs.bidi` library](https://github.com/tobyzerner/m.attrs. This abstracts away input processing in Mithril. For instance: - -```jsx -import Stream from 'flarum/common/utils/Stream'; - -const value = Stream(); - -// Without bidi - value(e.target.value)}> - -// With bidi - -``` - -You can also use the `flarum/common/utils/withAttr` util for simplified form processing. `withAttr` calls a callable, providing as an argument some attr of the DOM element tied to the component in question: - -```jsx -import Stream from 'flarum/common/utils/Stream'; -import withAttr from 'flarum/common/utils/withAttr'; - -const value = Stream(); - -// With a stream - - -// With any callable - { - // Some custom logic here -})}> -``` - -## Making Requests - -In our [models](models.md) documentation, you learned how to work with models, and save model creation, changes, and deletion to the database via the Store util, which is just a wrapper around Flarum's request system, which itself is just a wrapper around [Mithril's request system](https://mithril.js.org/request.html). - -Flarum's request system is available globally via `app.request(options)`, and has the following differences from Mithril's `m.request(options)`: - -- It will automatically attach `X-CSRF-Token` headers. -- It will convert `PATCH` and `DELETE` requests into `POST` requests, and attach a `X-HTTP-Method-Override` header. -- If the request errors, it will show an alert which, if in debug mode, can be clicked to show a full error modal. -- You can supply a `background: false` option, which will run the request synchronously. However, this should almost never be done. - -Otherwise, the API for using `app.request` is the same as that for `m.request`. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/frontend-pages.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/frontend-pages.md deleted file mode 100644 index 396292ad1..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/frontend-pages.md +++ /dev/null @@ -1,218 +0,0 @@ -# Frontend Pages and Resolvers - -As explained in the [Routes and Content](routes.md#frontend-routes) documentation, we can use Mithril's routing system to show different [components](frontend.md#components) for different routes. Mithril allows you to use any component you like, even a Modal or Alert, but we recommend sticking to component classes that inherit the `Page` component. - -## The Page Component - -We provide `flarum/common/components/Page` as a base class for pages in both the `admin` and `forum` frontends. It has a few benefits: - -- Automatically updates [`app.current` and `app.previous` PageState](#pagestate) when switching from one route to another. -- Automatically closes the modal and drawer when switching from one route to another. -- Applies `this.bodyClass` (if defined) to the '#app' HTML element when the page renders. -- It's also good for consistency's sake to use a common base class for all pages. -- If the page's `scrollTopOnCreate` attribute is set to `false` in `oninit`, the page won't be scrolled to the top when changed. -- If the page's `useBrowserScrollRestoration` is set to `false` in `oninit`, the browser's automatic scroll restoration won't be used on that page. - -Page components work just like any other inherited component. For a (very simple) example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - view() { - return

Hello!

- } -} -``` - -### Setting Page as Homepage - -Flarum uses a setting to determine which page should be the homepage: this gives admins flexibility to customize their communities. To add your custom page to the homepage options in Admin, you'll need to extend the `BasicsPage.homePageItems` method with your page's path. - -An example from the [Tags extension](https://github.com/flarum/tags/blob/master/js/src/admin/addTagsHomePageOption.js): - -```js -import { extend } from 'flarum/common/extend'; -import BasicsPage from 'flarum/common/components/BasicsPage'; - -export default function() { - extend(BasicsPage.prototype, 'homePageItems', items => { - items.add('tags', { - path: '/tags', - label: app.translator.trans('flarum-tags.admin.basics.tags_label') - }); - }); -} -``` - -To learn how to set up a path/route for your custom page, see the [relevant documentation](routes.md). - -### Page Titles - -Often, you'll want some custom text to appear in the browser tab's title for your page. For instance, a tags page might want to show "Tags - FORUM NAME", or a discussion page might want to show the title of the discussion. - -To do this, your page should include calls to `app.setTitle()` and `app.setTitleCount()` in its `oncreate` [lifecycle hook](frontend.md) (or when data is loaded, if it pulls in data from the API). - -For example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - oncreate(vnode) { - super.oncreate(vnode); - - app.setTitle("Cool Page"); - app.setTitleCount(0); - } - - view() { - // ... - } -} - -export default class CustomPageLoadsData extends Page { - oninit(vnode) { - super.oninit(vnode); - - app.store.find("users", 1).then(user => { - app.setTitle(user.displayName()); - app.setTitleCount(0); - }) - } - - view() { - // ... - } -} -``` - -Please note that if your page is [set as the homepage](#setting-page-as-homepage), `app.setTitle()` will clear the title for simplicity. It should still be called though, to prevent titles from previous pages from carrying over. - -## PageState - -Sometimes, we want to get information about the page we're currently on, or the page we've just come from. To allow this, Flarum creates (and stores) instances of [`PageState`](https://api.docs.flarum.org/js/master/class/src/common/states/pagestate.js~pagestate) as `app.current` and `app.previous`. These store: - -- The component class being used for the page -- A collection of data that each page sets about itself. The current route name is always included. - -Data can be set to, and retrieved from, Page State using: - -```js -app.current.set(KEY, DATA); -app.current.get(KEY); -``` - -For example, this is how the Discussion Page makes its [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) instance globally available. - -You can also check the type and data of a page using `PostStreamState`'s `matches` method. For instance, if we want to know if we are currently on a discussion page: - -```jsx -import IndexPage from 'flarum/forum/components/DiscussionPage'; -import DiscussionPage from 'flarum/forum/components/DiscussionPage'; - -// To just check page type -app.current.matches(DiscussionPage); - -// To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -## Admin Pages - -See the [Admin Dashboard documentation](admin.md) for more information on tools specifically available to admin pages (and how to override the admin page for your extension). - -## Route Resolvers (Advanced) - -[Advanced use cases](https://mithril.js.org/route.html#advanced-component-resolution) can take advantage of Mithril's [route resolver system](https://mithril.js.org/route.html#routeresolver). Flarum actually already wraps all its components in the `flarum/common/resolvers/DefaultResolver` resolver. This has the following benefits: - -- It passes a `routeName` attr to the current page, which then provides it to `PageState` -- It assigns a [key](https://mithril.js.org/keys.html#single-child-keyed-fragments) to the top level page component. When the route changes, if the top level component's key has changed, it will be completely rerendered (by default, Mithril does not rerender components when switching from one page to another if both are handled by the same component). - -### Using Route Resolvers - -There are actually 3 ways to set the component / route resolver when registering a route: - -- the `resolver` key can be used to provide an **instance** of a route resolver. This instance should define which component should be used, and hardcode the route name to be passed into it. This instance will be used without any modifications by Flarum. -- The `resolverClass` key AND `component` key can be used to provide a **class** that will be used to instantiate a route resolver, to be used instead of Flarum's default one, as well as the component to use. Its constructor should take 2 arguments: `(component, routeName)`. -- The `component` key can be used alone to provide a component. This will result in the default behavior. - -For example: - -```js -// See above for a custom page example -import CustomPage from './components/CustomPage'; -// See below for a custom resolver example -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Use a route resolver instance -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Use a custom route resolver class -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Use the default resolver class (`flarum/common/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -### Custom Resolvers - -We strongly encourage custom route resolvers to extend `flarum/common/resolvers/DefaultResolver`. For example, Flarum's `flarum/forum/resolvers/DiscussionPageResolver` assigns the same key to all links to the same discussion (regardless of the current post), and triggers scrolling when using `m.route.set` to go from one post to another on the same discussion page: - -```js -import DefaultResolver from '../../common/resolvers/DefaultResolver'; - -/** - * This isn't exported as it is a temporary measure. - * A more robust system will be implemented alongside UTF-8 support in beta 15. - */ -function getDiscussionIdFromSlug(slug: string | undefined) { - if (!slug) return; - return slug.split('-')[0]; -} - -/** - * A custom route resolver for DiscussionPage that generates the same key to all posts - * on the same discussion. It triggers a scroll when going from one post to another - * in the same discussion. - */ -export default class DiscussionPageResolver extends DefaultResolver { - static scrollToPostNumber: number | null = null; - - makeKey() { - const params = { ...m.route.param() }; - if ('near' in params) { - delete params.near; - } - params.id = getDiscussionIdFromSlug(params.id); - return this.routeName.replace('.near', '') + JSON.stringify(params); - } - - onmatch(args, requestedPath, route) { - if (route.includes('/d/:id') && getDiscussionIdFromSlug(args.id) === getDiscussionIdFromSlug(m.route.param('id'))) { - DiscussionPageResolver.scrollToPostNumber = parseInt(args.near); - } - - return super.onmatch(args, requestedPath, route); - } - - render(vnode) { - if (DiscussionPageResolver.scrollToPostNumber !== null) { - const number = DiscussionPageResolver.scrollToPostNumber; - // Scroll after a timeout to avoid clashes with the render. - setTimeout(() => app.current.get('stream').goToNumber(number)); - DiscussionPageResolver.scrollToPostNumber = null; - } - - return super.render(vnode); - } -} -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/frontend.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/frontend.md deleted file mode 100644 index 43b53dd66..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/frontend.md +++ /dev/null @@ -1,422 +0,0 @@ -# Frontend Development - -This page describes how to make changes to Flarum's user interface. How to add buttons, marquees, and blinking text. 🤩 - -[Remember](/extend/start.md#architecture), Flarum's frontend is a **single-page JavaScript application**. There's no Twig, Blade, or any other kind of PHP template to speak of. The few templates that are present in the backend are only used to render search-engine-optimized content. All changes to the UI need to be made via JavaScript. - -Flarum has two separate frontend applications: - -* `forum`, the public side of your forum where users create discussions and posts. -* `admin`, the private side of your forum where, as an administrator of your forum, you configure your Flarum installation. - -They share the same foundational code, so once you know how to extend one, you know how to extend both. - -:::tip Schreiben! - -Along with new TypeScript support, we have a [`tsconfig` package](https://www.npmjs.com/package/flarum-tsconfig) available, which you should install as a dev dependency to gain access to our typings. Make sure you follow the instructions in the [package's README](https://github.com/flarum/flarum-tsconfig#readme) to configure typings support. - -::: - -## Transpilation and File Structure - -This portion of the guide will explain the necessary file setup for extensions. Once again, we highly recommend using the [Flarum CLI](https://github.com/flarum/cli) to set up the file structure for you. That being said, you should still read this to understand what's going on beneath the surface. - -Before we can write any JavaScript, we need to set up a **transpiler**. This allows us to use [TypeScript](https://www.typescriptlang.org/) and its magic in Flarum core and extensions. - -In order to do this transpilation, you need to be working in a capable environment. No, not the home/office kind of environment – you can work in the bathroom for all I care! I'm talking about the tools that are installed on your system. You'll need: - -* Node.js and npm ([Download](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) - -This can be tricky because everyone's system is different. From the OS you're using, to the program versions you have installed, to the user access permissions – I get chills just thinking about it! If you run into trouble, ~~tell him I said hi~~ use [Google](https://google.com) to see if someone has encountered the same error as you and found a solution. If not, ask for help from the [Flarum Community](https://discuss.flarum.org) or on the [Discord chat](https://flarum.org/discord/). - -It's time to set up our little JavaScript transpilation project. Create a new folder in your extension called `js`, then pop in a couple of new files. A typical extension will have the following frontend structure: - -``` -js -├── dist (compiled js is placed here) -├── src -│ ├── admin -│ └── forum -├── admin.js -├── forum.js -├── package.json -├── tsconfig.json -└── webpack.config.js -``` - -### package.json - -```json -{ - "private": true, - "name": "@acme/flarum-hello-world", - "dependencies": { - "flarum-webpack-config": "^1.0.0", - "webpack": "^4.0.0", - "webpack-cli": "^4.0.0" - }, - "devDependencies": { - "flarum-tsconfig": "^1.0.0" - }, - "scripts": { - "dev": "webpack --mode development --watch", - "build": "webpack --mode production" - } -} -``` - -This is a standard JS [package-description file](https://docs.npmjs.com/files/package.json), used by npm and Yarn (Javascript package managers). You can use it to add commands, js dependencies, and package metadata. We're not actually publishing a npm package: this is simply used to collect dependencies. - -Please note that we do not need to include `flarum/core` or any flarum extensions as dependencies: they will be automatically packaged when Flarum compiles the frontends for all extensions. - -### webpack.config.js - -```js -const config = require('flarum-webpack-config'); - -module.exports = config(); -``` - -[Webpack](https://webpack.js.org/concepts/) is the system that actually compiles and bundles all the javascript (and its dependencies) for our extension. To work properly, our extensions should use the [official flarum webpack config](https://github.com/flarum/flarum-webpack-config) (shown in the above example). - -### tsconfig.json - -```json -{ - // Use Flarum's tsconfig as a starting point - "extends": "flarum-tsconfig", - // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder - // and also tells your Typescript server to read core's global typings for - // access to `dayjs` and `$` in the global namespace. - "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"], - "compilerOptions": { - // This will output typings to `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] - } - } -} -``` - -This is a standard configuration file to enable support for Typescript with the options that Flarum needs. - -Always ensure you're using the latest version of this file: https://github.com/flarum/flarum-tsconfig#readme. - -Even if you choose not to use TypeScript in your extension, which is supported natively by our Webpack config, it's still recommended to install the `flarum-tsconfig` package and to include this configuration file so that your IDE can infer types for our core JS. - -To get the typings working, you'll need to run `composer update` in your extension's folder to download the latest copy of Flarum's core into a new `vendor` folder. Remember not to commit this folder if you're using a version control system such as Git. - -You may also need to restart your IDE's TypeScript server. In Visual Studio Code, you can press F1, then type "Restart TypeScript Server" and hit ENTER. This might take a minute to complete. - -### admin.js and forum.js - -These files contain the root of our actual frontend JS. You could put your entire extension here, but that would not be well organized. For this reason, we recommend putting the actual source code in `src`, and having these files just export the contents of `src`. For instance: - -```js -// admin.js -export * from './src/admin'; - -// forum.js -export * from './src/forum'; -``` - -### src - -If following the recommendations for `admin.js` and `forum.js`, we'll want to have 2 subfolders here: one for `admin` frontend code, and one for `forum` frontend code. If you have components, models, utils, or other code that is shared across both frontends, you may want to create a `common` subfolder and place it there. - -Structure for `admin` and `forum` is identical, so we'll just show it for `forum` here: - -``` -src/forum/ -├── components/ -|-- models/ -├── utils/ -└── index.js -``` - -`components`, `models`, and `utils` are directories that contain files where you can define custom [components](#components), [models](models.md#frontend-models), and reusable util helper functions. Please note that this is all simply a recommendation: there's nothing forcing you to use this particular file structure (or any other file structure). - -The most important file here is `index.js`: everything else is just extracting classes and functions into their own files. Let's go over a typical `index.js` file structure: - -```js -import { extend, override } from 'flarum/common/extend'; - -// We provide our extension code in the form of an "initializer". -// This is a callback that will run after the core has booted. -app.initializers.add('acme-flarum-hello-world', function(app) { - // Your Extension Code Here - console.log("EXTENSION NAME is working!"); -}); -``` - -We'll go over tools available for extensions below. - -### Importing - -You should familiarize yourself with proper syntax for [importing js modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), as most extensions larger than a few lines will split their js into multiple files. - -Pretty much every Flarum extension will need to import *something* from Flarum Core. Like most extensions, core's JS source code is split up into `admin`, `common`, and `forum` folders. You can import the file by prefixing its path in the Flarum core source code with `flarum`. So `admin/components/AdminLinkButton` is available as `flarum/admin/components/AdminLinkButton`, `common/Component` is available as `flarum/common/Component`, and `forum/states/PostStreamState` is available as `flarum/forum/states/PostStreamState`. - -In some cases, an extension may want to extend code from another flarum extension. This is only possible for extensions which explicitly export their contents. - -* `flarum/tags` and `flarum/flags` are currently the only bundled extensions that allow extending their JS. You can import their contents from `flarum/{EXT_NAME}/PATH` (e.g. `flarum/tags/components/TagHero`). -* The process for extending each community extension is different; you should consult documentation for each individual extension. - -### Transpilation - -OK, time to fire up the transpiler. Run the following commands in the `js` directory: - -```bash -npm install -npm run dev -``` - -This will compile your browser-ready JavaScript code into the `js/dist/forum.js` file, and keep watching for changes to the source files. Nifty! - -When you've finished developing your extension (or before a new release), you'll want to run `npm run build` instead of `npm run dev`: this builds the extension in production mode, which makes the source code smaller and faster. - -## Asset Registration - -### JavaScript - -In order for your extension's JavaScript to be loaded into the frontend, we need to tell Flarum where to find it. We can do this using the `Frontend` extender's `js` method. Add it to your extension's `extend.php` file: - -```php -js(__DIR__.'/js/dist/forum.js') -]; -``` - -Flarum will make anything you `export` from `forum.js` available in the global `flarum.extensions['acme-hello-world']` object. Thus, you may choose to expose your own public API for other extensions to interact with. - -:::tip Externe Bibliotheken - -Only one main JavaScript file per extension is permitted. If you need to include any external JavaScript libraries, either install them with NPM and `import` them so they are compiled into your JavaScript file, or see [Routes and Content](/extend/routes.md) to learn how to add extra `'; - }) -]; -``` - -You can also add content onto your frontend route registrations: - -```php -return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) -]; -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/search.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/search.md deleted file mode 100644 index 167372780..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/search.md +++ /dev/null @@ -1,202 +0,0 @@ -# Searching and Filtering - -Flarum treats searching and filtering as parallel but distinct processes. Which process is used to handle a request to a [`List` API endpoint](/extend/api.md#api-endpoints) depends on the query parameters: - -- Filtering is applied when the `filter[q]` query param is omitted. Filters represent **structured** queries: for instance, you might want to only retrieve discussions in a certain category, or users who registered before a certain date. Filtering computes results based entirely on `filter[KEY] = VALUE` query parameters. -- Searching is applied when the `filter[q]` query param is included. Searches represent **unstructured** queries: the user submits an arbitrary string, and data records that "match" it are returned. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Searching computes results based solely on parsing the `filter[q]` query param: all other `filter[KEY] = VALUE` params are ignored when searching. It's important to note that searches aren't entirely unstructured: the dataset being searched can be constrained by gambits (which are very similar to filters, and will be explained later). - -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. - -Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. - -One key advantage of this split is that it allows searching to be implemented via an external service, such as ElasticSearch. For larger communities, this can be significantly more performant and accurate. There isn't a dedicated extender for this yet, so for now, replacing the default Flarum search driver requires overriding the container bindings of `Searcher` classes. This is a highly advanced use case; if you're interested in doing this, please reach out on our [community forums](https://discuss.flarum.org/). - -Remember that the [JSON:API schema](https://jsonapi.org/format) is used for all API requests. - -:::tip Code wiederverwenden - -Often, you might want to use the same class as both a `Filter` and a `Gambit` (both explained below). Your classes can implement both interface; see Flarum core's [`UnreadFilterGambit`](https://github.com/flarum/framework/blob/main/framework/core/src/Discussion/Query/UnreadFilterGambit.php) for an example. - -::: - -:::tip Query Builder vs. Eloquent Builder - -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps - -::: - -## Filtering - -Filtering constrains queries based on `Filters` (highlighted in code to avoid confusion with the process of filtering), which are classes that implement `Flarum\Filter\FilterInterface` and run depending on query parameters. After filtering is complete, a set of callbacks called "filter mutators" run for every filter request. - -When the `filter` method on a `Filterer` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Filter/AbstractFilterer.php#L50-L93)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Filterer` class's `getQuery()` method. -2. We loop through all `filter[KEY] = VALUE` query params. For each of these, any `Filter`s registered to the model whose `getFilterKey()` method matches the query param `KEY` is applied. `Filter`s can be negated by providing the query param as `filter[-KEY] = VALUE`. Whether or not a `Filter` is negated is passed to it as an argument: implementing negation is up to the `Filter`s. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "filter mutators" are applied. These are callbacks that receive the filter state (a wrapper around the query builder and current user) and filter criteria, and perform some arbitrary changes. All "filter mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Filtering for an Existing Model - -Let's say you've added a `country` column to the User model, and would like to filter users by country. We'll need to define a custom `Filter`: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -Note that `FilterState` is a wrapper around the Eloquent builder's underlying Query builder and the current user. - -Also, let's pretend that for some reason, we want to omit any users that have a different country from the current user on ANY filter. We can use a "filter mutator" for this: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -Now, all we need to do is register these via the Filter extender: - -```php - // Other extenders - (new Extend\Filter(UserFilterer::class)) - ->addFilter(CountryFilter::class) - ->addFilterMutator(OnlySameCountryFilterMutator::class), - // Other extenders -``` - -### Add Filtering to a New Model - -To filter a model that doesn't support filtering, you'll need to create a subclass of `Flarum/Filter/AbstractFilterer` for that model. For an example, see core's [UserFilterer](https://github.com/flarum/framework/blob/main/framework/core/src/User/Filter/UserFilterer.php). - -Then, you'll need to use that filterer in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -## Searching - -Searching constrains queries by applying `Gambit`s, which are classes that implement `Flarum\Search\GambitInterface`, based on the `filter[q]` query param. After searching is complete, a set of callbacks called "search mutators" run for every search request. - -When the `search` method on a `Searcher` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Search/AbstractSearcher.php#L55-L79)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Searcher` class's `getQuery()` method. -2. The `filter[q]` param is split by spaces into "tokens". Each token is matched against the model's registered `Gambit`s (each gambit has a `match` method). For any tokens that match a gambit, that gambit is applied, and the token is removed from the query string. Once all regular `Gambit`s have ran, all remaining unmatched tokens are passed to the model's `FullTextGambit`, which implements the actual searching logic. For example if searching discussions, in the `filter[q]` string `'author:1 hello is:hidden' world`, `author:1` and `is:hidden` would get matched by core's Author and Hidden gambits, and `'hello world'` (the remaining tokens) would be passed to the `DiscussionFulltextGambit`. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "search mutators" are applied. These are callbacks that receive the search state (a wrapper around the query builder and current user) and criteria, and perform some arbitrary changes. All "search mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Searching for an Existing Model - -Let's reuse the "country" examples we used above, and see how we'd implement the same things for searching: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -:::warning Keine Leerzeichen in Gambit-Mustern! - -Flarum splits the `filter[q]` string into tokens by splitting it at spaces. This means that your custom gambits can NOT use spaces as part of their pattern. - -::: - -:::tip AbstractRegexGambit - -All a gambit needs to do is implement `Flarum\Search\GambitInterface`, which receives the search state and a token. It should return if this gambit applies for the given token, and if so, make whatever mutations are necessary to the query builder accessible as `$searchState->getQuery()`. - -However, for most gambits, the `AbstractRegexGambit` abstract class (used above) should be used as a base class. This makes it a lot simpler to match and apply gambits. - -::: - -Similarly, the search mutator we need is almost identical to the filter mutator from before: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -We can register these via the `SimpleFlarumSearch` extender (in the future, the `Search` extender will be used for registering custom search drivers): - -```php - // Other extenders - (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(CountryGambit::class) - ->addSearchMutator(OnlySameCountrySearchMutator::class), - // Other extenders -``` - -### Add Searching to a New Model - -To support searching for a model, you'll need to create a subclass of `Flarum/Search/AbstractSearcher` for that model. For an example, see core's [UserSearcher](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/UserSearcher.php). - -Then, you'll need to use that searcher in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -Every searcher **must** have a fulltext gambit (the logic that actually does the searching). Otherwise, it won't be booted by Flarum, and you'll get an error. See core's [FulltextGambit for users](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/Gambit/FulltextGambit.php) for an example. You can set (or override) the full text gambit for a searcher via the `SimpleFlarumSearch` extender's `setFullTextGambit()` method. - -### Search Drivers - -Coming soon! - -## Frontend Tools - -Coming soon! diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/service-provider.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/service-provider.md deleted file mode 100644 index 65d98e0bf..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/service-provider.md +++ /dev/null @@ -1,65 +0,0 @@ -# Service Provider - -As noted throughout this documentation, Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection. [Service Providers](https://laravel.com/docs/8.x/providers) allow low-level configuration and modification of the Flarum backend. The most common use case for service providers is to create, modify, or replace container bindings. That being said, service providers allow you full access to run whatever logic you need during application boot with access to the container. - -:::caution Nur für Fortgeschrittene!!! - -Unlike with other extenders, the Service Provider layer is NOT use-case driven, and is NOT considered public API. It is subject to change at any time, without notice or deprecation. This should only be used if you know what you're doing, and the other extenders don't satisfy your use case. - -::: - -## Flarum Boot Process - -To understand service providers, you must first understand the order in which Flarum boots. Most of this happens in [Flarum\Foundation\InstalledSite](https://github.com/flarum/framework/blob/main/framework/core/src/Foundation/InstalledSite.php) - -1. The container and application are initialized, and essential bindings (config, environment, logger) are registered -2. The `register` methods of all core service providers are run. -3. The `extend` methods of all extenders used by all enabled extensions are run. -4. The `extend` methods of all extenders used in the Flarum site's local `extend.php` are run. -5. The `boot` methods of all core service providers are run. - -## Custom Service Providers - -A custom service provider should extend `Flarum\Foundation\AbstractServiceProvider`, and can have a `boot` and a `register` method. For example: - -```php -container->resolving(SomeClass::class, function ($container) { - return new SomeClass($container->make('some.binding')); - }); - } - - public function boot(Container $container) - { - // custom logic here - } -} -``` - -The `register` method will run during step (3) above, and the `boot` method will run during step (5) above. In the `register` method, the container is available via `$this->container`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. - -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane) for more information. - -To actually register your custom service provider, you can use the `ServiceProvider` extender in `extend.php`: - -```php -register(CustomServiceProvider::class), - // Other extenders -]; -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/settings.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/settings.md deleted file mode 100644 index ffefdcde5..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/settings.md +++ /dev/null @@ -1,90 +0,0 @@ -# Settings - -At some point while making an extension, you might want to read some of the forum's settings or store certain settings specific to your extension. Thankfully, Flarum makes this very easy. - -## The Settings Repository - -Reading or changing settings can be done using an implementation of the `SettingsRepositoryInterface`. Because Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection, you don't need to worry about where to obtain such a repository, or how to instantiate one. Instead, you can rely on the container to instantiate your class and inject the correct dependencies. - -```php -settings = $settings; - } -} -``` - -Great! Now the `SettingsRepositoryInterface` is available through `$this->settings` to our class. - -### Reading Settings - -To read settings, all we have to do is use the repository's `get()` function: - -`$this->settings->get('forum_title')` - -The `get()` function accepts two arguments: - -1. The name of the setting you are trying to read. -2. (Optional) A default value if no value has been stored for such a setting. By default, this will be `null`. - -### Storing Settings - -Storing settings ist just as easy, use the `set()` function: - -`$this->settings->set('forum_title', 'Super Awesome Forum')` - -The `set` function also accepts two arguments: - -1. The name of the setting you are trying to change. -2. The value you want to store for this setting. - -### Other Functions - -The `all()` function returns an array of all known settings. - -The `delete($name)` function lets you remove a named setting. - -## Settings in the Frontend - -### Editing Settings - -To learn more about adding settings through the admin dashboard, see the [relevant documentation](admin.md). -### Accessing Settings - -All settings are available in the `admin` frontend via the `app.data.settings` global. However, this is not done in the `forum` frontend, as anyone can access it, and you wouldn't want to leak all your settings! (Seriously, that could be a very problematic data breach). - -Instead, if we want to use settings in the `forum` frontend, we'll need to serialize them and send them alongside the initial forum data payload. - -This can be done via the `Settings` extender. For example: - -**extend.php** - -```php -use Flarum\Extend; - -return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }, "default value!"), -] -``` - -Now, the `my.cool.setting.key` setting will be accessible in the frontend as `app.forum.attribute("myCoolSetting")`, and our modified value will be accessible via `app.forum.attribute("myCoolSettingModified")`. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/slugging.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/slugging.md deleted file mode 100644 index 3dc39416b..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/slugging.md +++ /dev/null @@ -1 +0,0 @@ -# Model Slugging diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/start.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/start.md deleted file mode 100644 index b73125a7c..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/start.md +++ /dev/null @@ -1,153 +0,0 @@ -# Getting Started - -Want to build a Flarum extension? You've come to the right place! This document will take you through some essential concepts, after which you'll build your first Flarum extension from scratch. - -## Architecture - -In order to understand how to extend Flarum, first we need to understand a bit about how Flarum is built. - -Be aware that Flarum uses some _modern_ languages and tools. If you've only ever built WordPress plugins before, you might feel a bit out of your depth! That's OK — this is a great time to learn cool new things and extend your skillset. However, we would advise that you become somewhat familiar with the technologies described below before proceeding. - -Flarum is made up of three layers: - -* First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/8.x/container), which is used throughout our backend. - -* Second, the backend exposes a **public API** which allows frontend clients to interface with your forum's data. This is built according to the [JSON:API specification](https://jsonapi.org/). - -* Finally, there is the default web interface which we call the **frontend**. This is a [single-page application](https://en.wikipedia.org/wiki/Single-page_application) which consumes the API. It's built with a simple React-like framework called [Mithril.js](https://mithril.js.org). - -Extensions will often need to interact with all three of these layers to make things happen. For example, if you wanted to build an extension that adds custom fields to user profiles, you would need to add the appropriate database structures in the **backend**, expose that data in the **public API**, and then display it and allow users to edit it on the **frontend**. - -So... how do we extend these layers? - -## Extenders - -In order to extend Flarum, we will be using a concept called **extenders**. Extenders are *declarative* objects that describe in plain terms the goals you are trying to achieve (such as adding a new route to your forum, or executing some code when a new discussion was created). - -Every extender is different. However, they will always look somewhat similar to this: - -```php -// Register a JavaScript and a CSS file to be delivered with the forum frontend -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') -``` - -You first create an instance of the extender, and then call methods on it for further configuration. All of these methods return the extender itself, so that you can achieve your entire configuration just by chaining method calls. - -To keep things consistent, we use this concept of extenders in both the backend (in PHP land) and the frontend (in JavaScript land). _Everything_ you do in your extension should be done via extenders, because they are a **guarantee** we are giving to you that a future minor release of Flarum won't break your extension. - -All of the extenders currently available to you from Flarum's core can be found in the [`Extend` namespace](https://github.com/flarum/framework/blob/main/framework/core/src/Extend) [(PHP API documentation)](https://api.docs.flarum.org/php/master/flarum/extend) Extensions may also offer their [own extenders](extensibility.md#custom-extenders). - -## Hello World - -Want to see an extender in action? The `extend.php` file in the root of your Flarum installation is the easiest way to register extenders just for your site. It should return an array of extender objects. Pop it open and add the following: - -```php -content(function (Document $document) { - $document->head[] = ''; - }) -]; -``` - -Now pay your forum a visit for a pleasant (albeit extremely obtrusive) greeting. 👋 - -For simple site-specific customizations – like adding a bit of custom CSS/JavaScript, or integrating with your site's authentication system – the `extend.php` file in your forum's root is great. But at some point, your customization might outgrow it. Or maybe you have wanted to build an extension to share with the community from the get-go. Time to build an extension! - -## Extension Packaging - -[Composer](https://getcomposer.org) is a dependency manager for PHP. It allows applications to easily pull in external code libraries and makes it easy to keep them up-to-date so that security and bug fixes are propagated rapidly. - -As it turns out, every Flarum extension is also a Composer package. That means someone's Flarum installation can "require" a certain extension and Composer will pull it in and keep it up-to-date. Nice! - -During development, you can work on your extensions locally and set up a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path) to install your local copy. Create a new `packages` folder in the root of your Flarum installation, and then run this command to tell Composer that it can find packages in here: - -```bash -composer config repositories.0 path "packages/*" -``` - -Now let's start building our first extension. Make a new folder inside `packages` for your extension called `hello-world`. We'll put two files in it: `extend.php` and `composer.json`. These files serve as the heart and soul of the extension. - -### extend.php - -The `extend.php` file is just like the one in the root of your site. It will return an array of extender objects that tell Flarum what you want to do. For now, just move over the `Frontend` extender that you had earlier. - -### composer.json - -We need to tell Composer a bit about our package, and we can do this by creating a `composer.json` file: - -```json -{ - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": "^1.0.0" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } - } -} -``` - -* **name** is the name of the Composer package in the format `vendor/package`. - * You should choose a vendor name that’s unique to you — your GitHub username, for example. For the purposes of this tutorial, we’ll assume you’re using `acme` as your vendor name. - * You should prefix the `package` part with `flarum-` to indicate that it’s a package specifically intended for use with Flarum. - -* **description** is a short one-sentence description of what the extension does. - -* **type** MUST be set to `flarum-extension`. This ensures that when someone "requires" your extension, it will be identified as such. - -* **require** contains a list of your extension's own dependencies. - * You'll want to specify the version of Flarum that your extension is compatible with here. - * This is also the place to list other Composer libraries your code needs to work. - -* **autoload** tells Composer where to find your extension's classes. The namespace in here should reflect your extensions' vendor and package name in CamelCase. - -* **extra.flarum-extension** contains some Flarum-specific information, like your extension's display name and how its icon should look. - * **title** is the display name of your extension. - * **icon** is an object which defines your extension's icon. The **name** property is a [Font Awesome icon class name](https://fontawesome.com/icons). All other properties are used as the `style` attribute for your extension's icon. - -See [the composer.json schema](https://getcomposer.org/doc/04-schema.md) documentation for information about other properties you can add to `composer.json`. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -Use the CLI to automatically create your extension's scaffolding: -```bash -$ flarum-cli init -``` - -::: - -### Installing Your Extension - -The final thing we need to do to get up and running is to install your extension. Navigate to the root directory of your Flarum install and run the following command: - -```bash -composer require acme/flarum-hello-world *@dev -``` - -Once that's done, go ahead and fire 'er up on your forum's Administration page, then navigate back to your forum. - -*whizzing, whirring, metal clunking* - -Woop! Hello to you too, extension! - -We're making good progress. We've learned how to set up our extension and use extenders, which opens up a lot of doors. Read on to learn how to extend Flarum's frontend. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md deleted file mode 100644 index 28e6c4aa7..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md +++ /dev/null @@ -1,86 +0,0 @@ -# Static Code Analysis - -Static code analysis is the process of analyzing the source code against a set of rules to find bugs, code smells, and security vulnerabilities. This is a great way to improve the quality of your code and to find potential issues before they are deployed to production. An example is validating the typings of a function to ensure that the function is called with the correct arguments. - -Flarum provides a static code analysis package based on [PHPStan](https://phpstan.org/) that can be added to your extension. In this guide, we will show you how to add the package to your extension and how to run the analysis. - -## Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update the infrastructure for phpstan to your code: - -```bash -$ flarum-cli infra phpstan -``` - -::: - -First you need to require the `flarum/phpstan` package in your extension. You can do this by running the following command in the root of our extension: - -```bash -composer require --dev flarum/phpstan:^1.0 -``` - -Next, you need to create a `phpstan.neon` file in the root of your extension. This file contains [the configuration for PHPStan](https://phpstan.org/config-reference). You can copy the following configuration into the file: - -```neon -includes: - - vendor/flarum/phpstan/extension.neon - -parameters: - # The level will be increased in Flarum 2.0 - level: 5 - paths: - - src - - extend.php - excludePaths: - - *.blade.php - checkMissingIterableValueType: false - databaseMigrationsPath: ['migrations'] -``` - -Finally, you need to add the following script to your `composer.json` file: - -```json -{ - "scripts": { - "analyse:phpstan": "phpstan analyse", - "clear-cache:phpstan": "phpstan clear-result-cache" - }, - "scripts-descriptions": { - "analyse:phpstan": "Run static analysis" - } -} -``` - -## Running the analysis - -To run the analysis, you can run the following command in the root of your extension: - -```bash -composer analyse:phpstan -``` - -If you want to clear the cache before running the analysis, you can run the following command: - -```bash -composer clear-cache:phpstan && composer analyse:phpstan -``` - -## GitHub Actions - -You can also run the analysis using GitHub Actions. Checkout the page on [GitHub Actions](github-actions.md) for more information. - -## Tips - -### Extended model attribute types - -PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. - -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. - -```php -(new Extend\Model(User::class)) - ->cast('is_cool', 'bool'), -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/testing.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/testing.md deleted file mode 100644 index 2607b03da..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/testing.md +++ /dev/null @@ -1,565 +0,0 @@ -# Testing - -Automated testing ensures that your extension performs as you expect it to, helps avoid introducing new bugs or regressions, and saves time on manual testing. Flarum currently provides tooling for automated backend unit and integration tests, and we plan to release support for frontend unit testing and E2E testing in the future. - -## Backend Tests - -The `flarum/testing` library is used by core and some bundled extensions for automated unit and integration tests. It is essentially a collection of utils that allow testing Flarum core and extensions with PHPUnit. - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update backend testing infrastructure to your code: - -```bash -$ flarum-cli infra backendTesting -``` - -::: - -```bash -composer require --dev flarum/testing:^1.0 -``` - -Then, you will need to set up a file structure for tests, and add PHPUnit configuration: - -``` -tests -├── fixtures (put any files needed by your tests here (blade templates, images, etc)) -├── integration -│ ├── setup.php (code below) -│ └── PUT INTEGRATION TESTS HERE (organizing into folder is generally a good idea) -├── unit -│ ├── PUT UNIT TESTS HERE -├── phpunit.integration.xml (code below) -└── phpunit.unit.xml (code below) -``` - -#### phpunit.integration.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for integration tests. You can tweak this as needed, but keep `backupGlobals`, `backupStaticAttributes`, and `processIsolation` unchanged. - -```xml - - - - - - - ./integration - - - -``` - -#### phpunit.unit.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for unit tests. You can tweak this as needed. - -```xml - - - - - - - ./unit - - - - - - -``` - -#### setup.php - -This script will be run to set up a testing database / file structure. - -```php -run(); -``` - -#### composer.json Modifications - -We will also want to add scripts to our `composer.json`, so that we can run our test suite via `composer test`. Add some variant of the following to your `composer.json`: - -```json -"scripts": { - "test": [ - "@test:unit", - "@test:integration" - ], - "test:unit": "phpunit -c tests/phpunit.unit.xml", - "test:integration": "phpunit -c tests/phpunit.integration.xml", - "test:setup": "@php tests/integration/setup.php" -}, -"scripts-descriptions": { - "test": "Runs all tests.", - "test:unit": "Runs all unit tests.", - "test:integration": "Runs all integration tests.", - "test:setup": "Sets up a database for use with integration tests. Execute this only once." -} -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - ---- - -Now that we have everything in place, we need to set up our testing site for integration tests. For this, we will need a MySQL or MariaDb instance, and a place to store testing files. - -Testing database information is configured via the `DB_HOST` (defaults to `localhost`), `DB_PORT` (defaults to `3306`), `DB_DATABASE` (defaults to `flarum_test`), `DB_USERNAME` (defaults to `root`), `DB_PASSWORD` (defaults to `root`), and `DB_PREFIX` (defaults to `''`) environmental variables. The testing tmp directory path is configured via the `FLARUM_TEST_TMP_DIR_LOCAL` or `FLARUM_TEST_TMP_DIR` environmental variables, with the former taking precedence over the latter. If neither are provided, a `tmp` directory will be created in the `vendor` folder of your extension's local install. - -Now that we've provided the needed information, all we need to do is run `composer test:setup` in our extension's root directory, and we have our testing environment ready to go! - -Since [(almost)](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/tests/integration/api/discussions/ListWithFulltextSearchTest.php#L29-L45) all database operations in integration tests are run in transactions, developers working on multiple extensions will generally find it more convenient to use one shared database and tmp directory for testing all their extensions. To do this, set the database config and `FLARUM_TEST_TMP_DIR` environmental variables in your `.bashrc` or `.bash_profile` to the path you want to use, and run the setup script for any one extension (you'll still want to include the setup file in every repo for CI testing via GitHub Actions). You should then be good to go for any Flarum extension (or core). - -### Using Integration Tests - -Flarum's integration test utils are contained in the `Flarum\Testing\integration\TestCase` class. It: - -- Boots (and makes available) an instance of the Flarum application. -- Allows pre-populating the database, enabling extensions, and adding extenders. -- Runs all database changes in transactions, so your test database retains the default post-installation state. -- Allows sending requests through the middleware stack to test HTTP endpoints. - -Your testcase classes should extend this class. - -#### Test Case Setup - -There are several important utilities available for your test cases: - -- The `setting($key, $value)` method allows you to override settings before the app has booted. This is useful if your boot process has logic depending on settings (e.g. which driver to use for some system). -- Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. -- The `extension($extensionId)` method will take Flarum IDs of extensions to enable as arguments. Your extension should always call this with your extension's ID at the start of test cases, unless the goal of the test case in question is to confirm some behavior present without your extension, and compare that to behavior when your extension is enabled. If your extension is dependent on other extensions, make sure they are included in the composer.json `require` field (or `require-dev` for [optional dependencies](extending-extensions.md)), and also list their composer package names when calling `extension()`. Note that you must list them in a valid order. -- The `extend($extender)` method takes instances of extenders as arguments, and is useful for testing extenders introduced by your extension for other extensions to use. -- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/8.x/queries#insert-statements). - -If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. - -:::warning - -The `TestCase` class will boot a Flarum instance the first time its `app()` method is called. Any uses of `prepareDatabase`, `extend`, or `extension` after this happens will have no effect. Make sure you have done all the setup you need in your test case before calling `app()`, or `database()`, `server()`, or `send()`, which call `app()` implicitly. If you need to make database modifications after the app has booted, you can use the regular Eloquent save method, or the `Illuminate\Database\ConnectionInterface` instance obtained via calling the `database()` method. - -::: - -Of course, since this is all based on PHPUnit, you can use the `setUp()` methods of your test classes for common setup tasks. - -For example: - -```php -setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. - ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] - ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '

something

'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - - // ... -} -``` - -#### Sending Requests - -A common application of automated testing is pinging various HTTP endpoints with various data, authenticated as different users. You can use this to ensure that: - -- Users can't access content they're not supported to access. -- Permission-based create/edit/delete operations perform as expected. -- The type and schema of data returned is correct. -- Some desired side effect is applied when pinging an API. -- The basic API operations needed by your extension aren't erroring, and don't break when you make changes. - -`TestCase` provides several utilities: - -- The `request()` method constructs a `Psr\Http\Message\ServerRequestInterface` implementing object from a path, a method, and some options, which can be used for authentication, attaching cookies, or configuring the JSON request body. See the [method docblock](https://github.com/flarum/testing/blob/main/src/integration/TestCase.php) for more information on available options. -- Once you've created a request instance, you can send it (and get a response object back) via the `send()` method. - -For example: - -```php -send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - // ... -} -``` - -:::caution - -If you want to send query parameters in a GET request, you can't include them in the path; you'll need to add them afterwards with the `withQueryParams` method. - -::: - -:::caution - -This is an extreme edge case, but note that MySQL does not update the fulltext index in transactions, so the standard approach won't work if you're trying to test a modified fulltext query. See [core's approach](https://github.com/flarum/framework/blob/main/framework/core/tests/integration/extenders/SimpleFlarumSearchTest.php) for an example of a workaround. - -::: - -#### Console Tests - -If you want to test custom console commands, you can extend `Flarum\Testing\integration\ConsoleTestCase` (which itself extends the regular `Flarum\Testing\integration\TestCase`). It provides 2 useful methods: - -- `$this->console()` returns an instance of `Symfony\Component\Console\Application` -- `$this->runCommand()` takes an array that will be wrapped in `Symfony\Component\Console\Input\ArrayInput`, and run. See the [Symfony code docblock](https://github.com/symfony/console/blob/5.x/Input/ArrayInput.php#L22) for more information. - -For example: - -```php - 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } -} -``` - -### Using Unit Tests - -Unit testing in Flarum uses [PHPUnit](https://phpunit.de/getting-started/phpunit-9.html) and so unit testing in flarum is much like any other PHP application. You can find [general tutorials on testing](https://www.youtube.com/watch?v=9-X_b_fxmRM) if you're also new to php. - -When writing unit tests in Flarum, here are some helpful tips. - -#### Mocking Flarum Services - -Unlike the running app, or even integration tests, there is no app/container/etc to inject service instances into our classes. Now all the useful settings, or helpers your extension use require a _mock_ . We want to limit mocking to just the key services, supporting only the minimum interactions needed to test the contract of our individual functions. - -```php - public function setUp(): void - { - parent::setUp(); - // example - if our setting needs settings, we can mock the settings repository - $settingsRepo = m::mock(SettingsRepositoryInterface::class); - // and then control specific return values for each setting key - $settingsRepo->shouldReceive('get')->with('some-plugin-key')->andReturn('some-value-useful-for-testing'); - // construct your class under test, passing mocked services as needed - $this->serializer = new YourClassUnderTest($settingsRepo); - } -``` - -Some aspects require more mocks. If you're validating authorization interactions for instance you might need to mock your users `User::class` and the request's method that provides them as well! - -``` - $this->actor = m::mock(User::class); - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('getAttribute->getActor')->andReturn($this->actor); - $this->actor->shouldReceive('SOME PERMISSION')->andReturn(true/false); -``` - -NOTE: If you find your extension needs _lots and lots_ of mocks, or mocks that feel unrelated, it might be an opportunity to simplify your code, perhaps moving key logic into their own smaller functions (that dont require mocks). - -## Frontend Tests - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update frontend testing infrastructure to your code: - -```bash -$ flarum-cli infra frontendTesting -``` - -::: - -First, you need to install the Jest config dev dependency: - -```bash -$ yarn add --dev @flarum/jest-config -``` - -Then, add the following to your `package.json`: - -```json -{ - "type": "module", - "scripts": { - ..., - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" - } -} -``` - -Rename `webpack.config.js` to `webpack.config.cjs`. This is necessary because Jest doesn't support ESM yet. - -Create a `jest.config.cjs` file in the root of your extension: - -```js -module.exports = require('@flarum/jest-config')(); -``` - -If you are using TypeScript, create tsconfig.test.json with the following content: - -```json -{ - "extends": "./tsconfig.json", - "include": ["tests/**/*"], - "files": ["../../../node_modules/@flarum/jest-config/shims.d.ts"] -} -``` - -Then, you will need to set up a file structure for tests: - -``` -js -├── dist -├── src -├── tests -│ ├── unit -│ │ └── functionTest.test.js -│ ├── integration -│ │ └── componentTest.test.js -├── package.json -├── tsconfig.json -├── tsconfig.test.json -├── jest.config.cjs -└── webpack.config.cjs -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - -### Using Unit Tests - -Like any other JS project, you can use Jest to write unit tests for your frontend code. Checkout the [Jest docs](https://jestjs.io/docs/using-matchers) for more information on how to write tests. - -Here's a simple example of a unit test fo core's `abbreviateNumber` function: - -```ts -import abbreviateNumber from '../../../../src/common/utils/abbreviateNumber'; - -test('does not change small numbers', () => { - expect(abbreviateNumber(1)).toBe('1'); -}); - -test('abbreviates large numbers', () => { - expect(abbreviateNumber(1000000)).toBe('1M'); - expect(abbreviateNumber(100500)).toBe('100.5K'); -}); - -test('abbreviates large numbers with decimal places', () => { - expect(abbreviateNumber(100500)).toBe('100.5K'); - expect(abbreviateNumber(13234)).toBe('13.2K'); -}); -``` - -### Using Integration Tests - -Integration tests are used to test the components of your frontend code and the interaction between different components. For example, you might test that a page component renders the correct content based on certain parameters. - -Here's a simple example of an integration test for core's `Alert` component: - -```ts -import Alert from '../../../../src/common/components/Alert'; -import m from 'mithril'; -import mq from 'mithril-query'; -import { jest } from '@jest/globals'; - -describe('Alert displays as expected', () => { - it('should display alert messages with an icon', () => { - const alert = mq(m(Alert, { type: 'error' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toHaveElement('i.icon'); - }); - - it('should display alert messages with a custom icon when using a title', () => { - const alert = mq(Alert, { type: 'error', icon: 'fas fa-users', title: 'Woops..' }); - expect(alert).toContainRaw('Woops..'); - expect(alert).toHaveElement('i.fas.fa-users'); - }); - - it('should display alert messages with a title', () => { - const alert = mq(m(Alert, { type: 'error', title: 'Error Title' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toContainRaw('Error Title'); - expect(alert).toHaveElement('.Alert-title'); - }); - - it('should display alert messages with custom controls', () => { - const alert = mq(Alert, { type: 'error', controls: [m('button', { className: 'Button--test' }, 'Click me!')] }); - expect(alert).toHaveElement('button.Button--test'); - }); -}); - -describe('Alert is dismissible', () => { - it('should show dismiss button', function () { - const alert = mq(m(Alert, { dismissible: true }, 'Shoot!')); - expect(alert).toHaveElement('button.Alert-dismiss'); - }); - - it('should call ondismiss when dismiss button is clicked', function () { - const ondismiss = jest.fn(); - const alert = mq(Alert, { dismissible: true, ondismiss }); - alert.click('.Alert-dismiss'); - expect(ondismiss).toHaveBeenCalled(); - }); - - it('should not be dismissible if not chosen', function () { - const alert = mq(Alert, { type: 'error', dismissible: false }); - expect(alert).not.toHaveElement('button.Alert-dismiss'); - }); -}); -``` - -#### Methods - -These are the custom methods that are available for mithril component tests: -* **`toHaveElement(selector)`** - Checks if the component has an element that matches the given selector. -* **`toContainRaw(content)`** - Checks if the component HTML contains the given content. - -To negate any of these methods, simply prefix them with `not.`. For example, `expect(alert).not.toHaveElement('button.Alert-dismiss');`. For more information, check out the [Jest docs](https://jestjs.io/docs/using-matchers). For example you may need to check how to [mock functions](https://jestjs.io/docs/mock-functions), or how to use `beforeEach` and `afterEach` to set up and tear down tests. - - - -## E2E Tests - -Coming Soon! diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/theme.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/theme.md deleted file mode 100644 index 7890be47f..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/theme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Themes - -Flarum "themes" are just extensions. Typically, you'll want to use the `Frontend` extender to register custom [Less](https://lesscss.org/#overview) and JS. Of course, you can use other extenders too: for example, you might want to support settings to allow configuring your theme. - -You can indicate that your extension is a theme by setting the "extra.flarum-extension.category" key to "theme". For example: - -```json -{ - // other fields - "extra": { - "flarum-extension": { - "category": "theme" - } - } - // other fields -} -``` - -All this will do is show your extension in the "theme" section in the admin dashboard extension list. - -## Less Variable Customization - -You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. - -## Switching Between Themes - -Flarum doesn't currently have a comprehensive system that would support switching between themes. This is planned for future releases. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_0.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_0.md deleted file mode 100644 index 7ba6adcbf..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_0.md +++ /dev/null @@ -1,257 +0,0 @@ -# Updating For 1.0 - -Flarum version 1.0 is the long-awaited stable release! This release brings a number of refactors, cleanup, and small improvements that should make your Flarum experience just a bit better! - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Full Stack - -### Translations and transChoice - -#### Background - -Historically, Flarum has used Symfony for backend translations, and a port for frontend translations to keep format consistent. There are a few limitations to this approach though: - -- Developers need to decide between using `trans` or `transChoice` for pluralization -- The pluralization format is proprietary to Symfony -- We have to maintain the JS port ourselves -- Keys for values provided to backend translations need to be wrapped in curly braces. (e.g. `$this->translator->trans('some.translation', ['{username}' => 'Some Username!'])`). -- There's no support for complex applications (nested pluralization, non-number-based selection) -- As a result of the previous point, genderization is impossible. And that's kinda important for a lot of languages. - -### New System - -In v5, Symfony dropped their proprietary `transChoice` system in favor of the more-or-less standard [ICU MessageFormat](https://symfony.com/doc/5.2/translation/message_format.html). This solves pretty much every single one of the aforementioned issues. In this release, Flarum will be fully switching to ICU MessageFormat as well. What does this mean for extensions? - -- `transChoice` should not be used at all; instead, the variable passed for pluralization should be included in the data. -- Keys for backend translations no longer need to be surrounded by curly braces. -- Translations can now use the [`select` and `plural`](https://symfony.com/doc/5.2/translation/message_format.html) formatter syntaxes. For the `plural` formatter, the `offset` parameter and `#` magic variables are supported. -- These `select` and `plural` syntaxes can be nested to arbitrary depth. This is often a bad idea though (beyond, say, 2 levels), as things can get unnecessarily complex. - -No change to translation file naming is necessary (Symfony docs say that an `+intl-icu` suffix is necessary, but Flarum will now interpret all translation files as internationalized). - -#### Future Changes - -In the future, this will serve as a basis for additional features: - -- Translator preprocessors will allow extensions to modify arguments passed to translations. This will enable genderization (extensions could automatically extract a gender field from any objects of type "user" passed in). -- We could support internationalized "magic variables" for numbers: currently, `one` is supported, but others (`few`, `many`, etc) currently aren't. -- We could support ordinal formatting in additional to just plural formatting. - -#### Changes Needed in Extensions - -The `transChoice` methods in the frontend and backend have been removed. The `trans` method should always be used for translating, regardless of pluralization. If a translation requires pluralization, make sure you pass in the controlling variable as one of the arguments. - -In the frontend, code that looked like this: - -```js -app.translator.transChoice('some-translation', guestCount, {host: hostName}); -``` - -should be changed to: - -```js -// This uses ES6 key-property shorthand notation. {guestCount: guestCount} is equivalent to {guestCount} -app.translator.trans('some-translation', {host: hostName, guestCount }); -``` - -Similarly, in the backend, - -```php -$translator->transChoice('some-translation', $guestCount, ['{host}' => $hostName]); -``` - -should be changed to: - -```php -$translator->trans('some-translation', ['host' => $hostName, 'guestCount' => $guestCount]); -``` - -Note that in the backend, translation keys were previously wrapped in curly braces. This is no longer needed. - -#### Changes Needed in Translations - -Translations that aren't using pluralization don't need any changes. - -Pluralized translations should be changed as follows: - -`For {count} minute|For {count} minutes` - -to - -`{count, plural, one {For # minute} other {For # minutes}}` - -Note that in this example, `count` is the variable that controls pluralization. If a different variable were used (such as guestCount in the example above), this would look like: - -`{guestCount, plural, one {For # minute} other {For # minutes}}` - -See [our i18n docs](i18n.md) for more information. - -### Permissions Changes - -For a long time, the `viewDiscussions` and `viewUserList` permissions have been confusing. Despite their names: - -- `viewDiscussions` controls viewing both discussions and users. -- `viewUserList` controls searching users, not viewing user profiles. - -To clear this up, in v1.0, these permissions have been renamed to `viewForum` and `searchUsers` respectively. A migration in core will automatically adjust all permissions in the database to use the new naming. However, any extension code using the old name must switch to the new ones immediately to avoid security issues. To help the transfer, a warning will be thrown if the old permissions are referenced. - -We have also slightly improved tag scoping for permissions. Currently, permissions can be applied to tags if: - -- The permission is `viewForum` -- The permission is `startDiscussion` -- The permission starts with `discussion.` - -However, this doesn't work for namespaced permissions (`flarum-acme.discussion.bookmark`), or permissions that don't really have anything to do with discussions, but should still be scoped (e.g. `viewTag`). To counter this, a `tagScoped` attribute can be used on the object passed to [`registerPermission`](admin.md) to explicitly indicate whether the permission should be tag scopable. If this attribute is not provided, the current rules will be used to determine whether the permission should be tag scopable. - -## Frontend - -### Tooltip Changes - -The `flarum/common/components/Tooltip` component has been introduced as a simpler and less framework-dependent way to add tooltips. If your code is creating tooltips directly (e.g. via `$.tooltip()` in `oncreate` methods), you should wrap your components in the `Tooltip` component instead. For example: - -```tsx - - - -``` - -See [the source code](https://github.com/flarum/core/blob/master/js/src/common/components/Tooltip.tsx) for more examples and instructions. - -See [the PR](https://github.com/flarum/core/pull/2843/files) for examples of how to change existing code to use tooltips. - -### PaginatedListState - -The `flarum/common/states/PaginatedListState` state class has been introduced to abstract away most of the logic of `DiscussionListState` and `NotificationListState`. It provides support for loading and displaying paginated lists of JSON:API resources (usually models). In future releases, we will also provide an `PaginatedList` (or `InfiniteScroll`) component that can be used as a base class for these paginated lists. - -Please see [the source code](https://github.com/flarum/core/blob/master/js/src/common/states/PaginatedListState.ts) for a list of methods. - -Note that `flarum/forum/states/DiscussionListState`'s `empty` and `hasDiscussions` methods have been removed, and replaced with `isEmpty` and `hasItems` respectively. This is a breaking change. - -### New Loading Spinner - -The old `spin.js` based loading indicator has been replaced with a CSS-based solution. For the most part, no changes should be needed in extensions, but in some cases, you might need to update your spinner. This change also makes it easier to customize the spinner. - -See [this discussion](https://discuss.flarum.org/d/26994-beta16-using-the-new-loading-spinner) for more information. - -### classList util - -Ever wrote messy code trying to put together a list of classes for some component? Well, no longer! The [clsx library](https://www.npmjs.com/package/clsx) is now available as the `flarum/common/utils/classList` util. - -### User List - -An extensible user list has been added to the admin dashboard. In future releases, we hope to extract a generic model table component that can be used to list any model in the admin dashboard. - -See [the source code](https://github.com/flarum/core/blob/master/js/src/admin/components/UserListPage.tsx#L41) for a list of methods to extend, and examples of how columns should look like (can be added by extending the `columns` method and adding items to the [ItemList](frontend.md)). - -### Miscellaneous - -- Components should now call `super` for ALL Mithril lifecycle methods they define. Before, this was only needed for `oninit`, `onbeforeupdate`, and `oncreate`. Now, it is also needed in `onupdate`, `onbeforeremove`, and `onremove`. See [this GitHub issue](https://github.com/flarum/core/issues/2446) for information on why this change was made. -- The `flarum/common/utils/insertText` and `flarum/common/utils/styleSelectedText` utils have been moved to core from `flarum/markdown`. See `flarum/markdown` for an example of usage. -- The `extend` and `override` utils can now modify several methods at once by passing in an array of method names instead of a single method name string as the second argument. This is useful for extending the `oncreate` and `onupdate` methods at once. -- The `EditUserModal` component is no longer available through the `flarum/forum` namespace, it has been moved to `flarum/common`. Imports should be adjusted. -- The `Model` and `Route` JS extenders have been removed for now. There aren't currently used in any extensions that we know of. We will be reintroducing JS extenders during v1.x releases. -- The `Search` component can now be used with the `SearchState` state class. Previously, `SearchState` was missing the `getInitialSearch` method expected by the `Search` component. - -## Backend - -### Filesystem Extenders - -In this release, we refactored our use of the filesystem to more consistently use [Laravel's filesystem API](https://laravel.com/docs/8.x/filesystem). Extensions can now declare new disks, more easily use core's `flarum-assets` and `flarum-avatars` disks, and create their own storage drivers, enabling CDN and cloud storage support. - -### Compat and Closure Extenders - -In early Flarum versions, the `extend.php` file allowed arbitrary functions that allowed execution of arbitrary code one extension boot. For example: - -```php -return [ - // other extenders - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - } -]; -``` - -This approach was difficult to maintain and provide a well-tested public API for, frequently resolved classes early (breaking all sorts of things), and was not very descriptive. With the extender API completed in beta 16, this approach is no longer necessary. Support for these closures has been removed in this stable version. - -One type of functionality for which the extender replacement isn't obvious is container bindings ([e.g. flarum/pusher](https://github.com/flarum/pusher/blob/v0.1.0-beta.14/extend.php#L33-L49)). This can be done with via the service provider extender (e.g. [a newer version of flarum/pusher](https://github.com/flarum/pusher/blob/master/extend.php#L40-L41)). - -If you are unsure about which extenders should be used to replace your use of callbacks in `extend.php`, or are not sure that such an extender exists, please comment so below or reach out! We're in the final stages of finishing up the extender API, so now is the time to comment. - -### Scheduled Commands - -The [fof/console](https://github.com/FriendsOfFlarum/console) library has been a popular way to schedule commands (e.g. for publishing scheduled posts, running DB-heavy operations, etc) for several release. In Flarum 1.0, this functionality has been brought into core's `Console` extender. See our [console extension documentation](console.md) for more information on how to create schedule commands, and our [console user documentation](../console.md) for more information on how to run scheduled commands. - -### Eager Loading Extender - -As part of solving [N+1 Query issues](https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/) in some [Flarum API endpoints](https://github.com/flarum/core/issues/2637), we have introduced a `load` method on the `ApiController` extender that allows you to indicate relations that should be eager loaded. - -This should be done if you know a relation will always be included, or will always be referenced by controller / permission logic. For example, we will always need the tags of a discussion to check what permissions a user has on that discussion, so we should eager load the discussion's `tags` relationship. For example: - -```php -return [ - // other extenders - (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) - ->addInclude(['tags', 'tags.state', 'tags.parent']) - ->load('tags'), -]; -``` - -### RequestUtil - -The `Flarum\Http\RequestUtil`'s `getActor` and `withActor` should be used for getting/setting the actor (user) on requests. `$request->getAttribute('actor')` and `$request->withAttribute('actor')` are deprecated, and will be removed in v2.0. - -### Miscellaneous - -- The `Formatter` extender now has an `unparse` method that allows modifying XML before unparsing content. -- All route names must now be unique. In beta 16, uniqueness was enforced per-method; now, it is mandatory for all routes. -- API requests sent through `Flarum\Api\Client` now run through middleware, including `ThrottleApi`. This means that it is now possible to throttle login/registration calls. -- In beta 16, registering custom [searchers](search.md) was broken. It has been fixed in stable. -- The `post_likes` table in the [flarum/likes](https://github.com/flarum/likes) extension now logs the timestamp when likes were created. This isn't used in the extension, but could be used in other extensions for analytics. -- The `help` attribute of [admin settings](admin.md) no longer disappears on click. -- The `generate:migration` console command has been removed. The [Flarum CLI](https://discuss.flarum.org/d/26525-rfc-flarum-cli-alpha) should be used instead. -- The `GambitManager` util class is now considered internal API, and should not be used directly by extensions. -- The `session` attribute is no longer available on the `User` class. This caused issues with queue drivers, and was not conceptually correct (a user can have multiple sessions). The current session is still available via the `$request` instance. -- The `app`, `base_path`, `public_path`, `storage_path`, and `event` global helpers have been restored, but deprecated perpetually. These exist in case Laravel packages need them; they **should not** be used directly by Flarum extension code. The `flarum/laravel-helpers` package has been abandoned. -- The following deprecated features from beta 16 have been removed: - - The `TextEditor`, `TextEditorButton`, and `SuperTextarea` components are no longer exported through the `flarum/forum` namespace, but through `flarum/common` (with the exception of `SuperTextarea`, which has been replaced with `flarum/common/utils/BasicEditorDriver`). - - Support for `Symfony\Component\Translation\TranslatorInterface` has been removed, `Symfony\Contracts\Translation\TranslatorInterface` should be used instead. - - All backwards compatibility layers for the [beta 16 access token refactors](update-b16.md#access-token-and-authentication-changes) have been removed - - The `GetModelIsPrivate` event has been removed. The `ModelPrivate` extender should be used instead. - - The `Searching` (for both `User` and `Discussion` models), `ConfigureAbstractGambits`, `ConfigureDiscussionGambits`, and `ConfigureUserGambits` events have been removed. The `SimpleFlarumSearch` extender should be used instead. - - The `ConfigurePostsQuery` event has been removed. The `Filter` extender should be used instead. - - The `ApiSerializer` extender's `mutate` method has been removed. The same class's `attributes` method should be used instead. - - The `SearchCriteria` and `SearchResults` util classes have been removed. `Flarum\Query\QueryCriteria` and `Flarum\Query\QueryResults` should be used instead. - - The `pattern` property of `AbstractRegexGambit` has been removed; the `getGambitPattern` method is now a required abstract method. - - The `AbstractSearch` util class has been removed. `Flarum\Search\SearchState` and `Flarum\Filter\FilterState` should be used instead. - - The `CheckingPassword` event has been removed, the `Auth` extender should be used instead. - -## Tags Extension Changes - -As mentioned above, [tag scopable permissions](#permissions-changes) can now be explicitly declared. - -We've also made several big refactors to significantly improve tags performance. - -Firstly, the [Tag](https://github.com/flarum/tags/blob/d093ca777ba81f826157522c96680717d3a90e24/src/Tag.php#L38-L38) model's static `getIdsWhereCan` and `getIdsWhereCannot` methods have been removed. These methods scaled horribly on forums with many tags, sometimes adding several seconds to response time. - -These methods have been replaced with a `whereHasPermission` [Eloquent dynamic scope](https://laravel.com/docs/8.x/eloquent#dynamic-scopes) that returns a query. For example: - -`Tag::whereHasPermission($actor, 'viewDiscussions)`. - -That query can then be used in other DB queries, or further constricted to retrieve individual tags. - -Secondly, we no longer load in all tags as part of the initial payload. The initial payload contains all top-level primary tags, and the top 3 secondary tags. Other tags are loaded in as needed. Future releases will paginate secondary tags. This should enable forums to have thousands of secondary tags without significant performance impacts. These changes mean that extensions should not assume that all tags are available in the model store. - -## Testing Library Changes - -- Bundled extensions will not be automatically enabled; all enabled extensions must be specified in that test case. -- `setting` and `config` methods have been added that allow configuring settings and config.php values before the tested application boots. See [the testing docs](testing.md) for more information. -- The `php flarum test:setup` command will now drop the existing test DB tables before creating the database. This means that you can run `php flarum test:setup` to ensure a clean database without needing to go into the database and drop tables manually. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_x.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_x.md deleted file mode 100644 index ed17364ed..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-1_x.md +++ /dev/null @@ -1,139 +0,0 @@ -# Updating For 1.x - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## 1.7 - -### Frontend - -- Frontend extenders similar to the backend have been added, we highly recommend using them instead of the old method (https://docs.flarum.org/extend/models#adding-new-models-1), (https://docs.flarum.org/extend/routes#frontend-routes). -- There is a new tag selection component (https://github.com/flarum/framework/blob/360a2ba1d886df3fc6d326be932c5431ee9df8cf/extensions/tags/js/src/common/components/TagSelectionModal.tsx). - -### Backend - -- Support for php 8.2, deprecations are still thrown by some packages, the testing workflow has been updated to ignore deprecations on 8.2 -- The `/api` endpoint now contains the actor as an included relationship. -- The `Model::dateAttribute($attribute)` extender is deprecated, use `Model::cast($attribute, 'datetime')` instead. - -### Tooling - -- New `phpstan` package to run static code analysis on your extensions for code safety (https://docs.flarum.org/extend/static-code-analysis). -- New `jest-config` package to run frontend unit and component tests (https://docs.flarum.org/extend/testing). - -## 1.6 Changes - -### Backend - -- Added customizable session drivers through the `Session` extender. - -## 1.5 Changes - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Modals can be used in stacks, allowing for multiple modals to be open at once. This is useful for modals that open other modals: `app.modal.show(ModalComponent, { attrs }, true)`. - -### Backend - -- There is a new `createTableIfNotExists` migration helper, which can be used to create tables only if they don't already exist. - -## 1.4 Changes - -No developer-facing changes were made in Flarum v1.4. - -## 1.3 Changes - -Flarum v1.3 included mostly QoL improvements. Below are listed note worthy changes for extension developers: - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Frontend errors will no longer cause the forum to crash into a NoJs page. The extension will fail to execute its frontend code (initializer) and display an error to the admin through an alert, and to all users through the console. The frontend will continue to execute without the extension's frontend changes. -- The markdown toolbar can now be used on the admin side. - -### Backend - -- Calculation of the `number` attribute on `posts` has changed and no longer relies on the discussion model's `post_number_index` attribute which is now deprecated and will be removed in 2.0 -- Extension event listeners are now added after core even listeners, this should generally cause no changes in behavior. - -### Tooling - -- The backend tests workflow now automatically fails tests if there are any PHP warnings and notices. - -## 1.2 Changes - -Flarum v1.2 included quite a few bugfixes, internal refactors, and new features. The following recaps the most important changes for extension developers: - -### Frontend - -- Flarum core now passes TypeScript type checking (on the portion written in TypeScript). Additionally, major portions of the frontend (models, the application instance, and others) are now written in TypeScript. These changes should make it much easier and more fruitful to write extensions in TypeScript. -- Instead of directly using Less variables in CSS code, core now uses CSS variables. For the most part, we've just created CSS variables and set their values to the Less variables. This should make theming and customizing CSS a lot easier. https://github.com/flarum/core/pull/3146. -- Dropdowns can now be lazy-drawn to improve performance. You can do this by setting the lazy draw attr to "true". https://github.com/flarum/core/pull/2925. -- [Textarea-type settings](https://github.com/flarum/core/pull/3141) are now supported through the `app.extensionData.registerSetting` util. -- You can now use Webpack 5 to bundle your extension's code. This will offer minor bundle size improvements. -- A new `flarum/common/components/ColorPreviewInput` component [has been added](https://github.com/flarum/core/pull/3140). It can be used directly, or through the `color-preview` type when registered via `app.extensionData.registerSetting`. -- Extensions can now [modify the minimum search length](https://github.com/flarum/core/pull/3130) of the `Search` component. -- The following components are now extensible: - - The "colors" part of the Appearance page in the admin dashboard: https://github.com/flarum/core/pull/3186 - - The `StatusWidget` dropdown in the admin dashboard: https://github.com/flarum/core/pull/3189 - - `primaryControls` in the notification list: https://github.com/flarum/core/pull/3204 -- Extensions now have finer control over positioning when adding elements to the DiscussionPage sidebar items: https://github.com/flarum/core/pull/3165 -- - -### Backend - -- An [extender for settings defaults](https://github.com/flarum/core/pull/3127) has been added. This should be used instead of the `addSettings` migration helper, which has been deprecated. -- You can now [generate Less variables from setting values](https://github.com/flarum/core/pull/3011) via the `Settings` extender. -- Extensions can now [override/supplement blade template namespaces](https://github.com/flarum/core/pull/3167) through the `View` extender, meaning custom blade templates can be used instead of the default ones added by core or extensions. -- You can now define [custom Less functions through PHP](https://github.com/flarum/core/pull/3190), allowing you to use some backend logic in your Less theming. -- Extensions can now create [custom page title drivers](https://github.com/flarum/core/pull/3109/files) for titles in server-returned HTML. -- Custom logic can now be used when [deciding which relations to eager-load](https://github.com/flarum/core/pull/3116). -- Events [are now dispatched](https://github.com/flarum/core/pull/3203) for the `Notification\Read` and `Notification\ReadAll` events. -- An `ImageManager` instance is now [bound into the container](https://github.com/flarum/core/pull/3195), and can be configured to use either the `gd` or `imagick` backing drivers via the `"intervention.driver"` key in `config.php`. -- User IP addresses are now passed to the [API Client](https://github.com/flarum/core/pull/3124). -- A custom revision versioner implentation [can be set via container bindings](https://github.com/flarum/core/pull/3183) to customize how asset versions are named. -- A SlugManager instance [is now available](https://github.com/flarum/core/pull/3194) in blade templates via the `slugManager` variable. - -### Misc - -- Translations now support the `zero`, `one`, `two`, `few`, and `many` localized plural rules for `plural` ICU MessageFormat translations. This was done through the [`Intl.PluralRules` helper](https://github.com/flarum/core/issues/3072). -- Translations are now used for page titles, so that the format can be customized via language packs or [Linguist](https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease): https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228 -- API endpoints for retrieving single groups, as well as support for filtering groups on the plural get endpoint, [have been added](https://github.com/flarum/core/pull/3084). - - -### Tooling - - -- The `flarum-cli infra` command can now be used to update or enable various infrastructure features. You can now add the following to your extension in just one command: - - TypeScript - - Prettier for JS/TS formatting - - Backend testing with PHPUnit - - Code formatting with StyleCI - - EditorConfig support - - GitHub actions for automating testing, linting, type checking, and building. -- You can also exclude any files from these updates by adding their relative path to the "extra.flarum-cli" key's array in your extension's `composer.json` file. For example, if you wanted to exclude your tsconfig file from any updates by the infra system, the "extra.flarum-cli" key's value should be `["js/tsconfig.json"]`. -- The `flarum-cli audit infra` can be used to check that all infra modules your extension uses are up to date. The `--fix` flag can be used to automatically fix any issues, which has essentially the same effect as running `flarum-cli infra` for each outdated module. -- All `flarum-cli` commands can now be run with a `--no-interaction` flag to prevent prompts. Defaults will be used when possible, and errors will be thrown if a prompt is needed and there is no default. -- Frontend GH actions now support type-checking, as well as type coverage reports. - -## 1.1 Changes - -Flarum version 1.1 mostly focuses on bugfixes and quality-of-life improvements following our stable release earlier this year. These are mainly user-facing and internal infrastructure changes, so extensions are not significantly affected. - -### Frontend - -- Flarum now has an organization-wide prettier config package under [`@flarum/prettier-config`](https://github.com/flarum/prettier-config). -- Most custom (setting or data based) coloring in core is now done via [CSS custom properties](https://github.com/flarum/core/pull/3001). -- Typehinting for Flarum's globals are now [supported in extensions](https://github.com/flarum/core/pull/2992). -- You can now pass extra attrs to the `Select` component, and they will be [passed through to the DOM](https://github.com/flarum/core/pull/2959). -- The `DiscussionPage` component is now organized [as an item list](https://github.com/flarum/core/pull/3004), so it's easier for extensions to change its content. -- Extensions [can now edit](https://github.com/flarum/core/pull/2935) the `page` parameter of `PaginatedListState`. - -### Backend - -- Flarum now comes with a [Preload extender](https://github.com/flarum/core/pull/3057) for preloading any custom frontend assets. -- A new [Theme](https://github.com/flarum/core/pull/3008) extender now allows overriding Less files and internal imports. This allows themes to more easily completely replace Less modules. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b10.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b10.md deleted file mode 100644 index aaa98a2a5..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b10.md +++ /dev/null @@ -1,53 +0,0 @@ -# Updating For Beta 10 - -Beta 10 further solidifies the core architecture, offering new extenders as a stable, use-case-driven API for extending Flarum's core. A few small changes may necessitate updates to your extensions to make them compatible with Beta 10. These are detailed below. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- The `Flarum\Event\GetDisplayName` class has been moved to `Flarum\User\Event\GetDisplayName`. -- The `Flarum\Http\Exception\ForbiddenException` has been removed. Use `Flarum\User\Exception\PermissionDeniedException` instead. -- The `assertGuest()` method of the `Flarum\User\AssertPermissionTrait` has been removed without replacement. -- Old error handling middleware and exception handler classes were removed (see "New Features" for more details): - - `Flarum\Api\Middleware\HandleErrors` - - `Flarum\Http\Middleware\HandleErrorsWithView` - - `Flarum\Http\Middleware\HandleErrorsWithWhoops` - - `Flarum\Api\ErrorHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FloodingExceptionHandler` - - `Flarum\Api\ExceptionHandler\IlluminateValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidAccessTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidConfirmationTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\MethodNotAllowedExceptionHandler` - - `Flarum\Api\ExceptionHandler\ModelNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\PermissionDeniedExceptionHandler` - - `Flarum\Api\ExceptionHandler\RouteNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\TokenMismatchExceptionHandler` - - `Flarum\Api\ExceptionHandler\ValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - -## Recommendations - -- We tweaked the [recommended flarum/core version constraints for extensions](start.md#composer-json). We now recommend you mark your extension as compatible with the current and the upcoming beta release. (For beta.10, that would be any beta.10.x and beta.11.x version.) The core team will strive to make this work well by deprecating features before removing them. More details on this change in [this pull request](https://github.com/flarum/docs/pull/75). - -## New Features - -- New, extensible **error handling** stack in the `Flarum\Foundation\ErrorHandling` namespace: The `Registry` maps exceptions to "types" and HTTP status codes, `HttpFormatter` instances turn them into HTTP responses. Finally, `Reporter` instances are notified about unknown exceptions. - - You can build custom exception classes that will abort the current request (or console command). If they have semantic meaning to your application, they should implement the `Flarum\Foundation\KnownError` interface, which exposes a "type" that is used to render pretty error pages or dedicated error messages. - - More consistent use of HTTP 401 and 403 status codes. HTTP 401 should be used when logging in (i.e. authenticating) could make a difference; HTTP 403 is reserved for requests that fail because the already authenticated user is lacking permissions to do something. - - The `assertRegistered()` and `assertPermission()` methods of the `Flarum\User\AssertPermissionTrait` trait have been changed to match above semantics. See [this pull request](https://github.com/flarum/core/pull/1854) for more details. - - Error views are now determined based on error "type", not on status code (see [bdac88b](https://github.com/flarum/core/commit/bdac88b5733643b9c5dabae9e09a64d9f6e41d58)) -- **Queue support**: This release incorporates Laravel's illuminate/queue package, which allows offloading long-running tasks (such as email sending or regular cleanup jobs) onto a dedicated worker process. These changes are mostly under the hood, the next release(s) will start using the queue system for sending emails. By default, Flarum will use the "sync" queue driver, which executes queued tasks immediately. This is far from ideal and mostly guarantees a hassle-free setups. Production-grade Flarum installs are expected to upgrade to a more full-featured queue adapter. -- The `Flarum\Extend\LanguagePack` now accepts an optional path in its constructor. That way, language packs can store their locales in a different directory if they want to. -- The `formatContent()` method of `Flarum\Post\CommentPost` can now be called without an HTTP request instance, e.g. when rendering a post in an email template. - -## Deprecations - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- Laravel's global string and array helpers (e.g. `str_contains()` and `array_only()`) are deprecated in favor of their class based alternatives (`Illuminate\Support\Str::contains()` and `Illuminate\Support\Arr::only()`). See the [announcement](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers) and [pull request](https://github.com/laravel/framework/pull/26898) for more information. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b12.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b12.md deleted file mode 100644 index ce6b1aca2..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b12.md +++ /dev/null @@ -1,34 +0,0 @@ -# Updating For Beta 12 - -Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Deprecations / Upcoming breaking changes - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- PHP 7.1 support will be dropped in beta.13. -- Using library classes from the `Zend` namespace is now deprecated and will be removed in beta.13. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been deprecated. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been deprecated. We finally have a [proper replacement](middleware.md) - see "New Features" below. Therefore, it will be removed in beta.13. -- If you implement the `Flarum\Mail\DriverInterface`: - - Returning a plain array of field names from the `availableSettings()` method is deprecated, but still supported. It must now return an array of field names mapping to their type. See [the inline documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L25-L32) for more details. - - Implement the `validate()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L34-L48). - - Implement the `canSend()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L50-L54). - -## New Features - -- New **PHP extenders**: - - `Flarum\Extend\Middleware` offers methods for adding, removing or replacing middleware in our three middleware stacks (api, forum, admin). We also added [documentation](middleware.md) for this feature. - - `Flarum\Extend\ErrorHandling` lets you configure status codes and other aspects of our error handling stack depending on error types or exception classes. -- **JavaScript**: - - The `flarum/components/Select` component now supports a `disabled` prop. See [PR #1978](https://github.com/flarum/core/pull/1978). - -## Other changes / Recommendations - -- The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b13.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b13.md deleted file mode 100644 index 1b19a9714..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b13.md +++ /dev/null @@ -1,40 +0,0 @@ -# Updating For Beta 13 - -Beta 13 ships with several new extenders to simplify building and maintaining extensions. We do our best to create backward compatibility changes. We recommend changing to new Extenders as soon as they are available. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- Dropped support for PHP 7.1. -- Classes from the `Zend` namespace are now removed. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been removed including the class. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been removed. Use the [proper replacement](middleware.md). -- Several events used in Event Listeners have been removed, use their [replacement extender](start.md#extenders) instead. -- The LanguagePack extender only loads keys from extensions that are enabled. The translations loaded are based on the yaml files matching the [i18n namespace](i18n.md#appendix-a-standard-key-format). -- All notifications are now sent through the queue; without a queue driver they will run as usual. -- The implementation of avatar upload changed, we're [no longer storing files temporarily on disk](https://github.com/flarum/core/pull/2117). -- The SES mail driver [has been removed](https://github.com/flarum/core/pull/2011). -- Mail driver backward compatibility from beta 12 has been removed, use the new Mail extender or implement the [modified interface](https://github.com/flarum/core/blob/master/src/Mail/DriverInterface.php). - -## Recommendations - -- Beta 14 will ship with a rewrite in the frontend (javascript). If you're building for that release, make sure to follow our [progress](https://github.com/flarum/core/pull/2126). - -## New Features - -- A ton of new extenders: - - [Middleware extender](https://github.com/flarum/core/pull/2017) - - [Console extender](https://github.com/flarum/core/pull/2057) - - [CSRF extender](https://github.com/flarum/core/pull/2095) - - [Event extender](https://github.com/flarum/core/pull/2097) - - [Mail extender](https://github.com/flarum/core/pull/2012) - - [Model extender](https://github.com/flarum/core/pull/2100) - -## Deprecations - -- Several events [have been marked deprecated](https://github.com/flarum/core/commit/4efdd2a4f2458c8703aae654f95c6958e3f7b60b) to be removed in beta 14. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b14.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b14.md deleted file mode 100644 index deafdc960..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b14.md +++ /dev/null @@ -1,757 +0,0 @@ -# Updating For Beta 14 - -This release brings a large chunk of breaking changes - hopefully the last chunk of this size before our stable release. In order to prepare the codebase for the upcoming stable release, we decided it was time to modernize / upgrade / exchange some of the underlying JavaScript libraries that are used in the frontend. Due to the nature and size of these upgrades, we have to pass on some of the breaking changes to you, our extension developers. - -On the bright side, this overdue upgrade brings us closer to the conventions of best practices of [Mithril.js](https://mithril.js.org/), the mini-framework used for Flarum's UI. Mithril's 2.0 release sports a more consistent component interface, which should be a solid foundation for years to come. Where possible, we replicated old APIs, to ease the upgrade and give you time to do the full transition. Quite a few breaking changes remain, though - read more below. - -:::tip - -If you need help with the upgrade, our friendly community will gladly help you out either [on the forum](https://discuss.flarum.org/t/extensibility) or [in chat](https://flarum.org/chat/). - -::: - -To ease the process, we've clearly separated the changes to the [frontend (JS)](#frontend-javascript) from those in the [backend (PHP)](#backend-php) below. If your extension does not change the UI, consider yourself lucky. :-) - -A [summary of the frontend changes](#required-frontend-changes-recap) is available towards the end of this guide. - -## Frontend (JavaScript) - -### Mithril 2.0: Concepts - -Most breaking changes required by beta 14 are prompted by changes in Mithril 2. [Mithril's upgrade guide](https://mithril.js.org/migration-v02x.html) is an extremely useful resource, and should be consulted for more detailed information. A few key changes are explained below: - -#### props -> attrs; initProps -> initAttrs - -Props passed into component are now referred to as `attrs`, and can be accessed via `this.attrs` where you would prior use `this.props`. This was done to be closer to Mithril's preferred terminology. We have provided a temporary backwards compatibility layer for `this.props`, but recommend using `this.attrs`. - -Accordingly, `initProps` has been replaced with `initAttrs`, with a similar BC layer. - -#### m.prop -> `flarum/utils/Stream` - -Mithril streams, which were available via `m.prop` in Mithril 0.2, are now available via `flarum/utils/Stream`. `m.prop` will still work for now due to a temporary BC layer. - -#### m.withAttr -> withAttr - -The `m.withAttr` util has been removed from Mithril. We have provided `flarum/utils/withAttr`, which does the same thing. A temporary BC layer has been added for `m.withAttr`. - -#### Lifecycle Hooks - -In mithril 0.2, we had 2 "lifecycle hooks": - -`init`, an unofficial hook which ran when the component instance was initialized. - -`config`, which ran when components were created, and on every redraw. - - -Mithril 2 has the following hooks; each of which take `vnode` as an argument: - -- `oninit` -- `oncreate` -- `onbeforeupdate` -- `onupdate` -- `onbeforeremove` -- `onremove` - -Please note that if your component is extending Flarum's helper `Component` class, you must call `super.METHOD(vnode)` if using `oninit`, `oncreate`, and `onbeforeupdate`. - -More information about what each of these do can be found [in Mithril's documentation](https://mithril.js.org/lifecycle-methods.html). - -A trivial example of how the old methods map to the new is: - -```js -class OldMithrilComponent extends Component { - init() { - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - config(element, isInitialized) { - console.log('Code to run on every redraw AND when the element is first attached'); - - if (isInitialized) return; - - console.log('Code to execute only once when components are first created and attached to the DOM'); - - context.onunload = () => { - console.log('Code to run when the component is removed from the DOM'); - } - } - - view() { - // In mithril 0, you could skip redrawing a component (or part of a component) by returning a subtree retain directive. - // See https://mithril.js.org/archive/v0.2.5/mithril.render.html#subtree-directives - // dontRedraw is a substitute for logic; usually, this is used together with SubtreeRetainer. - if (dontRedraw()) return { subtree: 'retain' }; - - return

Hello World!

; - } -} - -class NewMithrilComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - oncreate(vnode) { - super.oncreate(vnode); - - console.log('Code to run when components are first created and attached to the DOM'); - } - - onbeforeupdate(vnode, oldVnode) { - super.onbeforeupdate(vnode); - - console.log('Code to run BEFORE diffing / redrawing components on every redraw'); - - // In mithril 2, if we want to skip diffing / redrawing a component, we return "false" in its onbeforeupdate lifecycle hook. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeupdate - // This is also typically used with SubtreeRetainer. - if (dontRedraw()) return false; - } - - onupdate(vnode) { - // Unlike config, this does NOT run when components are first attached. - // Some code might need to be replicated between oncreate and onupdate. - console.log('Code to run on every redraw AFTER the DOM is updated.'); - } - - onbeforeremove(vnode) { - // This is run before components are removed from the DOM. - // If a promise is returned, the DOM element will only be removed when the - // promise completes. It is only called on the top-level component that has - // been removed. It has no equivalent in Mithril 0.2. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeremove - return Promise.resolve(); - } - - onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); - } -} -``` - -#### Children vs Text Nodes - -In Mithril 0.2, every child of a vnode is another vnode, stored in `vnode.children`. For Mithril 2, as a performance optimization, vnodes with a single text child now store that text directly in `vnode.text`. For developers, that means that `vnode.children` might not always contain the results needed. Luckily, text being stored in `vnode.text` vs `vnode.children` will be the same each time for a given component, but developers should be aware that at times, they might need to use `vnode.text` and not `vnode.children`. - -Please see [the mithril documentation](https://mithril.js.org/vnodes.html#structure) for more information on vnode structure. - -#### Routing API - -Mithril 2 introduces a few changes in the routing API. Most of these are quite simple: - -- `m.route()` to get the current route has been replaced by `m.route.get()` -- `m.route(NEW_ROUTE)` to set a new route has been replaced by `m.route.set(NEW_ROUTE)` -- When registering new routes, a component class should be provided, not a component instance. - -For example: - -```js -// Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } - -// Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } -``` - -Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. - -```js -// Mithril 0.2 -
Link Content - -// Mithril 2 -import Link from 'flarum/components/Link'; - -Link Content -``` - -You can also use `Link` to define external links, which will just render as plain `Children` html links. - -For a full list of routing-related changes, please see [the mithril documentation](https://mithril.js.org/migration-v02x.html). - -#### Redraw API - -Mithril 2 introduces a few changes in the redraw API. Most of these are quite simple: - -- Instead of `m.redraw(true)` for synchronous redraws, use `m.redraw.sync()` -- Instead of `m.lazyRedraw()`, use `m.redraw()` - -Remember that Mithril automatically triggers a redraw after DOM event handlers. The API for preventing a redraw has also changed: - -```js -// Mithril 0.2 - - -// Mithril 2 - -``` - -#### AJAX - -The `data` parameter of `m.request({...})` has been split up into `body` and `params`. - -For examples and other AJAX changes, see [the mithril documentation](https://mithril.js.org/migration-v02x.html#mrequest). - -#### Promises - -`m.deferred` has been removed, native promises should be used instead. For instance: - -```js -// Mithril 0.2 -const deferred = m.deferred(); - -app.store.find('posts').then(result => deferred.resolve(result)); - -return deferred.promise; - -// Mithril 2 -return app.store.find('posts'); -``` - -#### Component instances should not be stored - -Due to optimizations in Mithril's redrawing algorithms, [component instances should not be stored](https://mithril.js.org/components.html#define-components-statically,-call-them-dynamically). - -So whereas before, you might have done something like: - -```js -class ChildComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return

{this.counter}

; - } -} -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.child = new ChildComponent(); - } - - view() { - return ( -
- - {this.child.render()} -
- ) - } -} -``` - -That will no longer work. In fact; the Component class no longer has a render method. - -Instead, any data needed by a child component that is modified by a parent component should be passed in as an attr. For instance: - -```js -class ChildComponent extends Component { - view() { - return

{this.attrs.counter}

; - } -} - -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return ( -
- - -
- ) - } -} -``` - -For more complex components, this might require some reorganization of code. For instance, let's say you have data that can be modified by several unrelated components. In this case, it might be preferable to create a POJO "state instance' for this data. These states are similar to "service" singletons used in Angular and Ember. For instance: - -```js -class Counter { - constructor() { - this._counter = 0; - } - - increaseCounter() { - this._counter += 1; - } - - getCount() { - return this._counter; - } -} - -app.counter = new Counter(); - -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', -
-

Counter: {app.counter.getCount()}

-
- ); -}) - -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', -
- -
- ); -}) -``` - -This "state pattern" can be found throughout core. Some non-trivial examples are: - -- PageState -- SearchState and GlobalSearchState -- NotificationListState -- DiscussionListState - -### Changes in Core - -#### Modals - -Previously, modals could be opened by providing a `Modal` component instance: - -```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); -``` - -Since we don't store component instances anymore, we pass in the component class and any attrs separately. - -```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); -``` - -The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. Any modifications by extensions should accordingly be done to `ModalManagerState`. - -#### Alerts - -Previously, alerts could be opened by providing an `Alert` component instance: - -```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); -``` - -Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: - -```js -app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); -``` - -Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. This replaces the old method of passing the alert instance itself to `dismiss`. - -The `show`, `dismiss`, and `clear` methods are still available through `app.alerts`, but `app.alerts` now points to an instance of `AlertManagerState`, not of the `AlertManager` component. Any modifications by extensions should accordingly be done to `AlertManagerState`. - -#### Composer - -Since we don't store a component instances anymore, a number of util methods from `Composer`, `ComposerBody` (and it's subclasses), and `TextEditor` have been moved onto `ComposerState`. - -For `forum/components/Composer`, `isFullScreen`, `load`, `clear`, `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen` have been moved to `forum/states/ComposerState`. They all remain accessible via `app.composer.METHOD` - -A `bodyMatches` method has been added to `forum/states/ComposerState`, letting you check whether a certain subclass of `ComposerBody` is currently open. - -Various input fields are now stored as [Mithril Streams](https://mithril.js.org/stream.html) in `app.composer.fields`. For instance, to get the current composer content, you could use `app.composer.fields.content()`. Previously, it was available on `app.composer.component.content()`. **This is a convention that `ComposerBody` subclasses that add inputs should follow.** - -`app.composer.component` is no longer available. - -- Instead of `app.composer.component instanceof X`, use `app.composer.bodyMatches(X)`. -- Instead of `app.composer.component.props`, use `app.composer.body.attrs`. -- Instead of `app.composer.component.editor`, use `app.composer.editor`. - -For `forum/components/TextEditor`, the `setValue`, `moveCursorTo`, `getSelectionRange`, `insertAtCursor`, `insertAt`, `insertBetween`, `replaceBeforeCursor`, `insertBetween` methods have been moved to `forum/components/SuperTextarea`. - -Also for `forum/components/TextEditor`, `this.disabled` is no longer used; `disabled` is passed in as an attr instead. It may be accessed externally via `app.composer.body.attrs.disabled`. - -Similarly to Modals and Alerts, `app.composer.load` no longer accepts a component instance. Instead, pass in the body class and any attrs. For instance, - -```js -// Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); - -// Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) -``` - -Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. - -#### Widget and DashboardWidget - -The redundant `admin/components/Widget` component has been removed. `admin/components/DashboardWidget` should be used instead. - -#### NotificationList - -For `forum/components/NotificationList`, the `clear`, `load`, `loadMore`, `parseResults`, and `markAllAsRead` methods have been moved to `forum/states/NotificationListState`. - -Methods for `isLoading` and `hasMoreResults` have been added to `forum/states/NotificationListState`. - -`app.cache.notifications` is no longer available; `app.notifications` (which points to an instance of `NotificationListState`) should be used instead. - -#### Checkbox - -Loading state in the `common/components/Checkbox` component is no longer managed through `this.loading`; it is now passed in as a prop (`this.attrs.loading`). - -#### Preference Saver - -The `preferenceSaver` method of `forum/components/SettingsPage` has been removed without replacement. This is done to avoid saving component instances. Instead, preferences should be directly saved. For instance: - -```js -// Old way -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value, component) => { - this.user.pushAttributes({ lastSeenAt: null }); - this.preferenceSaver('discloseOnline')(value, component); - }, -}) - -// Without preferenceSaver -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value) => { - this.discloseOnlineLoading = true; - - this.user.savePreferences({ discloseOnline: value }).then(() => { - this.discloseOnlineLoading = false; - m.redraw(); - }); - }, - loading: this.discloseOnlineLoading, -}) -``` - -A replacement will eventually be introduced. - -#### DiscussionListState - -For `forum/components/DiscussionList`, the `requestParams`, `sortMap`, `refresh`, `loadResults`, `loadMore`, `parseResults`, `removeDiscussion`, and `addDiscussion` methods have been moved to `forum/states/DiscussionListState`. - -Methods for `hasDiscussions`, `isLoading`, `isSearchResults`, and `empty` have been added to `forum/states/DiscussionListState`. - -`app.cache.discussions` is no longer available; `app.discussions` (which points to an instance of `DiscussionListState`) should be used instead. - -#### PageState - -`app.current` and `app.previous` no longer represent component instances, they are now instances of the `common/states/PageState` class. This means that: - -- Instead of `app.current instanceof X`, use `app.current.matches(X)` -- Instead of `app.current.PROPERTY`, use `app.current.get('PROPERTY')`. Please note that all properties must be exposed EXPLICITLY via `app.current.set('PROPERTY', VALUE)`. - -#### PostStream - -Logic from `forum/components/PostStreamScrubber`'s `update` method has been moved to `forum/components/PostStream`'s `updateScrubber` method. - -For `forum/components/PostStream`, the `update`, `goToFirst`, `goToLast`, `goToNumber`, `goToIndex`, `loadNearNumber`, `loadNearIndex`, `loadNext`, `loadPrevious`, `loadPage`, `loadRange`, `show`, `posts`, `reset`, `count`, and `sanitizeIndex` methods have been moved to `forum/states/PostStreamState`. - -Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStreamState`. - -#### SearchState and GlobalSearchState - -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. - -At the minimum, `SearchState` contains the following methods: - -- getValue -- setValue -- clear -- cache (adds a searched value to cache, meaning that we don't need to search for its results again) -- isCached (checks if a value has been searched for before) - -All of these methods have been moved from `Search` to `SearchState`. Additionally, Search's `stickyParams`, `params`, `changeSort`, `getInitialSearch`, and `clearInitialSearch` methods have been moved to `forum/states/GlobalSearchState`, which is now available via `app.search`. - -To use a custom search, you'll want to: - -1. Possibly create a custom subclass of `SearchState` -2. Create a custom subclass of `Search`, which overrides the `selectResult` method to handle selecting results as needed by your use case, and modify the `sourceItems` methods to contain the search sources you need. - -#### moment -> dayjs - -The `moment` library has been removed, and replaced by the `dayjs` library. The global `moment` can still be used for now, but is deprecated. `moment` and `dayjs` have very similar APIs, so very few changes will be needed. Please see the dayjs documentation [for more information](https://day.js.org/en/) on how to use it. - -#### Subtree Retainer - -`SubtreeRetainer` is a util class that makes it easier to avoid unnecessary redraws by keeping track of some pieces of data. When called, it checks if any of the data has changed; if not, it indicates that a redraw is not necessary. - -In mithril 0.2, its `retain` method returned a [subtree retain directive](https://mithril.js.org/archive/v0.1.25/mithril.render.html#subtree-directives) if no redraw was necessary. - -In mithril 2, we use its `needsRebuild` method in combination with `onbeforeupdate`. For instance: - -```js -class CustomComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - this.showContent = false; - - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) - } - - onbeforeupdate() { - // If needsRebuild returns true, mithril will diff and redraw the vnode as usual. Otherwise, it will skip this redraw cycle. - // In this example, this means that this component and its children will only be redrawn when extra content is toggled. - return this.subtree.needsRebuild(); - } - - view(vnode) { - return
- -

Hello World!{this.showContent ? ' Extra Content!' : ''}

-
; - } -} -``` - -#### attrs() method - -Previously, some components would have an attrs() method, which provided an extensible way to provide attrs to the top-level child vnode returned by `view()`. For instance, - -```js -class CustomComponent extends Component { - view() { - return

Hello World!

; - } - - attrs() { - return { - className: 'SomeClass', - onclick: () => console.log('click'), - }; - } -} -``` - -Since `this.attrs` is now used for attrs passed in from parent components, `attrs` methods have been renamed to `elementAttrs`. - -#### Children and .component - -Previously, an element could be created with child elements by passing those in as the `children` prop: - -```js -Button.component({ - className: 'Button Button--primary', - children: 'Button Text' -}); -``` - -This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: - -```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); -``` - -Children can still be passed in through JSX: - -```js - -``` - -#### Tag attr - -Because mithril uses 'tag' to indicate the actual html tag (or component class) used for a vnode, you can no longer pass `tag` as an attr to components extending Flarum's `Component` helper class. The best workaround here is to just use another name for this attr. - -#### affixSidebar - -The `affixSidebar` util has been removed. Instead, if you want to affix a sidebar, wrap the sidebar code in an `AffixedSidebar` component. For instance, - -```js -class OldWay extends Component { - view() { - return
-
-
- -
Actual Page Content
-
-
-
; - } -} - -class NewWay extends Component { - view() { - return
-
-
- - - -
Actual Page Content
-
-
-
; - } -} -``` - -#### Fragment - -**Warning: For Advanced Use Only** - -In some rare cases, we want to have extremely fine grained control over the rendering and display of some significant chunks of the DOM. These are attached with `m.render`, and do not experience automated redraws. Current use cases in core and bundled extensions are: - -- The "Reply" button that shows up when selecting text in a post -- The mentions autocomplete menu that shows up when typing -- The emoji autocomplete menu that shows up when typing - -For this purpose, we provide a helper class (`common/Fragment`), of which you can create an instance, call methods, and render via `m.render(DOM_ROOT, fragmentInstance.render())`. The main benefit of using the helper class is that it allows you to use lifecycle methods, and to access the underlying DOM via `this.$()`, like you would be able to do with a component. - -This should only be used when absolutely necessary. If you are unsure, you probably don't need it. If the goal is to not store component instances, the "state pattern" as described above is preferable. - -### Required Frontend Changes Recap - -Each of these changes has been explained above, this is just a recap of major changes for your convenience. - -- Component Methods: - - `view()` -> `view(vnode)` - - Lifecycle - - `init()` -> `oninit(vnode)` - - `config()` -> Lifecycle hooks `oncreate(vnode)` / `onupdate(vnode)` - - `context.onunload()` -> `onremove()` - - `SubtreeRetainer` -> `onbeforeupdate()` - - if present, `attrs()` method needs to be renamed -> convention `elementAttrs()` - - building component with `MyComponent.component()` -> `children` is now second parameter instead of a named prop/attr (first argument) -> JSX preferred -- Routing - - `m.route()` -> `m.route.get()` - - `m.route(name)` -> `m.route.set(name)` - - register routes with page class, not instance - - special case when passing props - - `` -> `` -- AJAX - - `m.request({...})` -> `data:` key split up into `body:` and `params:` - - `m.deferred` -> native `Promise` -- Redrawing - - `m.redraw(true)` -> `m.redraw.sync()` - - `m.redraw.strategy('none')` -> `e.redraw = false` in event handler - - `m.lazyRedraw()` -> `m.redraw()` - -#### Deprecated changes - -For the following changes, we currently provide a backwards-compatibility layer. This will be removed in time for the stable release. The idea is to let you release a new version that's compatible with Beta 14 to your users as quickly as possible. When you have taken care of the changes above, you should be good to go. For the following changes, we have bought you time until the stable release. Considering you have to make changes anyway, why not do them now? - -- `this.props` -> `this.attrs` -- static `initProps()` -> static `initAttrs()` -- `m.prop` -> `flarum/utils/Stream` -- `m.withAttr` -> `flarum/utils/withAttr` -- `moment` -> `dayjs` - -## Backend (PHP) - -### New Features - -#### Extension Dependencies - -Some extensions are based on, or add features to, other extensions. Prior to this release, there was no way to ensure that those dependencies were enabled before the extension that builds on them. Now, you cannot enable an extension unless all of its dependencies are enabled, and you cannot disable an extension if there are other enabled extensions depending on it. - -So, how do we specify dependencies for an extension? Well, all you need to do is add them as composer dependencies to your extension's `composer.json`! For instance, if we have an extension that depends on Tags and Mentions, our `composer.json` will look like this: - -```json -{ - "name": "my/extension", - "description": "Cool New Extension", - "type": "flarum-extension", - "license": "MIT", - "require": { - "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency - } - // other config -} -``` - -#### View Extender - -Previously, when extensions needed to register Laravel Blade views, they could inject a view factory in `extend.php` and call it's `addNamespace` method. For instance, - -```php -// extend.php -use Illuminate\Contracts\View\Factory; - -return [ - function (Factory $view) { - $view->addNamespace(NAME, RELATIVE PATH); - } -] -``` - -This should NOT be used, as it will break views for all extensions that boot after yours. Instead, the `View` extender should be used: - -```php -// extend.php -use Flarum\Extend\View; - -return [ - (new View)->namespace(NAME, RELATIVE PATH); -] -``` - -#### Application and Container - -Although Flarum uses multiple components of the Laravel framework, it is not a pure Laravel system. In beta 14, the `Flarum\Foundation\Application` class no longer implements `Illuminate\Contracts\Foundation\Application`, and no longer inherits `Illuminate\Container\Container`. Several things to note: - -- The `app` helper now points to an instance of `Illuminate\Container\Container`, not `Flarum\Foundation\Application`. You might need to resolve things through the container before using them: for instance, `app()->url()` will no longer work; you'll need to resolve or inject an instance of `Flarum\Foundation\Config` and use that. -- Injected or resolved instances of `Flarum\Foundation\Application` can no longer resolve things through container methods. `Illuminate\Container\Container` should be used instead. -- Not all public members of `Illuminate\Contracts\Foundation\Application` are available through `Flarum\Foundation\Application`. Please refer to our [API docs on `Flarum\Foundation\Application`](https://api.docs.flarum.org/php/master/flarum/foundation/application) for more information. - -#### Other Changes - -- We are now using Laravel 6. Please see [Laravel's upgrade guide](https://laravel.com/docs/6.x/upgrade) for more information. Please note that we do not use all of Laravel. -- Optional params in url generator now work. For instance, the url generator can now properly generate links to posts in discussions. -- A User Extender has been added, which replaces the deprecated `PrepareUserGroups` and `GetDisplayName` events. -- Error handler middleware can now be manipulated by the middleware extender through the `add`, `remove`, `replace`, etc methods, just like any other middleware. -- `Flarum/Foundation/Config` and `Flarum/Foundation/Paths` can now be injected where needed; previously their data was accessible through `Flarum/Foundation/Application`. - -### Deprecations - -- `url` provided in `config.php` is now an array, accessible via `$config->url()`, for an instance of `Config` - [PR](https://github.com/flarum/core/pull/2271#discussion_r475930358) -- AssertPermissionTrait has been deprecated - [Issue](https://github.com/flarum/core/issues/1320) -- Global path helpers and path methods of `Application` have been deprecated, the injectable `Paths` class should be used instead - [PR](https://github.com/flarum/core/pull/2155) -- `Flarum\User\Event\GetDisplayName` has been deprecated, the `displayNameDriver` method of the `User` extender should be used instead - [PR](https://github.com/flarum/core/pull/2174) - -### Removals - -- Do NOT use the old closure notation for configuring view namespaces. This will break all extensions that boot after your extension. The `View` extender MUST be used instead. -- app()->url() will no longer work: [`Flarum\Http\UrlGenerator`](routes.md) should be injected and used instead. An instance of `Flarum\Http\UrlGenerator` is available in `blade.php` templates via `$url`. -- As a part of the Laravel 6 upgrade, the [`array_` and `str_` helpers](https://laravel.com/docs/6.x/upgrade#helpers) have been removed. -- The Laravel translator interface has been removed; the Symfony translator interface should be used instead: `Symfony\Component\Translation\TranslatorInterface` -- The Mandrill mail driver is no longer provided in Laravel 6, and has been removed. -- The following events deprecated in Beta 13 [have been removed](https://github.com/flarum/core/commit/7d1ef9d89161363d1c8dea19cf8aebb30136e9e3#diff-238957b67e42d4e977398cd048c51c73): - - `AbstractConfigureRoutes` - - `ConfigureApiRoutes` - Use the `Routes` extender instead - - `ConfigureForumRoutes` - Use the `Frontend` or `Routes` extenders instead - - `ConfigureLocales` - Use the `LanguagePack` extender instead - - `ConfigureModelDates` - Use the `Model` extender instead - - `ConfigureModelDefaultAttributes` - Use the `Model` extender instead - - `GetModelRelationship` - Use the `Model` extender instead - - `Console\Event\Configuring` - Use the `Console` extender instead - - `BioChanged` - User bio has not been a core feature for several releases diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b15.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b15.md deleted file mode 100644 index c815ca9c2..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b15.md +++ /dev/null @@ -1,60 +0,0 @@ -# Updating For Beta 15 - -Beta 15 features multiple new extenders, a total redesign of the admin dashboard, and several other interesting new features for extensions. As before, we have done our best to provide backwards compatibility layers, and we recommend switching away from deprecated systems as soon as possible to make your extensions more stable. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## New Features / Deprecations - -### Extenders - -- `Flarum\Api\Event\WillGetData` and `Flarum\Api\Event\WillSerializeData` have been deprecated, the `ApiController` extender should be used instead -- `Flarum\Api\Event\Serializing` and `Flarum\Event\GetApiRelationship` have been deprecated, the `ApiSerializer` extender should be used instead -- `Flarum\Formatter\Event\Parsing` has been deprecated, the `parse` method of the `Formatter` extender should be used instead -- `Flarum\Formatter\Event\Rendering` has been deprecated, the `render` method of the `Formatter` extender should be used instead -- `Flarum\Notification\Event\Sending` has been deprecated, the `driver` method of the `Notification` extender should be used instead - - Please note that the new notification driver system is not an exact analogue of the old `Sending` event, as it can only add new drivers, not change the functionality of the default notification bell alert driver. If your extension needs to modify **how** or **to whom** notifications are sent, you may need to replace `Flarum\Notification\NotificationSyncer` on the service provider level -- `Flarum\Event\ConfigureNotificationTypes` has been deprecated, the `type` method of the `Notification` extender should be used instead -- `Flarum\Event\ConfigurePostTypes` has been deprecated, the `type` method of the `Post` extender should be used instead -- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. -- `Flarum\Event\ConfigureUserPreferences` has been deprecated, the `registerPreference` method of the `User` extender should be used instead -- `Flarum\Foundation\Event\Validating` has been deprecated, the `configure` method of the `Validator` extender should be used instead - -- The Policy system has been reworked a bit to be more intuitive. Previously, policies contained both actual policies, which determine whether a user can perform some ability, and model visibility scopers, which allowed efficient restriction of queries to only items that users have access to. See the [authorization documentation](authorization.md) for more information on how to use the new systems. Now: - - `Flarum\Event\ScopeModelVisibility` has been deprecated. New scopers can be registered via the `ModelVisibility` extender, and any `Eloquent\Builder` query can be scoped by calling the `whereVisibleTo` method on it, with the ability in question as an optional 2nd argument (defaults to `view`). - - `Flarum\Event\GetPermission` has been deprecated. Policies can be registered via the `Policy` extender. `Flarum\User\User::can` has not changed. Please note that the new policies must return one of `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, not a boolean. - -- A `ModelUrl` extender has been added, allowing new slug drivers to be registered. This accompanies Flarum's new slug driving system, which allows for extensions to define custom slugging strategies for sluggable models. The extender supports sluggable models outside of Flarum core. Please see our [model slugging](slugging.md) documentation for more information. -- A `Settings` extender has been added, whose `serializeToForum` method makes it easy to serialize a setting to the forum. -- A `ServiceProvider` extender has been added. This should be used with extreme caution for advanced use cases only, where there is no alternative. Please note that the service provider layer is not considered public API, and is liable to change at any time, without notice. - -### Admin UX Redesign - -The admin dashboard has been completely redesigned, with a focus on providing navbar pages for each extension. The API for extensions to register settings, permissions, and custom pages has also been greatly simplified. You can also now update your extension's `composer.json` to provide links for funding, support, website, etc that will show up on your extension's admin page. Please see [our Admin JS documentation](admin.md) for more information on how to use the new system. - -### Other New Features - -- On the backend, the route name is now available via `$request->getAttribute('routeName')` for controllers, and for middleware that run after `Flarum\Http\Middleware\ResolveRoute.php`. -- `Flarum\Api\Controller\UploadImageController.php` can now be used as a base class for controllers that upload images (like for the logo and favicon). -- Automatic browser scroll restoration can now be disabled for individual pages [see our frontend page documentation for more info](frontend-pages.md). - -## Breaking Changes - -- The following deprecated frontend BC layers were removed: - - `momentjs` no longer works as an alias for `dayjs` - - `this.props` and `this.initProps` no longer alias `this.attrs` and `this.initAttrs` for the `Component` base class - - `m.withAttr` and `m.stream` no longer alias `flarum/utils/withAttr` and `flarum/utils/Stream` - - `app.cache.discussionList` has been removed - - `this.content` and `this.editor` have been removed from `ComposerBody` - - `this.component`, `this.content`, and `this.value` have been removed from `ComposerState` -- The following deprecated backend BC layers were removed: - - The `publicPath`, `storagePath`, and `vendorPath` methods of `Flarum\Foundation\Application` have been removed - - The `base_path`, `public_path`, and `storage_path` global helpers have been removed - - The `getEmailSubject` method of `Flarum\Notification\MailableInterface` MUST now take a translator instance as an argument - - `Flarum\User\AssertPermissionTrait` has been removed, the analogous methods on `Flarum\User\User` should be used instead - - The `Flarum\Event\PrepareUserGroups` event has been removed, use the `User` extender instead - - The `Flarum\User\Event\GetDisplayName` event has been removed, use the display name driver feature of the `User` extender instead diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b16.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b16.md deleted file mode 100644 index dbbc0cc5d..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b16.md +++ /dev/null @@ -1,138 +0,0 @@ -# Updating For Beta 16 - -Beta 16 finalizes the PHP extender API, introduces a testing library and JS typings, switches to using namespaces for JS imports, increases extension dependency robustness, and allows overriding routes, among other features. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Frontend - -- A new editor driver abstraction has been introduced, which allows extensions to override the default textarea-based editor with more advanced solutions. -- The `TextEditor` and `TextEditorButton` components, as well as the `BasicEditorDriver` util (which replaces `SuperTextarea`) have been moved from `forum` to `common`. -- The `forum`, `admin`, and `common` namespaces should be used when importing. So instead of `import Component from 'flarum/Component'`, use `import Component from 'flarum/common/Component`. Support for the old import styles will be deprecated through the stable release, and removed with Flarum 2.0. -- A typing library has been released to support editor autocomplete for frontend development, and can be installed in your dev environment via `npm install --save-dev flarum@0.1.0-beta.16`. -- Extension categories have been simplified down to `feature`, `theme`, and `language`. - -## Backend - -### Extenders - -- All extenders that support callbacks/closures now support global functions like `'boolval'` and array-type functions like `[ClassName::class, 'methodName']`. -- The `Settings` extender's `serializeToFrontend` method now supports a default value as the 4th argument. -- The `Event` extender now supports registering subscribers for multiple events at once via a `subscribe` method. -- The `Notification` extender now has a `beforeSending` method, which allows you to adjust the list of recipients before a notification is sent. -- The `mutate` method of `ApiSerializer` has been deprecated, and renamed to `attributes`. -- `remove` methods on the `Route` and `Frontend` extenders can be used to remove (and then replace) routes. -- A `ModelPrivate` extender replaces the `GetModelIsPrivate` event, which has been deprecated. -- Methods on the `Auth` extender replace the `CheckingPassword` event, which has been deprecated. -- All search-related events are now deprecated in favor of the `SimpleFlarumSearch` and `Filter` extenders; this is explained in more detail below. - -### Laravel and Symfony - -Beta 16 upgrades from v6.x to v8.x of Laravel components and v4 to v5 of Symfony components. Please see the respective upgrade guides of each for changes you might need to make to your extensions. The most applicable change is the deprecation of `Symfony\Component\Translation\TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface`. The former will be removed in beta 17. - -### Helper Functions - -The remaining `app` and `event` global helper functions have been deprecated. `app` has been replaced with `resolve`, which takes the name of a container binding and resolves it through the container. - -Since some Flarum extensions use Laravel libraries that assume some global helpers exist, we've recreated some commonly used helpers in the [flarum/laravel-helpers](https://github.com/flarum/laravel-helpers) package. These helpers should NOT be used directly in Flarum extension code; they are available so that Laravel-based libraries that expect them to exist don't malfunction. - -### Search Changes - -As part of our ongoing efforts to make Flarum's search system more flexible, we've made several refactors in beta 16. Most notably, filtering and searching are now treated as different mechanisms, and have separate pipelines and extenders. Essentially, if a query has a `filter[q]` query param, it will be treated as a search, and all other filter params will be ignored. Otherwise, it will be handled by the filtering system. This will eventually allow searches to be handled by alternative drivers (provided by extensions), such as ElasticSearch, without impacting filtering (e.g. loading recent discussions). Classes common to both systems have been moved to a `Query` namespace. - -Core's filtering and default search (named SimpleFlarumSearch) implementations are quite similar, as both are powered by the database. `List` API controllers call the `search` / `filter` methods on a resource-specific subclass of `Flarum\Search\AbstractSearcher` or `Flarum\Filter\AbstractFilterer`. Arguments are an instance of `Flarum\Query\QueryCriteria`, as well as sort, offset, and limit information. Both systems return an instance of `Flarum\Query\QueryResults`, which is effectively a wrapper around a collection of Eloquent models. - -The default systems are also somewhat similar in their implementation. `Filterer`s apply Filters (implementing `Flarum\Filter\FilterInterface`) based on query params in the form `filter[FILTER_KEY] = FILTER_VALUE` (or `filter[-FILTER_KEY] = FILTER_VALUE` for negated filters). SimpleFlarumSearch's `Searcher`s split the `filter[q]` param by spaces into "terms", apply Gambits (implementing `Flarum\Search\GambitInterface`) that match the terms, and then apply a "Fulltext Gambit" to search based on any "terms" that don't match an auxiliary gambit. Both systems then apply sorting, an offset, and a result count limit, and allow extensions to modify the query result via `searchMutators` or `filterMutators`. - -Extensions add gambits and search mutators and set fulltext gambits for `Searcher` classes via the `SimpleFlarumSearch` extender. They can add filters and filter mutators to `Filterer` classes via the `Filter` extender. - -With regards to upgrading, please note the following: - -- Search mutations registered by listening to the `Searching` events for discussions and users will be applied as to searches during the search mutation step via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Search gambits registered by listening to the `ConfigureUserGambits` and `ConfigureDiscussionGambits` events will be applied to searcher via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Post filters registered by listening to the `ConfigurePostsQuery` events will be applied to post filters via a temporary BC layer. That event has been deprecated. - -### Testing Library - -The `flarum/testing` package provides utils for PHPUnit-powered automated backend tests. See the [testing documentation](testing.md) for more info. - -### Optional Dependencies - -Beta 15 introduced "extension dependencies", which require any extensions listed in your extension's `composer.json`'s `require` section to be enabled before your extension can be enabled. - -With beta 16, you can specify "optional dependencies" by listing their composer package names as an array in your extension's `extra.flarum-extension.optional-dependencies`. Any enabled optional dependencies will be booted before your extension, but aren't required for your extension to be enabled. - -### Access Token and Authentication Changes - -#### Extension API changes - -The signature to various method related to authentication have been changed to take `$token` as parameter instead of `$userId`. Other changes are the result of the move from `$lifetime` to `$type` - -- `Flarum\Http\AccessToken::generate($userId)` no longer accepts `$lifetime` as a second parameter. Parameter has been kept for backward compatibility but has no effect. It will be removed in beta 17. -- `Flarum\Http\RememberAccessToken::generate($userId)` should be used to create remember access tokens. -- `Flarum\Http\DeveloperAccessToken::generate($userId)` should be used to create developer access tokens (don't expire). -- `Flarum\Http\SessionAccessToken::generate()` can be used as an alias to `Flarum\Http\AccessToken::generate()`. We might deprecate `AccessToken::generate()` in the future. -- `Flarum\Http\Rememberer::remember(ResponseInterface $response, AccessToken $token)`: passing an `AccessToken` has been deprecated. Pass an instance of `RememberAccessToken` instead. As a temporary compatibility layer, passing any other type of token will convert it into a remember token. In beta 17 the method signature will change to accept only `RememberAccessToken`. -- `Flarum\Http\Rememberer::rememberUser()` has been deprecated. Instead you should create/retrieve a token manually with `RememberAccessToken::generate()` and pass it to `Rememberer::remember()` -- `Flarum\Http\SessionAuthenticator::logIn(Session $session, $userId)` second parameter has been deprecated and is replaced with `$token`. Backward compatibility is kept. In beta 17, the second parameter method signature will change to `AccessToken $token`. -- `AccessToken::generate()` now saves the model to the database before returning it. -- `AccessToken::find($id)` or `::findOrFail($id)` can no longer be used to find a token, because the primary key was changed from `token` to `id`. Instead you can use `AccessToken::findValid($tokenString)` -- It's recommended to use `AccessToken::findValid($tokenString): AccessToken` or `AccessToken::whereValid(): Illuminate\Database\Eloquent\Builder` to find a token. This will automatically scope the request to only return valid tokens. On forums with low activity this increases the security since the automatic deletion of outdated tokens only happens every 50 requests on average. - -#### Symfony session changes - -If you are directly accessing or manipulating the Symfony session object, the following changes have been made: - -- `user_id` attribute is no longer used. `access_token` has been added as a replacement. It's a string that maps to the `token` column of the `access_tokens` database table. - -To retrieve the current user from inside a Flarum extension, the ideal solution which was already present in Flarum is to use `$request->getAttribute('actor')` which returns a `User` instance (which might be `Guest`) - -To retrieve the token instance from Flarum, you can use `Flarum\Http\AccessToken::findValid($tokenString)` - -To retrieve the user data from a non-Flarum application, you'll need to make an additional database request to retrieve the token. The user ID is present as `user_id` on the `access_tokens` table. - -#### Token creation changes - -The `lifetime` property of access tokens has been removed. Tokens are now either `session` tokens with 1h lifetime after last activity, or `session_remember` tokens with 5 years lifetime after last activity. - -The `remember` parameter that was previously available on the `POST /login` endpoint has been made available on `POST /api/token`. It doesn't return the remember cookie itself, but the token returned can be used as a remember cookie. - -The `lifetime` parameter of `POST /api/token` has been deprecated and will be removed in Flarum beta 17. Partial backward compatibility has been provided where a `lifetime` value longer than 3600 seconds is interpreted like `remember=1`. Values lower than 3600 seconds result in a normal non-remember token. - -New `developer` tokens that don't expire have been introduced, however they cannot be currently created through the REST API. Developers can create developer tokens from an extension using `Flarum\Http\DeveloperAccessToken::generate($userId)`. - -If you manually created tokens in the database from outside Flarum, the `type` column is now required and must contain `session`, `session_remember` or `developer`. Tokens of unrecognized type cannot be used to authenticate, but won't be deleted by the garbage collector either. In a future version extensions will be able to register custom access token types. - -#### Token usage changes - -A [security issue in Flarum](https://github.com/flarum/core/issues/2075) previously caused all tokens to never expire. This had limited security impact due to tokens being long unique characters. However custom integrations that saved a token in an external database for later use might find the tokens no longer working if they were not used recently. - -If you use short-lived access tokens for any purpose, take note of the expiration time of 1h. The expiration is based on the time of last usage, so it will remain valid as long as it continues to be used. - -Due to the large amount of expired tokens accumulated in the database and the fact most tokens weren't ever used more than once during the login process, we have made the choice to delete all access tokens a lifetime of 3600 seconds as part of the migration, All remaining tokens have been converted to `session_remember` tokens. - -#### Remember cookie - -The remember cookie still works like before, but a few changes have been made that could break unusual implementations. - -Now only access tokens created with `remember` option can be used as remember cookie. Any other type of token will be ignored. This means if you create a token with `POST /api/token` and then place it in the cookie manually, make sure you set `remember=1` when creating the token. - -#### Web session expiration - -In previous versions of Flarum, a session could be kept alive forever until the Symfony session files were deleted from disk. - -Now sessions are linked to access tokens. A token being deleted or expiring will automatically end the linked web session. - -A token linked to a web session will now be automatically deleted from the database when the user clicks logout. This prevents any stolen token from being re-used, but it could break custom integration that previously used a single access token in both a web session and something else. - -### Miscellaneous - -- The IP address is now available in requests via `$request->getAttribute('ipAddress')` -- Policies can now return `true` and `false` as aliases for `$this->allow()` and `$this->deny()`, respectively. -- The `user.edit` permission has been split into `user.editGroups`, `user.editCredentials` (for email, username, and password), and `user.edit` (for other attributes). -- There are now permissions (`bypassTagCounts`) that allow users to bypass tag count requirements. -- Flarum now supports PHP 7.3 - PHP 8.0, with support for PHP 7.2 officially dropped. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b8.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b8.md deleted file mode 100644 index 3a8f9c6e9..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/update-b8.md +++ /dev/null @@ -1,114 +0,0 @@ -# Updating For Beta 8 - -All extensions will need to be refactored in order to work with beta 8. Here are the main things you will need to do in order to make your extension compatible. - -:::caution - -This guide is not comprehensive. You may encounter some changes we haven't documented. If you need help, start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## PHP Namespaces - -Beta 8 comes with large changes to the overall structure of the PHP backend. You will need to look through [this list](https://discuss.flarum.org/d/6572-help-us-namespace-changes) of namespace changes and make changes to your extension accordingly. - -[This script](https://gist.github.com/tobyzerner/55e7c05c95404e5efab3a9e43799d375) can help you to automate most of the namespace changes. Of course, you should still test your extension after running the script as it may miss something. - -## Database Naming - -Many database columns and JSON:API attributes have been renamed to conform to a [convention](/contributing.md#database). You will need to update any instances where your extension interacts with core data. You can see the changes in [#1344](https://github.com/flarum/core/pull/1344/files). - -## Extenders - -Beta 8 introduces a new concept called **extenders** that replace the most common event listeners. You can learn more about how they work in the [updated extension docs](start.md#extenders). - -`bootstrap.php` has been renamed to `extend.php` and returns an array of extender instances and functions: - -```php -use Flarum\Extend; - -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] -``` - -If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. - -| Event | Extender | -| ------------------------------------- | --------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | - -_\* class no longer exists_ - -## JavaScript Tooling - -Previously Flarum and its extensions used a custom Gulp workflow to compile ES6 source code into something that browsers could understand. Beta 8 switches to a more conventional approach with Webpack. - -You will need to tweak the structure of your extension's `js` directory. Currently, your JS file hierarchy looks something like the following: - -``` -js -├── admin -│ ├── src -│ │ └── main.js -│ ├── dist -│ │ └── extension.js -│ ├── Gulpfile.js -│ └── package.json -└── forum - ├── src - │ └── main.js - ├── dist - │ └── extension.js - ├── Gulpfile.js - └── package.json -``` - -You'll need to make the following changes: - -1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.md#transpilation). - -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. - -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. - -4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. - -If everything went right, your folder structure should look something like this: - -``` -js -├── src -│ ├── admin -│ │ └── index.js -│ └── forum -│ └── index.js -├── dist -│ ├── admin.js -│ ├── admin.js.map -│ ├── forum.js -│ └── forum.js.map -├── admin.js -├── forum.js -├── package.json -└── webpack.config.js -``` - -Take a look at the [bundled extensions](https://github.com/flarum) for more examples. - -## Font Awesome Icons - -Beta 8 upgrades to Font Awesome 5, in which icon class names have changed. The `flarum/helpers/icon` helper now requires the **full Font Awesome icon class names** to be passed, eg. `fas fa-bolt`. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extend/views.md b/i18n/de/docusaurus-plugin-content-docs/current/extend/views.md deleted file mode 100644 index fc4a75a86..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extend/views.md +++ /dev/null @@ -1,63 +0,0 @@ -# Views and Blade - -Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. - -[Blade](https://laravel.com/docs/8.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). [Views](https://laravel.com/docs/8.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. - -For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). - -## Adding Views - -You will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->namespace('acme.hello-world', __DIR__.'/views'), -]; -``` - - -## Blade Templates - -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/8.x/blade). - -Once you've set up your views, you can render them to strings: - -```php -// Here, $view is of type `Illuminate\Contracts\View\Factory` -$renderedString = $view->make('acme.hello-world::greeting')->render(); - -// You can also pass variables to the view: -$renderedString = $view->make('acme.hello-world::greeting', ['varName' => true])->render(); -``` - -You can obtain the view factory instance through dependency injection. - -The format is `"VIEW_NAMESPACE::VIEW_NAME"`. If the view folder is organized as subdirectories, replace `/` with `.` in the pack. So if you have a file at `"forum/error.blade.php"` in a namespace called `"custom-views"`, you would use `"custom-views::forum.error"`. - -Note that all Blade templates rendered this way automatically have access to the following variables: - -- `$url`: a [URL generator](routes#generating-urls) instance. -- `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. -- `$slugManager`: a [SlugManager](slugging) instance. - -Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Serializer/ForumSerializer.php#L19). - -## Overriding Views - -If you want to override templates added by core or extensions, set up a view folder structure matching the one you are trying to override, containing just the files you are trying to override. Then use the `View` extender's `extendNamespace` method: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->extendNamespace('acme.hello-world', __DIR__.'/override_views'); -]; -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extenders.md b/i18n/de/docusaurus-plugin-content-docs/current/extenders.md deleted file mode 100644 index 9d1c686d3..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extenders.md +++ /dev/null @@ -1,23 +0,0 @@ -# Lokale Extender - -Wenn du Anpassungen an deiner Seite vornehmen möchtest, ohne eine ganze Erweiterung zu erstellen, kannst du dies mit **lokalen Extendern** tun. Jede Flarum-Installation wird mit einer `extend.php`-Datei geliefert, in der du Extender-Instanzen hinzufügen kannst, genau wie bei einer vollständigen Erweiterung. - -In unserer [Erweiterungsdokumentation](extend/start.md) findest du weitere Informationen über Extender (und auch ein [Beispiel für einen lokalen Extender](extend/start.md#hello-world)). - -Wenn du neue Dateien erstellen musst (wenn du eine benutzerdefinierte Klasse hinzufügst, die für Extender importiert werden soll), musst du deine composer.json ein wenig anpassen. Füge Folgendes hinzu: - -```json -"autoload": { - "psr-4": { - "App\\": "app/" - } -}, -``` - -Jetzt kannst du neue PHP-Dateien in einem `App`-Unterverzeichnis erstellen, indem du den `App\...`-Namensraum benutzt. - -:::tip Lokale Extender vs. Erweiterungen - -Lokale Extender können für kleine Anpassungen gut sein, aber wenn Sie umfangreiche Anpassungen benötigen, ist eine Erweiterung möglicherweise die bessere Wahl: Eine separate Codebasis, eine sauberere Handhabung vieler Dateien, Werkzeuge für Entwickler und die Möglichkeit, den Quellcode zu teilen, sind große Vorteile. - -::: diff --git a/i18n/de/docusaurus-plugin-content-docs/current/extensions.md b/i18n/de/docusaurus-plugin-content-docs/current/extensions.md deleted file mode 100644 index c99747d2b..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/extensions.md +++ /dev/null @@ -1,118 +0,0 @@ -# Erweiterungen - -Flarum ist minimalistisch, aber auch sehr erweiterbar. Tatsächlich sind die meisten Funktionen, die mit Flarum geliefert werden, tatsächlich Erweiterungen! - -Dieser Ansatz macht Flarum extrem anpassbar: Du kannst alle Funktionen deaktivieren, die Du nicht benötigst, und andere Erweiterungen installieren, um dein Forum perfekt für deine Community zu machen. - -Weitere Informationen zu Flarums Philosophie darüber, welche Funktionen wir im Kern enthalten, oder wenn Du deine eigene Erweiterung erstellen möchtest, findest Du in unserer [Erweiterungsdokumentation](extend/README.md). Dieser Artikel konzentriert sich auf die Verwaltung von Erweiterungen aus der Perspektive eines Forum-Administrators. - -## Extension Manager - -The extension manager is an extension that comes bundled with Flarum when installed via an archive. It provides a graphical interface for installing and updating both extensions and Flarum itself. - -If you do not have the extension manager installed and you wish to install it, you can do so by running the following command in your Flarum directory: - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -![extension manager admin page](https://github.com/flarum/docs/assets/20267363/d0e1f7a5-e194-4acd-af63-7b8ddd95c26b) - - -## Erweiterungen finden - -Flarum verfügt über ein breites Ökosystem von Erweiterungen, von denen die meisten Open Source und kostenlos sind. Um neue und tolle Erweiterungen zu finden, besuche das [Extensions](https://discuss.flarum.org/t/extensions)-Tag in Flarums Community-Foren. Die inoffizielle [Extiverse Erweiterungsdatenbank](https://extiverse.com/) ist ebenfalls eine großartige Ressource. - -## Erweiterungen installieren - -### Through the interface - -Using the extension manager extension, you can install extensions directly from the admin dashboard. Once you have browsed the list of available extensions from the links above, and found one you want to install, you can install it by entering the extension's composer package name into the extension manager's installation input. - -![Installing an extension](/en/img/install-extension.png) - -### Through the command line - -Genau wie Flarum werden Erweiterungen über [Composer](https://getcomposer.org) mit SSH installiert. So installierst Du eine typische Erweiterung: - -1. `cd` in dein Flarumverzeichnis. Dieses Verzeichnis sollte `composer.json`, `flarum`-Dateien und ein `storage`-Verzeichnis (unter anderem) enthalten. Du kannst Verzeichnisinhalte über `ls -la` überprüfen. -2. Führe `composer require COMPOSER_PACKAGE_NAME:*` aus. Dies sollte durch die Dokumentation der Erweiterung bereitgestellt werden. - -## Aktualisieren von Erweiterungen - -### Through the interface - -Using the extension manager extension, you can update extensions directly from the admin dashboard. You can run a check for updates by clicking the "Check for updates" button in the extension manager. If there are updates available, you can update all extensions by clicking the "Global update" button. Or, you can update individual extensions by clicking the "Update" button next to the extension you want to update. - -![Updating an extension](/en/img/update-extension.png) - -### Through the command line - -Anweisungen der Erweiterungsentwickler befolgen. Wenn Du `*` als Versionszeichenfolge für Erweiterungen verwendest ([wie empfohlen](composer.md)), sollten all deine Erweiterungen aktualisiert werden, indem Du die Befehle ausführst, die in der [Flarum-Upgrade-Anleitung](update.md) aufgeführt sind. - -## Erweiterungen deinstallieren - -### Through the interface - -Using the extension manager extension, you can uninstall extensions directly from the admin dashboard. You can uninstall an extension by clicking the "Uninstall" button next to the extension you want to uninstall inside the extension's page. - -![Uninstalling an extension](/en/img/uninstall-extension.png) - -### Through the command line - -Ähnlich wie bei der Installation, um eine Erweiterung zu entfernen: - -0. Wenn Du alle von der Erweiterung erstellten Datenbanktabellen entfernen möchtest, klicke im Admin-Dashboard auf die Schaltfläche „Löschen“. Weitere Informationen findest Du [unten](#managing-extensions). -1. `cd` in dein Flarumverzeichnis. -2. Führe `composer remove COMPOSER_PACKAGE_NAME` aus. Dies sollte durch die Dokumentation der Erweiterung bereitgestellt werden. - -## Verwalten von Erweiterungen - -Each individual extension page of the admin dashboard provides a convenient way to manage the extension. Du kannst: - -- Enable or disable the extension. -- See the settings provided by the extension, and change them. -- Migrationen einer Erweiterung zurücksetzen, um alle vorgenommenen Datenbankänderungen zu entfernen (dies kann mit der Schaltfläche „Löschen“ erfolgen). Dadurch werden ALLE mit der Erweiterung verknüpften Daten entfernt und sind irreversibel. Dies sollte nur durchgeführt werden, wenn Du eine Erweiterung entfernst und nicht vorhast, sie erneut zu installieren. Es ist auch völlig optional. -- See the extension's README, if it has one. -- See the extension's version. -- Uninstall the extension if the extension manager is installed. - -## Configuring additional extension repository sources - -The extension manager uses `composer` under the hood, and as such, it looks for extension packages in the same places as `composer`. By default, this is [Packagist](https://packagist.org/). However, you can configure additional sources for the extension manager to look for extensions in. This is useful if you want to install an extension that is not available on Packagist. - -In the admin page of the extension manager, clicking the **Add Repository** button will open a modal where you can enter the name and URL of the repository you want to add. The name is just a label for the repository, and can be anything you want. The URL should be the URL of the repository which depends on the type of repository you want to add. - -### Adding a repository from a VCS - -If you want to add a repository from a VCS (e.g. GitHub, GitLab, BitBucket, etc), the URL should be the URL of the repository's VCS. For example, if you had a private GitHub repository at `https://github.com/acme/flarum-extension`, you would enter that URL into the URL field. If it is a private source, you will need to enter an authentication method through the **New authentication method** button. The token can be generated from your VCS provider's website, and the host should be the domain of the VCS provider (e.g. `github.com`). - -### Adding a composer repository - -Extiverse provides access to premium extensions. It is a good example of a composer repository. You would specify the URL as `https://flarum.org/composer/` and the name as `premium`. You would also need to enter an authentication method through the **New authentication method** button. The token can be generated from your Flarum account's [subscriptions](https://flarum.org/dashboard/subscriptions) page with the Instructions button. - -* Type: `HTTP Bearer` -* Host: `flarum.org` - -![Configure repositories](/en/img/config-repositories.png) - -:::info - -The configured repositories and auth methods will be active for both the command line and the admin dashboard. If you configure them from the command line however, you must not include the flag `--global`. - -::: - -## Installing Non-stable extensions - -If for whatever reason you want to install a non-stable extension (e.g. a beta, alpha or RC version) you must first update the **Minimum stability** setting to the wanted stability. - -* If you set it to Alpha, you will be able to install alpha, beta, RC (Release Candidate) and stable versions. -* If you set it to Beta, you will be able to install beta, RC and stable versions. -* If you set it to RC, you will be able to install RC and stable versions. -* If you set it to Stable, you will only be able to install stable versions. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/faq.md b/i18n/de/docusaurus-plugin-content-docs/current/faq.md deleted file mode 100644 index 6acbfc349..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/faq.md +++ /dev/null @@ -1,35 +0,0 @@ -# FAQ - -### Ist Flarum stabil? - -Ja! Nach 6 Jahren Entwicklung ist Flarum 1.0.0 endlich da. - -### Was kommt als nächstes nach Stable? - -Wir arbeiten noch an einer formalen Roadmap. Wir haben viele Pläne und Ideen und freuen uns darauf, einen gründlicheren Meilenstein mit der Community zu teilen. - -### Kann ich Geld spenden, um die Entwicklung zu beschleunigen? - -Alle Spenden werden dankbar angenommen. Du kannst auf [GitHub Sponsors](https://github.com/sponsors/flarum) oder [OpenCollective](https://opencollective.com/flarum) spenden. - -Spenden wirken sich jedoch nicht direkt auf die Entwicklungsgeschwindigkeit von Flarum aus. Wir ermutigen Benutzer auch, auf andere Weise beizutragen, z. B. [Code beisteuern](contributing.md), [Erweiterungen erstellen](/extend/README.md), Dokumentation schreiben, Flarum in andere Sprachen übersetzen, Hilfe und Unterstützung in den [Community-Foren leisten](https://discuss.flarum.org/)... Und einfach eine allgemeine positive Energie in der Community sein! - -### Wird Flarum [Feature hier einfügen] haben? Wann? Warum nicht? - -Wir würden gerne unzählige Features und Erweiterungen für Flarum bauen, aber das Wichtigste zuerst: Unser Fokus liegt auf dem Wesentlichen und der Stabilität. - -### Warum habt ihr [Problem hier einfügen] noch nicht behoben? - -Auch hier lautet die Antwort „das Wichtigste zuerst“. Wenn wir ein Problem noch nicht behoben (oder ihm einen Meilenstein zugewiesen) haben, liegt das daran, dass wir an etwas anderem arbeiten, das genauso wichtig ist. Bitte habe Geduld; wir werden versuchen, es vor der Veröffentlichung zu erledigen. Oder wenn Du es eilig hast, kannst Du gerne selbst reparieren und [zum Projekt beitragen](contributing.md)! - -### Kann ich mein Forum zu Flarum migrieren? - -Wir bieten derzeit keine offiziellen Migrationsprogramme an, aber es existieren viele Community-Lösungen da draußen. Relativ bald werden wir damit beginnen, Tools zu entwickeln, um Daten aus anderer Forensoftware wie esoTalk, FluxBB, phpBB, Discourse und anderen zu importieren. - -### Wie trete ich dem Flarum-Team bei? - -> „Durch eine arkane und mühsame Tortur, die mystische Rituale, lebensbedrohliche Gefahren und Abenteuer in ferne Länder beinhaltet, in die viele gehen und nur wenige zurückkehren.“ ~ jordanjay29 - -Die wahre Antwort ist, dass wir unsere Community im Allgemeinen nach herausragenden Mitgliedern im Auge behalten, die gute Mitarbeiter abgeben würden. Ehrlich gesagt, für die meisten unserer derzeitigen Mitarbeiter war das, was sie taten, bevor sie Mitarbeiter wurden, nicht viel anders als das, was sie jetzt tun. - -Finde eine Leidenschaft und trage so bei, wie Du es für am besten hältst. Dann lass es seinen Lauf nehmen. Du musst kein Abzeichen haben, um hier respektiert zu werden. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/install.md b/i18n/de/docusaurus-plugin-content-docs/current/install.md deleted file mode 100644 index 9063f0c54..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/install.md +++ /dev/null @@ -1,198 +0,0 @@ -# Installation - -:::tip Schneller Test? - -Fühle Dich frei, Flarum in einem unserer [Demonstrationsforen](https://discuss.flarum.org/d/21101) auszuprobieren. Or set up your own forum in seconds at [Free Flarum](https://www.freeflarum.com), a free community service not affiliated with the Flarum team. - -::: - -## Server-Anforderungen - -Before you install Flarum, it's important to check that your server meets the requirements. Um Flarum ausführen zu können, brauchst du: - -* **Apache** (with mod\_rewrite enabled) or **Nginx** -* **PHP 7.3+** with the following extensions: curl, dom, fileinfo, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+/8.0.23+** or **MariaDB 10.0.5+** -* **SSH (command-line) access** to run potentially necessary software maintenance commands, and Composer if you intend on using the command-line to install and manage Flarum extensions. - -## Installieren - -### Installing by unpacking an archive - -If you don't have SSH access to your server or you prefer not to use the command line, you can install Flarum by unpacking an archive. Below is a list of the available archives, make sure you choose the one that matches your PHP version and public path or lack thereof preference. - -| Flarum Version | PHP Version | Public Path | Type | Archive | -| -------------- | ----------------- | ----------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1.x | 8.3 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.zip) | -| 1.x | 8.3 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | Yes | ZIP | [flarum-v1.x-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.zip) | -| 1.x | 8.2 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.zip) | -| 1.x | 8.2 (recommended) | Yes | ZIP | [flarum-v1.x-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.zip) | -| 1.x | 8.1 | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.tar.gz) | -| 1.x | 8.1 | Yes | TAR.GZ | [flarum-v1.x-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.tar.gz) | -| 1.x | 8.1 | No | ZIP | [flarum-v1.x-no-public-dir-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.zip) | -| 1.x | 8.1 | Yes | ZIP | [flarum-v1.x-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.zip) | -| 1.x | 8.0 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.zip) | -| 1.x | 8.0 (end of life) | Yes | ZIP | [flarum-v1.x-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.zip) | -| 1.x | 7.4 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.zip) | -| 1.x | 7.4 (end of life) | Yes | ZIP | [flarum-v1.x-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.zip) | -| 1.x | 7.3 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.zip) | -| 1.x | 7.3 (end of life) | Yes | ZIP | [flarum-v1.x-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.zip) | - -### Installing using the Command Line Interface - -Flarum uses [Composer](https://getcomposer.org) to manage its dependencies and extensions. If you're not familiar with it, read [our guide](composer.md) for information on what it is and how to set it up. Afterwards, run this command in an empty location that you want Flarum to be installed in: - -```bash -composer create-project flarum/flarum:^1.8.0 . -``` - -While this command is running, you can configure your web server. You will need to make sure your webroot is set to `/path/to/your/forum/public`, and set up [URL Rewriting](#url-rewriting) as per the instructions below. - -When everything is ready, navigate to your forum in a web browser and follow the instructions to complete the installation. - -If you wish to install and update extensions from the admin dashboard, you need to also install the [Extension Manager](extensions.md) extension. - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -## URL Rewriting - -### Apache - -Flarum includes a `.htaccess` file in the `public` directory – make sure it has been uploaded correctly. **Flarum will not function properly if `mod_rewrite` is not enabled or `.htaccess` is not allowed.** Be sure to check with your hosting provider (or your VPS) that these features are enabled. If you're managing your own server, you may need to add the following to your site configuration to enable `.htaccess` files: - -``` - - AllowOverride All - -``` - -This ensures that htaccess overrides are allowed so Flarum can rewrite URLs properly. - -Methods for enabling `mod_rewrite` vary depending on your OS. You can enable it by running `sudo a2enmod rewrite` on Ubuntu. `mod_rewrite` is enabled by default on CentOS. Don't forget to restart Apache after making modifications! - -### Nginx - -Flarum includes a `.nginx.conf` file – make sure it has been uploaded correctly. Then, assuming you have a PHP site set up within Nginx, add the following to your server's configuration block: - -```nginx -include /path/to/flarum/.nginx.conf; -``` - -### Caddy - -Caddy requires a very simple configuration in order for Flarum to work properly. Note that you should replace the URL with your own and the path with the path to your own `public` folder. If you are using a different version of PHP, you wil also need to change the `fastcgi` path to point to your correct PHP install socket or URL. - -``` -www.example.com { - root * /var/www/flarum/public - php_fastcgi unix//var/run/php/php7.4-fpm.sock - header /assets/* { - +Cache-Control "public, must-revalidate, proxy-revalidate" - +Cache-Control "max-age=25000" - Pragma "public" - } - file_server -} -``` -## Folder Ownership - -During installation, Flarum may request that you make certain directories writable. Modern operating systems are generally multi-user, meaning that the user you log in as is not the same as the user Flarum is running as. The user that Flarum is running as MUST have read + write access to: - -- The root install directory, so Flarum can edit `config.php`. -- The `storage` subdirectory, so Flarum can edit logs and store cached data. -- The `assets` subdirectory, so that logos and avatars can be uploaded to the filesystem. - -Extensions might require other directories, so you might want to recursively grant write access to the entire Flarum root install directory. - -There are several commands you'll need to run in order to set up file permissions. Please note that if your install doesn't show warnings after executing just some of these, you don't need to run the rest. - -First, you'll need to allow write access to the directory. On Linux: - -```bash -chmod 775 -R /path/to/directory -``` - -If that isn't enough, you may need to check that your files are owned by the correct group and user. By default, in most Linux distributions `www-data` is the group and user that both PHP and the web server operate under. You'll need to look into the specifics of your distro and web server setup to make sure. You can change the folder ownership in most Linux operating systems by running: - -```bash -chown -R www-data:www-data /path/to/directory -``` - -With `www-data` changed to something else if a different user/group is used for your web server. - -Additionally, you'll need to ensure that your CLI user (the one you're logged into the terminal as) has ownership, so that you can install extensions and manage the Flarum installation via CLI. To do this, add your current user (`whoami`) to the web server group (usually `www-data`) via `usermod -a -G www-data YOUR_USERNAME`. You will likely need to log out and back in for this change to take effect. - -Finally, if that doesn't work, you might need to configure [SELinux](https://www.redhat.com/en/topics/linux/what-is-selinux) to allow the web server to write to the directory. To do so, run: - -```bash -chcon -R -t httpd_sys_rw_content_t /path/to/directory -``` - -To find out more about these commands as well as file permissions and ownership on Linux, read [this tutorial](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). If you are setting up Flarum on Windows, you may find the answers to [this Super User question](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) useful. - -:::caution Umgebungen können variieren - -Your environment may vary from the documentation provided, please consult your web server configuration or web hosting provider for the proper user and group that PHP and the web server operate under. - -::: - -:::danger Niemals die Berechtigung 777 verwenden - -You should never set any folder or file to permission level `777`, as this permission level allows anyone to access the content of the folder and file regardless of user or group. - -::: - -## Customizing Paths - -By default Flarum's directory structure includes a `public` directory which contains only publicly-accessible files. This is a security best-practice, ensuring that all sensitive source code files are completely inaccessible from the web root. - -However, if you wish to host Flarum in a subdirectory (like `yoursite.com/forum`), or if your host doesn't give you control over your webroot (you're stuck with something like `public_html` or `htdocs`), you can set up Flarum without the `public` directory. - -If you intend to install Flarum using one of the archives, you can simply use the `no-public-dir` (Public Path = No) [archives](#installing-by-unpacking-an-archive) and skip the rest of this section. If you're installing via Composer, you'll need to follow the instructions below. - -Simply move all the files inside the `public` directory (including `.htaccess`) into the directory you want to serve Flarum from. Then edit `.htaccess` and uncomment lines 9-15 in order to protect sensitive resources. For Nginx, uncomment lines 8-11 of `.nginx.conf`. - -You will also need to edit the `index.php` file and change the following line: - -```php -$site = require './site.php'; -``` - - Edit the `site.php` and update the paths in the following lines to reflect your new directory structure: - -```php -'base' => __DIR__, -'public' => __DIR__, -'storage' => __DIR__.'/storage', -``` - -Finally, check `config.php` and make sure the `url` value is correct. - -## Importing Data - -If you have an existing community and don't want to start from scratch, you may be able to import your existing data into Flarum. While there are no official importers yet, the community has made several unofficial importers: - -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) - -These can be used for other forum software as well by migrating to phpBB first, then to Flarum. Be aware that we can't guarantee that these will work nor can we offer support for them. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/internal/README.md b/i18n/de/docusaurus-plugin-content-docs/current/internal/README.md deleted file mode 100644 index d1b8efb11..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/internal/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -slug: '/internal' ---- - -# Interne Team Dokumentation - -Dies ist ein neuer Dokumentationsbereich, in dem wir einige Dokumente veröffentlichen werden, die intern vom Flarum-Team verwendet werden. Wir starten diesen Abschnitt, um unserer Community Transparenz darüber zu verschaffen, wie Flarum betrieben wird, und um denjenigen zu helfen, die zu Flarum beitragen möchten. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md b/i18n/de/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md deleted file mode 100644 index 555e7977c..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bundled Extensions Policy - -This document is to assist in deciding what core features should be bundled or maintained by the Flarum project team. - -Understand that Flarum aims to have a lean and efficient team. To guarantee a transparent workload, we intentionally have a "this could be an extension" mentality. The acronym D.O.R.C. spells out our decision-making process. - -- **Density**: prevent bloating Flarum so that it becomes a burden to install on shared hosting plans with limited space. -- **Opinionatedness**: no extensions should be bundled that is only useful by only a limited amount of communities or on specific hosting environments. -- **Responsibility**: extensions that could easily be maintained by others should be maintained by others. -- **Complexity**: extensions that are complex in terms of design, frontend or backend code should not be a responsibility of the Flarum project team. - -### Density - -To prevent the installation size of Flarum from continuously increasing we need to protect it from extensions that bloat it. We should ship extensions with Flarum that, for instance, have kilobytes in media files. - -### Opinionatedness - -Our goal is to allow installation of Flarum, in its vanilla form, by any community on any hosting environment. This includes shared hosting environment as well. - -Releasing Flarum with extensions that add functionality specific to cloud based (AWS) installations or for corporate support communities, as such, is unwanted. - -### Responsibility - -Protecting the time of the project team is key. To do so we should empower the ecosystem in building extensions that it needs. Therefor we distance ourselves from the responsibility of building every and all extensions. The responsibility of extension development is held primarily by our community. - -### Complexity - -Complex extensions require a vast amount of time, not just for development, but also documentation and support. To protect the lean and efficient principles of the team, we will not take ownership of extensions that add this complexity. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/internal/extension-manager.md b/i18n/de/docusaurus-plugin-content-docs/current/internal/extension-manager.md deleted file mode 100644 index 5b44436de..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/internal/extension-manager.md +++ /dev/null @@ -1,87 +0,0 @@ -# Extension Manager -This contains an explanation of how the extension manager works and what it has to offer. - -slightly outdated: see [the extensions guide for more](/extensions.md). - -## Inhalt -* Installieren, Aktualisieren und Entfernen von Erweiterungen. -* [Nach Updates suchen](#checking-for-updates). -* [Global Flarum-Update](#global-flarum-updates). -* [Patch-Minor Flarum-Updates](#patch-minor-flarum-updates). -* [Major Flarum-Update](#major-flarum-updates). -* [Flarum-Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Hintergrundaufgaben](#background-tasks). - -## Anforderungen -Es existieren einige Hindernisse, die behoben werden müssen, bevor dies verwendet werden kann. - -### Dateiberechtigungen -Der relevante Computer-Webbenutzer muss über Lese- und Schreibberechtigungen für Folgendes verfügen: `vendor`, `composer.json`, `composer.lock` und `storage`. Im Moment erscheint eine Warnung, wenn dies nicht der Fall ist, sollte dies vorzugsweise geändert werden, um nur die Dateien/Verzeichnisse zu erwähnen, in denen Berechtigungen fehlen, anstatt alle. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Pfad-Repository -In Entwicklungsumgebungen (und Produktion in seltenen Szenarien) sollte ein Pfad-Repository zu einem Verzeichnis existieren, das (meistens Entwicklungs-) Pakete enthält, der Pfad zu diesem Verzeichnis muss in einen absoluten Pfad geändert werden, da Composer sonst Probleme haben wird, einen Befehl auszuführen. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the extension manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the extension manager UI. - -## Gemeinsame Aktionen -Jede der oben aufgeführten Funktionen ist im Grunde ein oder zwei Composer-Befehle, und es existieren gemeinsame Aktionen/gemeinsames Verhalten zwischen ihnen allen. - -* Einschränkung des Zugriffs auf den Administrator. -* Validierung des bereitgestellten Paketnamens oder der Erweiterungs-ID, falls angegeben. -* Fehler beim Installieren einer vorhandenen Erweiterung, Aktualisieren oder Entfernen einer nicht vorhandenen Erweiterung usw -* Ausführen des Befehls. Dies [protokolliert die Ausgabe automatisch](#command-output-logging). -* [Fehler bei Befehlsfehler](#command-failure). -* Versenden eines Ereignisses. -* Wenn Du ein Update ausführst: - + Cache leeren. - + Migrationen ausführen. - + Assets veröffentlichen. - + Aktualisierungsprüfung durchführen und alle Erweiterungen protokolliere, die im Aktualisierungsprozess nicht auf ihre neuesten Versionen aktualisiert wurden. - -### Protokollierung der Befehlsausgabe -In Anbetracht dessen, dass dies noch experimentell ist und insbesondere aus Gründen der einfacheren Unterstützung, wird jede Befehlsausgabe genau wie die Flarum-Fehlerprotokolle in `storage/logs/composer` protokolliert, sodass Du zurückgehen und sehen kannst, was während einer Befehlsausführung geschehen ist. - -### Befehlsfehler -Wenn ein Composer-Befehl fehlschlägt (erkannt durch den Exit-Code), wird eine Ausnahme ausgelöst, die einen Grund enthält, der von der Ausnahme basierend auf dem Ausgabetext des Befehls erraten wird. Geschätzte Ursachen werden im Frontend in ordnungsgemäß erklärende Warnmeldungen umgewandelt. - -## Nach Updates suchen -Dies führt den Befehl `composer outdated -D --format json` aus, der nach Aktualisierungen von Paketen sucht, die direkt im Stammverzeichnis `composer.json` erforderlich sind, und die Ergebnisse im JSON-Format ausgibt. Nur Pakete, die von Composer als `semver-safe-update` und `update-possible` gekennzeichnet sind, werden angezeigt. - -Die Informationen zum letzten Update-Check werden in einer JSON-Einstellung gespeichert. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Einfach den Befehl `command update --prefer-dist --no-dev -a --with-all-dependencies` ausführen, was nützlich ist, um alle Pakete zu aktualisieren. - -## Patch-Minor Flarum Updates -Dieser ändert direkt benötigte Paketversionen auf `*` und führt dann den Befehl `command update --prefer-dist --no-dev -a --with-all-dependencies` aus. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -Dadurch werden die direkt erforderlichen Paketversionen auf `*` geändert, der Kern auf die neueste Hauptversionsanforderung geändert und dann derselbe Befehl oben ausgeführt. Bei einem Fehler kann richtig vermutet werden, dass einige Erweiterungen nicht mit der neuen Hauptversion kompatibel sind, die Ausnahmedetails enthalten eine Reihe von Erweiterungspaketnamen, die nicht kompatibel sind, es wird im Frontend gerendert, mit der Möglichkeit, ein `composer Why-not Flarum/Core 2.0` für weitere Details auszuführen. - -![große Update-Benutzeroberfläche](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Informationen über die zuletzt ausgeführten Updates werden in einer `last_update_run` JSON-Einstellung gespeichert, die ein Array von Erweiterungspaketnamen enthalten kann, die während des Prozesses nicht auf ihre neueste Version aktualisiert wurden. Dies wird im Frontend als Warnsymbolschaltflächen auf der Wenn Sie auf Erweiterungselemente klicken, wird ein `composer why-not` ausgeführt, das die Details des Fehlers in einem Modal anzeigt. - -![Benutzeroberfläche mit Liste von Erweiterungen, die Schaltflächen mit Warnsymbolen enthalten](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI mit dem Modal, das die Details anzeigt](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Hintergrundaufgaben -Um Zeitüberschreitungsprobleme zu umgehen, können Composer-Befehle auch im Hintergrund ausgeführt werden, indem die Warteschlange verwendet wird. Benutzer können auf [Blomstras Datenbankwarteschlangenimplementierung](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) als grundlegende Warteschlangenlösung verwiesen werden. Es enthält Anweisungen zum Aktivieren der Warteschlange über einen Cron-Job. - -:::danger Cron-Job PHP-Prozessversion - -Es ist üblich, dass gemeinsam genutzte Hosts eine niedrige PHP-Version in SSH verwenden. Benutzer müssen darauf hingewiesen werden, dass sie sicherstellen müssen, dass der PHP-Prozess eine mit Flarum kompatible Version hat. Entweder durch manuelle Überprüfung oder durch Nachfragen bei ihren Gastgebern. - -::: - -![Extension Manager Queue Table Preview](/en/img/extension-manager-queue.png) - -## ZUTUN -- Mit Shared Hosting versuchen. -- Bessere Erklärung auf der Benutzeroberfläche zu Hintergrundaufgaben. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/internal/merging-policy.md b/i18n/de/docusaurus-plugin-content-docs/current/internal/merging-policy.md deleted file mode 100644 index 067e2809f..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/internal/merging-policy.md +++ /dev/null @@ -1,38 +0,0 @@ -# PR Merging Policy - -Technical contributions to the Flarum source code go through a review process. Over the years we have tuned this process based on our experiences, our targeted development speed and availability. - -## What makes a great Pull Request? - -Great pull requests: - -- Have the [Pull Request template](https://github.com/flarum/.github/blob/main/PULL_REQUEST_TEMPLATE.md) filled out completely when opening a pull request. -- Do not combine different changes. Although tempting, don't change formatting of unrelated code. Stick to the one feature or change you wish to contribute. -- Have a related issue where the technical implementation has been agreed upon by the core team, or has been approved on by the core team through discussion on the official forums or other channels like Discord. -- Clearly explain the need for the change and list the areas where the pull request requires discussion. - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. We usually find several commits from bots like StyleCI in these prefabricated commit messages, their commit messages should be removed. - -- After merging: - - Assign the related issue (if none exists, the pull request itself, but never both) to the appropriate milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/de/docusaurus-plugin-content-docs/current/internal/merging.md b/i18n/de/docusaurus-plugin-content-docs/current/internal/merging.md deleted file mode 100644 index 0408b1bee..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/internal/merging.md +++ /dev/null @@ -1,29 +0,0 @@ -# PR Merging Workflow - - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all of the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. - -- After merging: - - Make sure the *issue* (if none exists, the PR - but not both) belongs to the appropriate milestone and project board. - - PRs in extensions cannot be assigned to core milestones, so create a core issue that references it and add it to the milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/de/docusaurus-plugin-content-docs/current/internal/package-manager.md b/i18n/de/docusaurus-plugin-content-docs/current/internal/package-manager.md deleted file mode 100644 index 2c4300699..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/internal/package-manager.md +++ /dev/null @@ -1,89 +0,0 @@ -# Paket-Manager -Darin wird erklärt, wie der Paketmanager funktioniert und was er zu bieten hat. - -## Inhalt -* Installieren, Aktualisieren und Entfernen von Erweiterungen. -* [Nach Updates suchen](#checking-for-updates). -* [Global Flarum-Update](#global-flarum-updates). -* [Patch-Minor Flarum-Updates](#patch-minor-flarum-updates). -* [Major Flarum-Update](#major-flarum-updates). -* [Flarum-Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Hintergrundaufgaben](#background-tasks). - -## Anforderungen -Es existieren einige Hindernisse, die behoben werden müssen, bevor dies verwendet werden kann. - -### Dateiberechtigungen -Der relevante Computer-Webbenutzer muss über Lese- und Schreibberechtigungen für Folgendes verfügen: `vendor`, `composer.json`, `composer.lock` und `storage`. Im Moment erscheint eine Warnung, wenn dies nicht der Fall ist, sollte dies vorzugsweise geändert werden, um nur die Dateien/Verzeichnisse zu erwähnen, in denen Berechtigungen fehlen, anstatt alle. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Pfad-Repository -In Entwicklungsumgebungen (und Produktion in seltenen Szenarien) sollte ein Pfad-Repository zu einem Verzeichnis existieren, das (meistens Entwicklungs-) Pakete enthält, der Pfad zu diesem Verzeichnis muss in einen absoluten Pfad geändert werden, da Composer sonst Probleme haben wird, einen Befehl auszuführen. Außerdem hat das Pfad-Repository standardmäßig eine höhere Priorität, sodass die Anforderung einer Erweiterung, die in diesem Repository vorhanden ist, wahrscheinlich fehlschlagen wird, es sei denn, es wird eine `*@dev`-Einschränkung angegeben, in diesem Fall sollte der Paketmanager ohnehin nicht für Entwicklungszwecke verwendet werden. - -Es existiert derzeit ein Hinweis darauf in der Paketmanager-Benutzeroberfläche. - -## Gemeinsame Aktionen -Jede der oben aufgeführten Funktionen ist im Grunde ein oder zwei Composer-Befehle, und es existieren gemeinsame Aktionen/gemeinsames Verhalten zwischen ihnen allen. - -* Einschränkung des Zugriffs auf den Administrator. -* Validierung des bereitgestellten Paketnamens oder der Erweiterungs-ID, falls angegeben. -* Fehler beim Installieren einer vorhandenen Erweiterung, Aktualisieren oder Entfernen einer nicht vorhandenen Erweiterung usw -* Ausführen des Befehls. Dies [protokolliert die Ausgabe automatisch](#command-output-logging). -* [Fehler bei Befehlsfehler](#command-failure). -* Versenden eines Ereignisses. -* Wenn Du ein Update ausführst: - + Cache leeren. - + Migrationen ausführen. - + Assets veröffentlichen. - + Aktualisierungsprüfung durchführen und alle Erweiterungen protokolliere, die im Aktualisierungsprozess nicht auf ihre neuesten Versionen aktualisiert wurden. - -### Protokollierung der Befehlsausgabe -In Anbetracht dessen, dass dies noch experimentell ist und insbesondere aus Gründen der einfacheren Unterstützung, wird jede Befehlsausgabe genau wie die Flarum-Fehlerprotokolle in `storage/logs/composer` protokolliert, sodass Du zurückgehen und sehen kannst, was während einer Befehlsausführung geschehen ist. - -### Befehlsfehler -Wenn ein Composer-Befehl fehlschlägt (erkannt durch den Exit-Code), wird eine Ausnahme ausgelöst, die einen Grund enthält, der von der Ausnahme basierend auf dem Ausgabetext des Befehls erraten wird. Geschätzte Ursachen werden im Frontend in ordnungsgemäß erklärende Warnmeldungen umgewandelt. - -## Nach Updates suchen -Dies führt den Befehl `composer outdated -D --format json` aus, der nach Aktualisierungen von Paketen sucht, die direkt im Stammverzeichnis `composer.json` erforderlich sind, und die Ergebnisse im JSON-Format ausgibt. Nur Pakete, die von Composer als `semver-safe-update` und `update-possible` gekennzeichnet sind, werden angezeigt. - -Die Informationen zum letzten Update-Check werden in einer JSON-Einstellung gespeichert. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Einfach den Befehl `command update --prefer-dist --no-dev -a --with-all-dependencies` ausführen, was nützlich ist, um alle Pakete zu aktualisieren. - -## Patch-Minor Flarum Updates -Dieser ändert direkt benötigte Paketversionen auf `*` und führt dann den Befehl `command update --prefer-dist --no-dev -a --with-all-dependencies` aus. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -Dadurch werden die direkt erforderlichen Paketversionen auf `*` geändert, der Kern auf die neueste Hauptversionsanforderung geändert und dann derselbe Befehl oben ausgeführt. Bei einem Fehler kann richtig vermutet werden, dass einige Erweiterungen nicht mit der neuen Hauptversion kompatibel sind, die Ausnahmedetails enthalten eine Reihe von Erweiterungspaketnamen, die nicht kompatibel sind, es wird im Frontend gerendert, mit der Möglichkeit, ein `composer Why-not Flarum/Core 2.0` für weitere Details auszuführen. - -![große Update-Benutzeroberfläche](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Informationen über die zuletzt ausgeführten Updates werden in einer `last_update_run` JSON-Einstellung gespeichert, die ein Array von Erweiterungspaketnamen enthalten kann, die während des Prozesses nicht auf ihre neueste Version aktualisiert wurden. Dies wird im Frontend als Warnsymbolschaltflächen auf der Wenn Sie auf Erweiterungselemente klicken, wird ein `composer why-not` ausgeführt, das die Details des Fehlers in einem Modal anzeigt. - -![Benutzeroberfläche mit Liste von Erweiterungen, die Schaltflächen mit Warnsymbolen enthalten](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI mit dem Modal, das die Details anzeigt](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Hintergrundaufgaben -Um Zeitüberschreitungsprobleme zu umgehen, können Composer-Befehle auch im Hintergrund ausgeführt werden, indem die Warteschlange verwendet wird. Benutzer können auf [Blomstras Datenbankwarteschlangenimplementierung](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) als grundlegende Warteschlangenlösung verwiesen werden. Es enthält Anweisungen zum Aktivieren der Warteschlange über einen Cron-Job. - -:::danger Cron-Job PHP-Prozessversion - -Es ist üblich, dass gemeinsam genutzte Hosts eine niedrige PHP-Version in SSH verwenden. Benutzer müssen darauf hingewiesen werden, dass sie sicherstellen müssen, dass der PHP-Prozess eine mit Flarum kompatible Version hat. Entweder durch manuelle Überprüfung oder durch Nachfragen bei ihren Gastgebern. - -::: - -![Vorschau der Paket-Manager-Warteschlangentabelle](/en/img/package-manager-queue.png) - -## ZUTUN -- Mit Shared Hosting versuchen. -- Composer-Befehlsjob darf sich nicht überschneiden. -- Code TODOs. -- Bessere Erklärung auf der Benutzeroberfläche zu Hintergrundaufgaben. -- Szenario betrachten, in dem wir eine Erweiterung aktualisieren, die keine erforderliche Root-Abhängigkeit ist, z. B. Bundles. -- Jeweils eine Hintergrundaufgabe ausführen und verhindern, dass der Benutzer mehrere Aufgaben auslöst. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/languages.md b/i18n/de/docusaurus-plugin-content-docs/current/languages.md deleted file mode 100644 index 6985d142d..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/languages.md +++ /dev/null @@ -1,29 +0,0 @@ -# Sprachen - -Es ist ganz einfach, deiner Flarum-Basisinstallation eine neue Sprache hinzuzufügen. Befolgen einfach die nachstehenden Anweisungen, um das Sprachpaket deiner Wahl herunterzuladen und zu installieren. - -Nachdem du ein Sprachpaket hinzugefügt hast, kannst du es als [Standardsprache](#setting-the-default-language) für dein Forum festlegen. Und wenn du jemals feststellst, dass du eines deiner installierten Sprachpakete nicht benötigst, kannst du es jederzeit [deaktivieren](#disabling-a-language-pack). Wenn du Erweiterungen von Drittanbietern verwendest, stelle sicher, dass du [dies liest](#third-party-extensions), bevor du beginnst. - -## Installation des Sprachpakets - -Besuche zunächst das Tag [Extensions > Languages](https://discuss.flarum.org/t/languages) auf der Flarum Community-Site und suche ein Sprachpaket, das du installieren möchtest. - -Sprachpakete werden auf die gleiche Weise installiert wie [Erweiterungen](extensions.md). Die Sprache wird auf der Seite **Erweiterungen** der Admin-Oberfläche angezeigt und du kannst sie dort aktivieren. - -Das ist alles dazu! Du solltest jetzt in der Lage sein, die Sprachauswahl in der Kopfzeile deiner Website zu verwenden, um die Anzeige deines Forums auf die neue Sprache umzustellen. - -## Festlegen der Standardsprache - -Nachdem du ein Sprachpaket installiert und sichergestellt hast, dass es funktioniert, möchtest du es möglicherweise als Standardsprache für neue Benutzer und Gäste festlegen. Du kannst dies auf der Seite **Grundeinstellungen** der Admin-Oberfläche tun. - -## Deaktivieren eines Sprachpakets - -Wenn du entscheidest, dass du eine bestimmte Sprache nicht unterstützen musst, kannst du sie schließlich deaktivieren. Suche einfach das Sprachpaket auf der Seite **Erweiterungen** der Admin-Oberfläche und deaktiviere es. - -Das Deaktivieren einer Sprache kann nützlich sein, wenn du eine einsprachige Website betreiben und nicht möchtest, dass die Sprachauswahl im Website-Header angezeigt wird. Die Sprachauswahl ist ausgeblendet, wenn nur eine Sprache aktiviert ist. - -## Community-Erweiterungen - -Während Sprachpakete, die von der Flarum Community-Site heruntergeladen werden, im Allgemeinen Übersetzungen für alle Erweiterungen enthalten, die mit Flarum gebündelt sind, decken sie in der Regel _keine_ Community-Erweiterungen ab, die du möglicherweise installiert hast. Es ist Sache der Entwickler, Übersetzungen für ihre Erweiterungen bereitzustellen und zu pflegen. - -Bevor du also eine Community-Erweiterung installierst, sollten du überprüfen, ob sie Übersetzungen für jedes von dir installierte Sprachpaket enthält. Wenn du feststellst, dass eine Erweiterung eine von dir benötigte Sprache nicht unterstützt, wende dich bitte direkt an den Entwickler und veranlasse, dass die erforderlichen Übersetzungen hinzugefügt werden. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/mail.md b/i18n/de/docusaurus-plugin-content-docs/current/mail.md deleted file mode 100644 index 82308b601..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/mail.md +++ /dev/null @@ -1,29 +0,0 @@ -# E-Mail-Konfiguration - -Jede Community muss E-Mails senden, um die E-Mail-Verifizierung, das Zurücksetzen von Kennwörtern, Benachrichtigungen und andere Mitteilungen an Benutzer zu ermöglichen. Das Konfigurieren deines Forums zum Senden von E-Mails sollte einer deiner ersten Schritte als Administrator sein: Eine falsche Konfiguration führt zu Fehlern, wenn Benutzer versuchen, sich zu registrieren. - -## Verfügbare Treiber - -Flarum bietet standardmäßig mehrere Treiber, die unten aufgeführt und erklärt werden. Entwickler können auch [benutzerdefinierte E-Mail-Treiber über die Erweiterungen](extend/mail.md) hinzufügen. - -### SMTP - -Dies ist wahrscheinlich der am häufigsten verwendete E-Mail-Treiber, mit dem Du einen Host, Port/Verschlüsselung, Benutzername und Passwort für einen externen SMTP-Dienst konfigurieren kannst. Bitte beachte, dass das Verschlüsselungsfeld entweder `ssl` oder `tls` erwartet. - -### Mail - -Der `mail`-Treiber versucht, das sendmail/postfix-E-Mail-System zu verwenden, das in vielen Hosting-Servern enthalten ist. Du musst sendmail ordnungsgemäß auf deinem Server installieren und konfigurieren, damit dies funktioniert. - -### Mailgun - -Dieser Treiber verwendet dein [Mailgun](https://www.mailgun.com/)-Konto zum Senden von E-Mails. Du benötigst einen geheimen Schlüssel sowie die Domäne und Region aus deiner Mailgun-Konfiguration. - -Um den Mailgun-Treiber zu verwenden, musst Du das Guzzle-Composer-Paket (einen PHP-HTTP-Client) installieren. Du kannst dies tun, indem Du `composer require guzzlehttp/guzzle:^6.0|^7.0` im Stammverzeichnis deiner Flarum-Installation ausführst. - -### Log - -Der Log-Mail-Treiber sendet KEINE MAIL und wird hauptsächlich von Entwicklern verwendet. Es schreibt den Inhalt aller E-Mails in die Protokolldatei in `FLARUM_ROOT_DIRECTORY/storage/logs`. - -## E-Mail testen - -Sobald Du eine E-Mail-Konfiguration gespeichert hast, kannst Du auf der Seite „Mail“ des Admin-Dashboards auf die Schaltfläche „Test-Mail senden“ klicken, um sicherzustellen, dass deine Konfiguration funktioniert. Wenn Du einen Fehler siehst oder keine E-Mail erhälst, passe die Konfiguration an und versuche es erneut. Stelle sicher, dass Du deinen Spam überprüfst, wenn kein Fehler vorliegt, jedoch nichts in deinem Posteingang angezeigt wird. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/releases.md b/i18n/de/docusaurus-plugin-content-docs/current/releases.md deleted file mode 100644 index 6fb9a5869..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/releases.md +++ /dev/null @@ -1,15 +0,0 @@ -# Versionshinweise - - - - -Versionshinweise sind in der [Flarum Community](https://discuss.flarum.org/t/blog?sort=newest) zu finden. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/rest-api.md b/i18n/de/docusaurus-plugin-content-docs/current/rest-api.md deleted file mode 100644 index 7e91238d3..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/rest-api.md +++ /dev/null @@ -1,375 +0,0 @@ -# Consuming the REST API - -Flarum exposes a REST API which is used by the single page application but also available for external scripts. - -The API follows the best practices defined by the [JSON:API](https://jsonapi.org/) specification. - -:::info - -To extend the REST API with new endpoints, see [API and Data Flow](extend/api.md) in the developer documentation. - -::: - -## Authentication - -The single page app uses session cookies to authenticate against the API. External scripts can use stateless authentication using [API Keys](#api-keys) or [Access Tokens](#access-tokens). - -`GET` endpoints can be used without authentication. Only content visible to guests will be returned. Other endpoints generally cannot be used without authentication because of the [CSRF protection](#csrf-protection). - -### API keys - -API Keys are the primary way for scripts, tools and integrations to interact with Flarum. - -#### Creation - -There is currently no UI to manage API Keys, but they can be created manually in the `api_keys` table of the database. - -The following attributes can be filled: - -- `key`: Generate a long unique token (recommended: alpha-numerical, 40 characters) and set it here, this will be the token used in the `Authorization` header. -- `user_id`: Optional. If set, the key can only be used to act as the given user. - -The remaining attributes are either automatically filled or currently not used: - -- `id`: Will be filled by MySQL auto-increment. -- `allowed_ips`: Not implemented. -- `scopes`: Not implemented. -- `created_at`: Can be set to any date, but is meant for the date of creation of the key. -- `last_activity_at`: Will be updated automatically when the token is used. - -#### Usage - -Attach your key value to each API request using the `Authorization` header. Then provide the user ID you want to interact as at the end of the header: - - Authorization: Token YOUR_API_KEY_VALUE; userId=1 - -If a `user_id` value has been set for the key in the database, `userId=` will be ignored. Otherwise, it can be set to any valid user ID that exists in the database. - -### Access Tokens - -Access Tokens are short-lived tokens that belong to a specific user. - -Those tokens are used behind the scenes for cookie sessions. Their use in stateless API requests has the same effect as a regular session. The user last activity will be updated each time the token is used. - -#### Creation - -All users are allowed to create access tokens. To create a token, use the `/api/token` endpoint with the credentials of your user: - -``` -POST /api/token HTTP/1.1 - -{ - "identification": "Toby", - "password": "pass7word" -} - -HTTP/1.1 200 OK - -{ - "token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX", - "userId": "1" -} -``` - -At the moment, 3 token types exist, although only 2 types can be created via the REST API. - -- `session` tokens expire after 1h of inactivity. This is the default token type. -- `session_remember` tokens expire after 5 years of inactivity. They can be obtained by specifying `remember=1` in the request attributes. -- `developer` tokens never expire. They can only be created manually in the database at the moment. - -**All access tokens are deleted when the user logs out** (this includes `developer` tokens, although it is planned to change it). - -#### Usage - -Attach the returned `token` value to each API request using the `Authorization` header: - - Authorization: Token YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX - -### CSRF Protection - -Most of the `POST`/`PUT`/`DELETE` API endpoints are protected against [Cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery). This means stateless requests are not possible without authentication. - -When using an API Key or Access Token, CSRF protection is bypassed. - -## Endpoints - -This part of the documentation is still in progress. We are researching options to provide an automated documentation of the endpoints. - -Every extension adds new endpoints and attributes so it's difficult to provide a complete documentation of all endpoints. A good way to discover endpoints is to use the browser development tools to inspect requests made by the single page application. - -Below are a few examples of commonly used endpoints. JSON has been truncated to make reading easier. - -### List discussions - - GET /api/discussions - -```json -{ - "links": { - "first": "https://flarum.tld/api/discussions", - "next": "https://flarum.tld/api/discussions?page%5Boffset%5D=20" - }, - "data": [ - { - "type": "discussions", - "id": "234", - "attributes": { - "title": "Lorem Ipsum", - "slug": "234-lorem-ipsum", - "commentCount": 10, - "participantCount": 3, - "createdAt": "2022-01-01T10:20:30+00:00", - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "lastPostNumber": 10, - "canReply": true, - "canRename": true, - "canDelete": true, - "canHide": true, - "isHidden": true, - "hiddenAt": "2022-01-06T10:20:30+00:00", - "lastReadAt": "2022-01-02T10:20:30+00:00", - "lastReadPostNumber": 2, - "isApproved": true, - "canTag": true, - "isLocked": false, - "canLock": true, - "isSticky": false, - "canSticky": true, - "canMerge": true, - "subscription": null - }, - "relationships": { - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - "lastPostedUser": { - "data": { - "type": "users", - "id": "64" - } - }, - "tags": { - "data": [ - { - "type": "tags", - "id": "3" - } - ] - }, - "firstPost": { - "data": { - "type": "posts", - "id": "668" - } - } - } - }, - { - "type": "discussions", - "id": "234", - "attributes": { - // [...] - }, - "relationships": { - // [...] - } - }, - // [...] more discussions - ], - "included": [ - { - "type": "users", - "id": "1", - "attributes": { - "username": "Admin", - "displayName": "Admin", - "avatarUrl": null, - "slug": "1" - } - }, - { - "type": "users", - "id": "64", - "attributes": { - "username": "Flarum", - "displayName": "Flarum", - "avatarUrl": "https://flarum.tld/assets/avatars/Z4hEncw0ndVqZ8be.png", - "slug": "64" - } - }, - { - "type": "tags", - "id": "3", - "attributes": { - "name": "Welcome", - "description": "Post interesting things here", - "slug": "welcome", - "color": "#888", - "backgroundUrl": null, - "backgroundMode": null, - "icon": "fas fa-bullhorn", - "discussionCount": 30, - "position": 1, - "defaultSort": null, - "isChild": false, - "isHidden": false, - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "canStartDiscussion": true, - "canAddToDiscussion": true, - "isRestricted": false - } - }, - { - "type": "posts", - "id": "668", - "attributes": { - "number": 1, - "createdAt": "2022-01-01T10:20:30+00:00", - "contentType": "comment", - "contentHtml": "

Hello World

" - } - }, - // [...] more includes for the other discussions - ] -} -``` - -### Create discussion - - POST /api/discussions - -```json -{ - "data":{ - "type": "discussions", - "attributes": { - "title": "Lorem Ipsum", - "content": "Hello World" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "1" - } - ] - } - } - } -} -``` - -The response includes the ID of the new discussion: - -```json -{ - "data": { - "type": "discussions", - "id": "42", - "attributes": { - "title": "Lorem Ipsum", - "slug": "42-lorem-ipsum", - "commentCount": 1 - // [...] other attributes - }, - "relationships": { - "posts": { - "data": [ - { - "type": "posts", - "id": "58" - } - ] - }, - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - // [...] other relationships - } - }, - "included":[ - { - "type": "posts", - "id": "38", - "attributes": { - "number": 1, - "contentType": "comment", - "contentHtml": "\u003Cp\u003EHello World\u003C\/p\u003E" - // [...] other attributes - } - } - // [...] other includes - ] -} -``` - -### Create user - - POST /api/users - -```json -{ - "data": { - "attributes": { - "username": "Flarum", - "email": "flarum@example.com", - "password": "correcthorsebatterystaple" - } - } -} -``` - -## Errors - -Flarum uses various HTTP status code and includes error descriptions that follow the [JSON:API error spec](https://jsonapi.org/format/#errors). - -Below are a few common errors you might encounter when using the REST API: - -### CSRF Token Mismatch - -If you receive a 400 HTTP error with `csrf_token_mismatch` message, it means the `Authorization` header is absent or invalid and Flarum attempted to authenticate through the session cookie. - -```json -{ - "errors": [ - { - "status": "400", - "code": "csrf_token_mismatch" - } - ] -} -``` - -### Validation errors - -Validation errors are returned with 422 HTTP status code. The name of the invalid field is returned as the `pointer` value. There can be multiple errors for a single field at the same time. - -```json -{ - "errors": [ - { - "status": "422", - "code": "validation_error", - "detail": "The username has already been taken.", - "source":{ - "pointer":"\/data\/attributes\/username" - } - }, - { - "status": "422", - "code": "validation_error", - "detail": "The email has already been taken.", - "source": { - "pointer":"\/data\/attributes\/email" - } - } - ] -} -``` diff --git a/i18n/de/docusaurus-plugin-content-docs/current/scheduler.md b/i18n/de/docusaurus-plugin-content-docs/current/scheduler.md deleted file mode 100644 index 6123ce7c3..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/scheduler.md +++ /dev/null @@ -1,55 +0,0 @@ -# Scheduler - -The Flarum scheduler allows extensions to automate certain tasks effortlessly. In this guide we will see how to set it up. We won't go into the details of cron itself, but if you want to read more about it, I suggest you take a look at [this Wikipedia article](https://en.wikipedia.org/wiki/Cron) on cron. - -## Why should I care? - -Quite simply, a growing list of extensions now support handling certain functions automatically for you, completely behind the scenes. Wondering why `fof/drafts` 'scheduled drafts' are not posting, or `fof/best-answer` 'remind users to set a best answer after X days' does not fire? That'll be because they will setup themselves with the scheduler service, but without a one-liner cron job, nothing will happen! - -## What extensions currently use the scheduler? - -Some of the most popular examples are the following: - -- [FoF Best Answer](https://github.com/FriendsOfFlarum/best-answer) -- [FoF Drafts](https://github.com/FriendsOfFlarum/drafts) -- [FoF Sitemap](https://github.com/FriendsOfFlarum/sitemap) -- [FoF Open Collective](https://github.com/FriendsOfFlarum/open-collective) -- [FoF Github Sponsors](https://github.com/FriendsOfFlarum/github-sponsors) - -## Ok, let's get this setup! - -Most (if not all) Linux distros either come with, or can have, cron installed. For example, on Debian and Ubuntu based systems, you can install `cron` like this: - -``` -sudo apt-get update -sudo apt-get install cron -``` - -In case you are using a RHEL based Linux distribution (CentOS, AlmaLinux, Rocky Linux...), install cron like this: - -``` -sudo dnf update -sudo dnf install crontabs -``` - -Once you have cron installed, let's create the one and only entry you need for Flarum: - -``` -crontab -e -``` - -This will open the cron editor. You may or may not have other entries there. Add this line, and remember to leave an empty line at the bottom. - -``` -* * * * * cd /path-to-your-project && php flarum schedule:run >> /dev/null 2>&1 -``` - -`* * * * *` tells cron to run your command every minute. - -In case you want to use a different value and don't know exactly how cron expressions work, you can use a [cron expression generator](https://crontab.guru) to easily get the desired string. - -`cd /path-to-your-project && php flarum schedule:run` executes Flarum's scheduler to trigger any tasks currently waiting to be run. If PHP isn't in your system's path, you may need to experiment with setting the full path to PHP. - -Lastly `>> /dev/null 2>&1` suppresses any output from the command. - -Voila! Now any extension that registers a task to run, anything from every minute to daily, monthly, yearly - whatever - will now run on your server. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/themes.md b/i18n/de/docusaurus-plugin-content-docs/current/themes.md deleted file mode 100644 index 7fb39f29e..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/themes.md +++ /dev/null @@ -1,29 +0,0 @@ -# Design - -Obwohl wir hart daran gearbeitet haben, Flarum so schön wie möglich zu machen, wird wahrscheinlich jede Community einige Optimierungen/Modifikationen vornehmen wollen, um sie ihrem gewünschten Stil anzupassen. - -## Admin-Dashboard - -The [admin dashboard](admin.md)'s Appearance page is a great first place to start customizing your forum. Hier kannst Du: - -- Designfarben auswählen -- Dunkelmodus und eine farbige Kopfzeile umschalten -- Ein Logo und Favicon hochladen (Symbol wird in Browser-Tabs angezeigt) -- HTML für benutzerdefinierte Kopf- und Fußzeilen hinzufügen -- [custom LESS/CSS](#css-theming) hinzufügen, um zu ändern, wie Elemente angezeigt werden - -## CSS-Design - -CSS ist eine Stylesheet-Sprache, die Browsern mitteilt, wie Elemente einer Webseite angezeigt werden sollen. Es ermöglicht uns, alles von Farben über Schriftarten bis hin zu Elementgröße und Positionierung bis hin zu Animationen zu ändern. Das Hinzufügen von benutzerdefiniertem CSS kann eine großartige Möglichkeit sein, deine Flarum-Installation an ein Thema anzupassen. - -Ein CSS-Tutorial würde den Rahmen dieser Dokumentation sprengen, aber es existieren viele großartige Online-Ressourcen, um die Grundlagen von CSS zu erlernen. - -:::tip - -Flarum verwendet tatsächlich LESS, was das Schreiben von CSS erleichtert, indem es Variablen, Bedingungen und Funktionen zulässt. - -::: - -## Erweiterungen - -Das flexible [Erweiterungssystem](extensions.md) von Flarum ermöglicht es dir, praktisch jeden Teil von Flarum hinzuzufügen, zu entfernen oder zu modifizieren. Wenn Du über das Ändern von Farben/Größen/Stilen hinaus erhebliche thematische Änderungen vornehmen möchtest, ist eine benutzerdefinierte Erweiterung definitiv der richtige Weg. Um zu erfahren, wie man eine Erweiterung erstellt, lese unsere [Extension-Dokumentation](extend/README.md)! diff --git a/i18n/de/docusaurus-plugin-content-docs/current/troubleshoot.md b/i18n/de/docusaurus-plugin-content-docs/current/troubleshoot.md deleted file mode 100644 index 1358f7fc6..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/troubleshoot.md +++ /dev/null @@ -1,56 +0,0 @@ -# Problembehandlung - -If Flarum isn't installing or working as expected, the first thing you should do is *check again* whether your environment meets the [system requirements](install.md#server-requirements). If you're missing something that Flarum needs to run, you'll need to remedy that first. - -Next, you should take a few minutes to search the [Support forum](https://discuss.flarum.org/t/support) and the [issue tracker](https://github.com/flarum/core/issues). It's possible that someone has already reported the problem, and a fix is either available or on the way. If you've searched thoroughly and can't find any information about the problem, it's time to start troubleshooting. - -## Step 0: Activate debug mode - -:::danger Produktion überspringen - -Diese Debugging-Tools sind sehr nützlich, können jedoch Informationen offenlegen, die nicht öffentlich sein sollten. Diese sind in Ordnung, wenn du dich in einer Staging- oder Entwicklungsumgebung befindest, doch wenn du nicht weißt, was du tust, überspringe diesen Schritt in einer Produktionsumgebung. - -::: - -Bevor du fortfährst, solltest du die Debugging-Tools von Flarum aktivieren. Simply open up **config.php** with a text editor, change the `debug` value to `true`, and save the file. This will cause Flarum to display detailed error messages, giving you an insight into what's going wrong. - -If you've been seeing blank pages and the above change doesn't help, try setting `display_errors` to `On` in your **php.ini** configuration file. - -## Schritt 1: Allgemeine Korrekturen - -Viele Probleme können wie folgt behoben werden: - -* Lösche deinen Browser-Cache -* Lösche den Backend-Cache mit [`php flarum cache:clear`](console.md). -* Make sure your database is updated with [`php flarum migrate`](console.md). -* Ensure that the [email configuration](mail.md) in your admin dashboard is correct: invalid email config will cause errors when registering, resetting a password, changing emails, and sending notifications. -* Check that your `config.php` is correct. For instance, make sure that the right `url` is being used (`https` vs `http` and case sensitivity matter here!). -* One potential culprit could be a custom header, custom footer, or custom LESS. If your issue is in the frontend, try temporarily removing those via the Appearance page of the admin dashboard. - -You'll also want to take a look at the output of [`php flarum info`](console.md) to ensure that nothing major is out of place. - -## Step 2: Reproduce the issue - -Try to make the problem happen again. Pay careful attention to what you're doing when it occurs. Does it happen every time, or only now and then? Try changing a setting that you think might affect the problem, or the order in which you're doing things. Does it happen under some conditions, but not others? - -If you've recently added or updated an extension, you should disable it temporarily to see if that makes the problem go away. Make sure all of your extensions were meant to be used with the version of Flarum you're running. Outdated extensions can cause a variety of issues. - -Somewhere along the way you may get an idea about what's causing your issue, and figure out a way to fix it. But even if that doesn't happen, you will probably run across a few valuable clues that will help us figure out what's going on, once you've filed your bug report. - -## Step 3: Collect information - -If it looks like you're going to need help solving the problem, it's time to get serious about collecting data. Look for error messages or other information about the problem in the following places: - -* Displayed on the actual page -* Displayed in the browser console (Chrome: More tools -> Developer Tools -> Console) -* Recorded in the server's error log (e.g. `/var/log/nginx/error.log`) -* Recorded in PHP-FPM's error log (e.g. `/var/log/php7.x-fpm.log`) -* Recorded by Flarum (`storage/logs`) - -Copy any messages to a text file and jot down a few notes about *when* the error occurred, *what* you were doing at the time, and so on. Be sure to include any insights you may have gleaned about the conditions under which the issue does and doesn't occur. Add as much information as possible about your server environment: OS version, web server version, PHP version and handler, et cetera. - -## Step 4: Prepare a report - -Once you have gathered all the information you can about the problem, you're ready to file a bug report. Please follow the instructions on [Reporting Bugs](bugs.md). - -If you discover something new about the issue after filing your report, please add that information at the bottom of your original post. It's a good idea to file a report even if you have solved the problem on your own, since other users may also benefit from your solution. If you've found a temporary workaround for the problem, be sure to mention that as well. \ No newline at end of file diff --git a/i18n/de/docusaurus-plugin-content-docs/current/update.md b/i18n/de/docusaurus-plugin-content-docs/current/update.md deleted file mode 100644 index 21b090eb2..000000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/update.md +++ /dev/null @@ -1,110 +0,0 @@ -# Updating - -## From the Admin Dashboard - -:::info - -If you have the extension manager extension installed you can simply run the update from its interface and skip this page entirely. - -::: - ---- - -To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. - -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. - -## General Steps - -**Step 1:** Make sure all your extensions have versions compatible with the Flarum version you're trying to install. This is only needed across major versions (e.g. you probably don't need to check this if upgrading from v1.0.0 to v1.1.0, assuming your extensions follow recommended versioning). You can check this by looking at the extension's [Discuss thread](https://discuss.flarum.org/t/extensions), searching for it on [Packagist](http://packagist.org/), or checking databases like [Extiverse](https://extiverse.com). You'll need to remove (not just disable) any incompatible extensions before updating. Please be patient with extension developers! - -**Step 2:** Take a look at your `composer.json` file. Unless you have a reason to require specific versions of extensions or libraries, you should set the version string of everything except `flarum/core` to `*` (including `flarum/tags`, `flarum/mentions`, and other bundled extensions). Make sure `flarum/core` is NOT set to `*`. If you're targeting a specific version of Flarum, set `flarum/core` to that (e.g. `"flarum/core": "v0.1.0-beta.16`). If you just want the most recent version, use `"flarum/core": "^1.0"`. - -**Step 3:** If your local install uses [local extenders](extenders.md), make sure they are up to date with changes in Flarum. - -**Step 4:** We recommend disabling third-party extensions in the admin dashboard before updating. This isn't strictly required, but will make debugging easier if you run into issues. - -**Step 5:** Make sure your PHP version is supported by the version of Flarum you are trying to upgrade to, and that you are using Composer 2 (`composer --version)`. - -**Step 6:** Finally, to update, run: - -``` -composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -php flarum migrate -php flarum cache:clear -``` - -**Step 7:** If applicable, restart your PHP process and opcache. - -## Major Version Update Guides - -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) - -1. Do steps 1-5 above. -2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. -3. Change `flarum/core`'s version string in `composer.json` from `^0.1.0` to `^1.0`. -4. Remove the `"minimum-stability": "beta",` line from your `composer.json` -5. Do steps 6 and 7 above. - -## Troubleshooting Issues - -There are 2 main places where you might run into errors when updating Flarum: while running the update command itself, or when accessing the forum after updating. - -### Errors While Updating - -Here we'll go through several common types of issues while trying to update Flarum. - ---- - -If the output is short and contains: - -``` -Nothing to modify in lock file -``` - -Or does not list `flarum/core` as an updated package, and you are not on the latest flarum version: - -- Revisit step 2 above, make sure that all third party extensions have an asterisk for their version string. -- Make sure your `flarum/core` version requirement isn't locked to a specific minor version (e.g. `v0.1.0-beta.16` is locked, `^1.0.0` isn't). If you're trying to update across major versions of Flarum, follow the related major version update guide above. - ---- - -For other errors, try running `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO` - -If the output looks something like this: - -``` -flarum/flarum - requires flarum/core (v0.1.0-beta.15) -fof/moderator-notes 0.4.4 requires flarum/core (>=0.1.0-beta.15 <0.1.0-beta.16) -jordanjay29/flarum-ext-summaries 0.3.2 requires flarum/core (>=0.1.0-beta.14 <0.1.0-beta.16) -flarum/core v0.1.0-beta.16 requires dflydev/fig-cookies (^3.0.0) -flarum/flarum - does not require dflydev/fig-cookies (but v2.0.3 is installed) -flarum/core v0.1.0-beta.16 requires franzl/whoops-middleware (^2.0.0) -flarum/flarum - does not require franzl/whoops-middleware (but 0.4.1 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/bus (^8.0) -flarum/flarum - does not require illuminate/bus (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/cache (^8.0) -flarum/flarum - does not require illuminate/cache (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/config (^8.0) -flarum/flarum - does not require illuminate/config (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/container (^8.0) -flarum/flarum - does not require illuminate/container (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/contracts (^8.0) -flarum/flarum - does not require illuminate/contracts (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/database (^8.0) -flarum/flarum - does not require illuminate/database (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/events (^8.0) -flarum/flarum - does not require illuminate/events (but v6.20.19 is installed) -... (this'll go on for a bit) -``` - -It is very likely that some of your extensions have not yet been updated. - -- Revisit step 1 again, make sure all your extensions have versions compatible with the core version you want to upgrade to. Remove any that don't. -- Make sure you're running `composer update` with all the flags specified in the update step. - -If none of this fixes your issue, feel free to reach out on our [Support forum](https://discuss.flarum.org/t/support). Make sure to include the output of `php flarum info` and `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO`. - -### Errors After Updating - -If you are unable to access your forum after updating, follow our [troubleshooting instructions](troubleshoot.md). diff --git a/i18n/de/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md b/i18n/de/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md index 0ff695c4e..0a54dcd06 100644 --- a/i18n/de/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md +++ b/i18n/de/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md @@ -305,7 +305,7 @@ export default class NewPostNotification extends Notification { } ``` -In the example, the icon is a star, the link will go to the new post, and the content will say that "{user} posted". +In the example, the icon is a star, the link will go to the new post, and the content will say that "`{user}` posted". Next, we need to tell Flarum that the notification you send in the backend corresponds to the frontend notification we just created. diff --git a/i18n/de/docusaurus-plugin-content-docs/version-1.x/update.md b/i18n/de/docusaurus-plugin-content-docs/version-1.x/update.md index 21b090eb2..5321a3a36 100644 --- a/i18n/de/docusaurus-plugin-content-docs/version-1.x/update.md +++ b/i18n/de/docusaurus-plugin-content-docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. +If updating across major versions (e.g. `<=0.1.0` to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. ## General Steps @@ -38,7 +38,7 @@ php flarum cache:clear ## Major Version Update Guides -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) +### Updating from Beta (`<=0.1.0`) to Stable v1 (^1.0.0) 1. Do steps 1-5 above. 2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/README.md b/i18n/es/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index b3b09e6bd..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,45 +0,0 @@ -- - - -slug: / -- - - - -# Acerca de Flarum - -Flarum es una plataforma de discusión increíblemente sencilla para su sitio web. Es rápido y fácil de usar, con todas las características que necesitas para dirigir una comunidad exitosa. It's also extremely extensible, allowing for ultimate customizability. - -![Flarum Home Screenshot](/en/img/home_screenshot.png) - -## Objetivos - -Flarum es el sucesor combinado de [esoTalk](https://github.com/esotalk/esoTalk) y [FluxBB](https://fluxbb.org). Está diseñado para ser: - -* **Rápido y simple.** Sin desorden, sin relleno, sin dependencias complejas. Flarum está construido con PHP por lo que es rápido y fácil de desplegar. La interfaz está impulsada por [Mithril](https://mithril.js.org), un marco de trabajo de JavaScript de alto rendimiento con una pequeña huella. - -* **Bonito y responsivo.** Este es el software de foros hecho para personas. Flarum está cuidadosamente diseñado para ser consistente e intuitivo en todas las plataformas, desde el principio. - -* **Potente y extensible.** Personalice, extienda e integre Flarum para adaptarlo a su comunidad. La arquitectura de Flarum es increíblemente flexible, con una [potente API de extensión](/extend/). - -* **Gratis y libre.** Flarum está liberado bajo la [licencia MIT](https://github.com/flarum/flarum/blob/master/LICENSE). - -You can read more about our [philosophy and values for Flarum here](https://discuss.flarum.org/d/28869-flarum-philosophy-and-values). - -## Help the Flarum Project - -Flarum is [free, open source](https://github.com/flarum/core) software, maintained and governed by volunteers. We rely on community contributions to help us improve and expand Flarum. - -🧑‍💻 If you're a developer, consider [contributing to Flarum's core or bundled extensions](contributing.md). This is **the** most efficient way to help Flarum, and your work can have a lot of impact: there are thousands of Flarum sites out there, with millions of total end users. - -🧩 If there's a feature you're missing, or a theme idea you have, [writing a custom extension](extend/README.md) will make Flarum that much better for you and others. - -Esta guía de usuario te ayudará a crear tu propio foro usando Flarum y te enseñará los fundamentos básicos de la gestión de tu comunidad. - -🌐 If you speak multiple languages, you could [contribute translations](extend/language-packs.md) to could help make Flarum accessible to countless users around the world. - -💸 The Flarum Foundation doesn't make money off of Flarum, but does have bills to pay. Donations via [GitHub Sponsors](https://github.com/sponsors/flarum) or [OpenCollective](https://opencollective.com/flarum) are always gratefully received. In the past, we've also been able to support some of our core developers financially, so they could work on Flarum part time. This wouldn't be possible without your financial support. - -🧑‍🤝‍🧑 Join [our community](https://discuss.flarum.org) to talk about Flarum development, get help with your instance, or just meet cool people! If you're experienced with Flarum, you can also help out beginners! - -🐛 If there's a bug that's bothering you, or a feature idea on your mind, we can't know about it unless you tell us! We track bugs, suggestions, and future development plans [via GitHub issues](https://github.com/flarum/core/issues). If there's already an issue open, adding likes and (constructive) additional information can be very helpful! - -📣 And if you like Flarum, please consider blogging/tweeting/talking about it! More people aware of Flarum leads to more people engaging with Flarum, and therefore more activity, better extensions, and faster development. - -Flarum wouldn't be possible without our phenomenal community. If you're interested in contributing, see our [developer contribution](contributing.md) and [other contribution](contributing-docs-translations.md) docs for more information. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/admin.md b/i18n/es/docusaurus-plugin-content-docs/current/admin.md deleted file mode 100644 index e2f0bc93c..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/admin.md +++ /dev/null @@ -1,13 +0,0 @@ -# Panel de Administración - -El Panel de Administración de Flarum es una interfaz fácil de usar para administrar su foro. Solo está disponible para los usuarios del [grupo] "Admin" (permissions.md). Para acceder al panel de administración, haz clic en tu **Nombre** en la parte superior derecha de la pantalla, y selecciona **Administración**. - -The Admin Dashboard has the following sections, being: -- **Dashboard** - Shows the main Admin Dashboard, containing statistics and other relevant information. -- **Basics** - Shows the options to set basic forum details such as Name, Description, and Welcome Banner. -- **Email** - Allows you to configure your E-Mail settings. Refer [here](https://docs.flarum.org/mail) for more information. -- **Permissions** - Shows the permissions for each user group, and allows you to configure global and specific scopes. -- **Appearance** - Allows you to customize the forum's colors, branding and add additional CSS for customization. -- **Users** - Provides you with a paginated list of all the users in the forum, and grants you the ability to edit the user or take administrative actions. - -Apart from the above mentioned sections, the Admin Dashboard also allows you to manage your Extensions (including the flarum core extensions such as Tags) under the _Features_ section. Extensions which modify the forum theme, or allow you to use multiple languages are categorized under the _Themes_ and _Languages_ section respectively. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/bugs.md b/i18n/es/docusaurus-plugin-content-docs/current/bugs.md deleted file mode 100644 index 85e8ea193..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/bugs.md +++ /dev/null @@ -1,28 +0,0 @@ -# Reporting Bugs - -:::danger Security Vulnerabilities - -If you discover a security vulnerability within Flarum, please follow our [security policy](https://github.com/flarum/core/security/policy) so we can address it promptly. - -::: - -Thank you for helping us test Flarum. We're happy to have you on the team! We need people who can *troubleshoot issues patiently* and *communicate them clearly*. As you probably know, good bug reporting takes some time and effort. If you're fine with that, then let's get started! - -## Duplicates - -Found a bug already? Wonderful! We'd love to hear about it — but first you should check around to make sure you're not wasting your time on a known issue: - -- Search our [Support forum](https://discuss.flarum.org/t/support) to see if it's already been reported. -- We could be working on a fix, so search our [issue tracker](https://github.com/flarum/core/issues) too. - -If you've searched *thoroughly* and come up empty-handed, we'll welcome your report. If it's just a simple issue (a misspelled word or graphics glitch, for example) skip to the next paragraph. But if you're seeing errors, or something is clearly broken, we'll need you to gather some information first. Please head over to our [Troubleshooting](troubleshoot.md) guide and follow the instructions there. Collect as much info as you can! - -## Reporting - -We track issues on GitHub. Make sure you open your issue in the [correct repository](https://github.com/flarum), and fill out all of the information in the Bug Report template. - -If you can, check if the issue is reproducible with the latest version of Flarum. If you are using a pre-release or development version, please indicate the specific version you are using. - -Remember: the goal of a bug report is to make it easy for us to replicate the bug and fix it. You might want to read [this article](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) for some useful tips on how to write an effective bug report. It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Issues with no clear reproduction steps will not be triaged. If an issue labeled "needs verification" receives no further input from the issue author for more than 5 days, it will be closed. - -Once you've posted your report, we'd ask that you please *follow the discussion* and wait patiently. We may need to ask for further details or clarification; but we've always got plenty to do, and it could be a while before we can give your report the time it deserves. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/code-of-conduct.md b/i18n/es/docusaurus-plugin-content-docs/current/code-of-conduct.md deleted file mode 100644 index 72e6c104a..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/code-of-conduct.md +++ /dev/null @@ -1,51 +0,0 @@ -# Código de conducta - -### _¡Bienvenido a la Comunidad de Flarum!_ - -... And thanks for joining us! We're excited about Flarum, and are always happy to meet people who feel the same way. Queremos que *todos* aprovechen al máximo Flarum y la comunidad de Flarum, por lo que te pedimos que leas y sigas estas directrices. Estas se aplican ya sea que estés usando nuestro foro, el chat de Discord, comunicándote en GitHub, o cualquier otra forma de comunicación sin la comunidad de Flarum. - -### Por encima de todo, ¡mantén la calma! - -Todos estamos aquí para hablar de Flarum, y para trabajar juntos para hacer una aplicación aún mejor. Criticar ideas (mediante argumentos razonados, por supuesto) es una parte importante de eso. Pero no nos dejemos llevar por los ataques personales, porque la negatividad sólo estorba. Te pedimos que evites lo siguiente: - -- Lenguaje ofensivo o abusivo, así como cualquier tipo de discurso de odio -- Mensajes que pretendan acosar, suplantar o difamar a otros -- Eliminación innecesaria de contenidos publicados -- Intentos de abusar o exponer la información privada de otros -- Contenido obsceno o sexualmente explícito -- Spam, suplantación de identidad y cualquier otra acción que pretenda desprestigiar este sitio -- Discusión de la piratería de software y temas similares - -*Todo lo anterior es motivo de acción por parte de los moderadores.* Si tienes un problema con otro miembro, te pedimos que no te enfrentes a él. Si es en el foro, utiliza el comando *Informar* en el mensaje en cuestión, y luego deja que el personal se encargue de la situación. Otherwise, report the violation using our [contact page](https://flarum.org/foundation/contact), option Legal. - -Nuestros moderadores pueden editar o borrar cualquier contenido que sea ofensivo o que interrumpa el flujo de comunicación. Las infracciones graves o repetidas pueden llevar a la suspensión de la cuenta del usuario infractor. Así que, ya sabes, *sé guay*. 😎 - -### Hazte Oír - -¿Quieres iniciar una nueva discusión? Primero, asegúrate de leer [nuestro FAQ](faq.md) y sigue los enlaces para asegurarte de que estás completamente informado sobre el proyecto. A continuación, dedícate a navegar por el foro, familiarízate con [el sistema de etiquetas](https://discuss.flarum.org/tags) y haz algunas búsquedas de palabras clave relacionadas con tu tema: *¡podría ser que alguien ya haya iniciado una discusión al respecto!* - -Cuando estés seguro de que estás preparado para iniciar una discusión, ten en cuenta los siguientes puntos: - -- ¡Dale un buen título! Obtendrás mejores resultados si tu título deja claro de qué quieres hablar. -- Elige la(s) etiqueta(s) adecuada(s). Esto aumentará la probabilidad de que tu mensaje sea leído y respondido rápidamente. -- *No* publiques repetidamente sobre el mismo tema, ya que esto tiende a tener el efecto contrario. -- If not using a tag set aside for multilingual use, *post in English only.* We can't help you if we don't understand your posts. -- Recuerda que no es necesario que firmes tus mensajes. Tenemos tu perfil para saber quién eres. - -Por favor, haz el esfuerzo de ayudarnos a mantener las cosas organizadas. El tiempo que pasamos ordenando es tiempo que no podemos dedicar a conocerte, a discutir tus asuntos y a hablar de Flarum. Y eso, al fin y al cabo, es lo que hemos venido a hacer. - -### Haz que tu respuesta cuente - -Te tomas el tiempo de participar en una discusión, con la esperanza de que los demás lean tus ideas y las tengan en cuenta. Así que, ¿por qué no hacer un esfuerzo para que tu respuesta merezca la pena? - -- No respondas a un título. Tómate un tiempo para *leer* el texto y, al menos, *escanear* el resto de la conversación. -- Pregúntate si tu respuesta aporta algo a la discusión. Si no lo hace, piénsalo mejor antes de publicar. -- Evita hacer posts de una sola palabra sólo para estar de acuerdo con alguien; para eso puedes usar el botón "Me gusta". -- Evita hacer varios mensajes seguidos cuando uno sería suficiente. Esto es un foro, no una sala de chat. -- Si tu respuesta puede desviar el curso de la discusión, considera la posibilidad de iniciar una nueva discusión. -- Si sólo quieres publicar una tontería como prueba, hazlo en la etiqueta [Test Posting](https://discuss.flarum.org/t/sandbox). -- Asegúrate de que tus respuestas aportan comentarios constructivos y apoyo para permitir una comunidad inclusiva. - -Nadie se va a quejar por una broma o un comentario inteligente ocasional. Nos gusta que el ambiente sea distendido. Pero para que las cosas sigan siendo productivas, te pedimos que trates de evitar el descarrilamiento de la discusión. - -> Gracias a Dominion por su ayuda en la elaboración de estas directrices. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/composer.md b/i18n/es/docusaurus-plugin-content-docs/current/composer.md deleted file mode 100644 index c2d38a451..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/composer.md +++ /dev/null @@ -1,152 +0,0 @@ - -# Composer - -Flarum uses a program called [Composer](https://getcomposer.org) to manage its dependencies and extensions. You'll need to use composer if you want to: - -- Install or update Flarum through the command line -- Install, update, or remove Flarum extensions through the command line - -This guide is provided as a brief explanation of Composer. We highly recommend consulting the [official documentation](https://getcomposer.org/doc/00-intro.md) for more information. - -:::tip ¿Prueba rápida? - -On shared hosting it is recommended to use the Extension Manager extension instead of Composer. It is a graphical interface for Composer that allows you to install, update and remove extensions without the need for SSH access. You can directly install Flarum using an archive file, without the need for Composer. With the extension manager pre-installed, check the [installation guide](install.md#installing-by-unpacking-an-archive) for more information. - -::: - -## What is Composer? - -> Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. — [Composer Introduction](https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) - -Each Flarum installation consists primarily of Flarum core and a set of [extensions](extensions.md). Each of these has its own dependencies and releases. - -Back in the day, forum frameworks would manage extensions by having users upload zip files with the extension code. That seems simple enough, but issues quickly become evident: - -- Uploading random zip files from the internet tends to be a bad idea. Requiring that extensions be downloaded from a central source like [Packagist](https://packagist.org/) makes it somewhat more tedious to spam malicious code, and ensures that source code is available on GitHub for free/public extensions. -- Let's say Extension A requires v4 of some library, and Extension B requires v5 of that same library. With a zip-based solution, either one of the two dependencies could override the other, causing all sorts of inconsistent problems. Or both would attempt to run at once, which would cause PHP to crash (you can't declare the same class twice). -- Zip files can cause a lot of headache if trying to automate deployments, run automated tests, or scale to multiple server nodes. -- There is no good way to ensure conflicting extension versions can't be installed, or that system PHP version and extension requirements are met. -- Sure, we can upgrade extensions by replacing the zip file. But what about upgrading Flarum core? And how can we ensure that extensions can declare which versions of core they're compatible with? - -Composer takes care of all these issues, and more! - -## Flarum and Composer - -When you go to [install Flarum](install.md#installing), you're actually doing 2 things: - -1. Downloading a boilerplate "skeleton" for Flarum. This includes an `index.php` file that handles web requests, a `flarum` file that provides a CLI, and a bunch of web server config and folder setup. This is taken from the [`flarum/flarum` github repository](https://github.com/flarum/flarum), and doesn't actually contain any of the code necessary for Flarum to run. -2. Installing `composer` packages necessary for Flarum, namely Flarum core, and several bundled extensions. These are called by the `index.php` and `flarum` files from step 1, and are the implementation of Flarum. These are specified in a `composer.json` file included in the skeleton. - -When you want to update Flarum or add/update/remove extensions, you'll do so by running `composer` commands. Each command is different, but all commands follow the same general process: - -1. Update the `composer.json` file to add/remove/update the package. -2. Do a bunch of math to get the latest compatible versions of everything if possible, or figure out why the requested arrangement is impossible. -3. If everything works, download new versions of everything that needs to be updated. If not, revert the `composer.json` changes - -When running `composer.json` commands, make sure to pay attention to the output. If there's an error, it'll probably tell you if it's because of extension incompatibilities, an unsupported PHP version, missing PHP extensions, or something else. - -### The `composer.json` File - -As mentioned above, the entire composer configuration for your Flarum site is contained inside the `composer.json` file. You can consult the [composer documentation](https://getcomposer.org/doc/04-schema.md) for a specific schema, but for now, let's go over an annotated `composer.json` from `flarum/flarum`: - -```json -{ - // This following section is mostly just metadata about the package. - // For forum admins, this doesn't really matter. - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // End of metadata - - // This next section is the one we care about the most. - // It's a list of packages we want, and the versions for each. - // We'll discuss this shortly. - "require": { - "flarum/core": "^1.0", - "flarum/approval": "*", - "flarum/bbcode": "*", - "flarum/emoji": "*", - "flarum/lang-english": "*", - "flarum/flags": "*", - "flarum/likes": "*", - "flarum/lock": "*", - "flarum/markdown": "*", - "flarum/mentions": "*", - "flarum/nicknames": "*", - "flarum/pusher": "*", - "flarum/statistics": "*", - "flarum/sticky": "*", - "flarum/subscriptions": "*", - "flarum/suspend": "*", - "flarum/tags": "*" - }, - - // Various composer config. The ones here are sensible defaults. - // See https://getcomposer.org/doc/06-config.md for a list of options. - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // If composer can find a stable (not dev, alpha, or beta) version - // of a package, it should use that. Generally speaking, production - // sites shouldn't run beta software unless you know what you're doing. - "prefer-stable": true -} -``` - -Let's focus on that `require` section. Each entry is the name of a composer package, and a version string. To read more about version strings, see the relevant [composer documentation](https://semver.org/). - -For Flarum projects, there's several types of entries you'll see in the `require` section of your root install's `flarum/core`: - -- You MUST have a `flarum/core` entry. This should have an explicit version string corresponding to the major release you want to install. For Flarum 1.x versions, this would be `^1.0`. -- You should have an entry for each extension you've installed. Some bundled extensions are included by default (e.g. `flarum/tags`, `flarum/suspend`, etc), [others you'll add via composer commands](extensions.md). Unless you have a reason to do otherwise (e.g. you're testing a beta version of a package), we recommend using an asterisk as the version string for extensions (`*`). This means "install the latest version compatible with my flarum/core". -- Some extensions / features might require PHP packages that aren't Flarum extensions. For example, you need the guzzle library to use the [Mailgun mail driver](mail.md). In these cases, the instructions for the extension/feature in question should explain which version string to use. - -## How to install Composer? - -As with any other software, Composer must first be [installed](https://getcomposer.org/download/) on the server where Flarum is running. There are several options depending on the type of web hosting you have. - -### Dedicated Web Server - -In this case you can install composer as recommended in the Composer [guide](https://getcomposer.org/doc/00-intro.md#system-requirements) - -### Managed / Shared hosting - -If Composer is not preinstalled (you can check this by running `composer --version`), you can use a [manual installation](https://getcomposer.org/composer-stable.phar). Just upload the composer.phar to your folder and run `/path/to/your/php7 composer.phar COMMAND` for any command documented as `composer COMMAND`. - -:::danger - -Some articles on the internet will mention that you can use tools like a PHP shell. If you are not sure what you are doing or what they are talking about - be careful! An unprotected web shell is **extremely** dangerous. - -::: - -## How do I use Composer? - -You'll need to use Composer over the **C**ommand-**l**ine **i**nterface (CLI). Be sure you can access your server over **S**ecure **Sh**ell (SSH). - -Once you have Composer installed, you should be able to run Composer commands in your SSH terminal via `composer COMMAND`. - -:::info Optimizations - -After most commands, you'll want to run `composer dump-autoload -a`. Essentially, this caches PHP files so they run faster. - -::: diff --git a/i18n/es/docusaurus-plugin-content-docs/current/config.md b/i18n/es/docusaurus-plugin-content-docs/current/config.md deleted file mode 100644 index cc32a6aca..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/config.md +++ /dev/null @@ -1,35 +0,0 @@ -# Archivo de configuración - -Sólo hay un lugar donde la configuración de Flarum no puede ser modificada a través del panel de administración de Flarum (excluyendo la base de datos), y es el archivo `config.php` ubicado en la raíz de su instalación de Flarum. - -Este archivo, aunque pequeño, contiene detalles que son cruciales para que su instalación de Flarum funcione. - -Si el archivo existe, le dice a Flarum que ya ha sido instalado. También proporciona a Flarum información de la base de datos y más. - -Aquí hay un rápido resumen de lo que significa todo con un archivo de ejemplo: - -```php - false, // activa o desactiva el modo de depuración, utilizado para solucionar problemas - 'offline' => false, // enables or disables site maintenance mode. This makes your site inaccessible to all users (including admins). - 'database' => - array ( - 'driver' => 'mysql', // el controlador de la base de datos, es decir, MySQL, MariaDB... - 'host' => 'localhost', // el host de la conexión, localhost en la mayoría de los casos, a menos que se utilice un servicio externo - 'database' => 'flarum', // el nombre de la base de datos en la instancia - 'username' => 'root', // nombre de usuario de la base de datos - 'password' => '', // contraseña de la base de datos - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', // el prefijo de las tablas, útil si se comparte la misma base de datos con otro servicio - 'port' => '3306', // el puerto de la conexión, por defecto 3306 con MySQL - 'strict' => false, - ), - 'url' => 'https://flarum.localhost', // la configuración de la URL, deberá cambiarla si cambia de dominio - 'paths' => - array ( - 'api' => 'api', // /api va a la API - 'admin' => 'admin', // /admin va a la administración - ), -); -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/console.md b/i18n/es/docusaurus-plugin-content-docs/current/console.md deleted file mode 100644 index d5efd357a..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# Consola - -Además del panel de administración, Flarum proporciona varios comandos de consola para ayudar a gestionar su foro a través de la terminal. - -Using the console: - -1. `ssh` en el servidor donde está alojada su instalación de flarum -2. `cd` to the folder that contains the file `flarum` -3. Ejecute el comando mediante `php flarum [comando]` - -## Comandos por defecto - -### list - -Lista todos los comandos de gestión disponibles, así como las instrucciones para utilizar los comandos de gestión - -### help - -`php flarum help [command_name]` - -Muestra la ayuda de un comando determinado. - -También puede mostrar la ayuda en otros formatos utilizando la opción --format: - -`php flarum help --format=xml list` - -Para mostrar la lista de comandos disponibles, utilice el comando list. - -### info - -`php flarum info` - -Get information about Flarum's core and installed extensions. Esto es muy útil para la depuración de problemas, y debe ser compartido cuando se solicita apoyo. - -### cache:clear - -`php flarum cache:clear` - -Borra la caché del backend de Flarum, incluyendo los js/css generados, la caché del formateador de texto y las traducciones en caché. Esto debe ser ejecutado después de instalar o eliminar extensiones, y ejecutar esto debe ser el primer paso cuando se producen problemas. - -### assets:publish - -`php flarum assets:publish` - -Publish assets from core and extensions (e.g. compiled JS/CSS, bootstrap icons, logos, etc). This is useful if your assets have become corrupted, or if you have switched [filesystem drivers](extend/filesystem.md) for the `flarum-assets` disk. - -### migrate - -`php flarum migrate` - -Ejecuta todas las migraciones pendientes. Debe utilizarse cuando se añade o actualiza una extensión que modifica la base de datos. - -### migrate:reset - -`php flarum migrate:reset --extension [extension_id]` - -Restablece todas las migraciones de una extensión. Esto es utilizado principalmente por los desarrolladores de extensiones, pero en ocasiones, puede ser necesario ejecutar este comando si se está eliminando una extensión, y desea borrar todos sus datos de la base de datos. Tenga en cuenta que la extensión en cuestión debe estar instalada (pero no necesariamente activada) para que esto funcione. - -### schedule:run - -`php flarum schedule:run` - -Many extensions use scheduled jobs to run tasks on a regular interval. This could include database cleanups, posting scheduled drafts, generating sitemaps, etc. If any of your extensions use scheduled jobs, you should add a [cron job](https://ostechnix.com/a-beginners-guide-to-cron-jobs/) to run this command on a regular interval: - -``` -* * * * * cd /path-to-your-flarum-install && php flarum schedule:run >> /dev/null 2>&1 -``` - -This command should generally not be run manually. - -Note that some hosts do not allow you to edit cron configuration directly. In this case, you should consult your host for more information on how to schedule cron jobs. - -### schedule:list - -`php flarum schedule:list` - -This command returns a list of scheduled commands (see `schedule:run` for more information). This is useful for confirming that commands provided by your extensions are registered properly. This **can not** check that cron jobs have been scheduled successfully, or are being run. \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/contributing-docs-translations.md b/i18n/es/docusaurus-plugin-content-docs/current/contributing-docs-translations.md deleted file mode 100644 index 7b17fc28e..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/contributing-docs-translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# Docs and Translation - -## Add Documentation - -Adding documentation can help countless future Flarum users. A few ideas of what to work on: - -- User guides to help Flarum end users with some advanced Flarum features. -- More [frequently asked questions](faq.md). -- Expanded [troubleshooting](troubleshoot.md) steps. -- Step-by-step tutorials for Flarum development or installation. -- [Technical reference guides](extend/README.md) for extension developers. -- Improving literally anything else you think we should elaborate on or explain better. - -A good way to find topics to write about is to look for common questions in the [support tag](https://discuss.flarum.org/t/support) of our community. - -## Translate Flarum - -We want Flarum to be accessible to everyone, regardless of language! By contributing translations, you make it possible for many more people to enjoy Flarum. Best of all, we use user-friendly GUIs for translations, so no technical skills are necessary to help! - -Translations for Flarum core, bundled extensions, and community extensions are managed through [Weblate](https://weblate.rob006.net/projects/flarum/). - -Translations for this documentation are managed through [Crowdin](https://crowdin.com/project/flarum-docs). - -The Flarum Foundation has created the "flarum-lang" organization to support translators and ensure continuous availability of language packs. You can learn more about this by [visiting the GitHub repository](https://github.com/flarum-lang/about). - -If you want to support an existing language pack, start a new translation, or you run into issues using weblate or crowdin, it's best to [get in touch with the `flarum-lang` team](https://discuss.flarum.org/d/27519-the-flarum-language-project). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/contributing.md b/i18n/es/docusaurus-plugin-content-docs/current/contributing.md deleted file mode 100644 index abf602d77..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/contributing.md +++ /dev/null @@ -1,170 +0,0 @@ -# Contribuir - -¿Estás interesado en contribuir al desarrollo de Flarum? That's great! ¡Genial! Desde [abrir un informe de error](bugs.md) hasta crear un pull request: toda contribución es apreciada y bienvenida. Flarum wouldn't be possible without our community contributions. - -Antes de contribuir, por favor lee el [código de conducta](code-of-conduct.md). - -Este documento es una guía para los desarrolladores que quieren contribuir con código a Flarum. Si estás empezando, te recomendamos que leas la documentación de [Cómo Empezar](/extend/start.md) en los documentos de Extensión para entender un poco más cómo funciona Flarum. - -## En qué trabajar - -⚡ **Have Real Impact.** There are thousands of Flarum instances, with millions of aggregate end users. By contributing to Flarum, your code will have a positive impact on all of them. - -🔮 **Shape the Future of Flarum.** We have a long backlog, and limited time. If you're willing to champion a feature or change, it's much more likely to happen, and you'll be able to enact your vision for it. Plus, our roadmap and milestones are set by our [core development team](https://flarum.org/team), and all of us started as contributors. The best road to influence is contributing. - -🧑‍💻 **Become a Better Engineer.** Our codebase is modern, and we heavily value good engineering and clean code. There's also a lot of interesting, challenging problems to solve regarding design, infrastructure, performance, and extensibility. Especially if you're a student or early in your career, working on Flarum is a great opportunity to build development skills. - -🎠 **It's Fun!** We really enjoy working on Flarum: there's a lot of interesting challenges and fun features to build. We also have an active community on [our forums](https://discuss.flarum.org) and [Discord server](https://flarum.org/chat). - -## Configuración de desarrollo - -Consulta nuestros próximos [Hitos](https://github.com/flarum/core/milestones) para tener una visión general de lo que hay que hacer. Consulta la etiqueta [Good first issue](https://github.com/flarum/core/labels/Good%20first%20issue) para ver una lista de temas que deberían ser relativamente fáciles de empezar. If there's anything you're unsure of, don't hesitate to ask! All of us were just starting out once. - -Si estás planeando seguir adelante y trabajar en algo, por favor comenta en el tema correspondiente o primero crea uno nuevo. De esta manera podemos asegurarnos de que tu precioso trabajo no sea en vano. - -Since Flarum is so extension-driven, we highly recommend [our extension docs](extend/README.md) as a reference when working on core, as well as for bundled extensions. You should start with [the introduction](extend/README.md) for a better understanding of our extension philosophy. - -## Flujo de desarrollo - -### Setting Up a Local Codebase - -[flarum/flarum](https://github.com/flarum/flarum) is a "skeleton" application which uses Composer to download the core package and a bunch of extensions. Source code for Flarum core, extensions, and all packages used by the aforementioned is located in the Flarum monorepo [flarum/framework](https://github.com/flarum/framework). In order to contribute to these, you'll need to fork and clone the monorepo repository locally, and then add it to your dev environment as a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path): - -```bash -git clone https://github.com/flarum/flarum.git -cd flarum - -# Or, when you want to clone directly into the current directory -git clone https://github.com/flarum/flarum.git . -# Note, the directory must be empty - -# Set up a Composer path repository for Flarum monorepo packages -composer config repositories.0 path "PATH_TO_MONOREPO/*/*" -git clone https://github.com//framework.git PATH_TO_MONOREPO -``` - -Un flujo de trabajo de contribución típico es el siguiente: - -Finalmente, ejecute `composer install` para completar la instalación desde los repositorios de la ruta. - -Una vez que su instalación local esté configurada, asegúrese de que ha habilitado el modo `debug` en **config.php**, y establezca `display_errors` a `On` en su configuración php. Esto le permitirá ver los detalles de los errores tanto de Flarum como de PHP. Debug mode also forces a re-compilation of Flarum's asset files on each request, removing the need to call `php flarum cache:clear` after each change to the extension's JavaScript or CSS. - -El código del front-end de Flarum está escrito en ES6 y transpilado en JavaScript. During development you will need to recompile the JavaScript using [Node.js](https://nodejs.org/) and [`yarn`](https://yarnpkg.com/). **Please do not commit the resulting `dist` files when sending PRs**; this is automatically taken care of when changes are merged into the `main` branch. - -To contribute to the frontend, first install the JavaScript dependencies. The monorepo uses [yarn workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) to easily install JS dependencies across all packages within. - -```bash -cd packages/framework -yarn install -``` - -Then you can watch JavaScript files for changes during development: - -```bash -cd framework/core/js -yarn dev -``` - -The process is the same for extensions. - -```bash -cd extensions/tags/js -yarn dev -``` - -### Development Tools - -After you've forked and cloned the repositories you'll be working on, you'll need to set up local hosting so you can test out your changes. Flarum doesn't currently come with a development server, so you'll need to set up Apache/NGINX/Caddy/etc to serve this local Flarum installation. - -Alternatively, you can use tools like, [Laravel Valet](https://laravel.com/docs/master/valet) (Mac), [XAMPP](https://www.apachefriends.org/index.html) (Windows), or [Docker-Flarum](https://github.com/mondediefr/docker-flarum) (Linux) to serve a local forum. - -Most Flarum contributors develop with [PHPStorm](https://www.jetbrains.com/phpstorm/download/) or [Visual Studio Code](https://code.visualstudio.com/). - -## Estilo de Codificación - -A typical contribution workflow looks like this: - -0. 🌳 Se bifurca el **Branch** apropiado en un nuevo branch de características. - * *Correcciones de Bugs* debe enviarse al ultimo branch estable. - * Características *menores* que son totalmente compatibles con la versión actual de Flarum pueden ser enviadas al ultimo branch estable. - -1. 🔨 **Escribe** algo de código. - * Ver abajo sobre el [Estilo de codificación](#coding-style). - * Características *mayores* deben enviarse siempre al branch `master`, que contiene la próxima versión de Flarum. - * *Major* features should always be sent to the `main` branch, which contains the upcoming Flarum release. - * Internamente utilizamos el scheme de nomenclatura `/` (eg. `tz/refactor-frontend`). - -2. 🚦 **Prueba** el código. - * Añade pruebas unitarias según sea necesario cuando arregles errores o añadas características. - -3. 💾 Haz el **commit** de su código con un mensaje descriptivo. - * Si su cambio resuelve un problema existente (por lo general, debería) incluir "Fixes #123" en una nueva línea, donde 123 es el número del issue. - * Escriba un [buen mensaje en el commit](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). - * See [here](extend/testing.md) for more information about testing in Flarum. - -4. 🎁 **Envia** un Pull Request en GitHub. - * Rellene la plantilla del pull request. - * Follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) specification. - * *Fix* commits should describe the issue fixed, not how it was fixed. - -5. 🤝 **Intercambio** con el equipo de Flarum para su aprobación. - * Fill out the pull request template. - * Cuando se aborda la retroalimentación, envíe commits adicionales en lugar de sobrescribir o aplastar (vamos a aplastar en la fusión). - * NO registre los archivos `dist` de JavaScript. Éstos se compilarán automáticamente en el merge. - -6. 🕺 **Baila** como si acabaras de contribuir a Flarum. - * Los miembros del equipo revisarán su código. Podemos sugerir algunos cambios o mejoras o alternativas, pero para los pequeños cambios su pull request debería ser aceptado rápidamente. - * When addressing feedback, push additional commits instead of overwriting or squashing (we will squash on merge). - -7. **Columnas** deben nombrarse según su tipo de datos: - -## Herramientas de Desarrollo - -In order to keep the Flarum codebase clean and consistent, we have a number of coding style guidelines that we follow. When in doubt, read the source code. - -Don't worry if your code styling isn't perfect! StyleCI and Prettier will automatically check formatting for every pull request. This allows us to focus on the content of the contribution, not the code style. - -### PHP - -Flarum follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard. On top of this, we conform to a number of [other style rules](https://github.com/flarum/framework/blob/main/.styleci.yml). We use PHP 7 type hinting and return type declarations where possible, and [PHPDoc](https://docs.phpdoc.org/) to provide inline documentation. Try and mimic the style used by the rest of the codebase in your contributions. - -* Los espacios de nombres deben ser singulares (p. ej. `Flarum-Discussion`, no `Flarum-Discussions`). -* Las interfaces deben llevar el sufijo `Interface` (p. ej. `MailableInterface`) -* Las clases abstractas deben llevar el prefijo `Abstract` (p. ej. `AbstractModel`) -* Los rasgos deben llevar el sufijo `Trait` (p. ej. `ScopeVisibilityTrait`) - -### JavaScript - -Flarum's JavaScript mostly follows the [Airbnb Style Guide](https://github.com/airbnb/javascript). We use [ESDoc](https://esdoc.org/manual/tags.html) to provide inline documentation. - -### Traducciones - -**Columns** should be named according to their data type: -* DATETIME o TIMESTAMP: `{verbed}_at` (ej. created_at, read_at) o `{verbed}_until` (ej. suspended_until) -* INT que es un recuento: `{noun}_count` (ej. comment_count, word_count) -* Clave foránea: `{verbed}_{entity}_id` (ej. hidden_user_id) - * Se puede omitir el término para la relación primaria (por ejemplo, el autor del post es sólo `user_id`) -* BOOL: `is_{adjective}` (ej. is_locked) - -**Tables** should be named as follows: -* Utilizar la forma plural (`discussions`) -* Separe las palabras múltiples con guiones bajos (`access_tokens`) -* Para las tablas de relaciones, unir los dos nombres de las tablas en singular con un guión bajo en orden alfabético (ej. `discussion_user`) - -### CSS - -Flarum's CSS classes roughly follow the [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) using the format `.ComponentName-descendentName--modifierName`. - -### Translations - -We use a [standard key format](/extend/i18n.md#appendix-a-standard-key-format) to name translation keys descriptively and consistently. - -## Acuerdo de Licencia para Colaboradores - -By contributing your code to Flarum you grant the Flarum Foundation (Stichting Flarum) a non-exclusive, irrevocable, worldwide, royalty-free, sublicensable, transferable license under all of Your relevant intellectual property rights (including copyright, patent, and any other rights), to use, copy, prepare derivative works of, distribute and publicly perform and display the Contributions on any licensing terms, including without limitation: (a) open source licenses like the MIT license; and (b) binary, proprietary, or commercial licenses. Except for the licenses granted herein, You reserve all right, title, and interest in and to the Contribution. - -You confirm that you are able to grant us these rights. You represent that You are legally entitled to grant the above license. If Your employer has rights to intellectual property that You create, You represent that You have received permission to make the Contributions on behalf of that employer, or that Your employer has waived such rights for the Contributions. - -You represent that the Contributions are Your original works of authorship, and to Your knowledge, no other person claims, or has the right to claim, any right in any invention or patent related to the Contributions. You also represent that You are not legally obligated, whether by entering into an agreement or otherwise, in any way that conflicts with the terms of this license. - -The Flarum Foundation acknowledges that, except as explicitly described in this Agreement, any Contribution which you provide is on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/current.json b/i18n/es/docusaurus-plugin-content-docs/current/current.json deleted file mode 100644 index 4e26ceae4..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/current.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.guideSidebar.category.Introduction": { - "message": "Introducción", - "description": "The label for category Introduction in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Setting Up": { - "message": "Configuración", - "description": "The label for category Setting Up in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Management": { - "message": "Gestión", - "description": "The label for category Management in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Advanced": { - "message": "Advanced", - "description": "The label for category Advanced in sidebar guideSidebar" - }, - "sidebar.extendSidebar.category.Main Concepts": { - "message": "Conceptos Principales", - "description": "The label for category Main Concepts in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Reference Guides": { - "message": "Guías de Referencia", - "description": "The label for category Reference Guides in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Advanced Guides": { - "message": "Guías Avanzadas", - "description": "The label for category Advanced Guides in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Update Guides": { - "message": "Update Guides", - "description": "The label for category Update Guides in sidebar extendSidebar" - }, - "sidebar.internalSidebar.category.Internal Docs": { - "message": "Internal Docs", - "description": "The label for category Internal Docs in sidebar internalSidebar" - } -} \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/README.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/README.md deleted file mode 100644 index b5361960b..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/README.md +++ /dev/null @@ -1,40 +0,0 @@ -- - - -slug: /extend -- - - - -# Extensión de Flarum - -Flarum es minimalista, pero también es altamente extensible. De hecho, ¡la mayoría de las características que vienen con Flarum son en realidad extensiones! - -Este enfoque hace que Flarum sea extremadamente personalizable. Un usuario puede desactivar cualquier característica que no utilice en su foro, e instalar otras extensiones para hacer un foro perfecto para su comunidad. - -Para lograr esta extensibilidad, Flarum ha sido construido con ricas APIs y puntos de extensión. Con algunos conocimientos de programación, puedes aprovechar estas APIs para añadir casi cualquier característica que desees. Esta sección de la documentación pretende enseñarte cómo funciona Flarum, y cómo usar las APIs para que puedas construir tus propias extensiones. - -## Core vs. Extensiones - -¿Dónde trazamos la línea entre el core de Flarum y sus extensiones? ¿Por qué algunas características se incluyen en el core y otras no? Es importante entender esta distinción para que podamos mantener la consistencia y la calidad dentro del ecosistema de Flarum. - -**El core de Flarum** no pretende estar lleno de características. Más bien, es un andamio, o un marco, que proporciona una base fiable sobre la que se pueden construir extensiones. Contiene sólo las funcionalidades básicas, no opinables, que son esenciales para un foro: discusiones, mensajes, usuarios, grupos y notificaciones. - -**Las extensiones incluidas** son características que vienen empaquetadas con Flarum y están activadas por defecto. Son extensiones como cualquier otra, y pueden ser desactivadas y desinstaladas. Si bien su alcance no pretende abordar todos los casos de uso, la idea es hacerlas lo suficientemente genéricas y configurables para que puedan satisfacer a la mayoría. - -**Las extensiones de terceros** son características creadas por otros y no están oficialmente soportadas por el equipo de Flarum. Pueden ser construidas y usadas para abordar casos de uso más específicos. - -Si quieres solucionar un error o una deficiencia del núcleo, o de una extensión ya existente, puede ser apropiado *contribuir al proyecto respectivo* en lugar de dispersar el esfuerzo en una nueva extensión de terceros. Es una buena idea comenzar una discusión en la [Comunidad Flarum](https://discuss.flarum.org/) para obtener la perspectiva de los desarrolladores de Flarum. - -## Recursos útiles - -- [Esta documentación](start.md) -- [Consejos para desarrolladores principiantes](https://discuss.flarum.org/d/5512-extension-development-tips) -- [Desarrolladores explicando su flujo de trabajo para el desarrollo de extensiones](https://github.com/flarum/cli) -- [Consejos sobre el espacio de nombres de las extensiones](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) -- [Documentación de Mithril js](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) -- [Documentación de la API de Laravel](https://mithril.js.org/) -- [Documentación de la API de Flarum](https://laravel.com/api/8.x/) -- [Flarum API Docs](https://api.flarum.org) -- [ES6 cheatsheet](https://github.com/DrkSephy/es6-cheatsheet) - -### Obtener ayuda - -- [Comunidad oficial de desarrollo de Flarum](https://discuss.flarum.org/t/dev) -- [Únase a nosotros en #extend en nuestro chat de Discord](https://flarum.org/discord/) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/admin.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/admin.md deleted file mode 100644 index cad6292c7..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/admin.md +++ /dev/null @@ -1,217 +0,0 @@ -# Panel de Administración - -La Beta 15 ha introducido un panel de administración y una API frontend completamente rediseñada. Ahora es más fácil que nunca añadir ajustes o permisos a tu extensión. - -Antes de la Beta 15, los ajustes de las extensiones se añadían en un `SettingsModal` o se añadía una nueva página para ajustes más complejos. Ahora, cada extensión tiene una página que contiene información, ajustes y los propios permisos de la extensión. - -Puedes simplemente registrar los ajustes, extender la base [`ExtensionPage`] (https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage), o proporcionar tu propia página completamente personalizada. - -## API de datos de la extensión - -Esta nueva API le permite añadir ajustes a su extensión con muy pocas líneas de código. - -### Cómo informar a la API sobre su extensión - -Antes de que puedas registrar nada, tienes que decirle a `ExtensionData` de qué extensión va a obtener datos. - -Simplemente ejecute la función `for` en `app.extensionData` pasando el id de su extensión. Para encontrar el id de tu extensión, toma el nombre del compositor y sustituye las barras por guiones (ejemplo: 'fof/merge-discussions' se convierte en 'fof-merge-discussions'). Extensions with the `flarum-` and `flarum-ext-` will omit those from the name (example: 'webbinaro/flarum-calendar' becomes 'webbinaro-calendar'). - -Para el siguiente ejemplo, utilizaremos la extensión ficticia 'acme/interstellar': - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') -}); -``` - -Una vez hecho esto, puedes empezar a añadir configuraciones y permisos. - -:::info Note - -Todas las funciones de registro en `ExtensionData` son encadenables, lo que significa que puedes llamarlas una tras otra sin tener que volver a ejecutar `for`. - -::: - -### Registro de ajustes - -Se recomienda añadir campos de configuración para los elementos simples. Como regla general, si sólo necesitas almacenar cosas en la tabla de ajustes, esto debería ser suficiente para ti. - -Para añadir un campo, llama a la función `registerSetting` después de `for` en `app.extensionData` y pasa un 'setting object' como primer argumento. Detrás de las escenas `ExtensionData` en realidad convierte su configuración en un [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), puede pasar un número de prioridad como el segundo argumento. - -Aquí hay un ejemplo con un elemento switch (booleano): - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // Esta es la clave con la que se guardarán los ajustes en la tabla de ajustes de la base de datos. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // La etiqueta que se mostrará para que el administrador sepa lo que hace el ajuste. - type: 'boolean', // Qué tipo de ajuste es, las opciones válidas son: booleano, texto (o cualquier otro tipo de etiqueta ), y seleccionar. - }, - 30 // Opcional: - Prioridad - ) -}); -``` - -Si se utiliza `type: 'select'` el objeto de ajuste tiene un aspecto un poco diferente: - -```js -{ - setting: 'acme-interstellar.fuel_type', - label: app.translator.trans('acme-interstellar.admin.fuel_type_label'), - type: 'select', - options: { - 'LOH': 'Liquid Fuel', // La clave en este objeto es lo que la configuración almacenará en la base de datos, el valor es la etiqueta que el administrador verá (recuerde usar traducciones si tienen sentido en su contexto). - 'RDX': 'Solid Fuel', - }, - default: 'LOH', -} -``` - -Also, note that additional items in the setting object will be used as component attrs. This can be used for placeholders, min/max restrictions, etc: - -```js -{ - setting: 'acme-interstellar.crew_count', - label: app.translator.trans('acme-interstellar.admin.crew_count_label'), - type: 'number', - min: 1, - max: 10 -} -``` - -Si quieres añadir algo a los ajustes como algún texto extra o una entrada más complicada, también puedes pasar una devolución de llamada como primer argumento que devuelva JSX. Este callback se ejecutará en el contexto de [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) y los valores de configuración no se serializarán automáticamente. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( -
-

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

- -
- ); - } - }) -}); -``` - -### Registro de Permisos - -Como novedad en la beta 15, los permisos pueden encontrarse ahora en dos lugares. Ahora, puedes ver los permisos individuales de cada extensión en su página. Todos los permisos se pueden seguir encontrando en la página de permisos. - -Para que esto ocurra, los permisos deben estar registrados en `ExtensionData`. Esto se hace de forma similar a la configuración, llamando a `registerPermission`. - -Volvemos a nuestra extensión favorita del rocket: - * Objeto de permiso - * Qué tipo de permiso - ver las funciones de [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) para los tipos (eliminar elementos del nombre) - * Prioridad de `ItemList` - -Recuerda que todas estas funciones se pueden encadenar como: - -```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Icono Font-Awesome - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Etiqueta de permiso - permission: 'discussion.rocket_fly', // Nombre real del permiso almacenado en la base de datos (y utilizado al comprobar el permiso). - tagScoped: true, // Si es posible aplicar este permiso en las etiquetas, no sólo globalmente. Se explica en el siguiente párrafo. - }, - 'start', // El permiso de la categoría se añadirá a la cuadrícula (grid) - 95 // Opcional: Prioridad - ); -}); -``` - -If your extension interacts with the [tags extension](https://github.com/flarum/tags) (which is fairly common), you might want a permission to be tag scopable (i.e. applied on the tag level, not just globally). You can do this by including a `tagScoped` attribute, as seen above. Permissions starting with `discussion.` will automatically be tag scoped unless `tagScoped: false` is indicated. - -Crea una nueva clase que extienda el componente `Page` o `ExtensionPage`: - -### Recordatorio de Encadenamiento - -Entonces, simplemente ejecute `registerPage`: - -```js -app.extensionData - .for('acme-interstellar') - .registerSetting(...) - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); -``` - -### Extending/Overriding de la Página por Defecto - -A veces tienes configuraciones más complicadas que se mezclan con las relaciones, o simplemente quieres que la página se vea completamente diferente. En este caso, necesitarás decirle a `ExtensionData` que quieres proporcionar tu propia página. Note that `buildSettingComponent`, the util used to register settings by providing a descriptive object, is available as a method on `ExtensionPage` (extending from `AdminPage`, which is a generic base for all admin pages with some util methods). - -¡Puedes extender la [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) o extender la `Page` base y diseñar la tuya propia! - -```js -import ExtensionPage from 'flarum/components/ExtensionPage'; - -export default class StarPage extends ExtensionPage { - content() { - return ( -

¡Hola desde la sección de ajustes!

- ) - } -} - -``` - -En la beta 15, las páginas de las extensiones tienen espacio para información extra que se extrae del composer.json de las extensiones. - -```js - -import StarPage from './components/StarPage'; - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); -}); -``` - -Para más información, consulte el esquema [composer.json](https://getcomposer.org/doc/04-schema.md). - -You can extend the [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) or extend the base `Page` and design your own! - -## Metadatos del Composer.json - -En la beta 15, las páginas de las extensiones tienen espacio para información extra que se extrae del composer.json de las extensiones. - -Para más información, consulte el esquema (schema) [composer.json](https://getcomposer.org/doc/04-schema.md). - -| Descripción | Dónde en composer.json | -| -------------------------------------- | --------------------------------------------------------------------- | -| Enlace de discusión discuss.flarum.org | Clave "forum" dentro de "support" | -| Documentación | Clave "docs" dentro de "support" | -| Soporte (correo electrónico) | Clave "email" dentro de "support" | -| Sitio web | Clave "homepage" | -| Donación | Bloque de claves "funding" (Nota: Sólo se utilizará el primer enlace) | -| Fuente | Clave "source" dentro de "support" | diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/api-throttling.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/api-throttling.md deleted file mode 100644 index 8d776b680..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/api-throttling.md +++ /dev/null @@ -1,62 +0,0 @@ -# Aceleración de la API - -Flarum viene con un `Flarum\Api\Middleware\ThrottleApi` [middleware](middleware.md) para acelerar las peticiones a la API. Esto se ejecuta en cada ruta de la API, y las extensiones pueden añadir su propia lógica personalizada para acelerar las solicitudes. - -:::caution Rutas del Foro - -Algunas rutas del foro (inicio de sesión, registro, olvido de contraseña, etc) funcionan llamando a una ruta de la API bajo la superficie. El middleware `ThrottleApi` no se ejecuta actualmente para estas peticiones, pero está previsto para el futuro. - -::: - -## Aceleradores personalizados - -El formato de un acelerador personalizado es extremadamente simple: todo lo que necesitas es un cierre o clase invocable que tome la petición actual como argumento, y devuelva una de las siguientes opciones - -- `false`: Esto evita explícitamente el aceleramiento para esta solicitud, anulando todos los demás aceleradores. -- `true`: Esto marca la solicitud como para ser acelerada. -- `null`: Esto significa que este acelerador no se aplica. Cualquier otra salida será ignorada, con el mismo efecto que `null`. - -Los aceleradores se ejecutarán en TODAS las peticiones, y son responsables de averiguar si se aplican o no. Por ejemplo, considere el acelerador de correos de Flarum: - -```php -use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; -``` - -Los aceleradores pueden ser añadidos o eliminados a través del middleware `ThrottleApi` en `extend.php`. Por ejemplo: - -```php -set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders -]; -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/api.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/api.md deleted file mode 100644 index 06d35f1cc..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/api.md +++ /dev/null @@ -1,353 +0,0 @@ -# API and Data Flow - -In the [previous article](models.md), we learned how Flarum uses models to interact with data. Here, we'll learn how to get that data from the database to the JSON-API to the frontend, and all the way back again. - -:::info - -To use the built-in REST API as part of an integration, see [Consuming the REST API](../rest-api.md). - -::: - -## Ciclo de vida de las solicitudes de la API - -Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical API request: - -![Flarum API Flowchart](/en/img/api_flowchart.png) - -1. Se envía una solicitud HTTP a la API de Flarum. Normalmente, esto vendrá del frontend de Flarum, pero los programas externos también pueden interactuar con la API. La API de Flarum sigue en su mayoría la especificación [JSON:API](https://jsonapi.org/), por lo que, en consecuencia, las solicitudes deben seguir [dicha especificación](https://jsonapi.org/format/#fetching). -2. La solicitud se ejecuta a través de [middleware](middleware.md), y se dirige al controlador adecuado. Puedes aprender más sobre los controladores en su conjunto en nuestra [documentación sobre rutas y contenido](routes.md). Asumiendo que la petición es a la API (que es el caso de esta sección), el controlador que maneja la petición será una subclase de `Flarum\Api\AbstractSerializeController`. -3. Cualquier modificación realizada por las extensiones del controlador a través del extensor [`ApiController`] (#extending-api-controllers) se aplica. Esto podría suponer el cambio de sort, añadir includes, cambiar el serializador, etc. -4. Se llama al método `$this->data()` del controlador, obteniendo algunos datos en bruto que deben ser devueltos al cliente. Típicamente, estos datos tomarán la forma de una colección o instancia del modelo de Laravel Eloquent, que ha sido recuperada de la base de datos. Dicho esto, los datos pueden ser cualquier cosa siempre que el serializador del controlador pueda procesarlos. Cada controlador es responsable de implementar su propio método `data`. Ten en cuenta que para las peticiones `PATCH`, `POST` y `DELETE`, `data` realizará la operación en cuestión, y devolverá la instancia del modelo modificado. -5. Esos datos se ejecutan a través de cualquier callback de preserialización que las extensiones registren a través del extensor [`ApiController`](#extending-api-controllers). -6. Los datos se pasan a través de un [serializador](#serializers), que los convierte del formato de base de datos del backend al formato JSON: API esperado por el frontend. También adjunta cualquier objeto relacionado, que se ejecuta a través de sus propios serializadores. Como explicaremos más adelante, las extensiones pueden [añadir / anular relaciones y atributos](#attributes-and-relationships) en el nivel de serialización. -7. Los datos serializados se devuelven como una respuesta JSON al frontend. -8. Si la solicitud se originó a través de la `Store` del frontend de Flarum, los datos devueltos (incluyendo cualquier objeto relacionado) serán almacenados como [modelos del frontend](#frontend-models) en el almacén del frontend. - -## API Endpoints - -We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. - -As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: - -- Listing instances of a model (possibly including searching/filtering) -- Getting a single model instance -- Creating a model instance -- Updating a model instance -- Deleting a single model instance - -We'll go over each type of controller shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -:::caution - -Paths to API endpoints are not arbitrary! To support interactions with frontend models: - -- The path should either be `/prefix/{id}` for get/update/delete, or `/prefix` for list/create. -- the prefix (`tags` in the example above) must correspond to the JSON:API model type. You'll also use this model type in your serializer's `$type` attribute, and when registering the frontend model (`app.store.models.TYPE = MODEL_CLASS`). -- The methods must match the example above. - -Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! - -::: - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your endpoint controllers: -```bash -$ flarum-cli make backend api-controller -``` - -::: - -### Listado de recursos - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -#### Paginación - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // The number of records included by default. - public $limit = 20; - - // The maximum number of records that can be requested. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. - -#### Clasificación - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // The default sort field and order to use. - public $sort = ['name' => 'asc']; - - // The fields that are available to be sorted by. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -use Illuminate\Support\Str; - -// ... - -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(Str::snake($field), $order); -} - -return $query->get(); -``` - -#### Search - -Read our [searching and filtering](search.md) guide for more information! - -### Mostrar un recurso - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creación de un recurso - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Actualización de un recurso - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Borrar un recurso - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### ncluir Relaciones - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Extensión de los controladores de la API - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -The `ApiController` extender can also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Serializadores - -Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your serializer: -```bash -$ flarum-cli make backend api-serializer -``` - -::: - -### Atributos y relaciones - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -### Extending Serializers - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -### Non-Model Serializers and `ForumSerializer` - -Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/assets.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/assets.md deleted file mode 100644 index 16b401fc3..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/assets.md +++ /dev/null @@ -1,7 +0,0 @@ -# Extension Assets - -Some extensions might want to include assets like images or JSON files in their source code (note that this is not the same as uploads, which would probably require a [filesystem disk](filesystem.md)). - -This is actually very easy to do. Just create an `assets` folder at the root of your extension, and place any asset files there. Flarum will then automatically copy those files to its own `assets` directory (or other storage location if [one is offered by extensions](filesystem.md)) every time the extension is enabled or [`php flarum assets:publish`](../console.md) is executed. - -If using the default storage driver, assets will be available at `https://FORUM_URL/assets/extensions/EXTENSION_ID/file.path`. However, since other extensions might use remote filesystems, we recommend serializing the url to assets you need in the backend. See [Flarum's serialization of the logo and favicon URLs](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Serializer/ForumSerializer.php#L85-L86) for an example. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/authorization.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/authorization.md deleted file mode 100644 index a8bf6f5ec..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/authorization.md +++ /dev/null @@ -1,235 +0,0 @@ -# Autorización - -Como todo framework, Flarum permite restringir ciertas acciones y contenidos a determinados usuarios. Hay dos sistemas paralelos para esto: - -- El proceso de autorización dicta si un usuario puede realizar una determinada acción. -- El alcance de la visibilidad puede aplicarse a una consulta de la base de datos para restringir eficazmente los registros a los que los usuarios pueden acceder. This is documented in our [model visibility](model-visibility.md) article. - -## Proceso de Autorización - -El proceso de autorización se utiliza para comprobar si una persona está autorizada a realizar ciertas acciones. Por ejemplo, queremos comprobar si un usuario está autorizado antes de que: - -- Acceda al panel de control del administrador -- Inicie un debate -- Edite un mensaje -- Actualice el perfil de otro usuario - -Cada uno de ellos está determinado por un criterio único: en algunos casos, un flag es suficiente; de lo contrario, podríamos necesitar una lógica personalizada. - -## Alcance de la visibilidad - -Las consultas de autorización se realizan con 3 parámetros, con la lógica contenida en [`Flarum\User\Gate`](https://api.docs.flarum.org/php/master/flarum/user/gate): - -1. El actor: el usuario que intenta realizar la acción -2. La habilidad: una cadena que representa la acción que el actor está intentando -3. Los argumentos: normalmente una instancia de un modelo de base de datos que es el objeto de la habilidad intentada, pero puede ser cualquier cosa. - -En primer lugar, pasamos la solicitud completa (los tres parámetros) por todas las [políticas](#policies) registradas por las extensiones y el núcleo. Las políticas son bloques de lógica proporcionados por el núcleo y las extensiones que determinan si el actor puede realizar la habilidad con los argumentos. Las políticas pueden devolver una de las siguientes cosas: - -- `Flarum\User\Access\AbstractPolicy::ALLOW` (via `$this->allow()`) -- `Flarum\User\Access\AbstractPolicy::DENY` (via `$this->deny()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (via `$this->forceAllow()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (via `$this->forceDeny()`) - -Los resultados de las políticas se consideran en la prioridad `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. Por ejemplo, si una sola política devuelve `FORCE_DENY`, todas las demás políticas serán ignoradas. Si una política devuelve `DENY` y 10 políticas devuelven `ALLOW`, la solicitud será denegada. Esto permite tomar decisiones independientemente del orden en el que se arranquen las extensiones. Tenga en cuenta que las políticas son extremadamente poderosas: si el acceso es denegado en la etapa de políticas, eso anulará los permisos de grupo e incluso los privilegios de administrador. - -En segundo lugar, si todas las políticas devuelven null (o no devuelven nada), comprobamos si el usuario está en un grupo que tiene un permiso igual a la habilidad (nótese que tanto los permisos como las habilidades se representan como cadenas). Si es así, autorizamos la acción. Consulta nuestra [documentación sobre grupos y permisos](permissions.md) para obtener más información sobre los permisos. - -Luego, si el usuario está en el grupo de administradores, autorizaremos la acción. - -Finalmente, como hemos agotado todas las comprobaciones, asumiremos que el usuario no está autorizado y denegaremos la solicitud. - -## Autorización en el Frontend - -El sistema de autorización de Flarum es accesible a través de los métodos públicos de la clase `Flarum\User\User`. Los más importantes se enumeran a continuación; otros están documentados en nuestra [documentación de la API de PHP](https://api.docs.flarum.org/php/master/flarum/user/user). - - -En este ejemplo, usaremos `$actor` como una instancia de `Flarum\User\User`, `'viewForum'` y `'reply'` como ejemplos de habilidades, y `$discussion` (instancia de `Flarum\Discussion\Discussion`) como argumento de ejemplo. - -```php -// Comprueba si un usuario puede realizar una acción. -// ADVERTENCIA: esto debe ser utilizado con precaución, ya que no -// ejecuta el proceso de autorización, por lo que no tiene en cuenta las políticas. -$canDoSomething = $actor->can('viewForum'); - -// Comprueba si un usuario puede realizar una acción sobre un tema. -// Sin embargo, es útil para implementar políticas personalizadas. -$canDoSomething = $actor->can('reply', $discussion); - -// Lanza una PermissionDeniedException si un usuario no puede realizar una acción. -$actpr->assertAdmin(); - -// Comprueba si uno de los grupos del usuario tiene un permiso. -$actor->assertCan('viewForum'); -$actor->assertCan('reply', $discussion); - -// Lanza una NotAuthenticatedException si el usuario no está conectado. -$actor->assertRegistered(); - -// Lanza una PermissionDeniedException si el usuario no es un administrador. -$actorHasPermission = $actor->hasPermission(`viewForum`); -``` - -## Políticas personalizadas - -Las políticas nos permiten utilizar una lógica personalizada más allá de los simples grupos y permisos cuando se evalúa la autorización de una habilidad con un sujeto. Por ejemplo: - -- Queremos permitir a los usuarios editar los mensajes aunque no sean moderadores, pero sólo sus propios mensajes. -- Dependiendo de la configuración, podríamos permitir a los usuarios renombrar sus propias discusiones indefinidamente, durante un corto período de tiempo después de la publicación, o no en absoluto. - -Como se describe [arriba](#how-it-works), en cualquier comprobación de autorización, consultamos todas las políticas registradas para el modelo del objetivo, o cualquier clase padre del modelo del objetivo. Si no se proporciona ningún objetivo, se aplicarán todas las políticas registradas como `global`. - -Entonces, ¿cómo se "comprueba" una política? - -En primer lugar, comprobamos si la clase política tiene un método con el mismo nombre que la habilidad que se está evaluando. Si es así, lo ejecutamos con el actor y el sujeto como parámetros. Si ese método devuelve un valor no nulo, devolvemos ese resultado. En caso contrario, continuamos con el siguiente paso (no necesariamente con la siguiente política). - -A continuación, comprobamos si la clase de política tiene un método llamado `can`. Si es así, lo ejecutamos con el actor, la habilidad y el sujeto, y devolvemos el resultado. - -Si `can` no existe o devuelve null, hemos terminado con esta política, y pasamos a la siguiente. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate policies: -```bash -is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); - } -} -``` - -::: - -### Cómo funciona - -Veamos algunos ejemplos de [Flarum Tags](https://github.com/flarum/tags/blob/master/src/Access/TagPolicy). - -```php -whereIn('discussions.id', function ($query) use ($actor, $ability) { - return $query->select('discussion_id') - ->from('discussion_tag') - ->whereIn('tag_id', Tag::getIdsWhereCan($actor, 'discussion.'.$ability)); - }); - } -} -``` - -También podemos tener políticas globales, que se ejecutan cuando `$user->can()` es llamado sin una instancia del modelo de destino. De nuevo desde Tags: - -```php -settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewForum', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } - } -} -``` - -### Cómo usar la autorización - -¿Qué ocurre cuando llamamos a `whereVisibleTo`? Esta llamada es manejada por el sistema de alcance de visibilidad del modelo general de Flarum, que ejecuta la consulta a través de una secuencia de llamadas de retorno, que se llaman "scopers". - -```php -use Flarum\Extend; -use Flarum\Tags\Tag; -use YourNamespace\Access; - -return [ - // Otros extensores - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), - // Otros extensores -]; -``` - -## Frontend Authorization - -Comúnmente, querrás usar los resultados de la autorización en la lógica del frontend. Por ejemplo, si un usuario no tiene permiso para ver usuarios de búsqueda, no deberíamos enviar solicitudes a ese punto final. Y si un usuario no tiene permiso para editar usuarios, no deberíamos mostrar elementos del menú para ello. - -Como no podemos hacer comprobaciones de autorización en el frontend, tenemos que realizarlas en el backend, y adjuntarlas a la serialización de los datos que estamos enviando. Los permisos globales (`viewForum`, `viewUserList`) pueden incluirse en el `ForumSerializer`, pero para la autorización específica de un objeto, podemos querer incluirlos con el objeto sujeto. Por ejemplo, cuando devolvemos listas de discusiones, comprobamos si el usuario puede responder, renombrar, editar y borrar, y almacenamos esos datos en el modelo de discusión del frontend. Entonces es accesible a través de `discussion.canReply()` o `discussion.canEdit()`, pero no hay nada mágico ahí: es sólo otro atributo enviado por el serializador. - -Hay dos tipos de scopers: diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/backend-events.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/backend-events.md deleted file mode 100644 index 90ea57107..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/backend-events.md +++ /dev/null @@ -1,215 +0,0 @@ -# Eventos del Backend - -A menudo, una extensión querrá reaccionar a algunos eventos que ocurren en otra parte de Flarum. Por ejemplo, podríamos querer incrementar un contador cuando se publica una nueva discusión, enviar un email de bienvenida cuando un usuario se conecta por primera vez, o añadir etiquetas a una discusión antes de guardarla en la base de datos. Estos eventos se conocen como **eventos de dominio**, y se transmiten a todo el framework a través del [sistema de eventos de Laravel](https://laravel.com/docs/6.x/events). - -Para obtener una lista completa de los eventos del backend, consulte nuestra [documentación de la API](https://api.docs.flarum.org/php/master/search.html?search=Event). Las clases de eventos del dominio están organizadas por espacio de nombres, normalmente `Flarum\TYPE\Event`. - - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate event listeners: -```bash -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // haz algo aquí - }) - ->listen(Deleted::class, PostDeletedListener::class) -]; - - -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Su lógica aquí - } -} -``` - -::: - -## Escuchar eventos - -Puedes adjuntar un oyente a un evento utilizando el [extensor] [`Event`](https://api.docs.flarum.org/php/master/flarum/extend/event)(start.md#extenders): - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Lógica - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // Más lógica - } -} -``` -```php -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -Como se muestra arriba, se puede utilizar una clase listener en lugar de un callback. Esto le permite [inyectar dependencias](https://laravel.com/docs/6.x/container) en su clase listener a través de los parámetros del constructor. En este ejemplo resolvemos una instancia de traductor, pero podemos inyectar cualquier cosa que queramos/necesitemos. - -You can also listen to multiple events at once via an event subscriber. This is useful for grouping common functionality; for instance, if you want to update some metadata on changes to posts: - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Flarum\Post\Event\Saving; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; -``` -```php -class PostEventSubscriber -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function subscribe($events) - { - $events->listen(Deleted::class, [$this, 'handleDeleted']); - $events->listen(Saving::class, [$this, 'handleSaving']); - } - - public function handleDeleted(Deleted $event) - { - // Your logic here - } - - public function handleSaving(Saving $event) - { - // Your logic here - } -} -``` - -## Dispatching de eventos - -Despachar eventos es muy sencillo. Todo lo que necesitas hacer es inyectar `Illuminate\Contracts\Events\Dispatcher` en tu clase, y luego llamar a su método `dispatch`. Por ejemplo: - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` - -## Eventos personalizados - -Como desarrollador de extensiones puedes definir tus propios eventos para permitirte a ti mismo (o a otras extensiones) reaccionar a eventos en tu extensión. Los eventos son generalmente instancias de clases simples (no es necesario extender nada). Cuando definas un nuevo evento, normalmente querrás usar propiedades públicas, y quizás algunos métodos para la comodidad de los usuarios. Por ejemplo, si echamos un vistazo a `Flarum\Post\Event\Deleted`, es sólo una envoltura de algunos datos: - -```php -post = $post; - $this->actor = $actor; - } -} -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/cli.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/cli.md deleted file mode 100644 index ab88b1142..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# Desarrolladores explicando su flujo de trabajo para el desarrollo de extensiones - -The Flarum development ecosystem is oriented around many small, modules, interacting extensions. This is a very powerful and flexible paradigm, but it also brings the maintenance cost of creating and maintaining all these extensions. - -We've created the Flarum CLI (command line interface) as a tool to help developers by automating some repetitive and menial tasks, and allow them to get into the actual work without much hassle. - -Major updates about Flarum CLI will be published [on this discussion](https://discuss.flarum.org/d/28427-flarum-cli-v10). - -See the [package's readme](https://github.com/flarum/cli#readme) for information on: - -- Instalación -- Usage -- Upgrading -- Available commands -- Some implementation details, if you're interested diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/console.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/console.md deleted file mode 100644 index d989d2b02..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/console.md +++ /dev/null @@ -1,79 +0,0 @@ -# Consola - -Flarum permite a los desarrolladores de extensiones añadir comandos de consola personalizados además de los [predeterminados](../console.md) proporcionados por el núcleo de flarum. - -Todo el desarrollo de comandos de consola se realiza en el backend usando PHP. Para crear un comando de consola personalizado, necesitará crear una clase que extienda `Flarum\Console\AbstractCommand`. - -```php -use Flarum\Console\AbstractCommand; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -class YourCommand implements AbstractCommand { - protected function configure() - { - $this - ->setName('YOUR COMMAND NAME') - ->setDescription('YOUR COMMAND DESCRIPTION'); - } - protected function fire() - { - // Su lógica aquí - } -} - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -:::tip Comandos Programados -```bash -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Otros extensores - (new Extend\Console())->command(CustomCommand::class) - // Otros extensores -]; -``` - -::: - -## Registro de los comandos de la consola - -To register console commands, use the `Flarum\Extend\Console` extender in your extension's `extend.php` file: - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Other extenders - (new Extend\Console())->command(CustomCommand::class) - // Other extenders -]; -``` - -## Scheduled Commands - -La [fof/console library](https://github.com/FriendsOfFlarum/console) le permite programar comandos para que se ejecuten en un intervalo regular. - - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; -use Illuminate\Console\Scheduling\Event; - -return [ - // Other extenders - (new Extend\Console())->schedule('cache:clear', function (Event $event) { - $event->everyMinute(); - }, ['Arg1', '--option1', '--option2']), - // Other extenders -]; -``` - -In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/8.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands) for more information. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/data.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/data.md deleted file mode 100644 index 88de40415..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/data.md +++ /dev/null @@ -1,562 +0,0 @@ -# Trabajar con datos - -Los datos son la base de cualquier foro, así que vas a tener que jugar bien con ellos si quieres que tu extensión haga algo útil. Este documento repasa cómo fluyen los datos en Flarum, desde la base de datos hasta el JSON-API y el frontend, y todo el camino de vuelta. - -Flarum utiliza el componente de base de datos de [Laravel](https://laravel.com/docs/database). Debes familiarizarte con él antes de continuar, ya que se asume como conocimiento previo en la siguiente documentación. - -## Ciclo de vida de las solicitudes de la API - -Antes de entrar en detalles sobre cómo ampliar la API de datos de Flarum, vale la pena pensar en el ciclo de vida de una solicitud de datos típica: - -1. Se envía una solicitud HTTP a la API de Flarum. Normalmente, esto vendrá del frontend de Flarum, pero los programas externos también pueden interactuar con la API. La API de Flarum sigue en su mayoría la especificación [JSON:API](https://jsonapi.org/), por lo que, en consecuencia, las solicitudes deben seguir [dicha especificación](https://jsonapi.org/format/#fetching). -2. La solicitud se ejecuta a través de [middleware](middleware.md), y se dirige al controlador adecuado. Puedes aprender más sobre los controladores en su conjunto en nuestra [documentación sobre rutas y contenido](routes.md). Asumiendo que la petición es a la API (que es el caso de esta sección), el controlador que maneja la petición será una subclase de `Flarum\Api\AbstractSerializeController`. -3. Cualquier modificación realizada por las extensiones del controlador a través del extensor [`ApiController`] (#extending-api-controllers) se aplica. Esto podría suponer el cambio de sort, añadir includes, cambiar el serializador, etc. -4. Se llama al método `$this->data()` del controlador, obteniendo algunos datos en bruto que deben ser devueltos al cliente. Típicamente, estos datos tomarán la forma de una colección o instancia del modelo de Laravel Eloquent, que ha sido recuperada de la base de datos. Dicho esto, los datos pueden ser cualquier cosa siempre que el serializador del controlador pueda procesarlos. Cada controlador es responsable de implementar su propio método `data`. Ten en cuenta que para las peticiones `PATCH`, `POST` y `DELETE`, `data` realizará la operación en cuestión, y devolverá la instancia del modelo modificado. -5. Esos datos se ejecutan a través de cualquier callback de preserialización que las extensiones registren a través del extensor [`ApiController`](#extending-api-controllers). -6. Los datos se pasan a través de un [serializador](#serializers), que los convierte del formato de base de datos del backend al formato JSON:API esperado por el frontend. También adjunta cualquier objeto relacionado, que se ejecuta a través de sus propios serializadores. Como explicaremos más adelante, las extensiones pueden [añadir / anular relaciones y atributos](#attributes-and-relationships) en el nivel de serialización. -7. Los datos serializados se devuelven como una respuesta JSON al frontend. -8. Si la solicitud se originó a través de la `Store` del frontend de Flarum, los datos devueltos (incluyendo cualquier objeto relacionado) serán almacenados como [modelos del frontend](#frontend-models) en el almacén del frontend. - -## Migraciones - -Si queremos utilizar un modelo personalizado, o añadir atributos a uno existente, tendremos que modificar la base de datos para añadir tablas / columnas. Esto lo hacemos a través de las migraciones. - -Las migraciones son como un control de versiones para su base de datos, permitiéndole modificar fácilmente el esquema de la base de datos de Flarum de forma segura. Las migraciones de Flarum son muy similares a las de [Laravel](https://laravel.com/docs/migrations), aunque hay algunas diferencias. - -Las migraciones viven dentro de una carpeta convenientemente llamada `migrations` en el directorio de su extensión. Las migraciones deben ser nombradas en el formato `YYY_MM_DD_HHMMSS_snake_case_description` para que sean listadas y ejecutadas en orden de creación. - -### Estructura de la migración - -En Flarum, los archivos de migración deben **devolver un array** con dos funciones: `up` y `down`. La función `up` se utiliza para añadir nuevas tablas, columnas o índices a tu base de datos, mientras que la función `down` debe revertir estas operaciones. Estas funciones reciben una instancia del [Laravel schema builder](https://laravel.com/docs/6.x/migrations#creating-tables) que puedes usar para alterar el esquema de la base de datos: - -```php - function (Builder $schema) { - // up migration - }, - 'down' => function (Builder $schema) { - // down migration - } -]; -``` - -Para tareas comunes como la creación de una tabla, o la adición de columnas a una tabla existente, Flarum proporciona algunos ayudantes que construyen esta matriz para usted, y se encargan de escribir la lógica de migración `down` mientras están en ello. Están disponibles como métodos estáticos en la clase `Flarum\Database\Migration`. - -### Ciclo de vida de las migraciones - -Las migraciones se aplican cuando la extensión se habilita por primera vez o cuando está habilitada y hay algunas migraciones pendientes. Las migraciones ejecutadas se registran en la base de datos, y cuando se encuentran algunas en la carpeta de migraciones de una extensión que no están registradas como completadas todavía, se ejecutarán. - -Las migraciones también pueden aplicarse manualmente con `php flarum migrate`, que también es necesario para actualizar las migraciones de una extensión ya habilitada. Para deshacer los cambios aplicados por las migraciones, es necesario hacer clic en "Desinstalar" junto a una extensión en la interfaz de administración, o utilizar el comando `php flarum migrate:reset`. No se puede romper nada ejecutando `php flarum migrate` de nuevo si ya has migrado - las migraciones ejecutadas no se ejecutarán de nuevo. - -Actualmente no hay ganchos a nivel de compositor para gestionar las migraciones en absoluto (es decir, actualizar una extensión con `composer update` no ejecutará sus migraciones pendientes). - -### Creación de tablas - -Para crear una tabla, utilice el ayudante `Migration::createTable`. El ayudante `createTable` acepta dos argumentos. El primero es el nombre de la tabla, mientras que el segundo es un `Closure` que recibe un objeto `Blueprint` que puede ser utilizado para definir la nueva tabla: - -```php -use Flarum\Database\Migration; -use Illuminate\Database\Schema\Blueprint; - -return Migration::createTable('users', function (Blueprint $table) { - $table->increments('id'); -}); -``` - -Al crear la tabla, puede utilizar cualquiera de los [métodos de columna](https://laravel.com/docs/6.x/migrations#creating-columns) del constructor de esquemas para definir las columnas de la tabla. - -### Renombrar Tablas - -Para renombrar una tabla de la base de datos existente, utilice el ayudante `Migration::renameTable`: - -```php -return Migration::renameTable($from, $to); -``` - -### Crear/eliminar columnas - -Para añadir columnas a una tabla existente, utilice el ayudante `Migration::addColumns`. El ayudante `addColumns` acepta dos argumentos. El primero es el nombre de la tabla. El segundo es un array de definiciones de columnas, cuya clave es el nombre de la columna. El valor de cada elemento es un array con las definiciones de las columnas, tal y como lo entiende el método `Illuminate\Database\Schema\Blueprint::addColumn()` de Laravel. El primer valor es el tipo de columna, y cualquier otro valor clave se pasa a través de `addColumn`. - -```php -return Migration::addColumns('users', [ - 'email' => ['string', 'nullable' => true], - 'discussion_count' => ['integer', 'unsigned' => true] -]); -``` - -Para eliminar columnas de una tabla existente, utilice el ayudante `Migration::dropColumns`, que acepta los mismos argumentos que el ayudante `addColumns`. Al igual que cuando se eliminan tablas, se deben especificar las definiciones completas de las columnas para que la migración se pueda revertir limpiamente. - -### Renombrar columnas - -Para cambiar el nombre de las columnas, utilice el ayudante `Migration::renameColumns`. El ayudante `renameColumns` acepta dos argumentos. El primero es el nombre de la tabla, mientras que el segundo es un array de nombres de columnas a renombrar: - -```php -return Migration::renameColumns('users', ['from' => 'to']); -``` - -### Migraciones de Datos (Avanzado) - -Una migración no tiene por qué cambiar la estructura de la base de datos: puedes utilizar una migración para insertar, actualizar o eliminar filas en una tabla. Por ejemplo, puedes utilizar las migraciones para asignar [permisos personalizados](permissions.md) a otros grupos que no sean el de Administrador, o proporcionar algunos datos iniciales para un modelo personalizado de Eloquent. Dado que tienes acceso al [Eloquent Schema Builder](https://laravel.com/docs/6.x/migrations#creating-tables), todo es posible (aunque, por supuesto, debes ser extremadamente cauteloso y probar tu extensión extensamente). - -Las migraciones de datos son la forma recomendada de especificar la configuración y los permisos por defecto. - -## Modelos del backend - -Con todas tus nuevas tablas y columnas de la base de datos, vas a querer una forma de acceder a los datos tanto en el backend como en el frontend. En el backend es bastante sencillo - sólo necesitas estar familiarizado con [Eloquent](https://laravel.com/docs/6.x/eloquent). - -### Añadir nuevos modelos - -Si has añadido una nueva tabla, tendrás que crear un nuevo modelo para ella. En lugar de extender la clase `Model` de Eloquent directamente, deberías extender `Flarum\Database\AbstractModel` que proporciona un poco de funcionalidad extra para permitir que tus modelos sean extendidos por otras extensiones. - - - -### Relaciones - -También puedes añadir [relaciones](https://laravel.com/docs/6.x/eloquent-relationships) a los modelos existentes utilizando los métodos `hasOne`, `belongsTo`, `hasMany`, `belongsToMany` y `relationship` del extensor `Model`. El primer argumento es el nombre de la relación; el resto de los argumentos se pasan al método equivalente en el modelo, por lo que se puede especificar el nombre del modelo relacionado y, opcionalmente, anular los nombres de las tablas y las claves: - -```php - new Extend\Model(User::class) - ->hasOne('phone', 'App\Phone', 'foreign_key', 'local_key') - ->belongsTo('country', 'App\Country', 'foreign_key', 'other_key') - ->hasMany('comment', 'App\Comment', 'foreign_key', 'local_key') - ->belongsToMany('role', 'App\Role', 'role_user', 'user_id', 'role_id') -``` - -Estos 4 métodos deberían cubrir la mayoría de las relaciones, pero a veces se necesita una personalización más fina (por ejemplo, `morphMany`, `morphToMany` y `morphedByMany`). Cualquier relación válida de Eloquent es soportada por el método `relationship`: - -```php - new Extend\Model(User::class) - ->relationship('mobile', 'App\Phone', function ($user) { - // Devuelve aquí cualquier relación Eloquent. - return $user->belongsToMany(Discussion::class, 'recipients') - ->withTimestamps() - ->wherePivot('removed_at', null); - }) -``` - -## Serializadores - -El siguiente paso es exponer tus nuevos datos en el JSON:API de Flarum para que puedan ser consumidos por el frontend. Debes familiarizarte con la [especificación JSON:API](https://jsonapi.org/format/). La capa JSON:API de Flarum se alimenta de la biblioteca [tobscure/json-api](https://github.com/tobscure/json-api). - -Los recursos JSON:API son definidos por **serializadores**. Para definir un nuevo tipo de recurso, crea una nueva clase de serializador que extienda `FlarumApi\Serializer\AbstractSerializer`. Debe especificar un recurso `$type` e implementar el método `getDefaultAttributes` que acepta la instancia del modelo como único argumento: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -### Atributos y relaciones - -También puedes especificar relaciones para tu recurso. Simplemente crea un nuevo método con el mismo nombre que la relación en tu modelo, y devuelve una llamada a `hasOne` o `hasMany` dependiendo de la naturaleza de la relación. Debes pasar la instancia del modelo y el nombre del serializador a utilizar para los recursos relacionados. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -Para añadir **atributos** y **relaciones** a un tipo de recurso existente, utilice el extensor `ApiSerializer`: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // Un atributo a la vez - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Múltiples modificaciones a la vez, lógica más compleja - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // Relaciones de la API - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -## API Endpoints - -Una vez que hayas definido tus recursos en los serializadores, necesitarás exponerlos como puntos finales de la API añadiendo rutas y controladores. - -Siguiendo las convenciones de JSON-API, puedes añadir cinco rutas estándar para tu tipo de recurso utilizando el extensor `Routes`: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -El espacio de nombres `Flarum\Api\Controller` contiene una serie de clases abstractas de controladores que puedes extender para implementar fácilmente tus recursos JSON-API. - -### Listado de recursos - -Para el controlador que enumera su recurso, extienda la clase `FlarumApi\Controller\AbstractListController`. Como mínimo, necesitas especificar el `$serializer` que quieres usar para serializar tus modelos, e implementar un método `data` para devolver una colección de modelos. El método `data` acepta el objeto `Request` y el `Document` tobscure/json-api. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -### Mostrar un recurso - -Para el controlador que muestra un solo recurso, extienda la clase `Flarum\Api\Controller\AbstractShowController`. Al igual que para el controlador de la lista, es necesario especificar el `$serializer` que desea utilizar para serializar sus modelos, e implementar un método `data` para devolver un solo modelo: - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creación de un recurso - -Para el controlador que crea un recurso, extienda la clase `Flarum\Api\Controller\AbstractCreateController`. Esto es lo mismo que el controlador de mostrar, excepto que el código de estado de la respuesta se establecerá automáticamente a `201 Created`. Puede acceder al cuerpo del documento JSON:API entrante a través de `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Actualización de un recurso - -Para el controlador que actualiza un recurso, extienda la clase `Flarum\Api\Controller\AbstractShowController`. Al igual que para el controlador de creación, puedes acceder al cuerpo del documento JSON:API entrante a través de `$request->getParsedBody()`. - -### Borrar un recurso - -Para el controlador que borra un recurso, extienda la clase `Flarum\Api\Controller\AbstractDeleteController`. Sólo necesitas implementar un método `delete` que ejecute el borrado. El controlador devolverá automáticamente una respuesta vacía `204 No Content`. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### ncluir Relaciones - -Para incluir las relaciones al **enumerar**, **mostrar** o **crear** su recurso, especifíquelas en las propiedades `$include` y `$optionalInclude` de su controlador: - -```php - // Las relaciones que se incluyen por defecto. - public $include = ['user']; - - // Otras relaciones que están disponibles para ser incluidas. - public $optionalInclude = ['discussions']; -``` - -A continuación, puede obtener una lista de relaciones incluidas utilizando el método `extractInclude`. Esto se puede utilizar para cargar con avidez las relaciones en sus modelos antes de que se serialicen: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Paginación - -Puede permitir que el número de recursos que se **liste** sea personalizado especificando las propiedades `limit` y `maxLimit` en su controlador: - -```php - // El número de registros incluidos por defecto. - public $limit = 20; - - // El número máximo de registros que se pueden solicitar. - public $maxLimit = 50; -``` - -A continuación, puede extraer la información de paginación de la solicitud utilizando los métodos `extractLimit` y `extractOffset`: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -Para añadir enlaces de paginación al documento JSON:API, utilice el método [`Document::addPaginationLinks`](https://github.com/tobscure/json-api#meta--links). - -### Clasificación - -Puede permitir que se personalice el orden de clasificación de los recursos que se **listen** especificando las propiedades `sort` y `sortField` en su controlador: - -```php - // El campo de clasificación por defecto y el orden a utilizar. - public $sort = ['name' => 'asc']; - - // Los campos que están disponibles para ser ordenados. - public $sortFields = ['firstName', 'lastName']; -``` - -A continuación, puede extraer la información de ordenación de la solicitud utilizando el método `extractSort`. Esto devolverá un array de criterios de ordenación que puedes aplicar a tu consulta: - -```php -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(snake_case($field), $order); -} - -return $query->get(); -``` - -### Extensión de los controladores de la API - -También es posible personalizar todas estas opciones en controladores de API _existentes_ mediante el extensor `ApiController`. - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Añade aquí la lógica personalizada para modificar el controlador - // antes de que se ejecuten las consultas de datos. - }) -] -``` - -El extensor `ApiController` también puede utilizarse para ajustar los datos antes de la serialización - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Modelos Frontend - -Ahora que has expuesto tus datos en el JSON:API de Flarum, es finalmente el momento de darles vida y consumirlos en el frontend. - -### Obtención de datos - -El frontend de Flarum contiene un `store` de datos local que proporciona una interfaz para interactuar con el JSON:API. Puedes recuperar recursos de la API usando el método `find`, que siempre devuelve una promesa: - - -```js -// GET /api/discussions?sort=createdAt -app.store.find('discussions', {sort: 'createdAt'}).then(console.log); - -// GET /api/discussions/123 -app.store.find('discussions', 123).then(console.log); -``` - -Una vez cargados los recursos, se guardarán en la caché del almacén para que puedas acceder a ellos de nuevo sin tener que recurrir a la API utilizando los métodos `all` y `getById`: - -```js -const discussions = app.store.all('discussions'); -const discussion = app.store.getById('discussions', 123); -``` - -El almacén envuelve los datos brutos de los recursos de la API en objetos modelo que facilitan el trabajo. Se puede acceder a los atributos y relaciones a través de métodos de instancia predefinidos: - -```js -const id = discussion.id(); -const title = discussion.title(); -const posts = discussion.posts(); // array de modelos Post -``` - -Puede obtener más información sobre el almacén en nuestra [documentación de la API] (https://api.docs.flarum.org/js/master/class/src/common/store.js~store). - -### Añadir nuevos modelos - -Si has añadido un nuevo tipo de recurso, tendrás que definir un nuevo modelo para él. Los modelos deben extender la clase `Model` y redefinir los atributos y relaciones del recurso: - - -```js -import Model from 'flarum/Model'; - -export default class Tag extends Model { - title = Model.attribute('title'); - createdAt = Model.attribute('createdAt', Model.transformDate); - parent = Model.hasOne('parent'); - discussions = Model.hasMany('discussions'); -} -``` - -A continuación, debe registrar su nuevo modelo en el almacén: - -```js -app.store.models.tags = Tag; -``` - - - -### Extender los modelos - -Para añadir atributos y relaciones a los modelos existentes, modifique el prototipo de la clase del modelo: - -```js -Discussion.prototype.user = Model.hasOne('user'); -Discussion.prototype.posts = Model.hasMany('posts'); -Discussion.prototype.slug = Model.attribute('slug'); -``` - - - -### Ahorro de recursos - -Para enviar datos a través de la API, llame al método `save` en una instancia del modelo. Este método devuelve una Promise que se resuelve con la misma instancia del modelo: - -```js -discussion.save({ title: 'Hello, world!' }).then(console.log); -``` - -También puede guardar las relaciones pasándolas en una clave `relationships`. Para las relaciones has-one, pasa una única instancia del modelo. Para las relaciones has-muchos, pasa una matriz de instancias del modelo. - -```js -user.save({ - relationships: { - groups: [ - store.getById('groups', 1), - store.getById('groups', 2) - ] - } -}) -``` - -### Creación de nuevos recursos - -Para crear un nuevo recurso, cree una nueva instancia del modelo para el tipo de recurso utilizando el método `createRecord` de la tienda, y luego `save`: - -```js -const discussion = app.store.createRecord('discussions'); - -discussion.save({ title: 'Hello, world!' }).then(console.log); -``` - -### Borrar recursos - -Para eliminar un recurso, llame al método `delete` en una instancia del modelo. Este método devuelve una Promise: - -```js -discussion.delete().then(done); -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/distribution.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/distribution.md deleted file mode 100644 index dc5fe6845..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/distribution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Distribución - -Has escrito una gran extensión y ahora quieres que todo el mundo pueda usarla. Este documento te llevará a través del proceso de distribución, desde la creación de un repositorio Git para tu extensión, hasta su publicación en Packagist. - -## Configurar Git - -Lo primero que tienes que hacer es configurar un sistema de control de versiones (VCS). El VCS más popular es [Git](https://git-scm.com/). En esta guía usaremos Git, así que asegúrate de tenerlo [instalado](https://git-scm.com/downloads) antes de continuar. Si no tienes muchos conocimientos sobre Git, puedes consultar [estos recursos de aprendizaje](https://try.github.io/). - -Después de haber instalado Git, necesitarás inicializar tu repositorio. Puedes usar `git init` en la línea de comandos si te sientes cómodo, o usar una herramienta GUI como [SourceTree](https://www.sourcetreeapp.com/) o [GitKraken](https://www.gitkraken.com/). - -A continuación, necesitarás una cuenta en un servidor de alojamiento de Git, siendo los más populares [GitHub](https://github.com) y [GitLab](https://gitlab.com). Estos te indicarán cómo conectar tu repositorio local con el repositorio "remoto" en línea. - -## Etiquetar una versión - -Como vas a publicar esta extensión, querrás asegurarte de que la información está actualizada. Tómese un minuto para revisar `composer.json` y asegurarse de que el nombre del paquete, la descripción y la información de la extensión Flarum son correctos. Se recomienda tener un archivo `README.md` en su repositorio para explicar qué es la extensión, así que cree uno si aún no lo ha hecho. - -Cuando esté listo para publicar, envíe los archivos de su extensión al repositorio y etiquete su primera versión: - -```bash -git tag v0.1.0 -git push && git push --tags -``` - -## Publicar en Packagist - -Los paquetes de Composer se publican en un repositorio de Composer, normalmente [Packagist](https://packagist.org/). Necesitarás una cuenta para proceder. - -Si esta es la primera versión que publicas de tu extensión, tendrás que [enviar tu paquete](https://packagist.org/packages/submit) utilizando la URL de su repositorio público. Si tu extensión se encuentra en GitHub, esta URL será algo así como `https://github.com/AUTHOR/NAME.git`. - -### Future Releases - -You can set up Packagist to [auto-update packages](https://packagist.org/about#how-to-update-packages). Then for future releases, all you will need to do with Git is commit, tag, and push it to the remote server. - -## Promover su extensión - -Lo más probable es que quieras crear una discusión en la Comunidad Flarum en la [etiqueta de extensiones](https://discuss.flarum.org/t/extensions). Otras personas pueden instalar su extensión usando el siguiente comando: - -```bash -composer require vendor/package -``` \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/extending-extensions.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/extending-extensions.md deleted file mode 100644 index 5e2cb1d54..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/extending-extensions.md +++ /dev/null @@ -1,122 +0,0 @@ -# Extending Extensions - -Flarum extensions aren't just for adding features to core: extensions can extend other extensions! - -:::tip - -To learn how to make your extension extensible, see the [relevant documentation](extensibility.md) - -::: - -## Dependencies - -If your extension relies on another extension, you'll want to ensure that: - -- The other extension is installed and enabled before yours can be. -- The other extension can't be disabled while yours is enabled. -- The other extension is booted before your extension. - -Flarum makes this very easy: just add the other extension to your extension's `composer.json`'s `require` section. - -For example, if you were building a new theme for the Flarum Tags extension, your `composer.json` would look like this: - -```json -{ - // ... - "require": { - "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. - "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. - }, - // ... -} -``` - -## Optional Dependencies - -Sometimes, extension A might want to extend extension B only if extension B is enabled. In this case, we call B an "Optional Dependency" of A. For instance, a drafts extension might want to add support for saving private discussion drafts, but only if the private discussion extension is enabled. - -The first step here is detecting whether extension B is enabled. In the frontend, this is easy: if extension B does anything in the frontend, its extension ID will appear as a key in the `flarum.extensions` global object. Por ejemplo: - -```js -if ('some-extension-id' in flarum.extensions) { - // do something -} -``` - -In the backend, you'll need to inject an instance of `Flarum\Extension\ExtensionManager`, and use its `isEnabled()` method. Por ejemplo: - -```php -extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // do something. - } - } -} -``` - -Generally, if your extension has optional dependencies, you'll want it to be booted after said optional dependencies. You can also do this by specifying composer package names (NOT flarum extension IDs) in an array for the `extra.flarum-extension.optional-dependencies` key of your composer.json. - -Por ejemplo: - -```json -{ - // ... - "extra": { - "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] - } - }, - // ... -} -``` - -## Importing from Extensions - -In the backend, you can import the classes you need via regular PHP `use` statements: - -```php - { - // Your Extension Code Here -}) - -export { - // Put all the stuff you want to export here. -} -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/filesystem.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/filesystem.md deleted file mode 100644 index ef202b2c7..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/filesystem.md +++ /dev/null @@ -1,129 +0,0 @@ -# Filesystem - -Flarum core integrates with the filesystem to store and serve assets (like compiled JS/CSS or upload logos/favicons) and avatars. - -Extensions can use Flarum's provided utils for their own filesystem interaction and file storage needs. This system is based around [Laravel's filesystem tools](https://laravel.com/docs/8.x/filesystem), which are in turn based on the [Flysystem library](https://github.com/thephpleague/flysystem). - -## Disks - -Filesystem **disks** represent storage locations, and are backed by storage drivers, which we'll cover later. Flarum core has 2 disks: `flarum-assets` and `flarum-avatars`. - -### Using existing disks - -To access a disk, you'll need to retrieve it from the [Filesystem Factory](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Factory.html). To do so, you should inject the factory contract in your class, and access the disks you need. - -Let's take a look at core's [`DeleteLogoController`](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Controller/DeleteLogoController.php#L19-L58) for an example: - -```php -settings = $settings; - $this->uploadDir = $filesystemFactory->disk('flarum-assets'); - } - - /** - * {@inheritdoc} - */ - protected function delete(ServerRequestInterface $request) - { - RequestUtil::getActor($request)->assertAdmin(); - - $path = $this->settings->get('logo_path'); - - $this->settings->set('logo_path', null); - - if ($this->uploadDir->exists($path)) { - $this->uploadDir->delete($path); - } - - return new EmptyResponse(204); - } -} -``` - -The object returned by `$filesystemFactory->disk(DISK_NAME)` implements the [Illuminate\Contracts\Filesystem\Cloud](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Cloud.html) interface, and can be used to create/get/move/delete files, and to get the URL to a resource. - -### Declaring new disks - -Some extensions will want to group their resources / uploads onto a custom disk as opposed to using `flarum-assets` or `flarum-avatars`. - -This can be done via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->disk('flarum-uploads', function (Paths $paths, UrlGenerator $url) { - return [ - 'root' => "$paths->public/assets/uploads", - 'url' => $url->to('forum')->path('assets/uploads') - ]; - }); -``` - -Since all disks use the local filesystem by default, you'll need to provide a base path and base URL for the local filesystem. - -The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/8.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. - -## Storage drivers - -Flarum selects the active driver for each disk by checking the `disk_driver.DISK_NAME` key in the [settings repository](settings.md) and [config.php file](../config.md). If no driver is configured, or the configured driver is unavailable, Flarum will default to the `local` driver. - -You can define new storage drivers by implementing the [`Flarum\Filesystem\DriverInterface` interface](https://github.com/flarum/framework/blob/main/framework/core/src/Filesystem/DriverInterface.php#L16), and registering it via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->driver('aws-with-cdn', AwsWithCdnDriver::class); -``` - -Filesystem storage drivers are a very powerful tool that allows you to completely customize file storage locations, attach arbitrary CDNs, and otherwise extend the filesystem / cloud storage integration layer. - -:::danger - -Some drivers might try to index their filesystem every time the driver is instantiated, even if only the `url` method is needed. This can have serious performance implications. In most cases, you'll want to ensure that your driver's `url` method does not ping the remote filesystem. Similarly, the remote filesystem should usually not be accessed until operations are actually executed. - -::: - -## GUI and Admin Configuration - -Flarum does not currently provide a GUI for selecting drivers for disks, or for entering settings for drivers. This might be added in the future. For now, extensions are responsible for providing a GUI for their disks and drivers. - -As noted [above](#storage-drivers), if your extension provides a GUI for selecting drivers for a disk, it should modify the `disk_driver.DISK_NAME` key in settings. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/formatting.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/formatting.md deleted file mode 100644 index 5020b6774..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/formatting.md +++ /dev/null @@ -1,42 +0,0 @@ -# Formatting - -Flarum utiliza la potente biblioteca [s9e TextFormatter](https://github.com/s9e/TextFormatter) para dar formato a los mensajes desde el marcado simple hasta el HTML. Deberías familiarizarte con [cómo funciona TextFormatter](https://s9etextformatter.readthedocs.io/Getting_started/How_it_works/) antes de intentar extenderlo. - -En Flarum, el contenido de las entradas se formatea con una configuración mínima de TextFormatter por defecto. Las extensiones **Markdown** y **BBCode** incluidas simplemente habilitan los respectivos plugins en esta configuración de TextFormatter. - -## Configuración - -Puedes configurar la instancia del `Configurador` de TextFormatter, así como ejecutar una lógica personalizada durante el análisis sintáctico y la renderización, utilizando el extensor `Formatter`: - -```php -use Flarum\Extend; -use Psr\Http\Message\ServerRequestInterface as Request; -use s9e\TextFormatter\Configurator; -use s9e\TextFormatter\Parser; -use s9e\TextFormatter\Renderer; - -return [ - (new Extend\Formatter) - // Añadir la configuración del formateador de texto personalizado - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modificar el texto en bruto antes de analizarlo. - // Esta llamada de retorno debe devolver el texto modificado. - ->parse(function (Parser $parser, $context, $text) { - // lógica personalizada aquí - return $newText; - }) - // Modificar el XML a renderizar antes de renderizar. - // Esta llamada de retorno debe devolver el nuevo XML. - // Por ejemplo, en la extensión de menciones, esto se utiliza para - // proporcionar el nombre de usuario y el nombre para mostrar del usuario que está siendo mencionado. - // Asegúrese de que el último argumento $request sea nulo (u omitido por completo). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // lógica personalizada aquí - return $newXml; - }) -]; -``` - -Con una buena comprensión de TextFormatter, esto le permitirá lograr cualquier cosa, desde simples adiciones de etiquetas BBCode hasta tareas de formato más complejas como la extensión **Mentions** de Flarum. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/forms.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/forms.md deleted file mode 100644 index f92cabe23..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/forms.md +++ /dev/null @@ -1,108 +0,0 @@ -# Formularios y peticiones - -En este artículo, repasaremos algunas herramientas de frontend que tenemos a nuestra disposición para construir y gestionar formularios, así como la forma de enviar peticiones HTTP a través de Flarum. - -## Componentes de los formularios - -Como en cualquier sitio interactivo, es probable que quiera incluir formularios en algunas páginas y modales. Flarum proporciona algunos componentes para facilitar la construcción (¡y el estilo!) de estos formularios. Por favor, consulte la documentación de la API vinculada para cada uno de ellos para obtener más información sobre sus atributos aceptados. - -- El componente [`flarum/components/FieldSet`](https://api.docs.flarum.org/js/master/class/src/common/components/fieldset.js~fieldset) envuelve a sus hijos en una etiqueta HTML fieldset, con una leyenda. -- El componente [`flarum/components/Select`](https://api.docs.flarum.org/js/master/class/src/common/components/select.js~select) es una entrada de selección estilizada. -- Los componentes [`flarum/components/Switch`](https://api.docs.flarum.org/js/master/class/src/common/components/switch.js~switch) y [`flarum/components/Checkbox`](https://api.docs.flarum.org/js/master/class/src/common/components/checkbox.js~checkbox) son componentes de entrada de casilla de verificación estilizados. Su attr `loading` puede establecerse en `true` para mostrar un indicador de carga. -- El componente [`flarum/components/Button`](https://api.docs.flarum.org/js/master/class/src/common/components/button.js~button) es un botón estilizado, y se utiliza frecuentemente en Flarum. - -Normalmente querrás asignar la lógica para reaccionar a los cambios de entrada a través de los attrs `on*` de Mithril, no de los listeners externos (como es común con jQuery o JS simple). Por ejemplo: - -```jsx -import Component from 'flarum/Component'; -import FieldSet from 'flarum/components/FieldSet'; -import Button from 'flarum/components/Button'; -import Switch from 'flarum/components/Switch'; - - -class FormComponent extends Component { - oninit(vnode) { - this.textInput = ""; - this.booleanInput = false; - } - - view() { - return ( -
-
- this.textInput = e.target.value}> - - this.booleanInput = val}> - -
- -
- ) - } - - onsubmit() { - // Lógica de manejo de formularios aquí - } -} -``` - -¡No olvides utilizar [traducciones](translate.md)! - - -## Streams, bidi, y withAttr - -Flarum proporciona [Mithril's Stream](https://mithril.js.org/stream.html) como `flarum/util/Stream`. Esta es una estructura de datos reactiva muy poderosa, pero es más comúnmente usada en Flarum como una envoltura para datos de formularios. Su uso básico es: - -```js -import Stream from 'flarum/utils/Stream'; - - -const value = Stream("hello!"); -value() === "hello!"; // verdadero -value("world!"); -value() === "world!"; // verdadero -``` - -En los formularios de Flarum, los flujos se utilizan frecuentemente junto con el attr bidi. Bidi significa unión bidireccional, y es un patrón común en los frameworks de frontend. Flarum parchea Mithril con la librería [`m.attrs.bidi`](https://github.com/tobyzerner/m.attrs. Esto abstrae el procesamiento de la entrada en Mithril. Por ejemplo: - -```jsx -import Stream from 'flarum/utils/Stream'; - -const value = Stream(); - -// Sin bidi - value(e.target.value)}> - -// Con bidi - -``` - -También puedes utilizar la utilidad `flarum/utils/withAttr` para simplificar el procesamiento de formularios. `withAttr` llama a un callable, proporcionando como argumento algún attr del elemento DOM ligado al componente en cuestión: - -```jsx -import Stream from 'flarum/utils/Stream'; -import withAttr from 'flarum/utils/withAttr'; - -const value = Stream(); - -// With a stream - - -// With any callable - { - // Some custom logic here -})}> -``` - -## Haciendo peticiones - -En nuestra documentación de [modelos y datos](data.md), aprendiste a trabajar con modelos, y a guardar la creación, los cambios y la eliminación de modelos en la base de datos a través de la utilidad Store, que no es más que una envoltura del sistema de peticiones de Flarum, que a su vez no es más que una envoltura del sistema de peticiones de [Mithril](https://mithril.js.org/request.html). - -El sistema de peticiones de Flarum está disponible globalmente a través de `app.request(options)`, y tiene las siguientes diferencias con respecto a `m.request(options)` de Mithril: - -- Adjuntará automáticamente las cabeceras `X-CSRF-Token`. -- Convertirá las peticiones `PATCH` y `DELETE` en peticiones `POST`, y adjuntará una cabecera `X-HTTP-Method-Override`. -- Si la petición da error, mostrará una alerta que, si está en modo de depuración, puede ser pulsada para mostrar un modal de error completo. -- Puede proporcionar la opción `background: false`, que ejecutará la petición de forma sincronizada. Sin embargo, esto no debería hacerse casi nunca. - -Por lo demás, la API para utilizar `app.request` es la misma que la de `m.request`. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/frontend-pages.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/frontend-pages.md deleted file mode 100644 index 4add48b70..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/frontend-pages.md +++ /dev/null @@ -1,215 +0,0 @@ -# Páginas del frontend y Resolvers - -Como se explica en la documentación de [Rutas y Contenido](routes.md#frontend-routes), podemos utilizar el sistema de rutas de Mithril para mostrar diferentes [componentes](frontend.md#components) para diferentes rutas. Mithril te permite usar cualquier componente que quieras, incluso un Modal o una Alerta, pero recomendamos ceñirse a las clases de componentes que heredan el componente `Page`. - -## El componente de la página - -Proporcionamos `flarum/components/Page` como una clase base para las páginas en los frontends `admin` y `forum`. Tiene algunos beneficios: - -- Actualiza automáticamente [`app.current` y `app.previous` PageState](#pagestate) cuando se cambia de una ruta a otra. -- Cierra automáticamente el modal y el cajón cuando se cambia de una ruta a otra. -- Aplica `this.bodyClass` (si está definido) al elemento HTML '#app' cuando la página se renderiza. -- También es bueno, por coherencia, utilizar una clase base común para todas las páginas. -- Si el atributo `scrollTopOnCreate` de la página se establece en `false` en `oninit`, la página no se desplazará a la parte superior cuando se cambie. -- Si el atributo `useBrowserScrollRestoration` de la página se establece como `false` en `oninit`, la restauración automática del desplazamiento del navegador no se utilizará en esa página. - -Los componentes de página funcionan como cualquier otro componente heredado. Para un ejemplo (muy simple): - -```js -import Page from 'flarum/components/Page'; - - -export default class CustomPage extends Page { - view() { - return

¡Hola!

- } -} -``` - -### Uso de Resolvers de Rutas - -Flarum uses a setting to determine which page should be the homepage: this gives admins flexibility to customize their communities. To add your custom page to the homepage options in Admin, you'll need to extend the `BasicsPage.homePageItems` method with your page's path. - -Los datos pueden establecerse y recuperarse del estado de la página utilizando: - -```js -import IndexPage from 'flarum/components/DiscussionPage'; -import DiscussionPage from 'flarum/components/DiscussionPage'; - -// Para comprobar sólo el tipo de página -app.current.matches(DiscussionPage); - -// Para comprobar el tipo de página y algunos datos -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -Por ejemplo, así es como la página de discusión hace que su instancia [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) esté disponible globalmente. - -### Resolvers personalizados - -Often, you'll want some custom text to appear in the browser tab's title for your page. For instance, a tags page might want to show "Tags - FORUM NAME", or a discussion page might want to show the title of the discussion. - -To do this, your page should include calls to `app.setTitle()` and `app.setTitleCount()` in its `oncreate` [lifecycle hook](frontend.md) (or when data is loaded, if it pulls in data from the API). - -En realidad hay 3 formas de establecer el componente / resolvedor de rutas cuando se registra una ruta: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - oncreate(vnode) { - super.oncreate(vnode); - - app.setTitle("Cool Page"); - app.setTitleCount(0); - } - - view() { - // ... - } -} - -export default class CustomPageLoadsData extends Page { - oninit(vnode) { - super.oninit(vnode); - - app.store.find("users", 1).then(user => { - app.setTitle(user.displayName()); - app.setTitleCount(0); - }) - } - - view() { - // ... - } -} -``` - -Please note that if your page is [set as the homepage](#setting-page-as-homepage), `app.setTitle()` will clear the title for simplicity. It should still be called though, to prevent titles from previous pages from carrying over. - -## PageState - -A veces, queremos obtener información sobre la página en la que estamos actualmente, o la página de la que acabamos de salir. Para permitir esto, Flarum crea (y almacena) instancias de [`PageState`](https://api.docs.flarum.org/js/master/class/src/common/states/pagestate.js~pagestate) como `app.current` y `app.previous`. Estos almacenan: - -- La clase de componente que se utiliza para la página -- Una colección de datos que cada página establece sobre sí misma. Siempre se incluye el nombre de la ruta actual. - -Data can be set to, and retrieved from, Page State using: - -```js -app.current.set(KEY, DATA); -app.current.get(KEY); -``` - -For example, this is how the Discussion Page makes its [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) instance globally available. - -También se puede comprobar el tipo y los datos de una página utilizando el método `matches` de `PostStreamState`. Por ejemplo, si queremos saber si estamos actualmente en una página de discusión: - -```jsx -import IndexPage from 'flarum/forum/components/DiscussionPage'; -import DiscussionPage from 'flarum/forum/components/DiscussionPage'; - -// To just check page type -app.current.matches(DiscussionPage); - -// To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -## Resolvers de rutas (avanzado) - -See the [Admin Dashboard documentation](admin.md) for more information on tools specifically available to admin pages (and how to override the admin page for your extension). - -## Route Resolvers (Advanced) - -Los [casos de uso avanzados](https://mithril.js.org/route.html#advanced-component-resolution) pueden aprovechar el [sistema de resolución de rutas](https://mithril.js.org/route.html#routeresolver) de Mithril. En realidad, Flarum ya envuelve todos sus componentes en el resolvedor `flarum/resolvers/DefaultResolver`. Esto tiene los siguientes beneficios: - -- Pasa un attr de `routeName` a la página actual, que lo proporciona a `PageState`. -- Asigna una [clave](https://mithril.js.org/keys.html#single-child-keyed-fragments) al componente de la página de nivel superior. Cuando la ruta cambie, si la clave del componente de nivel superior ha cambiado, se rerenderizará completamente (por defecto, Mithril no rerenderiza los componentes cuando se pasa de una página a otra si ambas son manejadas por el mismo componente). - -### Using Route Resolvers - -There are actually 3 ways to set the component / route resolver when registering a route: - -- la clave `resolver` puede utilizarse para proporcionar una **instancia** de un resolvedor de rutas. Esta instancia debe definir qué componente se debe utilizar, y codificar el nombre de la ruta que se le debe pasar. Esta instancia será utilizada sin ninguna modificación por Flarum. -- Las claves `resolverClass` y `component` pueden utilizarse para proporcionar una **clase** que se utilizará para instanciar un resolvedor de rutas, que se utilizará en lugar del predeterminado por Flarum, así como el componente a utilizar. Su constructor debe tomar 2 argumentos: `(componente, routeName)`. -- La clave `componente` puede utilizarse sola para proporcionar un componente. Esto dará como resultado el comportamiento por defecto. - -Por ejemplo: - -```js -// See above for a custom page example -import CustomPage from './components/CustomPage'; -// See below for a custom resolver example -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Utilizar una instancia de resolución de rutas -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Utilizar una clase de resolución de rutas personalizada -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Utilizar la clase de resolución por defecto (`flarum/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -### Custom Resolvers - -Recomendamos encarecidamente que los resolvedores de rutas personalizados extiendan `flarum/resolvers/DefaultResolver`. Por ejemplo, Flarum's `flarum/resolvers/DiscussionPageResolver` asigna la misma clave a todos los enlaces a la misma discusión (independientemente del post actual), y activa el desplazamiento cuando se utiliza `m.route.set` para ir de un post a otro en la misma página de discusión: - -```js -import DefaultResolver from '../../common/resolvers/DefaultResolver'; - -/** - * This isn't exported as it is a temporary measure. - * A more robust system will be implemented alongside UTF-8 support in beta 15. - */ -function getDiscussionIdFromSlug(slug: string | undefined) { - if (!slug) return; - return slug.split('-')[0]; -} - -/** - * A custom route resolver for DiscussionPage that generates the same key to all posts - * on the same discussion. It triggers a scroll when going from one post to another - * in the same discussion. - */ -export default class DiscussionPageResolver extends DefaultResolver { - static scrollToPostNumber: number | null = null; - - makeKey() { - const params = { ...m.route.param() }; - if ('near' in params) { - delete params.near; - } - params.id = getDiscussionIdFromSlug(params.id); - return this.routeName.replace('.near', '') + JSON.stringify(params); - } - - onmatch(args, requestedPath, route) { - if (route.includes('/d/:id') && getDiscussionIdFromSlug(args.id) === getDiscussionIdFromSlug(m.route.param('id'))) { - DiscussionPageResolver.scrollToPostNumber = parseInt(args.near); - } - - return super.onmatch(args, requestedPath, route); - } - - render(vnode) { - if (DiscussionPageResolver.scrollToPostNumber !== null) { - const number = DiscussionPageResolver.scrollToPostNumber; - // Scroll after a timeout to avoid clashes with the render. - setTimeout(() => app.current.get('stream').goToNumber(number)); - DiscussionPageResolver.scrollToPostNumber = null; - } - - return super.render(vnode); - } -} -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/frontend.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/frontend.md deleted file mode 100644 index 3a686e827..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/frontend.md +++ /dev/null @@ -1,418 +0,0 @@ -# Desarrollo del Frontend - -Esta página describe cómo realizar cambios en la interfaz de usuario de Flarum. Cómo añadir botones, marquesinas y texto parpadeante. 🤩 - -[Recuerda](/extend/start.md#architecture), el frontend de Flarum es una **aplicación JavaScript de una sola página**. No hay Twig, Blade, o cualquier otro tipo de plantilla PHP para hablar. Las pocas plantillas que están presentes en el backend sólo se utilizan para renderizar el contenido optimizado para el motor de búsqueda. Todos los cambios en la interfaz de usuario deben hacerse a través de JavaScript. - -Flarum tiene dos aplicaciones frontales separadas: - -* `forum`, el lado público de su foro donde los usuarios crean discusiones y mensajes. -* `admin`, el lado privado de tu foro donde, como administrador de tu foro, configuras tu instalación de Flarum. - -Comparten el mismo código fundacional, así que una vez que sabes cómo extender uno, sabes cómo extender ambos. - -:::tip Typings! - -Along with new TypeScript support, we have a [`tsconfig` package](https://www.npmjs.com/package/flarum-tsconfig) available, which you should install as a dev dependency to gain access to our typings. Make sure you follow the instructions in the [package's README](https://github.com/flarum/flarum-tsconfig#readme) to configure typings support. - -::: - -## Transpilación y estructura de archivos - -Esta parte de la guía explicará la configuración de archivos necesaria para las extensiones. Una vez más, recomendamos encarecidamente utilizar el [generador de extensiones FoF](https://github.com/FriendsOfFlarum/extension-generator) no oficial para configurar la estructura de los archivos por usted. Dicho esto, usted debe leer esto para entender lo que está pasando bajo la superficie. - -Antes de que podamos escribir cualquier JavaScript, necesitamos configurar un **transpilador**. Esto nos permite usar [TypeScript](https://www.typescriptlang.org/) y su magia en el núcleo y las extensiones de Flarum. - -Para hacer esta transpilación, tienes que trabajar en un entorno capaz. No, no se trata de un entorno doméstico o de oficina, ¡puedes trabajar en el baño por lo que a mí respecta! Me refiero a las herramientas instaladas en tu sistema. Necesitarás: - -* Node.js y npm ([Descarga](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) - -Esto puede ser complicado porque cada sistema es diferente. Desde el sistema operativo que usas, hasta las versiones de los programas que tienes instalados, pasando por los permisos de acceso de los usuarios... ¡me dan escalofríos sólo de pensarlo! Si tienes problemas, ~~dale recuerdos~~ utiliza [Google](https://google.com) para ver si alguien se ha encontrado con el mismo error que tú y ha encontrado una solución. Si no, pide ayuda en la [Comunidad Flarum](https://discuss.flarum.org) o en el [chat de Discord](https://flarum.org/discord/). - -Es hora de configurar nuestro pequeño proyecto de transpilación de JavaScript. Crea una nueva carpeta en tu extensión llamada `js`, y luego introduce un par de archivos nuevos. Una extensión típica tendrá la siguiente estructura de frontend: - -``` -js -├── dist (compiled js is placed here) -├── src -│ ├── admin -│ └── forum -├── admin.js -├── forum.js -├── package.json -└── webpack.config.json -``` - -### package.json - -```json -{ - "private": true, - "name": "@acme/flarum-hello-world", - "dependencies": { - "flarum-webpack-config": "0.1.0-beta.10", - "webpack": "^4.0.0", - "webpack-cli": "^3.0.7" - }, - "scripts": { - "dev": "webpack --mode development --watch", - "build": "webpack --mode production" - } -} -``` - -Este es un [archivo de descripción de paquetes](https://docs.npmjs.com/files/package.json) JS estándar, utilizado por npm y Yarn (gestores de paquetes Javascript). Puedes usarlo para añadir comandos, dependencias js y metadatos del paquete. En realidad no estamos publicando un paquete npm: esto simplemente se utiliza para recoger las dependencias. - -Por favor, ten en cuenta que no necesitamos incluir `flarum/core` o cualquier extensión de flarum como dependencias: se empaquetarán automáticamente cuando Flarum compile los frontales de todas las extensiones. - -### webpack.config.js - -```js -const config = require('flarum-webpack-config'); - -module.exports = config(); -``` - -[Webpack](https://webpack.js.org/concepts/) es el sistema que realmente compila y agrupa todo el javascript (y sus dependencias) para nuestra extensión. Para que funcione correctamente, nuestras extensiones deben utilizar el [official flarum webpack config](https://github.com/flarum/flarum-webpack-config) (mostrado en el ejemplo anterior). - -### tsconfig.json - -```json -{ - // Use Flarum's tsconfig as a starting point - "extends": "flarum-tsconfig", - // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder - // and also tells your Typescript server to read core's global typings for - // access to `dayjs` and `$` in the global namespace. - "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"], - "compilerOptions": { - // This will output typings to `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] - } - } -} -``` - -This is a standard configuration file to enable support for Typescript with the options that Flarum needs. - -Always ensure you're using the latest version of this file: https://github.com/flarum/flarum-tsconfig#readme. - -A continuación repasaremos las herramientas disponibles para las extensiones. - -To get the typings working, you'll need to run `composer update` in your extension's folder to download the latest copy of Flarum's core into a new `vendor` folder. Remember not to commit this folder if you're using a version control system such as Git. - -You may also need to restart your IDE's TypeScript server. In Visual Studio Code, you can press F1, then type "Restart TypeScript Server" and hit ENTER. This might take a minute to complete. - -### admin.js and forum.js - -Estos archivos contienen la raíz de nuestro frontend JS real. Podrías poner toda tu extensión aquí, pero eso no estaría bien organizado. Por esta razón, recomendamos poner el código en `src`, y que estos archivos sólo exporten el contenido de `src`. Por ejemplo: - -```js -// admin.js -export * from './src/admin'; - -// forum.js -export * from './src/forum'; -``` - -### src - -Si seguimos las recomendaciones para `admin.js` y `forum.js`, querremos tener 2 subcarpetas aquí: una para el código del frontend `admin`, y otra para el código del frontend `forum`. Si tienes componentes, modelos, utilidades u otro código que se comparte en ambos frontends, puedes crear una subcarpeta `common` y colocarla allí. - -La estructura para `admin` y `forum` es idéntica, así que sólo la mostraremos para `forum` aquí: - -``` -src/forum/ -├── components/ -|-- models/ -├── utils/ -└── index.js -``` - -`components`, `models`, y `utils` son directorios que contienen archivos donde puedes definir [componentes](#components), [modelos](data.md#frontend-models), y funciones de ayuda reutilizables. Tenga en cuenta que todo esto es simplemente una recomendación: no hay nada que le obligue a utilizar esta estructura de archivos en particular (o cualquier otra estructura de archivos). - -El archivo más importante aquí es `index.js`: todo lo demás es simplemente extraer clases y funciones en sus propios archivos. Repasemos una estructura típica de archivos `index.js`: - -```js -import {extend, override} from 'flarum/extend'; - -// Proporcionamos nuestro código de extensión en forma de un "inicializador". -// Este es un callback que se ejecutará después de que el núcleo haya arrancado. -app.initializers.add('our-extension', function(app) { - // Su código de extensión aquí - console.log("EXTENSION NAME is working!"); -}); -``` - -We'll go over tools available for extensions below. - -### Transpilación - -:::tip Bibliotecas externas - -Casi todas las extensiones de Flarum necesitarán importar *algo* de Flarum Core. Como la mayoría de las extensiones, el código fuente JS del núcleo está dividido en las carpetas `admin`, `common` y `forum`. Sin embargo, todo se exporta bajo `flarum`. Para elaborar: - -En algunos casos, una extensión puede querer extender el código de otra extensión de flarum. Esto sólo es posible para las extensiones que exportan explícitamente su contenido. - -* `flarum/tags` y `flarum/flags` son actualmente las únicas extensiones empaquetadas que permiten extender su JS. Puedes importar sus contenidos desde `flarum/{EXT_NAME}/PATH` (por ejemplo, `flarum/tags/components/TagHero`). -* The process for extending each community extension is different; you should consult documentation for each individual extension. - -### Transpilation - -Bien, es hora de encender el transpilador. Ejecuta los siguientes comandos en el directorio `js`: - -```bash -npm install -npm run dev -``` - -Esto compilará su código JavaScript listo para el navegador en el archivo `js/dist/forum.js`, y se mantendrá atento a los cambios en los archivos fuente. ¡Genial! - -Cuando hayas terminado de desarrollar tu extensión (o antes de un nuevo lanzamiento), querrás ejecutar `npm run build` en lugar de `npm run dev`: esto construye la extensión en modo de producción, lo que hace que el código fuente sea más pequeño y rápido. - -## Registro de activos - -### JavaScript - -Para que el JavaScript de tu extensión se cargue en el frontend, necesitamos decirle a Flarum dónde encontrarlo. Podemos hacer esto usando el método `js` del extensor `Frontend`. Añádelo al archivo `extend.php` de tu extensión: - -```php -js(__DIR__.'/js/dist/forum.js') -]; -``` - -Flarum hará que cualquier cosa que haga `export` desde `forum.js` esté disponible en el objeto global `flarum.extensions['acme-hello-world']`. Por lo tanto, puede elegir exponer su propia API pública para que otras extensiones interactúen con ella. - -:::tip External Libraries - -Sólo se permite un archivo JavaScript principal por extensión. Si necesitas incluir alguna librería JavaScript externa, instálala con NPM e `import` para que se compile en tu archivo JavaScript, o consulta [Rutas y Contenido](/extend/routes.md) para saber cómo añadir etiquetas `'; - }) -]; -``` - -You can also add content onto your frontend route registrations: - -```php -return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) -]; -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/search.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/search.md deleted file mode 100644 index 42328c55a..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/search.md +++ /dev/null @@ -1,202 +0,0 @@ -# Search - -Flarum treats searching and filtering as parallel but distinct processes. Which process is used to handle a request to a [`List` API endpoint](/extend/api.md#api-endpoints) depends on the query parameters: - -- Filtering is applied when the `filter[q]` query param is omitted. Filters represent **structured** queries: for instance, you might want to only retrieve discussions in a certain category, or users who registered before a certain date. Filtering computes results based entirely on `filter[KEY] = VALUE` query parameters. -- Searching is applied when the `filter[q]` query param is included. Searches represent **unstructured** queries: the user submits an arbitrary string, and data records that "match" it are returned. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Searching computes results based solely on parsing the `filter[q]` query param: all other `filter[KEY] = VALUE` params are ignored when searching. It's important to note that searches aren't entirely unstructured: the dataset being searched can be constrained by gambits (which are very similar to filters, and will be explained later). - -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. - -Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. - -One key advantage of this split is that it allows searching to be implemented via an external service, such as ElasticSearch. For larger communities, this can be significantly more performant and accurate. There isn't a dedicated extender for this yet, so for now, replacing the default Flarum search driver requires overriding the container bindings of `Searcher` classes. This is a highly advanced use case; if you're interested in doing this, please reach out on our [community forums](https://discuss.flarum.org/). - -Remember that the [JSON:API schema](https://jsonapi.org/format) is used for all API requests. - -:::tip Reuse Code - -Often, you might want to use the same class as both a `Filter` and a `Gambit` (both explained below). Your classes can implement both interface; see Flarum core's [`UnreadFilterGambit`](https://github.com/flarum/framework/blob/main/framework/core/src/Discussion/Query/UnreadFilterGambit.php) for an example. - -::: - -:::tip Query Builder vs Eloquent Builder - -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps - -::: - -## Filtering - -Filtering constrains queries based on `Filters` (highlighted in code to avoid confusion with the process of filtering), which are classes that implement `Flarum\Filter\FilterInterface` and run depending on query parameters. After filtering is complete, a set of callbacks called "filter mutators" run for every filter request. - -When the `filter` method on a `Filterer` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Filter/AbstractFilterer.php#L50-L93)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Filterer` class's `getQuery()` method. -2. We loop through all `filter[KEY] = VALUE` query params. For each of these, any `Filter`s registered to the model whose `getFilterKey()` method matches the query param `KEY` is applied. `Filter`s can be negated by providing the query param as `filter[-KEY] = VALUE`. Whether or not a `Filter` is negated is passed to it as an argument: implementing negation is up to the `Filter`s. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "filter mutators" are applied. These are callbacks that receive the filter state (a wrapper around the query builder and current user) and filter criteria, and perform some arbitrary changes. All "filter mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Filtering for an Existing Model - -Let's say you've added a `country` column to the User model, and would like to filter users by country. We'll need to define a custom `Filter`: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -Note that `FilterState` is a wrapper around the Eloquent builder's underlying Query builder and the current user. - -Also, let's pretend that for some reason, we want to omit any users that have a different country from the current user on ANY filter. We can use a "filter mutator" for this: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -Now, all we need to do is register these via the Filter extender: - -```php - // Other extenders - (new Extend\Filter(UserFilterer::class)) - ->addFilter(CountryFilter::class) - ->addFilterMutator(OnlySameCountryFilterMutator::class), - // Other extenders -``` - -### Add Filtering to a New Model - -To filter a model that doesn't support filtering, you'll need to create a subclass of `Flarum/Filter/AbstractFilterer` for that model. For an example, see core's [UserFilterer](https://github.com/flarum/framework/blob/main/framework/core/src/User/Filter/UserFilterer.php). - -Then, you'll need to use that filterer in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -## Searching - -Searching constrains queries by applying `Gambit`s, which are classes that implement `Flarum\Search\GambitInterface`, based on the `filter[q]` query param. After searching is complete, a set of callbacks called "search mutators" run for every search request. - -When the `search` method on a `Searcher` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Search/AbstractSearcher.php#L55-L79)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Searcher` class's `getQuery()` method. -2. The `filter[q]` param is split by spaces into "tokens". Each token is matched against the model's registered `Gambit`s (each gambit has a `match` method). For any tokens that match a gambit, that gambit is applied, and the token is removed from the query string. Once all regular `Gambit`s have ran, all remaining unmatched tokens are passed to the model's `FullTextGambit`, which implements the actual searching logic. For example if searching discussions, in the `filter[q]` string `'author:1 hello is:hidden' world`, `author:1` and `is:hidden` would get matched by core's Author and Hidden gambits, and `'hello world'` (the remaining tokens) would be passed to the `DiscussionFulltextGambit`. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "search mutators" are applied. These are callbacks that receive the search state (a wrapper around the query builder and current user) and criteria, and perform some arbitrary changes. All "search mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Searching for an Existing Model - -Let's reuse the "country" examples we used above, and see how we'd implement the same things for searching: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -:::warning No Spaces in Gambit Patterns! - -Flarum splits the `filter[q]` string into tokens by splitting it at spaces. This means that your custom gambits can NOT use spaces as part of their pattern. - -::: - -:::tip AbstractRegexGambit - -All a gambit needs to do is implement `Flarum\Search\GambitInterface`, which receives the search state and a token. It should return if this gambit applies for the given token, and if so, make whatever mutations are necessary to the query builder accessible as `$searchState->getQuery()`. - -However, for most gambits, the `AbstractRegexGambit` abstract class (used above) should be used as a base class. This makes it a lot simpler to match and apply gambits. - -::: - -Similarly, the search mutator we need is almost identical to the filter mutator from before: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -We can register these via the `SimpleFlarumSearch` extender (in the future, the `Search` extender will be used for registering custom search drivers): - -```php - // Other extenders - (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(CountryGambit::class) - ->addSearchMutator(OnlySameCountrySearchMutator::class), - // Other extenders -``` - -### Add Searching to a New Model - -To support searching for a model, you'll need to create a subclass of `Flarum/Search/AbstractSearcher` for that model. For an example, see core's [UserSearcher](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/UserSearcher.php). - -Then, you'll need to use that searcher in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -Every searcher **must** have a fulltext gambit (the logic that actually does the searching). Otherwise, it won't be booted by Flarum, and you'll get an error. See core's [FulltextGambit for users](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/Gambit/FulltextGambit.php) for an example. You can set (or override) the full text gambit for a searcher via the `SimpleFlarumSearch` extender's `setFullTextGambit()` method. - -### Search Drivers - -Coming soon! - -## Frontend Tools - -Coming soon! diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/service-provider.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/service-provider.md deleted file mode 100644 index ee4370f58..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/service-provider.md +++ /dev/null @@ -1,65 +0,0 @@ -# Proveedor de servicios - -Como se ha señalado a lo largo de esta documentación, Flarum utiliza [el contenedor de servicios de Laravel](https://laravel.com/docs/6.x/container) (o contenedor IoC) para la inyección de dependencias. Los [Service Providers](https://laravel.com/docs/6.x/providers) permiten la configuración y modificación de bajo nivel del backend de Flarum. El caso de uso más común para los proveedores de servicio es crear, modificar o reemplazar los enlaces del contenedor. Dicho esto, los proveedores de servicios le permiten un acceso completo para ejecutar cualquier lógica que necesite durante el arranque de la aplicación con acceso al contenedor. - -:::caution ¡¡¡Sólo para uso avanzado!!! - -A diferencia de otros extensores, la capa del proveedor de servicios NO está orientada a los casos de uso y NO se considera una API pública. Está sujeta a cambios en cualquier momento, sin previo aviso o depreciación. Esto sólo debe ser utilizado si usted sabe lo que está haciendo, y los otros extensores no satisfacen su caso de uso. - -::: - -## Proceso de arranque de Flarum - -Para entender los proveedores de servicios, primero hay que entender el orden en que Flarum arranca. Most of this happens in [Flarum\Foundation\InstalledSite](https://github.com/flarum/framework/blob/main/framework/core/src/Foundation/InstalledSite.php) - -1. El contenedor y la aplicación se inicializan, y se registran los bindings esenciales (config, environment, logger) -2. Se ejecutan los métodos `register` de todos los proveedores de servicios esenciales. -3. Se ejecutan los métodos `extend` de todos los extensores utilizados por todas las extensiones habilitadas. -4. Se ejecutan los métodos `extend` de todos los extensores utilizados en el sitio local de Flarum `extend.php`. -5. Se ejecutan los métodos `boot` de todos los proveedores de servicios centrales. - -## Proveedores de servicios personalizados - -Un proveedor de servicios personalizado debe extender `Flarum\Foundation\AbstractServiceProvider`, y puede tener un método `boot` y otro `register`. Por ejemplo: - -```php -container->resolving(SomeClass::class, function ($container) { - return new SomeClass($container->make('some.binding')); - }); - } - - public function boot(Container $container) - { - // custom logic here - } -} -``` - -El método `register` se ejecutará durante el paso (3) anterior, y el método `boot` se ejecutará durante el paso (5) anterior. En ambos métodos, el contenedor está disponible a través de `$this->app`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. - -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane) for more information. - -Para registrar tu proveedor de servicios personalizado, puedes usar el extensor `ServiceProvider` en `extend.php`: - -```php -register(CustomServiceProvider::class), - // Otros extensores -]; -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/settings.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/settings.md deleted file mode 100644 index e29999653..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/settings.md +++ /dev/null @@ -1,90 +0,0 @@ -# Ajustes - -En algún momento mientras haces una extensión, puede que quieras leer algunas de las configuraciones del foro o almacenar ciertas configuraciones específicas de tu extensión. Afortunadamente, Flarum hace esto muy fácil. - -## El repositorio de ajustes - -La lectura o el cambio de configuraciones puede hacerse usando una implementación de la `SettingsRepositoryInterface`. En su lugar, puedes confiar en el contenedor para instanciar tu clase e inyectar las dependencias correctas. Debido a que Flarum utiliza el [contenedor de servicios de Laravel](https://laravel.com/docs/6.x/container) (o contenedor IoC) para la inyección de dependencias, no necesitas preocuparte de dónde obtener tal repositorio, o cómo instanciar uno. - -```php -settings = $settings; - } -} -``` - -Muy bien. Ahora la `SettingsRepositoryInterface` está disponible a través de `$this->settings` para nuestra clase. - -### Lectura de la configuración - -Para leer la configuración, todo lo que tenemos que hacer es utilizar la función `get()` del repositorio: - -`$this->settings->get('forum_title')` - -La función `get()` acepta dos argumentos: - -1. El nombre de la configuración que está tratando de leer. -2. (Opcional) Un valor por defecto si no se ha almacenado ningún valor para dicho ajuste. Por defecto, será `null`. - -### Almacenamiento de ajustes - -Almacenar configuraciones es igual de fácil, utilice la función `set()`: - -`$this->settings->set('forum_title', 'Super Awesome Forum')` - -La función `set` también acepta dos argumentos: - -1. El nombre de la configuración que está tratando de cambiar. -2. El valor que desea almacenar para este ajuste. - -### Otras Funciones - -La función `all()` devuelve una matriz con todas las configuraciones conocidas. - -La función `delete($name)` permite eliminar una configuración con nombre. - -## Ajustes en el Frontend - -### Edición de Ajustes - -Para obtener más información sobre la gestión de la configuración a través del panel de administración, consulte la [documentación pertinente](admin.md). -### Acceso a la Configuración - -Todos los ajustes están disponibles en el frontend `admin` a través del global `app.data.settings`. Sin embargo, esto no se hace en el frontend `forum`, ya que cualquiera puede acceder a él, ¡y no querrías filtrar todas tus configuraciones! (En serio, eso podría ser una violación de datos muy problemática). (Seriously, that could be a very problematic data breach). - -En su lugar, si queremos utilizar la configuración en el frontend de `forum`, tendremos que serializarla y enviarla junto con la carga de datos inicial del foro. - -Esto se puede hacer a través del extensor `Settings`. Por ejemplo: - -**extend.php** - -```php -use Flarum\Extend; - -return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // Este tercer argumento es opcional, y nos permite pasar la configuración recuperada a través de alguna lógica personalizada. - // En este ejemplo, le añadiremos una cadena. - - return "My Cool Setting: $retrievedValue"; - }), -] -``` - -Ahora, el ajuste `my.cool.setting.key` será accesible en el frontend como `app.forum.attribute("myCoolSetting")`, y nuestro valor modificado será accesible a través de `app.forum.attribute("myCoolSettingModified")`. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/slugging.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/slugging.md deleted file mode 100644 index 3dc39416b..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/slugging.md +++ /dev/null @@ -1 +0,0 @@ -# Model Slugging diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/start.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/start.md deleted file mode 100644 index 91c58ff53..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/start.md +++ /dev/null @@ -1,153 +0,0 @@ -# Cómo empezar - -¿Quieres construir una extensión de Flarum? You've come to the right place! ¡Has venido al lugar correcto! Este documento te llevará a través de algunos conceptos esenciales, después de lo cual construirás tu primera extensión de Flarum desde cero. - -## Arquitectura - -Para entender cómo extender Flarum, primero necesitamos entender un poco cómo está construido Flarum. - -Ten en cuenta que Flarum utiliza algunos lenguajes y herramientas _modernas_. Si sólo has construido plugins para WordPress antes, puede que te sientas un poco fuera de tu alcance. No pasa nada, es un buen momento para aprender cosas nuevas y ampliar tus conocimientos. Sin embargo, te aconsejamos que te familiarices con las tecnologías descritas a continuación antes de continuar. - -Flarum se compone de tres capas: - -* En primer lugar, está el **backend**. Está escrito en [PHP orientado a objetos](https://laracasts.com/series/object-oriented-bootcamp-in-php), y hace uso de una amplia gama de componentes de [Laravel](https://laravel.com/) y otros paquetes a través de [Composer](https://getcomposer.org/). También querrás familiarizarte con el concepto de [Dependency Injection](https://laravel.com/docs/6.x/container), que se utiliza en todo nuestro backend. - -* En segundo lugar, el backend expone una **API pública** que permite a los clientes del frontend interactuar con los datos de tu foro. Está construida de acuerdo con la especificación [JSON:API](https://jsonapi.org/). - -* Por último, está la interfaz web por defecto que llamamos **frontend**. Esta es una [single-page application](https://en.wikipedia.org/wiki/Single-page_application) que consume la API. Está construida con un sencillo framework tipo React llamado [Mithril.js](https://mithril.js.org). - -Las extensiones a menudo necesitarán interactuar con estas tres capas para hacer que las cosas sucedan. Por ejemplo, si quieres construir una extensión que añada campos personalizados a los perfiles de los usuarios, tendrías que añadir las estructuras de base de datos apropiadas en el **backend**, exponer esos datos en la **public API**, y luego mostrarlos y permitir a los usuarios editarlos en el **frontend**. - -Así que... ¿cómo extendemos estas capas? - -## Extensores - -Para extender Flarum, usaremos un concepto llamado **extensores**. Los extensores son objetos *declarativos* que describen en términos sencillos los objetivos que se pretenden alcanzar (como añadir una nueva ruta a tu foro, o ejecutar algún código cuando se crea una nueva discusión). - -Cada extensor es diferente. Sin embargo, siempre tendrán un aspecto similar a este: - -```php -// Registrar un archivo JavaScript y un archivo CSS para ser entregado con el frontend del foro -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') -``` - -Primero se crea una instancia del extensor, y luego se llama a los métodos en él para la configuración adicional. Todos estos métodos devuelven el propio extensor, de modo que puedes conseguir toda la configuración simplemente encadenando llamadas a métodos. - -Para mantener la coherencia, utilizamos este concepto de extensores tanto en el backend (en la tierra de PHP) como en el frontend (en la tierra de JavaScript). _Todo_ lo que haga en su extensión debe ser hecho a través de extensores, porque son una **garantía** que le estamos dando de que una futura versión menor de Flarum no romperá su extensión. - -All of the extenders currently available to you from Flarum's core can be found in the [`Extend` namespace](https://github.com/flarum/framework/blob/main/framework/core/src/Extend) [(PHP API documentation)](https://api.docs.flarum.org/php/master/flarum/extend) Extensions may also offer their [own extenders](extensibility.md#custom-extenders). - -## Hola Mundo - -¿Quieres ver un extensor en acción? El archivo `extend.php` en la raíz de tu instalación de Flarum es la forma más fácil de registrar extensores sólo para tu sitio. Debería devolver un array de objetos extensores. Ábrelo y añade lo siguiente: - -```php -content(function (Document $document) { - $document->head[] = ''; - }) -]; -``` - -Ahora haz una visita a tu foro para un agradable (aunque extremadamente molesto) saludo. 👋 - -Para personalizaciones sencillas específicas del sitio -como añadir un poco de CSS/JavaScript personalizado, o integrarse con el sistema de autenticación de tu sitio- el archivo `extend.php` en la raíz de tu foro es genial. Pero en algún momento, tu personalización podría superarlo. O tal vez hayas querido construir una extensión para compartirla con la comunidad desde el principio. ¡Es hora de construir una extensión! - -## Empaquetado de extensiones - -[Composer](https://getcomposer.org) es un gestor de dependencias para PHP. Permite a las aplicaciones tirar fácilmente de las bibliotecas de código externas y hace que sea fácil mantenerlas actualizadas para que la seguridad y las correcciones de errores se propaguen rápidamente. - -Resulta que cada extensión de Flarum es también un paquete de Composer. Eso significa que la instalación de Flarum de alguien puede "requerir" una determinada extensión y Composer la traerá y la mantendrá actualizada. Muy bien. - -Durante el desarrollo, puedes trabajar en tus extensiones localmente y configurar un [repositorio de rutas de Composer](https://getcomposer.org/doc/05-repositories.md#path) para instalar tu copia local. Crea una nueva carpeta `packages` en la raíz de tu instalación de Flarum, y luego ejecuta este comando para decirle a Composer que puede encontrar paquetes aquí: - -```bash -composer config repositories.0 path "packages/*" -``` - -Ahora vamos a empezar a construir nuestra primera extensión. Crea una nueva carpeta dentro de `packages` para tu extensión llamada `hello-world`. Pondremos dos archivos en ella: `extend.php` y `composer.json`. Estos archivos sirven como el corazón y el alma de la extensión. - -### extend.php - -El archivo `extend.php` es igual que el que está en la raíz de su sitio. Devolverá un array de objetos extensor que le dicen a Flarum lo que quieres hacer. Por ahora, solo mueve el extensor `Frontend` que tenías antes. - -### composer.json - -Necesitamos decirle a Composer un poco sobre nuestro paquete, y podemos hacerlo creando un archivo `composer.json`: - -```json -{ - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } - } -} -``` - -* **name** es el nombre del paquete de Composer en el formato `vendedor/paquete`. - * Debes elegir un nombre de proveedor que sea único para ti - tu nombre de usuario de GitHub, por ejemplo. Para los propósitos de este tutorial, asumiremos que estás usando `acme` como tu nombre de proveedor. - * Debes anteponer a la parte del `package` el prefijo `flarum-` para indicar que se trata de un paquete específicamente destinado a ser utilizado con Flarum. - -* **description** es una breve descripción de una frase de lo que hace la extensión. - -* **type** debe ser establecido como `flarum-extension`. Esto asegura que cuando alguien "requiera" su extensión, será identificada como tal. - -* **require** contiene una lista de las dependencias propias de su extensión. - * Querrá especificar la versión de Flarum con la que su extensión es compatible aquí. - * Este es también el lugar para listar otras bibliotecas de Composer que su código necesita para funcionar. - -* **autoload** indica a Composer dónde encontrar las clases de su extensión. El espacio de nombres aquí debe reflejar el nombre del proveedor y del paquete de su extensión en CamelCase. - -* **extra.flarum-extension** contiene alguna información específica de Flarum, como el nombre de su extensión y el aspecto de su icono. - * **title** es el nombre de su extensión. - * **icon** es un objeto que define el icono de tu extensión. La propiedad **name** es un [nombre de clase de icono de Font Awesome](https://fontawesome.com/icons). Todas las demás propiedades se utilizan como el atributo `style` para el icono de su extensión. - -Consulte [el esquema composer.json](https://getcomposer.org/doc/04-schema.md) para obtener información sobre otras propiedades que puede añadir a `composer.json`. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -Utilice el [FoF extension generator](https://github.com/FriendsOfFlarum/extension-generator) para crear automáticamente el andamiaje de su extensión. -```bash -$ flarum-cli init -``` - -::: - -### Instalación de la extensión - -Lo último que tenemos que hacer para empezar a funcionar es instalar tu extensión. Navega al directorio raíz de tu instalación de Flarum y ejecuta el siguiente comando: - -```bash -composer require acme/flarum-hello-world *@dev -``` - -Una vez hecho esto, sigue adelante y activa la extension en la página de administración de tu foro, luego navega de nuevo a tu foro. - -*whizzing, whirring, metal clunking* - -Woop! Hello to you too, extension! - -Estamos haciendo buenos progresos. Hemos aprendido a configurar nuestra extensión y a utilizar los extensores, lo que nos abre muchas puertas. Sigue leyendo para aprender a extender el frontend de Flarum. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md deleted file mode 100644 index fe879c026..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md +++ /dev/null @@ -1,86 +0,0 @@ -# Static Code Analysis - -Static code analysis is the process of analyzing the source code against a set of rules to find bugs, code smells, and security vulnerabilities. This is a great way to improve the quality of your code and to find potential issues before they are deployed to production. An example is validating the typings of a function to ensure that the function is called with the correct arguments. - -Flarum provides a static code analysis package based on [PHPStan](https://phpstan.org/) that can be added to your extension. In this guide, we will show you how to add the package to your extension and how to run the analysis. - -## Configuración - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update the infrastructure for phpstan to your code: - -```bash -$ flarum-cli infra phpstan -``` - -::: - -First you need to require the `flarum/phpstan` package in your extension. You can do this by running the following command in the root of our extension: - -```bash -composer require --dev flarum/phpstan:^1.0 -``` - -Next, you need to create a `phpstan.neon` file in the root of your extension. This file contains [the configuration for PHPStan](https://phpstan.org/config-reference). You can copy the following configuration into the file: - -```neon -includes: - - vendor/flarum/phpstan/extension.neon - -parameters: - # The level will be increased in Flarum 2.0 - level: 5 - paths: - - src - - extend.php - excludePaths: - - *.blade.php - checkMissingIterableValueType: false - databaseMigrationsPath: ['migrations'] -``` - -Finally, you need to add the following script to your `composer.json` file: - -```json -{ - "scripts": { - "analyse:phpstan": "phpstan analyse", - "clear-cache:phpstan": "phpstan clear-result-cache" - }, - "scripts-descriptions": { - "analyse:phpstan": "Run static analysis" - } -} -``` - -## Running the analysis - -To run the analysis, you can run the following command in the root of your extension: - -```bash -composer analyse:phpstan -``` - -If you want to clear the cache before running the analysis, you can run the following command: - -```bash -composer clear-cache:phpstan && composer analyse:phpstan -``` - -## GitHub Actions - -You can also run the analysis using GitHub Actions. Checkout the page on [GitHub Actions](github-actions.md) for more information. - -## Tips - -### Extended model attribute types - -PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. - -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. - -```php -(new Extend\Model(User::class)) - ->cast('is_cool', 'bool'), -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/testing.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/testing.md deleted file mode 100644 index 838725732..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/testing.md +++ /dev/null @@ -1,565 +0,0 @@ -# Testing - -Las pruebas automatizadas garantizan que tu extensión funcione como esperas, ayudan a evitar la introducción de nuevos errores o regresiones, y ahorran tiempo en las pruebas manuales. Actualmente, Flarum proporciona herramientas para las pruebas unitarias y de integración automatizadas del backend, y planeamos lanzar soporte para las pruebas unitarias del frontend y las pruebas E2E en el futuro. - -## Backend Tests - -La librería `flarum/testing` es utilizada por el núcleo y algunas extensiones para realizar pruebas unitarias y de integración automatizadas. Es esencialmente una colección de utilidades que permiten probar el núcleo y las extensiones de Flarum con PHPUnit. - -### Configuración - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update backend testing infrastructure to your code: - -```bash -$ flarum-cli infra backendTesting -``` - -::: - -```bash -composer require --dev flarum/testing:^1.0 -``` - -Then, you will need to set up a file structure for tests, and add PHPUnit configuration: - -``` -tests -├── fixtures (put any files needed by your tests here (blade templates, images, etc)) -├── integration -│ ├── setup.php (code below) -│ └── PUT INTEGRATION TESTS HERE (organizing into folder is generally a good idea) -├── unit -│ ├── PUT UNIT TESTS HERE -├── phpunit.integration.xml (code below) -└── phpunit.unit.xml (code below) -``` - -#### phpunit.integration.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for integration tests. You can tweak this as needed, but keep `backupGlobals`, `backupStaticAttributes`, and `processIsolation` unchanged. - -```xml - - - - - - - ./integration - - - -``` - -#### phpunit.unit.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for unit tests. You can tweak this as needed. - -```xml - - - - - - - ./unit - - - - - - -``` - -#### setup.php - -This script will be run to set up a testing database / file structure. - -```php -run(); -``` - -#### composer.json Modificaciones - -We will also want to add scripts to our `composer.json`, so that we can run our test suite via `composer test`. Add some variant of the following to your `composer.json`: - -```json -"scripts": { - "test": [ - "@test:unit", - "@test:integration" - ], - "test:unit": "phpunit -c tests/phpunit.unit.xml", - "test:integration": "phpunit -c tests/phpunit.integration.xml", - "test:setup": "@php tests/integration/setup.php" -}, -"scripts-descriptions": { - "test": "Runs all tests.", - "test:unit": "Runs all unit tests.", - "test:integration": "Runs all integration tests.", - "test:setup": "Sets up a database for use with integration tests. Execute this only once." -} -``` - -#### Flujo de trabajo de pruebas en Github - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - ---- - -Now that we have everything in place, we need to set up our testing site for integration tests. For this, we will need a MySQL or MariaDb instance, and a place to store testing files. - -Testing database information is configured via the `DB_HOST` (defaults to `localhost`), `DB_PORT` (defaults to `3306`), `DB_DATABASE` (defaults to `flarum_test`), `DB_USERNAME` (defaults to `root`), `DB_PASSWORD` (defaults to `root`), and `DB_PREFIX` (defaults to `''`) environmental variables. The testing tmp directory path is configured via the `FLARUM_TEST_TMP_DIR_LOCAL` or `FLARUM_TEST_TMP_DIR` environmental variables, with the former taking precedence over the latter. If neither are provided, a `tmp` directory will be created in the `vendor` folder of your extension's local install. - -Now that we've provided the needed information, all we need to do is run `composer test:setup` in our extension's root directory, and we have our testing environment ready to go! - -Since [(almost)](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/tests/integration/api/discussions/ListWithFulltextSearchTest.php#L29-L45) all database operations in integration tests are run in transactions, developers working on multiple extensions will generally find it more convenient to use one shared database and tmp directory for testing all their extensions. To do this, set the database config and `FLARUM_TEST_TMP_DIR` environmental variables in your `.bashrc` or `.bash_profile` to the path you want to use, and run the setup script for any one extension (you'll still want to include the setup file in every repo for CI testing via GitHub Actions). You should then be good to go for any Flarum extension (or core). - -### Uso de las pruebas de integración - -Flarum's integration test utils are contained in the `Flarum\Testing\integration\TestCase` class. It: - -- Inicia (y hace disponible) una instancia de la aplicación Flarum. -- Permite prepoblar la base de datos, habilitar extensiones y añadir extensores. -- Ejecuta todos los cambios de la base de datos en las transacciones, por lo que su base de datos de prueba conserva el estado predeterminado después de la instalación. -- Permite enviar solicitudes a través de la pila de middleware para probar los puntos finales HTTP. - -Your testcase classes should extend this class. - -#### Configuración de casos de prueba - -There are several important utilities available for your test cases: - -- The `setting($key, $value)` method allows you to override settings before the app has booted. This is useful if your boot process has logic depending on settings (e.g. which driver to use for some system). -- Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. -- El método `extension()` tomará los IDs de Flarum de las extensiones a habilitar como argumentos. Su extensión siempre debe llamar a esto con el ID de su extensión al comienzo de los casos de prueba, a menos que el objetivo del caso de prueba en cuestión sea confirmar algún comportamiento presente sin su extensión, y compararlo con el comportamiento cuando su extensión está habilitada. Si su extensión depende de otras extensiones, asegúrese de que están incluidas en el campo `require` de composer.json (o `require-dev` para [dependencias opcionales](dependencies.md)), y también liste los nombres de sus paquetes en composer cuando llame a `extension()`. Ten en cuenta que debes listarlos en un orden válido. -- El método `extend()` toma instancias de extensores como argumentos, y es útil para probar extensores introducidos por su extensión para que otras extensiones los usen. -- El método `prepareDatabase()` le permite pre-poblar su base de datos. Esto podría incluir la adición de usuarios, discusiones, mensajes, configuración de permisos, etc. Su argumento es un array asociativo que mapea los nombres de las tablas a arrays de [arrays de registros](https://laravel.com/docs/8.x/queries#insert-statements). - -If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. - -:::warning - -The `TestCase` class will boot a Flarum instance the first time its `app()` method is called. Any uses of `prepareDatabase`, `extend`, or `extension` after this happens will have no effect. Make sure you have done all the setup you need in your test case before calling `app()`, or `database()`, `server()`, or `send()`, which call `app()` implicitly. If you need to make database modifications after the app has booted, you can use the regular Eloquent save method, or the `Illuminate\Database\ConnectionInterface` instance obtained via calling the `database()` method. - -::: - -Of course, since this is all based on PHPUnit, you can use the `setUp()` methods of your test classes for common setup tasks. - -Por ejemplo: - -```php -setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. - ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] - ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '

something

'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - - // ... -} -``` - -#### Envío de solicitudes - -A common application of automated testing is pinging various HTTP endpoints with various data, authenticated as different users. You can use this to ensure that: - -- Los usuarios no pueden acceder a contenidos a los que no están autorizados a acceder. -- Las operaciones de creación/edición/borrado basadas en permisos funcionan como se espera. -- El tipo y el esquema de los datos devueltos son correctos. -- Se aplica algún efecto secundario deseado al hacer ping a una API. -- Las operaciones básicas de la API que necesita tu extensión no dan errores y no se rompen cuando haces cambios. - -`TestCase` provides several utilities: - -- El método `request()` construye un objeto de implementación `Psr\Http\Message\ServerRequestInterface` a partir de una ruta, un método, y algunas opciones, que pueden utilizarse para la autenticación, adjuntar cookies, o configurar el cuerpo de la petición JSON. Consulta el [method docblock](https://github.com/flarum/testing/blob/main/src/integration/TestCase.php) para obtener más información sobre las opciones disponibles. -- Una vez que hayas creado una instancia de petición, puedes enviarla (y obtener un objeto de respuesta de vuelta) a través del método `send()`. - -Por ejemplo: - -```php -send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - // ... -} -``` - -:::caution - -If you want to send query parameters in a GET request, you can't include them in the path; you'll need to add them afterwards with the `withQueryParams` method. - -::: - -:::caution - -This is an extreme edge case, but note that MySQL does not update the fulltext index in transactions, so the standard approach won't work if you're trying to test a modified fulltext query. See [core's approach](https://github.com/flarum/framework/blob/main/framework/core/tests/integration/extenders/SimpleFlarumSearchTest.php) for an example of a workaround. - -::: - -#### Pruebas de consola - -If you want to test custom console commands, you can extend `Flarum\Testing\integration\ConsoleTestCase` (which itself extends the regular `Flarum\Testing\integration\TestCase`). It provides 2 useful methods: - -- `$this->console()` devuelve una instancia de `Symfony\Component\Console\Application`. -- `$this->runCommand()` toma un array que será envuelto en `Symfony\Component\ConsoleInput\ArrayInput`, y lo ejecuta. Para más información, consulte el [bloque de documentos de código Symfony](https://github.com/symfony/console/blob/5.x/Input/ArrayInput.php#L22). - -Por ejemplo: - -```php - 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } -} -``` - -### Using Unit Tests - -Unit testing in Flarum uses [PHPUnit](https://phpunit.de/getting-started/phpunit-9.html) and so unit testing in flarum is much like any other PHP application. You can find [general tutorials on testing](https://www.youtube.com/watch?v=9-X_b_fxmRM) if you're also new to php. - -When writing unit tests in Flarum, here are some helpful tips. - -#### Mocking Flarum Services - -Unlike the running app, or even integration tests, there is no app/container/etc to inject service instances into our classes. Now all the useful settings, or helpers your extension use require a _mock_ . We want to limit mocking to just the key services, supporting only the minimum interactions needed to test the contract of our individual functions. - -```php - public function setUp(): void - { - parent::setUp(); - // example - if our setting needs settings, we can mock the settings repository - $settingsRepo = m::mock(SettingsRepositoryInterface::class); - // and then control specific return values for each setting key - $settingsRepo->shouldReceive('get')->with('some-plugin-key')->andReturn('some-value-useful-for-testing'); - // construct your class under test, passing mocked services as needed - $this->serializer = new YourClassUnderTest($settingsRepo); - } -``` - -Some aspects require more mocks. If you're validating authorization interactions for instance you might need to mock your users `User::class` and the request's method that provides them as well! - -``` - $this->actor = m::mock(User::class); - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('getAttribute->getActor')->andReturn($this->actor); - $this->actor->shouldReceive('SOME PERMISSION')->andReturn(true/false); -``` - -NOTE: If you find your extension needs _lots and lots_ of mocks, or mocks that feel unrelated, it might be an opportunity to simplify your code, perhaps moving key logic into their own smaller functions (that dont require mocks). - -## Frontend Tests - -### Configuración - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update frontend testing infrastructure to your code: - -```bash -$ flarum-cli infra frontendTesting -``` - -::: - -First, you need to install the Jest config dev dependency: - -```bash -$ yarn add --dev @flarum/jest-config -``` - -Then, add the following to your `package.json`: - -```json -{ - "type": "module", - "scripts": { - ..., - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" - } -} -``` - -Rename `webpack.config.js` to `webpack.config.cjs`. This is necessary because Jest doesn't support ESM yet. - -Create a `jest.config.cjs` file in the root of your extension: - -```js -module.exports = require('@flarum/jest-config')(); -``` - -If you are using TypeScript, create tsconfig.test.json with the following content: - -```json -{ - "extends": "./tsconfig.json", - "include": ["tests/**/*"], - "files": ["../../../node_modules/@flarum/jest-config/shims.d.ts"] -} -``` - -Then, you will need to set up a file structure for tests: - -``` -js -├── dist -├── src -├── tests -│ ├── unit -│ │ └── functionTest.test.js -│ ├── integration -│ │ └── componentTest.test.js -├── package.json -├── tsconfig.json -├── tsconfig.test.json -├── jest.config.cjs -└── webpack.config.cjs -``` - -#### Flujo de trabajo de pruebas en Github - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - -### Using Unit Tests - -Like any other JS project, you can use Jest to write unit tests for your frontend code. Checkout the [Jest docs](https://jestjs.io/docs/using-matchers) for more information on how to write tests. - -Here's a simple example of a unit test fo core's `abbreviateNumber` function: - -```ts -import abbreviateNumber from '../../../../src/common/utils/abbreviateNumber'; - -test('does not change small numbers', () => { - expect(abbreviateNumber(1)).toBe('1'); -}); - -test('abbreviates large numbers', () => { - expect(abbreviateNumber(1000000)).toBe('1M'); - expect(abbreviateNumber(100500)).toBe('100.5K'); -}); - -test('abbreviates large numbers with decimal places', () => { - expect(abbreviateNumber(100500)).toBe('100.5K'); - expect(abbreviateNumber(13234)).toBe('13.2K'); -}); -``` - -### Uso de las pruebas de integración - -Integration tests are used to test the components of your frontend code and the interaction between different components. For example, you might test that a page component renders the correct content based on certain parameters. - -Here's a simple example of an integration test for core's `Alert` component: - -```ts -import Alert from '../../../../src/common/components/Alert'; -import m from 'mithril'; -import mq from 'mithril-query'; -import { jest } from '@jest/globals'; - -describe('Alert displays as expected', () => { - it('should display alert messages with an icon', () => { - const alert = mq(m(Alert, { type: 'error' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toHaveElement('i.icon'); - }); - - it('should display alert messages with a custom icon when using a title', () => { - const alert = mq(Alert, { type: 'error', icon: 'fas fa-users', title: 'Woops..' }); - expect(alert).toContainRaw('Woops..'); - expect(alert).toHaveElement('i.fas.fa-users'); - }); - - it('should display alert messages with a title', () => { - const alert = mq(m(Alert, { type: 'error', title: 'Error Title' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toContainRaw('Error Title'); - expect(alert).toHaveElement('.Alert-title'); - }); - - it('should display alert messages with custom controls', () => { - const alert = mq(Alert, { type: 'error', controls: [m('button', { className: 'Button--test' }, 'Click me!')] }); - expect(alert).toHaveElement('button.Button--test'); - }); -}); - -describe('Alert is dismissible', () => { - it('should show dismiss button', function () { - const alert = mq(m(Alert, { dismissible: true }, 'Shoot!')); - expect(alert).toHaveElement('button.Alert-dismiss'); - }); - - it('should call ondismiss when dismiss button is clicked', function () { - const ondismiss = jest.fn(); - const alert = mq(Alert, { dismissible: true, ondismiss }); - alert.click('.Alert-dismiss'); - expect(ondismiss).toHaveBeenCalled(); - }); - - it('should not be dismissible if not chosen', function () { - const alert = mq(Alert, { type: 'error', dismissible: false }); - expect(alert).not.toHaveElement('button.Alert-dismiss'); - }); -}); -``` - -#### Methods - -These are the custom methods that are available for mithril component tests: -* **`toHaveElement(selector)`** - Checks if the component has an element that matches the given selector. -* **`toContainRaw(content)`** - Checks if the component HTML contains the given content. - -To negate any of these methods, simply prefix them with `not.`. For example, `expect(alert).not.toHaveElement('button.Alert-dismiss');`. For more information, check out the [Jest docs](https://jestjs.io/docs/using-matchers). For example you may need to check how to [mock functions](https://jestjs.io/docs/mock-functions), or how to use `beforeEach` and `afterEach` to set up and tear down tests. - - - -## E2E Tests - -Coming Soon! diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/theme.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/theme.md deleted file mode 100644 index 197dcee17..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/theme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Inicio rápido - -Flarum "themes" are just extensions. Typically, you'll want to use the `Frontend` extender to register custom [Less](https://lesscss.org/#overview) and JS. Of course, you can use other extenders too: for example, you might want to support settings to allow configuring your theme. - -You can indicate that your extension is a theme by setting the "extra.flarum-extension.category" key to "theme". Por ejemplo: - -```json -{ - // other fields - "extra": { - "flarum-extension": { - "category": "theme" - } - } - // other fields -} -``` - -All this will do is show your extension in the "theme" section in the admin dashboard extension list. - -## Less Variable Customization - -You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. - -## Switching Between Themes - -Flarum doesn't currently have a comprehensive system that would support switching between themes. This is planned for future releases. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/translate.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/translate.md deleted file mode 100644 index 24ab6380b..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/translate.md +++ /dev/null @@ -1,39 +0,0 @@ -# Traducción de Flarum - -### LanguagePack - -Como extensor más simple, el extensor [`LanguagePack`](https://github.com/flarum/core/blob/master/src/Extend/LanguagePack.php) le permite definir que su extensión es un paquete de idiomas. - -Este extensor no tiene setters. Todo lo que tienes que hacer es instanciarlo, asegurarte de que tu paquete de idiomas está en la carpeta `locale`, ¡y ya está! - -Aquí hay un ejemplo rápido de [Flarum English](https://github.com/flarum/lang-english/blob/master/extend.php): - -```php -translator->trans('some.translation', ['{username}' => 'Some Username!'])`). -- There's no support for complex applications (nested pluralization, non-number-based selection) -- As a result of the previous point, genderization is impossible. And that's kinda important for a lot of languages. - -### New System - -In v5, Symfony dropped their proprietary `transChoice` system in favor of the more-or-less standard [ICU MessageFormat](https://symfony.com/doc/5.2/translation/message_format.html). This solves pretty much every single one of the aforementioned issues. In this release, Flarum will be fully switching to ICU MessageFormat as well. What does this mean for extensions? - -- `transChoice` should not be used at all; instead, the variable passed for pluralization should be included in the data. -- Keys for backend translations no longer need to be surrounded by curly braces. -- Translations can now use the [`select` and `plural`](https://symfony.com/doc/5.2/translation/message_format.html) formatter syntaxes. For the `plural` formatter, the `offset` parameter and `#` magic variables are supported. -- These `select` and `plural` syntaxes can be nested to arbitrary depth. This is often a bad idea though (beyond, say, 2 levels), as things can get unnecessarily complex. - -No change to translation file naming is necessary (Symfony docs say that an `+intl-icu` suffix is necessary, but Flarum will now interpret all translation files as internationalized). - -#### Future Changes - -In the future, this will serve as a basis for additional features: - -- Translator preprocessors will allow extensions to modify arguments passed to translations. This will enable genderization (extensions could automatically extract a gender field from any objects of type "user" passed in). -- We could support internationalized "magic variables" for numbers: currently, `one` is supported, but others (`few`, `many`, etc) currently aren't. -- We could support ordinal formatting in additional to just plural formatting. - -#### Changes Needed in Extensions - -The `transChoice` methods in the frontend and backend have been removed. The `trans` method should always be used for translating, regardless of pluralization. If a translation requires pluralization, make sure you pass in the controlling variable as one of the arguments. - -In the frontend, code that looked like this: - -```js -app.translator.transChoice('some-translation', guestCount, {host: hostName}); -``` - -should be changed to: - -```js -// This uses ES6 key-property shorthand notation. {guestCount: guestCount} is equivalent to {guestCount} -app.translator.trans('some-translation', {host: hostName, guestCount }); -``` - -Similarly, in the backend, - -```php -$translator->transChoice('some-translation', $guestCount, ['{host}' => $hostName]); -``` - -should be changed to: - -```php -$translator->trans('some-translation', ['host' => $hostName, 'guestCount' => $guestCount]); -``` - -Note that in the backend, translation keys were previously wrapped in curly braces. This is no longer needed. - -#### Changes Needed in Translations - -Translations that aren't using pluralization don't need any changes. - -Pluralized translations should be changed as follows: - -`For {count} minute|For {count} minutes` - -to - -`{count, plural, one {For # minute} other {For # minutes}}` - -Note that in this example, `count` is the variable that controls pluralization. If a different variable were used (such as guestCount in the example above), this would look like: - -`{guestCount, plural, one {For # minute} other {For # minutes}}` - -See [our i18n docs](i18n.md) for more information. - -### Permissions Changes - -For a long time, the `viewDiscussions` and `viewUserList` permissions have been confusing. Despite their names: - -- `viewDiscussions` controls viewing both discussions and users. -- `viewUserList` controls searching users, not viewing user profiles. - -To clear this up, in v1.0, these permissions have been renamed to `viewForum` and `searchUsers` respectively. A migration in core will automatically adjust all permissions in the database to use the new naming. However, any extension code using the old name must switch to the new ones immediately to avoid security issues. To help the transfer, a warning will be thrown if the old permissions are referenced. - -We have also slightly improved tag scoping for permissions. Currently, permissions can be applied to tags if: - -- The permission is `viewForum` -- The permission is `startDiscussion` -- The permission starts with `discussion.` - -However, this doesn't work for namespaced permissions (`flarum-acme.discussion.bookmark`), or permissions that don't really have anything to do with discussions, but should still be scoped (e.g. `viewTag`). To counter this, a `tagScoped` attribute can be used on the object passed to [`registerPermission`](admin.md) to explicitly indicate whether the permission should be tag scopable. If this attribute is not provided, the current rules will be used to determine whether the permission should be tag scopable. - -## Frontend - -### Tooltip Changes - -The `flarum/common/components/Tooltip` component has been introduced as a simpler and less framework-dependent way to add tooltips. If your code is creating tooltips directly (e.g. via `$.tooltip()` in `oncreate` methods), you should wrap your components in the `Tooltip` component instead. Por ejemplo: - -```tsx - - - -``` - -See [the source code](https://github.com/flarum/core/blob/master/js/src/common/components/Tooltip.tsx) for more examples and instructions. - -See [the PR](https://github.com/flarum/core/pull/2843/files) for examples of how to change existing code to use tooltips. - -### PaginatedListState - -The `flarum/common/states/PaginatedListState` state class has been introduced to abstract away most of the logic of `DiscussionListState` and `NotificationListState`. It provides support for loading and displaying paginated lists of JSON:API resources (usually models). In future releases, we will also provide an `PaginatedList` (or `InfiniteScroll`) component that can be used as a base class for these paginated lists. - -Please see [the source code](https://github.com/flarum/core/blob/master/js/src/common/states/PaginatedListState.ts) for a list of methods. - -Note that `flarum/forum/states/DiscussionListState`'s `empty` and `hasDiscussions` methods have been removed, and replaced with `isEmpty` and `hasItems` respectively. Este es un cambio de última hora. - -### New Loading Spinner - -The old `spin.js` based loading indicator has been replaced with a CSS-based solution. For the most part, no changes should be needed in extensions, but in some cases, you might need to update your spinner. This change also makes it easier to customize the spinner. - -See [this discussion](https://discuss.flarum.org/d/26994-beta16-using-the-new-loading-spinner) for more information. - -### classList util - -Ever wrote messy code trying to put together a list of classes for some component? Well, no longer! The [clsx library](https://www.npmjs.com/package/clsx) is now available as the `flarum/common/utils/classList` util. - -### User List - -An extensible user list has been added to the admin dashboard. In future releases, we hope to extract a generic model table component that can be used to list any model in the admin dashboard. - -See [the source code](https://github.com/flarum/core/blob/master/js/src/admin/components/UserListPage.tsx#L41) for a list of methods to extend, and examples of how columns should look like (can be added by extending the `columns` method and adding items to the [ItemList](frontend.md)). - -### Varios - -- Components should now call `super` for ALL Mithril lifecycle methods they define. Before, this was only needed for `oninit`, `onbeforeupdate`, and `oncreate`. Now, it is also needed in `onupdate`, `onbeforeremove`, and `onremove`. See [this GitHub issue](https://github.com/flarum/core/issues/2446) for information on why this change was made. -- The `flarum/common/utils/insertText` and `flarum/common/utils/styleSelectedText` utils have been moved to core from `flarum/markdown`. See `flarum/markdown` for an example of usage. -- The `extend` and `override` utils can now modify several methods at once by passing in an array of method names instead of a single method name string as the second argument. This is useful for extending the `oncreate` and `onupdate` methods at once. -- The `EditUserModal` component is no longer available through the `flarum/forum` namespace, it has been moved to `flarum/common`. Imports should be adjusted. -- The `Model` and `Route` JS extenders have been removed for now. There aren't currently used in any extensions that we know of. We will be reintroducing JS extenders during v1.x releases. -- The `Search` component can now be used with the `SearchState` state class. Previously, `SearchState` was missing the `getInitialSearch` method expected by the `Search` component. - -## Backend - -### Filesystem Extenders - -In this release, we refactored our use of the filesystem to more consistently use [Laravel's filesystem API](https://laravel.com/docs/8.x/filesystem). Extensions can now declare new disks, more easily use core's `flarum-assets` and `flarum-avatars` disks, and create their own storage drivers, enabling CDN and cloud storage support. - -### Compat and Closure Extenders - -In early Flarum versions, the `extend.php` file allowed arbitrary functions that allowed execution of arbitrary code one extension boot. Por ejemplo: - -```php -return [ - // other extenders - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - } -]; -``` - -This approach was difficult to maintain and provide a well-tested public API for, frequently resolved classes early (breaking all sorts of things), and was not very descriptive. With the extender API completed in beta 16, this approach is no longer necessary. Support for these closures has been removed in this stable version. - -One type of functionality for which the extender replacement isn't obvious is container bindings ([e.g. flarum/pusher](https://github.com/flarum/pusher/blob/v0.1.0-beta.14/extend.php#L33-L49)). This can be done with via the service provider extender (e.g. [a newer version of flarum/pusher](https://github.com/flarum/pusher/blob/master/extend.php#L40-L41)). - -If you are unsure about which extenders should be used to replace your use of callbacks in `extend.php`, or are not sure that such an extender exists, please comment so below or reach out! We're in the final stages of finishing up the extender API, so now is the time to comment. - -### Scheduled Commands - -The [fof/console](https://github.com/FriendsOfFlarum/console) library has been a popular way to schedule commands (e.g. for publishing scheduled posts, running DB-heavy operations, etc) for several release. In Flarum 1.0, this functionality has been brought into core's `Console` extender. See our [console extension documentation](console.md) for more information on how to create schedule commands, and our [console user documentation](../console.md) for more information on how to run scheduled commands. - -### Eager Loading Extender - -As part of solving [N+1 Query issues](https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/) in some [Flarum API endpoints](https://github.com/flarum/core/issues/2637), we have introduced a `load` method on the `ApiController` extender that allows you to indicate relations that should be eager loaded. - -This should be done if you know a relation will always be included, or will always be referenced by controller / permission logic. For example, we will always need the tags of a discussion to check what permissions a user has on that discussion, so we should eager load the discussion's `tags` relationship. Por ejemplo: - -```php -return [ - // other extenders - (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) - ->addInclude(['tags', 'tags.state', 'tags.parent']) - ->load('tags'), -]; -``` - -### RequestUtil - -The `Flarum\Http\RequestUtil`'s `getActor` and `withActor` should be used for getting/setting the actor (user) on requests. `$request->getAttribute('actor')` and `$request->withAttribute('actor')` are deprecated, and will be removed in v2.0. - -### Varios - -- The `Formatter` extender now has an `unparse` method that allows modifying XML before unparsing content. -- All route names must now be unique. In beta 16, uniqueness was enforced per-method; now, it is mandatory for all routes. -- API requests sent through `Flarum\Api\Client` now run through middleware, including `ThrottleApi`. This means that it is now possible to throttle login/registration calls. -- In beta 16, registering custom [searchers](search.md) was broken. It has been fixed in stable. -- The `post_likes` table in the [flarum/likes](https://github.com/flarum/likes) extension now logs the timestamp when likes were created. This isn't used in the extension, but could be used in other extensions for analytics. -- The `help` attribute of [admin settings](admin.md) no longer disappears on click. -- The `generate:migration` console command has been removed. The [Flarum CLI](https://discuss.flarum.org/d/26525-rfc-flarum-cli-alpha) should be used instead. -- The `GambitManager` util class is now considered internal API, and should not be used directly by extensions. -- The `session` attribute is no longer available on the `User` class. This caused issues with queue drivers, and was not conceptually correct (a user can have multiple sessions). The current session is still available via the `$request` instance. -- The `app`, `base_path`, `public_path`, `storage_path`, and `event` global helpers have been restored, but deprecated perpetually. These exist in case Laravel packages need them; they **should not** be used directly by Flarum extension code. The `flarum/laravel-helpers` package has been abandoned. -- The following deprecated features from beta 16 have been removed: - - The `TextEditor`, `TextEditorButton`, and `SuperTextarea` components are no longer exported through the `flarum/forum` namespace, but through `flarum/common` (with the exception of `SuperTextarea`, which has been replaced with `flarum/common/utils/BasicEditorDriver`). - - Support for `Symfony\Component\Translation\TranslatorInterface` has been removed, `Symfony\Contracts\Translation\TranslatorInterface` should be used instead. - - All backwards compatibility layers for the [beta 16 access token refactors](update-b16.md#access-token-and-authentication-changes) have been removed - - The `GetModelIsPrivate` event has been removed. The `ModelPrivate` extender should be used instead. - - The `Searching` (for both `User` and `Discussion` models), `ConfigureAbstractGambits`, `ConfigureDiscussionGambits`, and `ConfigureUserGambits` events have been removed. The `SimpleFlarumSearch` extender should be used instead. - - The `ConfigurePostsQuery` event has been removed. The `Filter` extender should be used instead. - - The `ApiSerializer` extender's `mutate` method has been removed. The same class's `attributes` method should be used instead. - - The `SearchCriteria` and `SearchResults` util classes have been removed. `Flarum\Query\QueryCriteria` and `Flarum\Query\QueryResults` should be used instead. - - The `pattern` property of `AbstractRegexGambit` has been removed; the `getGambitPattern` method is now a required abstract method. - - The `AbstractSearch` util class has been removed. `Flarum\Search\SearchState` and `Flarum\Filter\FilterState` should be used instead. - - The `CheckingPassword` event has been removed, the `Auth` extender should be used instead. - -## Tags Extension Changes - -As mentioned above, [tag scopable permissions](#permissions-changes) can now be explicitly declared. - -We've also made several big refactors to significantly improve tags performance. - -Firstly, the [Tag](https://github.com/flarum/tags/blob/d093ca777ba81f826157522c96680717d3a90e24/src/Tag.php#L38-L38) model's static `getIdsWhereCan` and `getIdsWhereCannot` methods have been removed. These methods scaled horribly on forums with many tags, sometimes adding several seconds to response time. - -These methods have been replaced with a `whereHasPermission` [Eloquent dynamic scope](https://laravel.com/docs/8.x/eloquent#dynamic-scopes) that returns a query. Por ejemplo: - -`Tag::whereHasPermission($actor, 'viewDiscussions)`. - -That query can then be used in other DB queries, or further constricted to retrieve individual tags. - -Secondly, we no longer load in all tags as part of the initial payload. The initial payload contains all top-level primary tags, and the top 3 secondary tags. Other tags are loaded in as needed. Future releases will paginate secondary tags. This should enable forums to have thousands of secondary tags without significant performance impacts. These changes mean that extensions should not assume that all tags are available in the model store. - -## Testing Library Changes - -- Bundled extensions will not be automatically enabled; all enabled extensions must be specified in that test case. -- `setting` and `config` methods have been added that allow configuring settings and config.php values before the tested application boots. See [the testing docs](testing.md) for more information. -- The `php flarum test:setup` command will now drop the existing test DB tables before creating the database. This means that you can run `php flarum test:setup` to ensure a clean database without needing to go into the database and drop tables manually. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-1_x.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-1_x.md deleted file mode 100644 index ed17364ed..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-1_x.md +++ /dev/null @@ -1,139 +0,0 @@ -# Updating For 1.x - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## 1.7 - -### Frontend - -- Frontend extenders similar to the backend have been added, we highly recommend using them instead of the old method (https://docs.flarum.org/extend/models#adding-new-models-1), (https://docs.flarum.org/extend/routes#frontend-routes). -- There is a new tag selection component (https://github.com/flarum/framework/blob/360a2ba1d886df3fc6d326be932c5431ee9df8cf/extensions/tags/js/src/common/components/TagSelectionModal.tsx). - -### Backend - -- Support for php 8.2, deprecations are still thrown by some packages, the testing workflow has been updated to ignore deprecations on 8.2 -- The `/api` endpoint now contains the actor as an included relationship. -- The `Model::dateAttribute($attribute)` extender is deprecated, use `Model::cast($attribute, 'datetime')` instead. - -### Tooling - -- New `phpstan` package to run static code analysis on your extensions for code safety (https://docs.flarum.org/extend/static-code-analysis). -- New `jest-config` package to run frontend unit and component tests (https://docs.flarum.org/extend/testing). - -## 1.6 Changes - -### Backend - -- Added customizable session drivers through the `Session` extender. - -## 1.5 Changes - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Modals can be used in stacks, allowing for multiple modals to be open at once. This is useful for modals that open other modals: `app.modal.show(ModalComponent, { attrs }, true)`. - -### Backend - -- There is a new `createTableIfNotExists` migration helper, which can be used to create tables only if they don't already exist. - -## 1.4 Changes - -No developer-facing changes were made in Flarum v1.4. - -## 1.3 Changes - -Flarum v1.3 included mostly QoL improvements. Below are listed note worthy changes for extension developers: - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Frontend errors will no longer cause the forum to crash into a NoJs page. The extension will fail to execute its frontend code (initializer) and display an error to the admin through an alert, and to all users through the console. The frontend will continue to execute without the extension's frontend changes. -- The markdown toolbar can now be used on the admin side. - -### Backend - -- Calculation of the `number` attribute on `posts` has changed and no longer relies on the discussion model's `post_number_index` attribute which is now deprecated and will be removed in 2.0 -- Extension event listeners are now added after core even listeners, this should generally cause no changes in behavior. - -### Tooling - -- The backend tests workflow now automatically fails tests if there are any PHP warnings and notices. - -## 1.2 Changes - -Flarum v1.2 included quite a few bugfixes, internal refactors, and new features. The following recaps the most important changes for extension developers: - -### Frontend - -- Flarum core now passes TypeScript type checking (on the portion written in TypeScript). Additionally, major portions of the frontend (models, the application instance, and others) are now written in TypeScript. These changes should make it much easier and more fruitful to write extensions in TypeScript. -- Instead of directly using Less variables in CSS code, core now uses CSS variables. For the most part, we've just created CSS variables and set their values to the Less variables. This should make theming and customizing CSS a lot easier. https://github.com/flarum/core/pull/3146. -- Dropdowns can now be lazy-drawn to improve performance. You can do this by setting the lazy draw attr to "true". https://github.com/flarum/core/pull/2925. -- [Textarea-type settings](https://github.com/flarum/core/pull/3141) are now supported through the `app.extensionData.registerSetting` util. -- You can now use Webpack 5 to bundle your extension's code. This will offer minor bundle size improvements. -- A new `flarum/common/components/ColorPreviewInput` component [has been added](https://github.com/flarum/core/pull/3140). It can be used directly, or through the `color-preview` type when registered via `app.extensionData.registerSetting`. -- Extensions can now [modify the minimum search length](https://github.com/flarum/core/pull/3130) of the `Search` component. -- The following components are now extensible: - - The "colors" part of the Appearance page in the admin dashboard: https://github.com/flarum/core/pull/3186 - - The `StatusWidget` dropdown in the admin dashboard: https://github.com/flarum/core/pull/3189 - - `primaryControls` in the notification list: https://github.com/flarum/core/pull/3204 -- Extensions now have finer control over positioning when adding elements to the DiscussionPage sidebar items: https://github.com/flarum/core/pull/3165 -- - -### Backend - -- An [extender for settings defaults](https://github.com/flarum/core/pull/3127) has been added. This should be used instead of the `addSettings` migration helper, which has been deprecated. -- You can now [generate Less variables from setting values](https://github.com/flarum/core/pull/3011) via the `Settings` extender. -- Extensions can now [override/supplement blade template namespaces](https://github.com/flarum/core/pull/3167) through the `View` extender, meaning custom blade templates can be used instead of the default ones added by core or extensions. -- You can now define [custom Less functions through PHP](https://github.com/flarum/core/pull/3190), allowing you to use some backend logic in your Less theming. -- Extensions can now create [custom page title drivers](https://github.com/flarum/core/pull/3109/files) for titles in server-returned HTML. -- Custom logic can now be used when [deciding which relations to eager-load](https://github.com/flarum/core/pull/3116). -- Events [are now dispatched](https://github.com/flarum/core/pull/3203) for the `Notification\Read` and `Notification\ReadAll` events. -- An `ImageManager` instance is now [bound into the container](https://github.com/flarum/core/pull/3195), and can be configured to use either the `gd` or `imagick` backing drivers via the `"intervention.driver"` key in `config.php`. -- User IP addresses are now passed to the [API Client](https://github.com/flarum/core/pull/3124). -- A custom revision versioner implentation [can be set via container bindings](https://github.com/flarum/core/pull/3183) to customize how asset versions are named. -- A SlugManager instance [is now available](https://github.com/flarum/core/pull/3194) in blade templates via the `slugManager` variable. - -### Misc - -- Translations now support the `zero`, `one`, `two`, `few`, and `many` localized plural rules for `plural` ICU MessageFormat translations. This was done through the [`Intl.PluralRules` helper](https://github.com/flarum/core/issues/3072). -- Translations are now used for page titles, so that the format can be customized via language packs or [Linguist](https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease): https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228 -- API endpoints for retrieving single groups, as well as support for filtering groups on the plural get endpoint, [have been added](https://github.com/flarum/core/pull/3084). - - -### Tooling - - -- The `flarum-cli infra` command can now be used to update or enable various infrastructure features. You can now add the following to your extension in just one command: - - TypeScript - - Prettier for JS/TS formatting - - Backend testing with PHPUnit - - Code formatting with StyleCI - - EditorConfig support - - GitHub actions for automating testing, linting, type checking, and building. -- You can also exclude any files from these updates by adding their relative path to the "extra.flarum-cli" key's array in your extension's `composer.json` file. For example, if you wanted to exclude your tsconfig file from any updates by the infra system, the "extra.flarum-cli" key's value should be `["js/tsconfig.json"]`. -- The `flarum-cli audit infra` can be used to check that all infra modules your extension uses are up to date. The `--fix` flag can be used to automatically fix any issues, which has essentially the same effect as running `flarum-cli infra` for each outdated module. -- All `flarum-cli` commands can now be run with a `--no-interaction` flag to prevent prompts. Defaults will be used when possible, and errors will be thrown if a prompt is needed and there is no default. -- Frontend GH actions now support type-checking, as well as type coverage reports. - -## 1.1 Changes - -Flarum version 1.1 mostly focuses on bugfixes and quality-of-life improvements following our stable release earlier this year. These are mainly user-facing and internal infrastructure changes, so extensions are not significantly affected. - -### Frontend - -- Flarum now has an organization-wide prettier config package under [`@flarum/prettier-config`](https://github.com/flarum/prettier-config). -- Most custom (setting or data based) coloring in core is now done via [CSS custom properties](https://github.com/flarum/core/pull/3001). -- Typehinting for Flarum's globals are now [supported in extensions](https://github.com/flarum/core/pull/2992). -- You can now pass extra attrs to the `Select` component, and they will be [passed through to the DOM](https://github.com/flarum/core/pull/2959). -- The `DiscussionPage` component is now organized [as an item list](https://github.com/flarum/core/pull/3004), so it's easier for extensions to change its content. -- Extensions [can now edit](https://github.com/flarum/core/pull/2935) the `page` parameter of `PaginatedListState`. - -### Backend - -- Flarum now comes with a [Preload extender](https://github.com/flarum/core/pull/3057) for preloading any custom frontend assets. -- A new [Theme](https://github.com/flarum/core/pull/3008) extender now allows overriding Less files and internal imports. This allows themes to more easily completely replace Less modules. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b10.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b10.md deleted file mode 100644 index aaa98a2a5..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b10.md +++ /dev/null @@ -1,53 +0,0 @@ -# Updating For Beta 10 - -Beta 10 further solidifies the core architecture, offering new extenders as a stable, use-case-driven API for extending Flarum's core. A few small changes may necessitate updates to your extensions to make them compatible with Beta 10. These are detailed below. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- The `Flarum\Event\GetDisplayName` class has been moved to `Flarum\User\Event\GetDisplayName`. -- The `Flarum\Http\Exception\ForbiddenException` has been removed. Use `Flarum\User\Exception\PermissionDeniedException` instead. -- The `assertGuest()` method of the `Flarum\User\AssertPermissionTrait` has been removed without replacement. -- Old error handling middleware and exception handler classes were removed (see "New Features" for more details): - - `Flarum\Api\Middleware\HandleErrors` - - `Flarum\Http\Middleware\HandleErrorsWithView` - - `Flarum\Http\Middleware\HandleErrorsWithWhoops` - - `Flarum\Api\ErrorHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FloodingExceptionHandler` - - `Flarum\Api\ExceptionHandler\IlluminateValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidAccessTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidConfirmationTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\MethodNotAllowedExceptionHandler` - - `Flarum\Api\ExceptionHandler\ModelNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\PermissionDeniedExceptionHandler` - - `Flarum\Api\ExceptionHandler\RouteNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\TokenMismatchExceptionHandler` - - `Flarum\Api\ExceptionHandler\ValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - -## Recommendations - -- We tweaked the [recommended flarum/core version constraints for extensions](start.md#composer-json). We now recommend you mark your extension as compatible with the current and the upcoming beta release. (For beta.10, that would be any beta.10.x and beta.11.x version.) The core team will strive to make this work well by deprecating features before removing them. More details on this change in [this pull request](https://github.com/flarum/docs/pull/75). - -## New Features - -- New, extensible **error handling** stack in the `Flarum\Foundation\ErrorHandling` namespace: The `Registry` maps exceptions to "types" and HTTP status codes, `HttpFormatter` instances turn them into HTTP responses. Finally, `Reporter` instances are notified about unknown exceptions. - - You can build custom exception classes that will abort the current request (or console command). If they have semantic meaning to your application, they should implement the `Flarum\Foundation\KnownError` interface, which exposes a "type" that is used to render pretty error pages or dedicated error messages. - - More consistent use of HTTP 401 and 403 status codes. HTTP 401 should be used when logging in (i.e. authenticating) could make a difference; HTTP 403 is reserved for requests that fail because the already authenticated user is lacking permissions to do something. - - The `assertRegistered()` and `assertPermission()` methods of the `Flarum\User\AssertPermissionTrait` trait have been changed to match above semantics. See [this pull request](https://github.com/flarum/core/pull/1854) for more details. - - Error views are now determined based on error "type", not on status code (see [bdac88b](https://github.com/flarum/core/commit/bdac88b5733643b9c5dabae9e09a64d9f6e41d58)) -- **Queue support**: This release incorporates Laravel's illuminate/queue package, which allows offloading long-running tasks (such as email sending or regular cleanup jobs) onto a dedicated worker process. These changes are mostly under the hood, the next release(s) will start using the queue system for sending emails. By default, Flarum will use the "sync" queue driver, which executes queued tasks immediately. This is far from ideal and mostly guarantees a hassle-free setups. Production-grade Flarum installs are expected to upgrade to a more full-featured queue adapter. -- The `Flarum\Extend\LanguagePack` now accepts an optional path in its constructor. That way, language packs can store their locales in a different directory if they want to. -- The `formatContent()` method of `Flarum\Post\CommentPost` can now be called without an HTTP request instance, e.g. when rendering a post in an email template. - -## Deprecations - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- Laravel's global string and array helpers (e.g. `str_contains()` and `array_only()`) are deprecated in favor of their class based alternatives (`Illuminate\Support\Str::contains()` and `Illuminate\Support\Arr::only()`). See the [announcement](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers) and [pull request](https://github.com/laravel/framework/pull/26898) for more information. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b12.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b12.md deleted file mode 100644 index ce6b1aca2..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b12.md +++ /dev/null @@ -1,34 +0,0 @@ -# Updating For Beta 12 - -Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Deprecations / Upcoming breaking changes - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- PHP 7.1 support will be dropped in beta.13. -- Using library classes from the `Zend` namespace is now deprecated and will be removed in beta.13. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been deprecated. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been deprecated. We finally have a [proper replacement](middleware.md) - see "New Features" below. Therefore, it will be removed in beta.13. -- If you implement the `Flarum\Mail\DriverInterface`: - - Returning a plain array of field names from the `availableSettings()` method is deprecated, but still supported. It must now return an array of field names mapping to their type. See [the inline documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L25-L32) for more details. - - Implement the `validate()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L34-L48). - - Implement the `canSend()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L50-L54). - -## New Features - -- New **PHP extenders**: - - `Flarum\Extend\Middleware` offers methods for adding, removing or replacing middleware in our three middleware stacks (api, forum, admin). We also added [documentation](middleware.md) for this feature. - - `Flarum\Extend\ErrorHandling` lets you configure status codes and other aspects of our error handling stack depending on error types or exception classes. -- **JavaScript**: - - The `flarum/components/Select` component now supports a `disabled` prop. See [PR #1978](https://github.com/flarum/core/pull/1978). - -## Other changes / Recommendations - -- The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b13.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b13.md deleted file mode 100644 index 1b19a9714..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b13.md +++ /dev/null @@ -1,40 +0,0 @@ -# Updating For Beta 13 - -Beta 13 ships with several new extenders to simplify building and maintaining extensions. We do our best to create backward compatibility changes. We recommend changing to new Extenders as soon as they are available. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- Dropped support for PHP 7.1. -- Classes from the `Zend` namespace are now removed. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been removed including the class. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been removed. Use the [proper replacement](middleware.md). -- Several events used in Event Listeners have been removed, use their [replacement extender](start.md#extenders) instead. -- The LanguagePack extender only loads keys from extensions that are enabled. The translations loaded are based on the yaml files matching the [i18n namespace](i18n.md#appendix-a-standard-key-format). -- All notifications are now sent through the queue; without a queue driver they will run as usual. -- The implementation of avatar upload changed, we're [no longer storing files temporarily on disk](https://github.com/flarum/core/pull/2117). -- The SES mail driver [has been removed](https://github.com/flarum/core/pull/2011). -- Mail driver backward compatibility from beta 12 has been removed, use the new Mail extender or implement the [modified interface](https://github.com/flarum/core/blob/master/src/Mail/DriverInterface.php). - -## Recommendations - -- Beta 14 will ship with a rewrite in the frontend (javascript). If you're building for that release, make sure to follow our [progress](https://github.com/flarum/core/pull/2126). - -## New Features - -- A ton of new extenders: - - [Middleware extender](https://github.com/flarum/core/pull/2017) - - [Console extender](https://github.com/flarum/core/pull/2057) - - [CSRF extender](https://github.com/flarum/core/pull/2095) - - [Event extender](https://github.com/flarum/core/pull/2097) - - [Mail extender](https://github.com/flarum/core/pull/2012) - - [Model extender](https://github.com/flarum/core/pull/2100) - -## Deprecations - -- Several events [have been marked deprecated](https://github.com/flarum/core/commit/4efdd2a4f2458c8703aae654f95c6958e3f7b60b) to be removed in beta 14. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b14.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b14.md deleted file mode 100644 index e06c15e8f..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b14.md +++ /dev/null @@ -1,757 +0,0 @@ -# Updating For Beta 14 - -This release brings a large chunk of breaking changes - hopefully the last chunk of this size before our stable release. In order to prepare the codebase for the upcoming stable release, we decided it was time to modernize / upgrade / exchange some of the underlying JavaScript libraries that are used in the frontend. Due to the nature and size of these upgrades, we have to pass on some of the breaking changes to you, our extension developers. - -On the bright side, this overdue upgrade brings us closer to the conventions of best practices of [Mithril.js](https://mithril.js.org/), the mini-framework used for Flarum's UI. Mithril's 2.0 release sports a more consistent component interface, which should be a solid foundation for years to come. Where possible, we replicated old APIs, to ease the upgrade and give you time to do the full transition. Quite a few breaking changes remain, though - read more below. - -:::tip - -If you need help with the upgrade, our friendly community will gladly help you out either [on the forum](https://discuss.flarum.org/t/extensibility) or [in chat](https://flarum.org/chat/). - -::: - -To ease the process, we've clearly separated the changes to the [frontend (JS)](#frontend-javascript) from those in the [backend (PHP)](#backend-php) below. If your extension does not change the UI, consider yourself lucky. :-) - -A [summary of the frontend changes](#required-frontend-changes-recap) is available towards the end of this guide. - -## Frontend (JavaScript) - -### Mithril 2.0: Concepts - -Most breaking changes required by beta 14 are prompted by changes in Mithril 2. [Mithril's upgrade guide](https://mithril.js.org/migration-v02x.html) is an extremely useful resource, and should be consulted for more detailed information. A few key changes are explained below: - -#### props -> attrs; initProps -> initAttrs - -Props passed into component are now referred to as `attrs`, and can be accessed via `this.attrs` where you would prior use `this.props`. This was done to be closer to Mithril's preferred terminology. We have provided a temporary backwards compatibility layer for `this.props`, but recommend using `this.attrs`. - -Accordingly, `initProps` has been replaced with `initAttrs`, with a similar BC layer. - -#### m.prop -> `flarum/utils/Stream` - -Mithril streams, which were available via `m.prop` in Mithril 0.2, are now available via `flarum/utils/Stream`. `m.prop` will still work for now due to a temporary BC layer. - -#### m.withAttr -> withAttr - -The `m.withAttr` util has been removed from Mithril. We have provided `flarum/utils/withAttr`, which does the same thing. A temporary BC layer has been added for `m.withAttr`. - -#### Lifecycle Hooks - -In mithril 0.2, we had 2 "lifecycle hooks": - -`init`, an unofficial hook which ran when the component instance was initialized. - -`config`, which ran when components were created, and on every redraw. - - -Mithril 2 has the following hooks; each of which take `vnode` as an argument: - -- `oninit` -- `oncreate` -- `onbeforeupdate` -- `onupdate` -- `onbeforeremove` -- `onremove` - -Please note that if your component is extending Flarum's helper `Component` class, you must call `super.METHOD(vnode)` if using `oninit`, `oncreate`, and `onbeforeupdate`. - -More information about what each of these do can be found [in Mithril's documentation](https://mithril.js.org/lifecycle-methods.html). - -A trivial example of how the old methods map to the new is: - -```js -class OldMithrilComponent extends Component { - init() { - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - config(element, isInitialized) { - console.log('Code to run on every redraw AND when the element is first attached'); - - if (isInitialized) return; - - console.log('Code to execute only once when components are first created and attached to the DOM'); - - context.onunload = () => { - console.log('Code to run when the component is removed from the DOM'); - } - } - - view() { - // In mithril 0, you could skip redrawing a component (or part of a component) by returning a subtree retain directive. - // See https://mithril.js.org/archive/v0.2.5/mithril.render.html#subtree-directives - // dontRedraw is a substitute for logic; usually, this is used together with SubtreeRetainer. - if (dontRedraw()) return { subtree: 'retain' }; - - return

Hello World!

; - } -} - -class NewMithrilComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - oncreate(vnode) { - super.oncreate(vnode); - - console.log('Code to run when components are first created and attached to the DOM'); - } - - onbeforeupdate(vnode, oldVnode) { - super.onbeforeupdate(vnode); - - console.log('Code to run BEFORE diffing / redrawing components on every redraw'); - - // In mithril 2, if we want to skip diffing / redrawing a component, we return "false" in its onbeforeupdate lifecycle hook. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeupdate - // This is also typically used with SubtreeRetainer. - if (dontRedraw()) return false; - } - - onupdate(vnode) { - // Unlike config, this does NOT run when components are first attached. - // Some code might need to be replicated between oncreate and onupdate. - console.log('Code to run on every redraw AFTER the DOM is updated.'); - } - - onbeforeremove(vnode) { - // This is run before components are removed from the DOM. - // If a promise is returned, the DOM element will only be removed when the - // promise completes. It is only called on the top-level component that has - // been removed. It has no equivalent in Mithril 0.2. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeremove - return Promise.resolve(); - } - - onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); - } -} -``` - -#### Children vs Text Nodes - -In Mithril 0.2, every child of a vnode is another vnode, stored in `vnode.children`. For Mithril 2, as a performance optimization, vnodes with a single text child now store that text directly in `vnode.text`. For developers, that means that `vnode.children` might not always contain the results needed. Luckily, text being stored in `vnode.text` vs `vnode.children` will be the same each time for a given component, but developers should be aware that at times, they might need to use `vnode.text` and not `vnode.children`. - -Please see [the mithril documentation](https://mithril.js.org/vnodes.html#structure) for more information on vnode structure. - -#### Routing API - -Mithril 2 introduces a few changes in the routing API. Most of these are quite simple: - -- `m.route()` to get the current route has been replaced by `m.route.get()` -- `m.route(NEW_ROUTE)` to set a new route has been replaced by `m.route.set(NEW_ROUTE)` -- When registering new routes, a component class should be provided, not a component instance. - -Por ejemplo: - -```js -// Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } - -// Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } -``` - -Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. - -```js -// Mithril 0.2 -
Link Content - -// Mithril 2 -import Link from 'flarum/components/Link'; - -Link Content -``` - -You can also use `Link` to define external links, which will just render as plain `Children` html links. - -For a full list of routing-related changes, please see [the mithril documentation](https://mithril.js.org/migration-v02x.html). - -#### Redraw API - -Mithril 2 introduces a few changes in the redraw API. Most of these are quite simple: - -- Instead of `m.redraw(true)` for synchronous redraws, use `m.redraw.sync()` -- Instead of `m.lazyRedraw()`, use `m.redraw()` - -Remember that Mithril automatically triggers a redraw after DOM event handlers. The API for preventing a redraw has also changed: - -```js -// Mithril 0.2 - - -// Mithril 2 - -``` - -#### AJAX - -The `data` parameter of `m.request({...})` has been split up into `body` and `params`. - -For examples and other AJAX changes, see [the mithril documentation](https://mithril.js.org/migration-v02x.html#mrequest). - -#### Promises - -`m.deferred` has been removed, native promises should be used instead. Por ejemplo: - -```js -// Mithril 0.2 -const deferred = m.deferred(); - -app.store.find('posts').then(result => deferred.resolve(result)); - -return deferred.promise; - -// Mithril 2 -return app.store.find('posts'); -``` - -#### Component instances should not be stored - -Due to optimizations in Mithril's redrawing algorithms, [component instances should not be stored](https://mithril.js.org/components.html#define-components-statically,-call-them-dynamically). - -So whereas before, you might have done something like: - -```js -class ChildComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return

{this.counter}

; - } -} -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.child = new ChildComponent(); - } - - view() { - return ( -
- - {this.child.render()} -
- ) - } -} -``` - -That will no longer work. In fact; the Component class no longer has a render method. - -Instead, any data needed by a child component that is modified by a parent component should be passed in as an attr. Por ejemplo: - -```js -class ChildComponent extends Component { - view() { - return

{this.attrs.counter}

; - } -} - -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return ( -
- - -
- ) - } -} -``` - -For more complex components, this might require some reorganization of code. For instance, let's say you have data that can be modified by several unrelated components. In this case, it might be preferable to create a POJO "state instance' for this data. These states are similar to "service" singletons used in Angular and Ember. Por ejemplo: - -```js -class Counter { - constructor() { - this._counter = 0; - } - - increaseCounter() { - this._counter += 1; - } - - getCount() { - return this._counter; - } -} - -app.counter = new Counter(); - -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', -
-

Counter: {app.counter.getCount()}

-
- ); -}) - -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', -
- -
- ); -}) -``` - -This "state pattern" can be found throughout core. Some non-trivial examples are: - -- PageState -- SearchState and GlobalSearchState -- NotificationListState -- DiscussionListState - -### Changes in Core - -#### Modales - -Previously, modals could be opened by providing a `Modal` component instance: - -```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); -``` - -Since we don't store component instances anymore, we pass in the component class and any attrs separately. - -```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); -``` - -The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. Any modifications by extensions should accordingly be done to `ModalManagerState`. - -#### Alertas - -Previously, alerts could be opened by providing an `Alert` component instance: - -```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); -``` - -Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: - -```js -app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); -``` - -Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. This replaces the old method of passing the alert instance itself to `dismiss`. - -The `show`, `dismiss`, and `clear` methods are still available through `app.alerts`, but `app.alerts` now points to an instance of `AlertManagerState`, not of the `AlertManager` component. Any modifications by extensions should accordingly be done to `AlertManagerState`. - -#### Composer - -Since we don't store a component instances anymore, a number of util methods from `Composer`, `ComposerBody` (and it's subclasses), and `TextEditor` have been moved onto `ComposerState`. - -For `forum/components/Composer`, `isFullScreen`, `load`, `clear`, `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen` have been moved to `forum/states/ComposerState`. They all remain accessible via `app.composer.METHOD` - -A `bodyMatches` method has been added to `forum/states/ComposerState`, letting you check whether a certain subclass of `ComposerBody` is currently open. - -Various input fields are now stored as [Mithril Streams](https://mithril.js.org/stream.html) in `app.composer.fields`. For instance, to get the current composer content, you could use `app.composer.fields.content()`. Previously, it was available on `app.composer.component.content()`. **This is a convention that `ComposerBody` subclasses that add inputs should follow.** - -`app.composer.component` is no longer available. - -- Instead of `app.composer.component instanceof X`, use `app.composer.bodyMatches(X)`. -- Instead of `app.composer.component.props`, use `app.composer.body.attrs`. -- Instead of `app.composer.component.editor`, use `app.composer.editor`. - -For `forum/components/TextEditor`, the `setValue`, `moveCursorTo`, `getSelectionRange`, `insertAtCursor`, `insertAt`, `insertBetween`, `replaceBeforeCursor`, `insertBetween` methods have been moved to `forum/components/SuperTextarea`. - -Also for `forum/components/TextEditor`, `this.disabled` is no longer used; `disabled` is passed in as an attr instead. It may be accessed externally via `app.composer.body.attrs.disabled`. - -Similarly to Modals and Alerts, `app.composer.load` no longer accepts a component instance. Instead, pass in the body class and any attrs. For instance, - -```js -// Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); - -// Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) -``` - -Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. - -#### Widget and DashboardWidget - -The redundant `admin/components/Widget` component has been removed. `admin/components/DashboardWidget` should be used instead. - -#### NotificationList - -For `forum/components/NotificationList`, the `clear`, `load`, `loadMore`, `parseResults`, and `markAllAsRead` methods have been moved to `forum/states/NotificationListState`. - -Methods for `isLoading` and `hasMoreResults` have been added to `forum/states/NotificationListState`. - -`app.cache.notifications` is no longer available; `app.notifications` (which points to an instance of `NotificationListState`) should be used instead. - -#### Checkbox - -Loading state in the `common/components/Checkbox` component is no longer managed through `this.loading`; it is now passed in as a prop (`this.attrs.loading`). - -#### Preference Saver - -The `preferenceSaver` method of `forum/components/SettingsPage` has been removed without replacement. This is done to avoid saving component instances. Instead, preferences should be directly saved. Por ejemplo: - -```js -// Old way -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value, component) => { - this.user.pushAttributes({ lastSeenAt: null }); - this.preferenceSaver('discloseOnline')(value, component); - }, -}) - -// Without preferenceSaver -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value) => { - this.discloseOnlineLoading = true; - - this.user.savePreferences({ discloseOnline: value }).then(() => { - this.discloseOnlineLoading = false; - m.redraw(); - }); - }, - loading: this.discloseOnlineLoading, -}) -``` - -A replacement will eventually be introduced. - -#### DiscussionListState - -For `forum/components/DiscussionList`, the `requestParams`, `sortMap`, `refresh`, `loadResults`, `loadMore`, `parseResults`, `removeDiscussion`, and `addDiscussion` methods have been moved to `forum/states/DiscussionListState`. - -Methods for `hasDiscussions`, `isLoading`, `isSearchResults`, and `empty` have been added to `forum/states/DiscussionListState`. - -`app.cache.discussions` is no longer available; `app.discussions` (which points to an instance of `DiscussionListState`) should be used instead. - -#### PageState - -`app.current` and `app.previous` no longer represent component instances, they are now instances of the `common/states/PageState` class. This means that: - -- Instead of `app.current instanceof X`, use `app.current.matches(X)` -- Instead of `app.current.PROPERTY`, use `app.current.get('PROPERTY')`. Please note that all properties must be exposed EXPLICITLY via `app.current.set('PROPERTY', VALUE)`. - -#### PostStream - -Logic from `forum/components/PostStreamScrubber`'s `update` method has been moved to `forum/components/PostStream`'s `updateScrubber` method. - -For `forum/components/PostStream`, the `update`, `goToFirst`, `goToLast`, `goToNumber`, `goToIndex`, `loadNearNumber`, `loadNearIndex`, `loadNext`, `loadPrevious`, `loadPage`, `loadRange`, `show`, `posts`, `reset`, `count`, and `sanitizeIndex` methods have been moved to `forum/states/PostStreamState`. - -Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStreamState`. - -#### SearchState and GlobalSearchState - -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. - -At the minimum, `SearchState` contains the following methods: - -- getValue -- setValue -- clear -- cache (adds a searched value to cache, meaning that we don't need to search for its results again) -- isCached (checks if a value has been searched for before) - -All of these methods have been moved from `Search` to `SearchState`. Additionally, Search's `stickyParams`, `params`, `changeSort`, `getInitialSearch`, and `clearInitialSearch` methods have been moved to `forum/states/GlobalSearchState`, which is now available via `app.search`. - -To use a custom search, you'll want to: - -1. Possibly create a custom subclass of `SearchState` -2. Create a custom subclass of `Search`, which overrides the `selectResult` method to handle selecting results as needed by your use case, and modify the `sourceItems` methods to contain the search sources you need. - -#### moment -> dayjs - -The `moment` library has been removed, and replaced by the `dayjs` library. The global `moment` can still be used for now, but is deprecated. `moment` and `dayjs` have very similar APIs, so very few changes will be needed. Please see the dayjs documentation [for more information](https://day.js.org/en/) on how to use it. - -#### Subtree Retainer - -`SubtreeRetainer` is a util class that makes it easier to avoid unnecessary redraws by keeping track of some pieces of data. When called, it checks if any of the data has changed; if not, it indicates that a redraw is not necessary. - -In mithril 0.2, its `retain` method returned a [subtree retain directive](https://mithril.js.org/archive/v0.1.25/mithril.render.html#subtree-directives) if no redraw was necessary. - -In mithril 2, we use its `needsRebuild` method in combination with `onbeforeupdate`. Por ejemplo: - -```js -class CustomComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - this.showContent = false; - - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) - } - - onbeforeupdate() { - // If needsRebuild returns true, mithril will diff and redraw the vnode as usual. Otherwise, it will skip this redraw cycle. - // In this example, this means that this component and its children will only be redrawn when extra content is toggled. - return this.subtree.needsRebuild(); - } - - view(vnode) { - return
- -

Hello World!{this.showContent ? ' Extra Content!' : ''}

-
; - } -} -``` - -#### attrs() method - -Previously, some components would have an attrs() method, which provided an extensible way to provide attrs to the top-level child vnode returned by `view()`. For instance, - -```js -class CustomComponent extends Component { - view() { - return

Hello World!

; - } - - attrs() { - return { - className: 'SomeClass', - onclick: () => console.log('click'), - }; - } -} -``` - -Since `this.attrs` is now used for attrs passed in from parent components, `attrs` methods have been renamed to `elementAttrs`. - -#### Children and .component - -Previously, an element could be created with child elements by passing those in as the `children` prop: - -```js -Button.component({ - className: 'Button Button--primary', - children: 'Button Text' -}); -``` - -This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: - -```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); -``` - -Children can still be passed in through JSX: - -```js - -``` - -#### Tag attr - -Because mithril uses 'tag' to indicate the actual html tag (or component class) used for a vnode, you can no longer pass `tag` as an attr to components extending Flarum's `Component` helper class. The best workaround here is to just use another name for this attr. - -#### affixSidebar - -The `affixSidebar` util has been removed. Instead, if you want to affix a sidebar, wrap the sidebar code in an `AffixedSidebar` component. For instance, - -```js -class OldWay extends Component { - view() { - return
-
-
- -
Actual Page Content
-
-
-
; - } -} - -class NewWay extends Component { - view() { - return
-
-
- - - -
Actual Page Content
-
-
-
; - } -} -``` - -#### Fragment - -**Warning: For Advanced Use Only** - -In some rare cases, we want to have extremely fine grained control over the rendering and display of some significant chunks of the DOM. These are attached with `m.render`, and do not experience automated redraws. Current use cases in core and bundled extensions are: - -- The "Reply" button that shows up when selecting text in a post -- The mentions autocomplete menu that shows up when typing -- The emoji autocomplete menu that shows up when typing - -For this purpose, we provide a helper class (`common/Fragment`), of which you can create an instance, call methods, and render via `m.render(DOM_ROOT, fragmentInstance.render())`. The main benefit of using the helper class is that it allows you to use lifecycle methods, and to access the underlying DOM via `this.$()`, like you would be able to do with a component. - -This should only be used when absolutely necessary. If you are unsure, you probably don't need it. If the goal is to not store component instances, the "state pattern" as described above is preferable. - -### Required Frontend Changes Recap - -Each of these changes has been explained above, this is just a recap of major changes for your convenience. - -- Component Methods: - - `view()` -> `view(vnode)` - - Lifecycle - - `init()` -> `oninit(vnode)` - - `config()` -> Lifecycle hooks `oncreate(vnode)` / `onupdate(vnode)` - - `context.onunload()` -> `onremove()` - - `SubtreeRetainer` -> `onbeforeupdate()` - - if present, `attrs()` method needs to be renamed -> convention `elementAttrs()` - - building component with `MyComponent.component()` -> `children` is now second parameter instead of a named prop/attr (first argument) -> JSX preferred -- Routing - - `m.route()` -> `m.route.get()` - - `m.route(name)` -> `m.route.set(name)` - - register routes with page class, not instance - - special case when passing props - - `` -> `` -- AJAX - - `m.request({...})` -> `data:` key split up into `body:` and `params:` - - `m.deferred` -> native `Promise` -- Redrawing - - `m.redraw(true)` -> `m.redraw.sync()` - - `m.redraw.strategy('none')` -> `e.redraw = false` in event handler - - `m.lazyRedraw()` -> `m.redraw()` - -#### Deprecated changes - -For the following changes, we currently provide a backwards-compatibility layer. This will be removed in time for the stable release. The idea is to let you release a new version that's compatible with Beta 14 to your users as quickly as possible. When you have taken care of the changes above, you should be good to go. For the following changes, we have bought you time until the stable release. Considering you have to make changes anyway, why not do them now? - -- `this.props` -> `this.attrs` -- static `initProps()` -> static `initAttrs()` -- `m.prop` -> `flarum/utils/Stream` -- `m.withAttr` -> `flarum/utils/withAttr` -- `moment` -> `dayjs` - -## Backend (PHP) - -### New Features - -#### Extension Dependencies - -Some extensions are based on, or add features to, other extensions. Prior to this release, there was no way to ensure that those dependencies were enabled before the extension that builds on them. Now, you cannot enable an extension unless all of its dependencies are enabled, and you cannot disable an extension if there are other enabled extensions depending on it. - -So, how do we specify dependencies for an extension? Well, all you need to do is add them as composer dependencies to your extension's `composer.json`! For instance, if we have an extension that depends on Tags and Mentions, our `composer.json` will look like this: - -```json -{ - "name": "my/extension", - "description": "Cool New Extension", - "type": "flarum-extension", - "license": "MIT", - "require": { - "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency - } - // other config -} -``` - -#### View Extender - -Previously, when extensions needed to register Laravel Blade views, they could inject a view factory in `extend.php` and call it's `addNamespace` method. For instance, - -```php -// extend.php -use Illuminate\Contracts\View\Factory; - -return [ - function (Factory $view) { - $view->addNamespace(NAME, RELATIVE PATH); - } -] -``` - -This should NOT be used, as it will break views for all extensions that boot after yours. Instead, the `View` extender should be used: - -```php -// extend.php -use Flarum\Extend\View; - -return [ - (new View)->namespace(NAME, RELATIVE PATH); -] -``` - -#### Application and Container - -Although Flarum uses multiple components of the Laravel framework, it is not a pure Laravel system. In beta 14, the `Flarum\Foundation\Application` class no longer implements `Illuminate\Contracts\Foundation\Application`, and no longer inherits `Illuminate\Container\Container`. Several things to note: - -- The `app` helper now points to an instance of `Illuminate\Container\Container`, not `Flarum\Foundation\Application`. You might need to resolve things through the container before using them: for instance, `app()->url()` will no longer work; you'll need to resolve or inject an instance of `Flarum\Foundation\Config` and use that. -- Injected or resolved instances of `Flarum\Foundation\Application` can no longer resolve things through container methods. `Illuminate\Container\Container` should be used instead. -- Not all public members of `Illuminate\Contracts\Foundation\Application` are available through `Flarum\Foundation\Application`. Please refer to our [API docs on `Flarum\Foundation\Application`](https://api.docs.flarum.org/php/master/flarum/foundation/application) for more information. - -#### Other Changes - -- We are now using Laravel 6. Please see [Laravel's upgrade guide](https://laravel.com/docs/6.x/upgrade) for more information. Please note that we do not use all of Laravel. -- Optional params in url generator now work. For instance, the url generator can now properly generate links to posts in discussions. -- A User Extender has been added, which replaces the deprecated `PrepareUserGroups` and `GetDisplayName` events. -- Error handler middleware can now be manipulated by the middleware extender through the `add`, `remove`, `replace`, etc methods, just like any other middleware. -- `Flarum/Foundation/Config` and `Flarum/Foundation/Paths` can now be injected where needed; previously their data was accessible through `Flarum/Foundation/Application`. - -### Deprecations - -- `url` provided in `config.php` is now an array, accessible via `$config->url()`, for an instance of `Config` - [PR](https://github.com/flarum/core/pull/2271#discussion_r475930358) -- AssertPermissionTrait has been deprecated - [Issue](https://github.com/flarum/core/issues/1320) -- Global path helpers and path methods of `Application` have been deprecated, the injectable `Paths` class should be used instead - [PR](https://github.com/flarum/core/pull/2155) -- `Flarum\User\Event\GetDisplayName` has been deprecated, the `displayNameDriver` method of the `User` extender should be used instead - [PR](https://github.com/flarum/core/pull/2174) - -### Removals - -- Do NOT use the old closure notation for configuring view namespaces. This will break all extensions that boot after your extension. The `View` extender MUST be used instead. -- app()->url() will no longer work: [`Flarum\Http\UrlGenerator`](routes.md) should be injected and used instead. An instance of `Flarum\Http\UrlGenerator` is available in `blade.php` templates via `$url`. -- As a part of the Laravel 6 upgrade, the [`array_` and `str_` helpers](https://laravel.com/docs/6.x/upgrade#helpers) have been removed. -- The Laravel translator interface has been removed; the Symfony translator interface should be used instead: `Symfony\Component\Translation\TranslatorInterface` -- The Mandrill mail driver is no longer provided in Laravel 6, and has been removed. -- The following events deprecated in Beta 13 [have been removed](https://github.com/flarum/core/commit/7d1ef9d89161363d1c8dea19cf8aebb30136e9e3#diff-238957b67e42d4e977398cd048c51c73): - - `AbstractConfigureRoutes` - - `ConfigureApiRoutes` - Use the `Routes` extender instead - - `ConfigureForumRoutes` - Use the `Frontend` or `Routes` extenders instead - - `ConfigureLocales` - Use the `LanguagePack` extender instead - - `ConfigureModelDates` - Use the `Model` extender instead - - `ConfigureModelDefaultAttributes` - Use the `Model` extender instead - - `GetModelRelationship` - Use the `Model` extender instead - - `Console\Event\Configuring` - Use the `Console` extender instead - - `BioChanged` - User bio has not been a core feature for several releases diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b15.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b15.md deleted file mode 100644 index b1577b12c..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b15.md +++ /dev/null @@ -1,60 +0,0 @@ -# Updating For Beta 15 - -Beta 15 features multiple new extenders, a total redesign of the admin dashboard, and several other interesting new features for extensions. As before, we have done our best to provide backwards compatibility layers, and we recommend switching away from deprecated systems as soon as possible to make your extensions more stable. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## New Features / Deprecations - -### Extensores - -- `Flarum\Api\Event\WillGetData` and `Flarum\Api\Event\WillSerializeData` have been deprecated, the `ApiController` extender should be used instead -- `Flarum\Api\Event\Serializing` and `Flarum\Event\GetApiRelationship` have been deprecated, the `ApiSerializer` extender should be used instead -- `Flarum\Formatter\Event\Parsing` has been deprecated, the `parse` method of the `Formatter` extender should be used instead -- `Flarum\Formatter\Event\Rendering` has been deprecated, the `render` method of the `Formatter` extender should be used instead -- `Flarum\Notification\Event\Sending` has been deprecated, the `driver` method of the `Notification` extender should be used instead - - Please note that the new notification driver system is not an exact analogue of the old `Sending` event, as it can only add new drivers, not change the functionality of the default notification bell alert driver. If your extension needs to modify **how** or **to whom** notifications are sent, you may need to replace `Flarum\Notification\NotificationSyncer` on the service provider level -- `Flarum\Event\ConfigureNotificationTypes` has been deprecated, the `type` method of the `Notification` extender should be used instead -- `Flarum\Event\ConfigurePostTypes` has been deprecated, the `type` method of the `Post` extender should be used instead -- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. -- `Flarum\Event\ConfigureUserPreferences` has been deprecated, the `registerPreference` method of the `User` extender should be used instead -- `Flarum\Foundation\Event\Validating` has been deprecated, the `configure` method of the `Validator` extender should be used instead - -- The Policy system has been reworked a bit to be more intuitive. Previously, policies contained both actual policies, which determine whether a user can perform some ability, and model visibility scopers, which allowed efficient restriction of queries to only items that users have access to. See the [authorization documentation](authorization.md) for more information on how to use the new systems. Now: - - `Flarum\Event\ScopeModelVisibility` has been deprecated. New scopers can be registered via the `ModelVisibility` extender, and any `Eloquent\Builder` query can be scoped by calling the `whereVisibleTo` method on it, with the ability in question as an optional 2nd argument (defaults to `view`). - - `Flarum\Event\GetPermission` has been deprecated. Policies can be registered via the `Policy` extender. `Flarum\User\User::can` has not changed. Please note that the new policies must return one of `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, not a boolean. - -- A `ModelUrl` extender has been added, allowing new slug drivers to be registered. This accompanies Flarum's new slug driving system, which allows for extensions to define custom slugging strategies for sluggable models. The extender supports sluggable models outside of Flarum core. Please see our [model slugging](slugging.md) documentation for more information. -- A `Settings` extender has been added, whose `serializeToForum` method makes it easy to serialize a setting to the forum. -- A `ServiceProvider` extender has been added. This should be used with extreme caution for advanced use cases only, where there is no alternative. Please note that the service provider layer is not considered public API, and is liable to change at any time, without notice. - -### Admin UX Redesign - -The admin dashboard has been completely redesigned, with a focus on providing navbar pages for each extension. The API for extensions to register settings, permissions, and custom pages has also been greatly simplified. You can also now update your extension's `composer.json` to provide links for funding, support, website, etc that will show up on your extension's admin page. Please see [our Admin JS documentation](admin.md) for more information on how to use the new system. - -### Other New Features - -- On the backend, the route name is now available via `$request->getAttribute('routeName')` for controllers, and for middleware that run after `Flarum\Http\Middleware\ResolveRoute.php`. -- `Flarum\Api\Controller\UploadImageController.php` can now be used as a base class for controllers that upload images (like for the logo and favicon). -- Automatic browser scroll restoration can now be disabled for individual pages [see our frontend page documentation for more info](frontend-pages.md). - -## Breaking Changes - -- The following deprecated frontend BC layers were removed: - - `momentjs` no longer works as an alias for `dayjs` - - `this.props` and `this.initProps` no longer alias `this.attrs` and `this.initAttrs` for the `Component` base class - - `m.withAttr` and `m.stream` no longer alias `flarum/utils/withAttr` and `flarum/utils/Stream` - - `app.cache.discussionList` has been removed - - `this.content` and `this.editor` have been removed from `ComposerBody` - - `this.component`, `this.content`, and `this.value` have been removed from `ComposerState` -- The following deprecated backend BC layers were removed: - - The `publicPath`, `storagePath`, and `vendorPath` methods of `Flarum\Foundation\Application` have been removed - - The `base_path`, `public_path`, and `storage_path` global helpers have been removed - - The `getEmailSubject` method of `Flarum\Notification\MailableInterface` MUST now take a translator instance as an argument - - `Flarum\User\AssertPermissionTrait` has been removed, the analogous methods on `Flarum\User\User` should be used instead - - The `Flarum\Event\PrepareUserGroups` event has been removed, use the `User` extender instead - - The `Flarum\User\Event\GetDisplayName` event has been removed, use the display name driver feature of the `User` extender instead diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b16.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b16.md deleted file mode 100644 index 86ee1ac8f..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b16.md +++ /dev/null @@ -1,138 +0,0 @@ -# Actualización para la Beta 16 - -La Beta 16 finaliza la API del extensor de PHP, introduce una biblioteca de pruebas y tipificaciones JS, cambia al uso de espacios de nombres para las importaciones JS, aumenta la robustez de las dependencias de la extensión y permite anular rutas, entre otras características. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Frontend - -- Se ha introducido una nueva abstracción del controlador del editor, que permite a las extensiones sustituir el editor por defecto basado en el área de texto por soluciones más avanzadas. -- Los componentes `TextEditor` y `TextEditorButton`, así como la utilidad `BasicEditorDriver` (que sustituye a `SuperTextarea`) han sido trasladados de `forum` a `common`. -- Los espacios de nombres `forum`, `admin` y `common` deben ser utilizados al importar. Así que en lugar de `importar Componente de 'flarum/Component'`, utilice `importar Componente de 'flarum/common/Component`. El soporte para los antiguos estilos de importación será retirado en la versión estable, y se eliminará con Flarum 2.0. -- Se ha liberado una librería de escritura para soportar el autocompletado del editor para el desarrollo del frontend, y puede ser instalada en su entorno de desarrollo mediante `npm install --save-dev flarum@0.1.0-beta.16`. -- Las categorías de las extensiones se han simplificado a `feature`, `theme` e `language`. - -## Backend - -### Extensores - -- Todos los extensores que soportan callbacks/cierres ahora soportan funciones globales como `'boolval'` y funciones de tipo array como `[ClassName::class, 'methodName']`. -- El método `SerializeToFrontend` del extensor `Settings` soporta ahora un valor por defecto como cuarto argumento. -- El extensor `Event` ahora soporta el registro de suscriptores para múltiples eventos a la vez a través de un método `subscribe`. -- El extensor `Notification` tiene ahora un método `beforeSending`, que permite ajustar la lista de destinatarios antes de enviar una notificación. -- El método `mutate` del `ApiSerializer` ha quedado obsoleto, y se ha renombrado a `attributes`. -- Los métodos `remove` de los extensores `Route` y `Frontend` pueden utilizarse para eliminar (y luego reemplazar) rutas. -- El extensor `ModelPrivate` sustituye al evento `GetModelIsPrivate`, que ha quedado obsoleto. -- Los métodos del extensor `Auth` sustituyen al evento `CheckingPassword`, que ha quedado obsoleto. -- Todos los eventos relacionados con la búsqueda están ahora obsoletos en favor de los extensores `SimpleFlarumSearch` y `Filter`; esto se explica con más detalle a continuación. - -### Laravel y Symfony - -La Beta 16 actualiza de la v6.x a la v8.x de los componentes de Laravel y de la v4 a la v5 de los componentes de Symfony. Por favor, consulta las respectivas guías de actualización de cada una de ellas para conocer los cambios que puedes necesitar en tus extensiones. El cambio más aplicable es la desaparición de `Symfony\Component\Translation\TranslatorInterface` en favor de `Symfony\Contracts\Translation\TranslatorInterface`. El primero se eliminará en la beta 17. - -### Funciones de Ayuda - -Las restantes funciones globales de ayuda `app` y `event` han quedado obsoletas. La función `app` ha sido reemplazada por `resolve`, que toma el nombre de un enlace del contenedor y lo resuelve a través del contenedor. - -Dado que algunas extensiones de Flarum utilizan bibliotecas de Laravel que asumen la existencia de algunos helpers globales, hemos recreado algunos helpers de uso común en el paquete [flarum/laravel-helpers](https://github.com/flarum/laravel-helpers). Estos helpers NO deben usarse directamente en el código de las extensiones de Flarum; están disponibles para que las bibliotecas basadas en Laravel que esperan que existan no funcionen mal. - -### Cambios en la búsqueda - -Como parte de nuestros esfuerzos para hacer el sistema de búsqueda de Flarum más flexible, hemos hecho varias refacciones en la beta 16. En particular, el filtrado y la búsqueda se tratan ahora como mecanismos diferentes, y tienen conductos y extensores separados. Esencialmente, si una consulta tiene un parámetro de consulta `filter[q]`, será tratada como una búsqueda, y todos los demás parámetros de filtro serán ignorados. En caso contrario, será tratada por el sistema de filtrado. Esto permitirá eventualmente que las búsquedas sean manejadas por controladores alternativos (provistos por extensiones), como ElasticSearch, sin afectar el filtrado (por ejemplo, cargar discusiones recientes). Las clases comunes a ambos sistemas se han trasladado a un espacio de nombres `Query`. - -Las implementaciones de filtrado y de búsqueda por defecto de Core (denominadas SimpleFlarumSearch) son bastante similares, ya que ambas se alimentan de la base de datos. Los controladores de la API `List` llaman a los métodos `search` / `filter` en una subclase específica de recursos de `Flarum\Search\AbstractSearcher` o `Flarum\Filter\AbstractFilterer`. Los argumentos son una instancia de `Flarum\Query\QueryCriteria`, así como información de ordenación, desplazamiento y límite. Ambos sistemas devuelven una instancia de `Flarum\Query\QueryResults`, que es efectivamente una envoltura alrededor de una colección de modelos Eloquent. - -Los sistemas por defecto también son algo similares en su implementación. El `Filterer` aplica filtros (implementando la `Flarum\Filter\FilterInterface`) basándose en los parámetros de consulta de la forma `filter[FILTER_KEY] = FILTER_VALUE` (o `filter[-FILTER_KEY] = FILTER_VALUE` para filtros negados). El `Searcher` de SimpleFlarumSearch divide el parámetro `filter[q]` por espacios en "términos", aplica Gambits (implementando `Flarum\Search\GambitInterface`) que coinciden con los términos, y luego aplica un "Fulltext Gambit" para buscar basado en cualquier "término" que no coincida con un Gambit auxiliar. Ambos sistemas aplican entonces una ordenación, un desplazamiento y un límite de recuento de resultados, y permiten que las extensiones modifiquen el resultado de la consulta mediante `searchMutators` o `filterMutators`. - -Las extensiones añaden gambits y mutadores de búsqueda y establecen gambits de texto completo para las clases `Searcher` mediante el extensor `SimpleFlarumSearch`. Pueden añadir filtros y mutadores de filtro a las clases `Filterer` mediante el extensor `Filter`. - -Con respecto a la actualización, tenga en cuenta lo siguiente: - -- Las mutaciones de búsqueda registradas al escuchar los eventos de `Searching` para discusiones y usuarios se aplicarán como a las búsquedas durante el paso de mutación de búsqueda a través de una capa temporal de BC. NO se aplicarán a los filtros. Este es un cambio de última hora. Estos eventos han quedado obsoletos. -- Los gambits de búsqueda registrados al escuchar los eventos `ConfigureUserGambits` y `ConfigureDiscussionGambits` se aplicarán a las búsquedas a través de una capa temporal de BC. NO se aplicarán a los filtros. Este es un cambio de última hora. Estos eventos han quedado obsoletos. -- Los filtros de entrada registrados mediante la escucha de los eventos `ConfigurePostsQuery` se aplicarán a los filtros de entrada a través de una capa temporal de BC. Este evento ha quedado obsoleto. - -### Biblioteca de pruebas - -El paquete `flarum/testing` proporciona utilidades para las pruebas automatizadas de backend impulsadas por PHPUnit. Vea la [documentación de pruebas](testing.md) para más información. - -### Dependencias Opcionales - -La beta 15 introdujo las "dependencias de la extensión", que requieren que cualquier extensión listada en la sección `composer.json` de tu extensión esté habilitada antes de que tu extensión pueda ser activada. - -Con la beta 16, puedes especificar "dependencias opcionales" listando los nombres de sus paquetes de compositor como un array en la sección `extra.flarum-extension.optional-dependencies` de tu extensión. Todas las dependencias opcionales habilitadas se iniciarán antes que su extensión, pero no son necesarias para que su extensión esté habilitada. - -### Cambios en el token de acceso y la autenticación - -#### Cambios en la API de extensión - -La firma de varios métodos relacionados con la autenticación se han cambiado para tomar `$token` como parámetro en lugar de `$userId`. Otros cambios son el resultado del paso de `$lifetime` a `$type`. - -- `Flarum\Http\AccessToken::generate($userId)` ya no acepta `$lifetime` como segundo parámetro. El parámetro se ha mantenido por compatibilidad con versiones anteriores, pero no tiene ningún efecto. Se eliminará en la beta 17. -- Para crear tokens de acceso recordables se debe utilizar `Flarum\Http\RememberAccessToken::generate($userId)`. -- `Flarum\Http\DeveloperAccessToken::generate($userId)` debe usarse para crear tokens de acceso para desarrolladores (no caducan). -- `Flarum\Http\SessionAccessToken::generate()` puede ser usado como un alias de `FlarumHttpAccessToken::generate()`. Es posible que en el futuro desaparezca `AccessToken::generate()`. -- `Flarum\Http\Rememberer::remember(ResponseInterface $response, AccessToken $token)`: pasar un `AccessToken` ha quedado obsoleto. Pasa una instancia de `RememberAccessToken` en su lugar. Como capa de compatibilidad temporal, pasar cualquier otro tipo de token lo convertirá en un remember token. En la beta 17 la firma del método cambiará para aceptar sólo `RememberAccessToken`. -- El método `Flarum\Http\Rememberer::rememberUser()` ha quedado obsoleto. En su lugar debe crear/recuperar un token manualmente con `RememberAccessToken::generate()` y pasarlo a `Rememberer::remember()`. -- El segundo parámetro de `Flarum\Http\SessionAuthenticator::logIn(Session $session, $userId)` ha quedado obsoleto y se sustituye por `$token`. Se mantiene la compatibilidad con versiones anteriores. En la beta 17, la firma del método del segundo parámetro cambiará a `AccessToken $token`. -- Ahora `AccessToken::generate()` guarda el modelo en la base de datos antes de devolverlo. -- Ya no se puede utilizar `AccessToken::find($id)` o `::findOrFail($id)` para encontrar un token, porque la clave primaria ha cambiado de `token` a `id`. En su lugar puedes utilizar `AccessToken::findValid($tokenString)`. -- Se recomienda utilizar `AccessToken::findValid($tokenString): AccessToken` o `AccessToken::whereValid(): Illuminate\Database\Eloquent\Builder` para encontrar un token. Esto hará que la solicitud se amplíe automáticamente para que sólo devuelva tokens válidos. En los foros con poca actividad, esto aumenta la seguridad, ya que la eliminación automática de tokens obsoletos sólo ocurre cada 50 solicitudes en promedio. - -#### Cambios en la sesión de Symfony - -Si estás accediendo o manipulando directamente el objeto de sesión de Symfony, se han realizado los siguientes cambios: - -- El atributo `user_id` ya no se utiliza. Se ha añadido el atributo `access_token` como reemplazo. Es una cadena que mapea a la columna `token` de la tabla de base de datos `access_tokens`. - -Para recuperar el usuario actual desde dentro de una extensión de Flarum, la solución ideal que ya estaba presente en Flarum es utilizar `$request->getAttribute('actor')` que devuelve una instancia de `User` (que podría ser `Guest`) - -Para recuperar la instancia del token desde Flarum, puede utilizar `Flarum\Http\AccessToken::findValid($tokenString)`. - -Para recuperar los datos del usuario desde una aplicación que no sea de Flarum, tendrá que hacer una petición adicional a la base de datos para recuperar el token. El ID de usuario está presente como `user_id` en la tabla `access_tokens`. - -#### Cambios en la creación de tokens - -Se ha eliminado la propiedad `lifetime` de los tokens de acceso. Los tokens son ahora o bien tokens `session` con un tiempo de vida de 1h después de la última actividad, o bien tokens `session_remember` con un tiempo de vida de 5 años después de la última actividad. - -El parámetro `remember` que antes estaba disponible en el punto final `POST /login` se ha hecho disponible en `POST /api/token`. No devuelve la cookie de recuerdo en sí, pero el token devuelto puede utilizarse como cookie de recuerdo. - -El parámetro `lifetime` de `POST /api/token` ha quedado obsoleto y será eliminado en la beta 17. Se ha proporcionado una compatibilidad parcial con el pasado donde un valor de `lifetime` superior a 3600 segundos se interpreta como `remember=1`. Los valores inferiores a 3600 segundos resultan en un token normal no recordado. - -Se han introducido nuevos tokens de `developer` que no caducan, aunque actualmente no pueden crearse a través de la API REST. Los desarrolladores pueden crear tokens de desarrollador desde una extensión usando `Flarum\Http\DeveloperAccessToken::generate($userId)`. - -Si ha creado manualmente tokens en la base de datos desde fuera de Flarum, la columna `type` es ahora obligatoria y debe contener `session`, `session_remember` o `developer`. Los tokens de tipo no reconocido no podrán ser utilizados para autenticarse, pero tampoco serán eliminados por el recolector de basura. En una futura versión las extensiones podrán registrar tipos de token de acceso personalizados. - -#### Cambios en el uso de los tokens - -Un [problema de seguridad en Flarum](https://github.com/flarum/core/issues/2075) provocaba anteriormente que todos los tokens no caducaran nunca. Esto tenía un impacto de seguridad limitado debido a que los tokens son caracteres únicos largos. Sin embargo, las integraciones personalizadas que guardaban un token en una base de datos externa para su uso posterior podían encontrar que los tokens ya no funcionaban si no se utilizaban recientemente. - -Si utiliza tokens de acceso de corta duración para cualquier propósito, tenga en cuenta el tiempo de caducidad de 1h. La caducidad se basa en la hora del último uso, por lo que seguirá siendo válida mientras se siga utilizando. - -Debido a la gran cantidad de tokens caducados acumulados en la base de datos y al hecho de que la mayoría de los tokens no se utilizaron nunca más de una vez durante el proceso de inicio de sesión, hemos tomado la decisión de eliminar todos los tokens de acceso con una vida útil de 3600 segundos como parte de la migración, Todos los tokens restantes se han convertido en tokens `session_remember`. - -#### Cookie de Recuerdo - -La cookie de recuerdo sigue funcionando como antes, pero se han hecho algunos cambios que podrían romper implementaciones inusuales. - -Ahora sólo los tokens de acceso creados con la opción `remember` pueden ser utilizados como cookie remember. Cualquier otro tipo de token será ignorado. Esto significa que si creas un token con `POST /api/token` y luego lo colocas en la cookie manualmente, asegúrate de establecer `remember=1` al crear el token. - -#### Expiración de la sesión web - -En versiones anteriores de Flarum, una sesión podía mantenerse viva para siempre hasta que los archivos de sesión de Symfony fueran borrados del disco. - -Ahora las sesiones están vinculadas a tokens de acceso. Si un token se borra o expira, la sesión web vinculada terminará automáticamente. - -Un token vinculado a una sesión web ahora se eliminará automáticamente de la base de datos cuando el usuario haga clic en el cierre de sesión. Esto evita que cualquier token robado sea reutilizado, pero podría romper la integración personalizada que anteriormente utilizaba un único token de acceso tanto en una sesión web como en otra cosa. - -### Varios - -- La dirección IP está ahora disponible en las peticiones a través de `$request->getAttribute('ipAddress')`. -- Las políticas ahora pueden devolver `true` y `false` como alias para `$this->allow()` y `$this->deny()`, respectivamente. -- El permiso `user.edit` se ha dividido en `user.editGroups`, `user.editCredentials` (para correo electrónico, nombre de usuario y contraseña) y `user.edit` (para otros atributos). -- Ahora hay permisos (`bypassTagCounts`) que permiten a los usuarios saltarse los requisitos de recuento de etiquetas. -- Flarum ahora soporta PHP 7.3 - PHP 8.0, con soporte para PHP 7.2 oficialmente eliminado. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b8.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b8.md deleted file mode 100644 index f1324800c..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/update-b8.md +++ /dev/null @@ -1,114 +0,0 @@ -# Updating For Beta 8 - -All extensions will need to be refactored in order to work with beta 8. Here are the main things you will need to do in order to make your extension compatible. - -:::caution - -This guide is not comprehensive. You may encounter some changes we haven't documented. If you need help, start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## PHP Namespaces - -Beta 8 comes with large changes to the overall structure of the PHP backend. You will need to look through [this list](https://discuss.flarum.org/d/6572-help-us-namespace-changes) of namespace changes and make changes to your extension accordingly. - -[This script](https://gist.github.com/tobyzerner/55e7c05c95404e5efab3a9e43799d375) can help you to automate most of the namespace changes. Of course, you should still test your extension after running the script as it may miss something. - -## Database Naming - -Many database columns and JSON:API attributes have been renamed to conform to a [convention](/contributing.md#database). You will need to update any instances where your extension interacts with core data. You can see the changes in [#1344](https://github.com/flarum/core/pull/1344/files). - -## Extensores - -Beta 8 introduces a new concept called **extenders** that replace the most common event listeners. You can learn more about how they work in the [updated extension docs](start.md#extenders). - -`bootstrap.php` has been renamed to `extend.php` and returns an array of extender instances and functions: - -```php -use Flarum\Extend; - -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] -``` - -If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. - -| Event | Extender | -| ------------------------------------- | --------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | - -_\* class no longer exists_ - -## JavaScript Tooling - -Previously Flarum and its extensions used a custom Gulp workflow to compile ES6 source code into something that browsers could understand. Beta 8 switches to a more conventional approach with Webpack. - -You will need to tweak the structure of your extension's `js` directory. Currently, your JS file hierarchy looks something like the following: - -``` -js -├── admin -│ ├── src -│ │ └── main.js -│ ├── dist -│ │ └── extension.js -│ ├── Gulpfile.js -│ └── package.json -└── forum - ├── src - │ └── main.js - ├── dist - │ └── extension.js - ├── Gulpfile.js - └── package.json -``` - -You'll need to make the following changes: - -1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.md#transpilation). - -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. - -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. - -4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. - -If everything went right, your folder structure should look something like this: - -``` -js -├── src -│ ├── admin -│ │ └── index.js -│ └── forum -│ └── index.js -├── dist -│ ├── admin.js -│ ├── admin.js.map -│ ├── forum.js -│ └── forum.js.map -├── admin.js -├── forum.js -├── package.json -└── webpack.config.js -``` - -Take a look at the [bundled extensions](https://github.com/flarum) for more examples. - -## Font Awesome Icons - -Beta 8 upgrades to Font Awesome 5, in which icon class names have changed. The `flarum/helpers/icon` helper now requires the **full Font Awesome icon class names** to be passed, eg. `fas fa-bolt`. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extend/views.md b/i18n/es/docusaurus-plugin-content-docs/current/extend/views.md deleted file mode 100644 index fc4a75a86..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extend/views.md +++ /dev/null @@ -1,63 +0,0 @@ -# Views and Blade - -Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. - -[Blade](https://laravel.com/docs/8.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). [Views](https://laravel.com/docs/8.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. - -For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). - -## Adding Views - -You will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->namespace('acme.hello-world', __DIR__.'/views'), -]; -``` - - -## Blade Templates - -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/8.x/blade). - -Once you've set up your views, you can render them to strings: - -```php -// Here, $view is of type `Illuminate\Contracts\View\Factory` -$renderedString = $view->make('acme.hello-world::greeting')->render(); - -// You can also pass variables to the view: -$renderedString = $view->make('acme.hello-world::greeting', ['varName' => true])->render(); -``` - -You can obtain the view factory instance through dependency injection. - -The format is `"VIEW_NAMESPACE::VIEW_NAME"`. If the view folder is organized as subdirectories, replace `/` with `.` in the pack. So if you have a file at `"forum/error.blade.php"` in a namespace called `"custom-views"`, you would use `"custom-views::forum.error"`. - -Note that all Blade templates rendered this way automatically have access to the following variables: - -- `$url`: a [URL generator](routes#generating-urls) instance. -- `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. -- `$slugManager`: a [SlugManager](slugging) instance. - -Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Serializer/ForumSerializer.php#L19). - -## Overriding Views - -If you want to override templates added by core or extensions, set up a view folder structure matching the one you are trying to override, containing just the files you are trying to override. Then use the `View` extender's `extendNamespace` method: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->extendNamespace('acme.hello-world', __DIR__.'/override_views'); -]; -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extenders.md b/i18n/es/docusaurus-plugin-content-docs/current/extenders.md deleted file mode 100644 index c680b9932..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extenders.md +++ /dev/null @@ -1,23 +0,0 @@ -# Local Extenders - -If there are customizations you want to make to your site without distributing an entire extension, you can do so by using **local extenders**. Each Flarum installation comes with an `extend.php` file where you can add extender instances, just like in a full extension. - -See our [extension documentation](extend/start.md) for more information about extenders (and even an [example of a local extender](extend/start.md#hello-world)). - -If you need to create new files (when adding a custom class to be imported for extenders), you'll need to adjust your composer.json a bit. Add the following: - -```json -"autoload": { - "psr-4": { - "App\\": "app/" - } -}, -``` - -Now you can create new PHP files in an `app` subdirectory using the `App\...` namespace. - -:::tip Local Extenders vs Extensions - -Local extenders can be good for small tweaks, but if you need large customizations, an extension might be a better choice: a separate codebase, cleaner handling of many files, developer tooling, and the ability to easily open source are big benefits. - -::: diff --git a/i18n/es/docusaurus-plugin-content-docs/current/extensions.md b/i18n/es/docusaurus-plugin-content-docs/current/extensions.md deleted file mode 100644 index a168cb229..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/extensions.md +++ /dev/null @@ -1,118 +0,0 @@ -# Extensiones - -Flarum es minimalista, pero también es altamente extensible. De hecho, ¡la mayoría de las características que vienen con Flarum son en realidad extensiones! - -Este enfoque hace que Flarum sea extremadamente personalizable: Puedes desactivar cualquier característica que no necesites, e instalar otras extensiones para que tu foro sea perfecto para tu comunidad. - -Para más información sobre la filosofía de Flarum en cuanto a las características que incluimos en el núcleo, o si está buscando hacer su propia extensión, por favor vea nuestra [documentación de extensiones](extend/README.md). Este artículo se centrará en la gestión de las extensiones desde la perspectiva de un administrador del foro. - -## Extension Manager - -The extension manager is an extension that comes bundled with Flarum when installed via an archive. It provides a graphical interface for installing and updating both extensions and Flarum itself. - -If you do not have the extension manager installed and you wish to install it, you can do so by running the following command in your Flarum directory: - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -![extension manager admin page](https://github.com/flarum/docs/assets/20267363/d0e1f7a5-e194-4acd-af63-7b8ddd95c26b) - - -## Encontrando Extensiones - -Flarum tiene un amplio ecosistema de extensiones, la mayoría de las cuales son de código abierto y gratuitas. Para encontrar nuevas e increíbles extensiones, visita la etiqueta [Extensiones](https://discuss.flarum.org/t/extensions) en los foros de la comunidad de Flarum. La base de datos no oficial [Extiverse extension database](https://extiverse.com/) es también un gran recurso. - -## Instalación de Extensiones - -### Through the interface - -Using the extension manager extension, you can install extensions directly from the admin dashboard. Once you have browsed the list of available extensions from the links above, and found one you want to install, you can install it by entering the extension's composer package name into the extension manager's installation input. - -![Installing an extension](/en/img/install-extension.png) - -### Through the command line - -Al igual que Flarum, las extensiones se instalan a través de [Composer](https://getcomposer.org), usando SSH. Para instalar una extensión típica: - -1. `cd` to your Flarum directory. `cd` a la carpeta que contiene el archivo `composer.json`. You can check directory contents via `ls -la`. -2. Run `composer require COMPOSER_PACKAGE_NAME:*`. Esto debería ser proporcionado por la documentación de la extensión. - -## Gestión de Extensiones - -### Through the interface - -Using the extension manager extension, you can update extensions directly from the admin dashboard. You can run a check for updates by clicking the "Check for updates" button in the extension manager. If there are updates available, you can update all extensions by clicking the "Global update" button. Or, you can update individual extensions by clicking the "Update" button next to the extension you want to update. - -![Updating an extension](/en/img/update-extension.png) - -### Through the command line - -Follow the instructions provided by extension developers. If you're using `*` as the version string for extensions ([as is recommended](composer.md)), running the commands listed in the [Flarum upgrade guide](update.md) should update all your extensions. - -## Uninstalling Extensions - -### Through the interface - -Using the extension manager extension, you can uninstall extensions directly from the admin dashboard. You can uninstall an extension by clicking the "Uninstall" button next to the extension you want to uninstall inside the extension's page. - -![Uninstalling an extension](/en/img/uninstall-extension.png) - -### Through the command line - -Similarly to installation, to remove an extension: - -0. If you want to remove all database tables created by the extension, click the "Purge" button in the admin dashboard. See [below](#managing-extensions) for more information. -1. `cd` to your Flarum directory. -2. Ejecute `composer require COMPOSER_PACKAGE_NAME`. Esto debería ser proporcionado por la documentación de la extensión. - -## Managing Extensions - -Each individual extension page of the admin dashboard provides a convenient way to manage the extension. Puede: - -- Enable or disable the extension. -- See the settings provided by the extension, and change them. -- Revert an extension's migrations to remove any database modifications it made (this can be done with the Purge button). Esto eliminará TODOS los datos asociados a la extensión, y es irreversible. Sólo se debe hacer cuando se está eliminando una extensión, y no se planea instalarla de nuevo. Es totalmente opcional. -- See the extension's README, if it has one. -- See the extension's version. -- Uninstall the extension if the extension manager is installed. - -## Configuring additional extension repository sources - -The extension manager uses `composer` under the hood, and as such, it looks for extension packages in the same places as `composer`. By default, this is [Packagist](https://packagist.org/). However, you can configure additional sources for the extension manager to look for extensions in. This is useful if you want to install an extension that is not available on Packagist. - -In the admin page of the extension manager, clicking the **Add Repository** button will open a modal where you can enter the name and URL of the repository you want to add. The name is just a label for the repository, and can be anything you want. The URL should be the URL of the repository which depends on the type of repository you want to add. - -### Adding a repository from a VCS - -If you want to add a repository from a VCS (e.g. GitHub, GitLab, BitBucket, etc), the URL should be the URL of the repository's VCS. For example, if you had a private GitHub repository at `https://github.com/acme/flarum-extension`, you would enter that URL into the URL field. If it is a private source, you will need to enter an authentication method through the **New authentication method** button. The token can be generated from your VCS provider's website, and the host should be the domain of the VCS provider (e.g. `github.com`). - -### Adding a composer repository - -Extiverse provides access to premium extensions. It is a good example of a composer repository. You would specify the URL as `https://flarum.org/composer/` and the name as `premium`. You would also need to enter an authentication method through the **New authentication method** button. The token can be generated from your Flarum account's [subscriptions](https://flarum.org/dashboard/subscriptions) page with the Instructions button. - -* Type: `HTTP Bearer` -* Host: `flarum.org` - -![Configure repositories](/en/img/config-repositories.png) - -:::info - -The configured repositories and auth methods will be active for both the command line and the admin dashboard. If you configure them from the command line however, you must not include the flag `--global`. - -::: - -## Installing Non-stable extensions - -If for whatever reason you want to install a non-stable extension (e.g. a beta, alpha or RC version) you must first update the **Minimum stability** setting to the wanted stability. - -* If you set it to Alpha, you will be able to install alpha, beta, RC (Release Candidate) and stable versions. -* If you set it to Beta, you will be able to install beta, RC and stable versions. -* If you set it to RC, you will be able to install RC and stable versions. -* If you set it to Stable, you will only be able to install stable versions. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/faq.md b/i18n/es/docusaurus-plugin-content-docs/current/faq.md deleted file mode 100644 index 25b9803fe..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/faq.md +++ /dev/null @@ -1,35 +0,0 @@ -# FAQ - -### ¿Cuándo será estable Flarum? - -Yes! After 6 years of development, Flarum 1.0.0 is finally here. - -### ¿Podré pasar de la versión beta a las siguientes? - -We're still working on a formal roadmap. We have a lot of plans and ideas, and look forward to sharing a more thorough milestone with the community. - -### ¿Puedo donar dinero para acelerar el desarrollo? - -Todas las donaciones son bienvenidas. Puedes donar en [Github Sponsors](https://github.com/sponsors/flarum) o en [OpenCollective](https://opencollective.com/flarum). - -Sin embargo, las donaciones no tendrán un impacto directo en la velocidad de desarrollo de Flarum. También animamos a los usuarios a contribuir de otras maneras, como [contribuyendo con código](contributing.md), [construyendo extensiones](/extend/), escribiendo documentación, traduciendo Flarum a otros idiomas, proporcionando ayuda y soporte en los [foros de la comunidad](https://discuss.flarum.org/)... - -### ¿Tendrá Flarum [insertar característica aquí]? When? ¿Cuándo? ¿Por qué no? - -Nos encantaría construir innumerables características y extensiones para Flarum, pero lo primero es lo primero: Nos centramos en lo esencial y en la estabilidad. - -### ¿Puedo integrar Flarum con WordPress/Laravel/etc.? - -También en este caso, la respuesta es "lo primero es lo primero". Si aún no hemos solucionado un problema (o no le hemos asignado un hito), es porque estamos trabajando en otra cosa igual de importante. Por favor, tened paciencia; intentaremos que esté listo antes del lanzamiento. O si tienes prisa, no dudes en arreglarlo tú mismo y [contribuir al proyecto](contributing.md). - -### ¿Podré migrar mi foro a Flarum? - -We don't currently provide official migrators, but there are many community solutions out there. Una vez que estemos seguros de que Flarum está listo para ser utilizado en la producción, vamos a empezar a construir herramientas para importar datos de otro software de foro como esoTalk, FluxBB, phpBB, Discourse, y otros. - -### ¿Por qué todavía no han arreglado [inserte el problema aquí]? - -> "A través de un arcano y arduo calvario, que implica rituales místicos, peligros que amenazan la vida y aventuras a tierras lejanas donde muchos van y pocos vuelven." ~ jordanjay29 - -La respuesta real es que, por lo general, echamos un ojo a nuestra comunidad en busca de miembros destacados que puedan ser un buen personal. Honestamente, para la mayoría de nuestro personal actual, lo que hacían antes de convertirse en personal no era muy diferente de lo que hacen ahora. - -Encuentra una pasión y contribuye de la manera que creas más conveniente. Luego deja que siga su curso. No hace falta tener una insignia para ser respetado aquí. \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/install.md b/i18n/es/docusaurus-plugin-content-docs/current/install.md deleted file mode 100644 index 5f4bb7783..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/install.md +++ /dev/null @@ -1,198 +0,0 @@ -# Instalación - -:::danger - -No dude en probar Flarum en uno de nuestros [foros de demostración](https://discuss.flarum.org/d/21101). O bien, configure su propio foro en segundos en [Free Flarum](https://www.freeflarum.com), un servicio comunitario gratuito no afiliado al equipo de Flarum. - -::: - -## Requisitos del Servidor - -Antes de instalar Flarum, es importante comprobar que tu servidor cumple los requisitos. Para ejecutar Flarum, necesitarás: - -* **Apache** (con mod\_rewrite activado) o **Nginx**. -* **PHP 7.3+** with the following extensions: curl, dom, fileinfo, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+** o **MariaDB 10.0.5+** -* **SSH (command-line) access** to run potentially necessary software maintenance commands, and Composer if you intend on using the command-line to install and manage Flarum extensions. - -## Instalando - -### Installing by unpacking an archive - -If you don't have SSH access to your server or you prefer not to use the command line, you can install Flarum by unpacking an archive. Below is a list of the available archives, make sure you choose the one that matches your PHP version and public path or lack thereof preference. - -| Flarum Version | PHP Version | Public Path | Type | Archive | -| -------------- | ----------------- | ----------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1.x | 8.3 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.zip) | -| 1.x | 8.3 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | Yes | ZIP | [flarum-v1.x-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.zip) | -| 1.x | 8.2 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.zip) | -| 1.x | 8.2 (recommended) | Yes | ZIP | [flarum-v1.x-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.zip) | -| 1.x | 8.1 | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.tar.gz) | -| 1.x | 8.1 | Yes | TAR.GZ | [flarum-v1.x-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.tar.gz) | -| 1.x | 8.1 | No | ZIP | [flarum-v1.x-no-public-dir-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.zip) | -| 1.x | 8.1 | Yes | ZIP | [flarum-v1.x-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.zip) | -| 1.x | 8.0 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.zip) | -| 1.x | 8.0 (end of life) | Yes | ZIP | [flarum-v1.x-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.zip) | -| 1.x | 7.4 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.zip) | -| 1.x | 7.4 (end of life) | Yes | ZIP | [flarum-v1.x-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.zip) | -| 1.x | 7.3 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.zip) | -| 1.x | 7.3 (end of life) | Yes | ZIP | [flarum-v1.x-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.zip) | - -### Installing using the Command Line Interface - -Flarum utiliza [Composer](https://getcomposer.org) para gestionar sus dependencias y extensiones. Antes de instalar Flarum, necesitarás [instalar Composer](https://getcomposer.org) en tu máquina. Después, ejecuta este comando en una ubicación vacía en la que quieras que se instale Flarum: - -```bash -composer create-project flarum/flarum:^1.8.0 . -``` - -Mientras se ejecuta este comando, puede configurar su servidor web. Tendrás que asegurarte de que tu webroot está configurado en `/ruta/para/su/foro/public`, y configurar el [URL Rewriting](#url-rewriting) según las instrucciones siguientes. - -Cuando todo esté listo, navega a tu foro en un navegador web y sigue las instrucciones para completar la instalación. - -If you wish to install and update extensions from the admin dashboard, you need to also install the [Extension Manager](extensions.md) extension. - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -## URL Rewriting - -### Apache - -Flarum incluye un archivo `.htaccess` en el directorio `public` - asegúrese de que ha sido descargado correctamente. **Flarum no funcionará correctamente si `mod_rewrite` no está habilitado o `.htaccess` no está permitido.** Asegúrate de comprobar con tu proveedor de hosting (o tu VPS) que estas características están habilitadas. Si gestionas tu propio servidor, puede que tengas que añadir lo siguiente a la configuración de tu sitio para habilitar los archivos `.htaccess`: - -``` - - AllowOverride All - -``` - -Esto asegura que las sobreescrituras de htaccess están permitidas para que Flarum pueda reescribir las URLs correctamente. - -Los métodos para habilitar `mod_rewrite` varían dependiendo de su sistema operativo. Puedes activarlo ejecutando `sudo a2enmod rewrite` en Ubuntu. En CentOS está activado por defecto. No te olvides de reiniciar Apache después de hacer las modificaciones. - -### Nginx - -Flarum incluye un archivo `.nginx.conf` - asegúrate de que se ha descargado correctamente. Entonces, asumiendo que tienes un sitio PHP configurado dentro de Nginx, añade lo siguiente al bloque de configuración de tu servidor: - -```nginx -include /ruta/para/flarum/.nginx.conf; -``` - -### Caddy - -Caddy requiere una configuración muy sencilla para que Flarum funcione correctamente. Tenga en cuenta que debe reemplazar la URL con la suya propia y la ruta con la ruta a su propia carpeta `public`. Si está usando una versión diferente de PHP, también necesitará cambiar la ruta `fastcgi` para que apunte a su socket o URL de instalación de PHP correcta. - -``` -www.example.com { - root * /var/www/flarum/public - php_fastcgi unix//var/run/php/php7.4-fpm.sock - header /assets/* { - +Cache-Control "public, must-revalidate, proxy-revalidate" - +Cache-Control "max-age=25000" - Pragma "public" - } - file_server -} -``` -## Propiedad de la Carpeta - -Durante la instalación, Flarum puede solicitar que se permita la escritura en ciertos directorios. Modern operating systems are generally multi-user, meaning that the user you log in as is not the same as the user Flarum is running as. The user that Flarum is running as MUST have read + write access to: - -- The root install directory, so Flarum can edit `config.php`. -- The `storage` subdirectory, so Flarum can edit logs and store cached data. -- The `assets` subdirectory, so that logos and avatars can be uploaded to the filesystem. - -Extensions might require other directories, so you might want to recursively grant write access to the entire Flarum root install directory. - -There are several commands you'll need to run in order to set up file permissions. Please note that if your install doesn't show warnings after executing just some of these, you don't need to run the rest. - -First, you'll need to allow write access to the directory. On Linux: - -```bash -chmod 775 -R /path/to/directory -``` - -If that isn't enough, you may need to check that your files are owned by the correct group and user. By default, in most Linux distributions `www-data` is the group and user that both PHP and the web server operate under. You'll need to look into the specifics of your distro and web server setup to make sure. You can change the folder ownership in most Linux operating systems by running: - -```bash -chown -R www-data:www-data /path/to/directory -``` - -With `www-data` changed to something else if a different user/group is used for your web server. - -Additionally, you'll need to ensure that your CLI user (the one you're logged into the terminal as) has ownership, so that you can install extensions and manage the Flarum installation via CLI. To do this, add your current user (`whoami`) to the web server group (usually `www-data`) via `usermod -a -G www-data YOUR_USERNAME`. You will likely need to log out and back in for this change to take effect. - -Finally, if that doesn't work, you might need to configure [SELinux](https://www.redhat.com/en/topics/linux/what-is-selinux) to allow the web server to write to the directory. To do so, run: - -```bash -chcon -R -t httpd_sys_rw_content_t /path/to/directory -``` - -To find out more about these commands as well as file permissions and ownership on Linux, read [this tutorial](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). If you are setting up Flarum on Windows, you may find the answers to [this Super User question](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) useful. - -:::caution Environments may vary - -Your environment may vary from the documentation provided, please consult your web server configuration or web hosting provider for the proper user and group that PHP and the web server operate under. - -::: - -:::danger Never use permission 777 - -You should never set any folder or file to permission level `777`, as this permission level allows anyone to access the content of the folder and file regardless of user or group. - -::: - -## Personalización de las Rutas - -By default Flarum's directory structure includes a `public` directory which contains only publicly-accessible files. This is a security best-practice, ensuring that all sensitive source code files are completely inaccessible from the web root. - -However, if you wish to host Flarum in a subdirectory (like `yoursite.com/forum`), or if your host doesn't give you control over your webroot (you're stuck with something like `public_html` or `htdocs`), you can set up Flarum without the `public` directory. - -If you intend to install Flarum using one of the archives, you can simply use the `no-public-dir` (Public Path = No) [archives](#installing-by-unpacking-an-archive) and skip the rest of this section. If you're installing via Composer, you'll need to follow the instructions below. - -Simply move all the files inside the `public` directory (including `.htaccess`) into the directory you want to serve Flarum from. Then edit `.htaccess` and uncomment lines 9-15 in order to protect sensitive resources. For Nginx, uncomment lines 8-11 of `.nginx.conf`. - -You will also need to edit the `index.php` file and change the following line: - -```php -$site = require './site.php'; -``` - - Edit the `site.php` and update the paths in the following lines to reflect your new directory structure: - -```php -'base' => __DIR__, -'public' => __DIR__, -'storage' => __DIR__.'/storage', -``` - -Finally, check `config.php` and make sure the `url` value is correct. - -## Importar datos - -If you have an existing community and don't want to start from scratch, you may be able to import your existing data into Flarum. While there are no official importers yet, the community has made several unofficial importers: - -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) - -These can be used for other forum software as well by migrating to phpBB first, then to Flarum. Be aware that we can't guarantee that these will work nor can we offer support for them. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/internal/README.md b/i18n/es/docusaurus-plugin-content-docs/current/internal/README.md deleted file mode 100644 index ff153a3bc..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/internal/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -slug: '/internal' ---- - -# Internal Team Docs - -This is a new documentation section, where we will be posting some docs used internally by the Flarum team. We are starting this section to provide our community with transparency as to how Flarum is run, and to help those hoping to contribute to Flarum. \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md b/i18n/es/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md deleted file mode 100644 index 555e7977c..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bundled Extensions Policy - -This document is to assist in deciding what core features should be bundled or maintained by the Flarum project team. - -Understand that Flarum aims to have a lean and efficient team. To guarantee a transparent workload, we intentionally have a "this could be an extension" mentality. The acronym D.O.R.C. spells out our decision-making process. - -- **Density**: prevent bloating Flarum so that it becomes a burden to install on shared hosting plans with limited space. -- **Opinionatedness**: no extensions should be bundled that is only useful by only a limited amount of communities or on specific hosting environments. -- **Responsibility**: extensions that could easily be maintained by others should be maintained by others. -- **Complexity**: extensions that are complex in terms of design, frontend or backend code should not be a responsibility of the Flarum project team. - -### Density - -To prevent the installation size of Flarum from continuously increasing we need to protect it from extensions that bloat it. We should ship extensions with Flarum that, for instance, have kilobytes in media files. - -### Opinionatedness - -Our goal is to allow installation of Flarum, in its vanilla form, by any community on any hosting environment. This includes shared hosting environment as well. - -Releasing Flarum with extensions that add functionality specific to cloud based (AWS) installations or for corporate support communities, as such, is unwanted. - -### Responsibility - -Protecting the time of the project team is key. To do so we should empower the ecosystem in building extensions that it needs. Therefor we distance ourselves from the responsibility of building every and all extensions. The responsibility of extension development is held primarily by our community. - -### Complexity - -Complex extensions require a vast amount of time, not just for development, but also documentation and support. To protect the lean and efficient principles of the team, we will not take ownership of extensions that add this complexity. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/internal/extension-manager.md b/i18n/es/docusaurus-plugin-content-docs/current/internal/extension-manager.md deleted file mode 100644 index c6ef1c890..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/internal/extension-manager.md +++ /dev/null @@ -1,87 +0,0 @@ -# Extension Manager -This contains an explanation of how the extension manager works and what it has to offer. - -slightly outdated: see [the extensions guide for more](/extensions.md). - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the extension manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the extension manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Extension Manager Queue Table Preview](/en/img/extension-manager-queue.png) - -## TODO -- Try on shared hosting. -- Better explanation on the UI about background tasks. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/internal/merging-policy.md b/i18n/es/docusaurus-plugin-content-docs/current/internal/merging-policy.md deleted file mode 100644 index 067e2809f..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/internal/merging-policy.md +++ /dev/null @@ -1,38 +0,0 @@ -# PR Merging Policy - -Technical contributions to the Flarum source code go through a review process. Over the years we have tuned this process based on our experiences, our targeted development speed and availability. - -## What makes a great Pull Request? - -Great pull requests: - -- Have the [Pull Request template](https://github.com/flarum/.github/blob/main/PULL_REQUEST_TEMPLATE.md) filled out completely when opening a pull request. -- Do not combine different changes. Although tempting, don't change formatting of unrelated code. Stick to the one feature or change you wish to contribute. -- Have a related issue where the technical implementation has been agreed upon by the core team, or has been approved on by the core team through discussion on the official forums or other channels like Discord. -- Clearly explain the need for the change and list the areas where the pull request requires discussion. - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. We usually find several commits from bots like StyleCI in these prefabricated commit messages, their commit messages should be removed. - -- After merging: - - Assign the related issue (if none exists, the pull request itself, but never both) to the appropriate milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/es/docusaurus-plugin-content-docs/current/internal/merging.md b/i18n/es/docusaurus-plugin-content-docs/current/internal/merging.md deleted file mode 100644 index 0408b1bee..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/internal/merging.md +++ /dev/null @@ -1,29 +0,0 @@ -# PR Merging Workflow - - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all of the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. - -- After merging: - - Make sure the *issue* (if none exists, the PR - but not both) belongs to the appropriate milestone and project board. - - PRs in extensions cannot be assigned to core milestones, so create a core issue that references it and add it to the milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/es/docusaurus-plugin-content-docs/current/internal/package-manager.md b/i18n/es/docusaurus-plugin-content-docs/current/internal/package-manager.md deleted file mode 100644 index 823599db5..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/internal/package-manager.md +++ /dev/null @@ -1,89 +0,0 @@ -# Package Manager -This contains an explanation of how the package manager works and what it has to offer. - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the package manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the package manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Package Manager Queue Table Preview](/en/img/package-manager-queue.png) - -## TODO -- Try on shared hosting. -- Composer command job must not overlap. -- Code TODOs. -- Better explanation on the UI about background tasks. -- Take into consideration a scenario where we're updating an extension that isn't a root required dependency, like bundles. -- Run one background task at a time, prevent user from triggering multiple tasks. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/languages.md b/i18n/es/docusaurus-plugin-content-docs/current/languages.md deleted file mode 100644 index def0ea989..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/languages.md +++ /dev/null @@ -1,29 +0,0 @@ -# Idiomas - -Es fácil añadir un nuevo idioma a tu instalación básica de Flarum. Sólo tienes que seguir las siguientes instrucciones para descargar e instalar el paquete de idioma de tu elección. - -Una vez que hayas añadido un paquete de idioma, puedes [establecerlo como idioma por defecto](#setting-the-default-language) para tu foro. Y si alguna vez descubres que no necesitas uno de los paquetes de idiomas instalados, siempre puedes [desactivarlo](#disabling-a-language-pack). Si usas extensiones de terceros, asegúrate de [leer esto](#extensiones-de-terceros) antes de empezar. - -## Instalación del paquete de idioma - -Para empezar, visite la etiqueta [Extensiones > Idiomas](https://discuss.flarum.org/t/languages) en el sitio de la Comunidad Flarum y encuentre un paquete de idioma que desee instalar. - -Los paquetes de idiomas se instalan de la misma manera que las [extensiones](extensions.md). El idioma aparecerá en la página de **Extensiones** de la interfaz de administración y podrás activarlo allí. - -Eso es todo. Ahora debería poder utilizar el selector de idioma en la cabecera de su sitio para cambiar la visualización de su foro al nuevo idioma. - -## Establecer el idioma por defecto - -Una vez que haya instalado un paquete de idioma y se haya asegurado de que funciona, es posible que quiera establecerlo como idioma por defecto para los nuevos usuarios e invitados. Puedes hacerlo en la página **Básicos** de la interfaz de administración. - -## Desactivar un Paquete de Idioma - -Si decides que no necesitas dar soporte a un determinado idioma, después de todo, puedes desactivarlo. Simplemente localice el paquete de idiomas en la página **Extensiones** de la interfaz de administración y desactívelo. - -Desactivar un idioma puede ser útil si tienes un sitio monolingüe y no quieres que el selector de idioma aparezca en la cabecera del sitio. El selector de idioma se oculta cuando sólo está habilitado un idioma. - -## Extensiones de la Comunidad - -Mientras que los paquetes de idiomas descargados desde el sitio de la Comunidad Flarum generalmente incluirán traducciones para todas las extensiones que vienen incluidas en Flarum, _no_ por regla general cubrirán cualquier extensión de la comunidad que pueda tener instalada. Es responsabilidad de los desarrolladores proporcionar y mantener las traducciones de sus extensiones. - -Por lo tanto, antes de instalar una extensión comunitaria, debe comprobar que incluye traducciones para cada paquete de idiomas que haya instalado. Si descubre que una extensión no es compatible con un idioma que usted necesita, póngase en contacto directamente con el desarrollador para que le añada las traducciones necesarias. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/mail.md b/i18n/es/docusaurus-plugin-content-docs/current/mail.md deleted file mode 100644 index f96f2a778..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/mail.md +++ /dev/null @@ -1,29 +0,0 @@ -# Configuración del Correo Electrónico - -Cualquier comunidad necesita enviar correos electrónicos para permitir la verificación del correo electrónico, el restablecimiento de la contraseña, las notificaciones y otras comunicaciones a los usuarios. Configurar tu foro para enviar correos electrónicos debería ser uno de tus primeros pasos como administrador: una configuración incorrecta causará errores cuando los usuarios intenten registrarse. - -## Controladores Disponibles - -Flarum proporciona varios controladores por defecto, están listados y explicados a continuación. Los desarrolladores también pueden añadir [controladores de correo personalizados a través de extensiones](extend/mail.md). - -### SMTP - -Este es probablemente el controlador de correo electrónico más comúnmente utilizado, permitiéndole configurar un host, puerto/encriptación, nombre de usuario y contraseña para un servicio SMTP externo. Tenga en cuenta que el campo de encriptación espera `ssl` o `tls`. - -### Mail - -El controlador `mail` intentará utilizar el sistema de correo electrónico sendmail / postfix incluido en muchos servidores de alojamiento. Debe instalar y configurar correctamente sendmail en su servidor para que esto funcione. - -### Mailgun - -Este controlador utiliza su cuenta [Mailgun](https://www.mailgun.com/) para enviar correos electrónicos. Necesitarás una clave secreta, así como el dominio y la región de tu configuración de mailgun. - -To use the mailgun driver, you'll need to install the Guzzle composer package (a PHP HTTP client). You can do this by running `composer require guzzlehttp/guzzle:^6.0|^7.0` in your Flarum install's root directory. - -### Log - -The log mail driver DOES NOT SEND MAIL, and is primarily used by developers. It writes the content of any emails to the log file in `FLARUM_ROOT_DIRECTORY/storage/logs`. - -## Probar el Correo Electrónico - -Una vez que hayas guardado una configuración de correo electrónico, puedes hacer clic en el botón "Enviar correo de prueba" en la página de correo del panel de administración para asegurarte de que tu configuración funciona. Si ves un error o no recibes un correo electrónico, ajusta la configuración e inténtalo de nuevo. Asegúrate de revisar tu correo no deseado si no hay ningún error, pero no aparece nada en tu bandeja de entrada. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/releases.md b/i18n/es/docusaurus-plugin-content-docs/current/releases.md deleted file mode 100644 index d9359b84e..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/releases.md +++ /dev/null @@ -1,15 +0,0 @@ -# Notas de la versión - - - - -Las notas de la versión se pueden encontrar en la [Comunidad de Flarum](https://discuss.flarum.org/t/blog?sort=newest). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/rest-api.md b/i18n/es/docusaurus-plugin-content-docs/current/rest-api.md deleted file mode 100644 index 7e91238d3..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/rest-api.md +++ /dev/null @@ -1,375 +0,0 @@ -# Consuming the REST API - -Flarum exposes a REST API which is used by the single page application but also available for external scripts. - -The API follows the best practices defined by the [JSON:API](https://jsonapi.org/) specification. - -:::info - -To extend the REST API with new endpoints, see [API and Data Flow](extend/api.md) in the developer documentation. - -::: - -## Authentication - -The single page app uses session cookies to authenticate against the API. External scripts can use stateless authentication using [API Keys](#api-keys) or [Access Tokens](#access-tokens). - -`GET` endpoints can be used without authentication. Only content visible to guests will be returned. Other endpoints generally cannot be used without authentication because of the [CSRF protection](#csrf-protection). - -### API keys - -API Keys are the primary way for scripts, tools and integrations to interact with Flarum. - -#### Creation - -There is currently no UI to manage API Keys, but they can be created manually in the `api_keys` table of the database. - -The following attributes can be filled: - -- `key`: Generate a long unique token (recommended: alpha-numerical, 40 characters) and set it here, this will be the token used in the `Authorization` header. -- `user_id`: Optional. If set, the key can only be used to act as the given user. - -The remaining attributes are either automatically filled or currently not used: - -- `id`: Will be filled by MySQL auto-increment. -- `allowed_ips`: Not implemented. -- `scopes`: Not implemented. -- `created_at`: Can be set to any date, but is meant for the date of creation of the key. -- `last_activity_at`: Will be updated automatically when the token is used. - -#### Usage - -Attach your key value to each API request using the `Authorization` header. Then provide the user ID you want to interact as at the end of the header: - - Authorization: Token YOUR_API_KEY_VALUE; userId=1 - -If a `user_id` value has been set for the key in the database, `userId=` will be ignored. Otherwise, it can be set to any valid user ID that exists in the database. - -### Access Tokens - -Access Tokens are short-lived tokens that belong to a specific user. - -Those tokens are used behind the scenes for cookie sessions. Their use in stateless API requests has the same effect as a regular session. The user last activity will be updated each time the token is used. - -#### Creation - -All users are allowed to create access tokens. To create a token, use the `/api/token` endpoint with the credentials of your user: - -``` -POST /api/token HTTP/1.1 - -{ - "identification": "Toby", - "password": "pass7word" -} - -HTTP/1.1 200 OK - -{ - "token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX", - "userId": "1" -} -``` - -At the moment, 3 token types exist, although only 2 types can be created via the REST API. - -- `session` tokens expire after 1h of inactivity. This is the default token type. -- `session_remember` tokens expire after 5 years of inactivity. They can be obtained by specifying `remember=1` in the request attributes. -- `developer` tokens never expire. They can only be created manually in the database at the moment. - -**All access tokens are deleted when the user logs out** (this includes `developer` tokens, although it is planned to change it). - -#### Usage - -Attach the returned `token` value to each API request using the `Authorization` header: - - Authorization: Token YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX - -### CSRF Protection - -Most of the `POST`/`PUT`/`DELETE` API endpoints are protected against [Cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery). This means stateless requests are not possible without authentication. - -When using an API Key or Access Token, CSRF protection is bypassed. - -## Endpoints - -This part of the documentation is still in progress. We are researching options to provide an automated documentation of the endpoints. - -Every extension adds new endpoints and attributes so it's difficult to provide a complete documentation of all endpoints. A good way to discover endpoints is to use the browser development tools to inspect requests made by the single page application. - -Below are a few examples of commonly used endpoints. JSON has been truncated to make reading easier. - -### List discussions - - GET /api/discussions - -```json -{ - "links": { - "first": "https://flarum.tld/api/discussions", - "next": "https://flarum.tld/api/discussions?page%5Boffset%5D=20" - }, - "data": [ - { - "type": "discussions", - "id": "234", - "attributes": { - "title": "Lorem Ipsum", - "slug": "234-lorem-ipsum", - "commentCount": 10, - "participantCount": 3, - "createdAt": "2022-01-01T10:20:30+00:00", - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "lastPostNumber": 10, - "canReply": true, - "canRename": true, - "canDelete": true, - "canHide": true, - "isHidden": true, - "hiddenAt": "2022-01-06T10:20:30+00:00", - "lastReadAt": "2022-01-02T10:20:30+00:00", - "lastReadPostNumber": 2, - "isApproved": true, - "canTag": true, - "isLocked": false, - "canLock": true, - "isSticky": false, - "canSticky": true, - "canMerge": true, - "subscription": null - }, - "relationships": { - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - "lastPostedUser": { - "data": { - "type": "users", - "id": "64" - } - }, - "tags": { - "data": [ - { - "type": "tags", - "id": "3" - } - ] - }, - "firstPost": { - "data": { - "type": "posts", - "id": "668" - } - } - } - }, - { - "type": "discussions", - "id": "234", - "attributes": { - // [...] - }, - "relationships": { - // [...] - } - }, - // [...] more discussions - ], - "included": [ - { - "type": "users", - "id": "1", - "attributes": { - "username": "Admin", - "displayName": "Admin", - "avatarUrl": null, - "slug": "1" - } - }, - { - "type": "users", - "id": "64", - "attributes": { - "username": "Flarum", - "displayName": "Flarum", - "avatarUrl": "https://flarum.tld/assets/avatars/Z4hEncw0ndVqZ8be.png", - "slug": "64" - } - }, - { - "type": "tags", - "id": "3", - "attributes": { - "name": "Welcome", - "description": "Post interesting things here", - "slug": "welcome", - "color": "#888", - "backgroundUrl": null, - "backgroundMode": null, - "icon": "fas fa-bullhorn", - "discussionCount": 30, - "position": 1, - "defaultSort": null, - "isChild": false, - "isHidden": false, - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "canStartDiscussion": true, - "canAddToDiscussion": true, - "isRestricted": false - } - }, - { - "type": "posts", - "id": "668", - "attributes": { - "number": 1, - "createdAt": "2022-01-01T10:20:30+00:00", - "contentType": "comment", - "contentHtml": "

Hello World

" - } - }, - // [...] more includes for the other discussions - ] -} -``` - -### Create discussion - - POST /api/discussions - -```json -{ - "data":{ - "type": "discussions", - "attributes": { - "title": "Lorem Ipsum", - "content": "Hello World" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "1" - } - ] - } - } - } -} -``` - -The response includes the ID of the new discussion: - -```json -{ - "data": { - "type": "discussions", - "id": "42", - "attributes": { - "title": "Lorem Ipsum", - "slug": "42-lorem-ipsum", - "commentCount": 1 - // [...] other attributes - }, - "relationships": { - "posts": { - "data": [ - { - "type": "posts", - "id": "58" - } - ] - }, - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - // [...] other relationships - } - }, - "included":[ - { - "type": "posts", - "id": "38", - "attributes": { - "number": 1, - "contentType": "comment", - "contentHtml": "\u003Cp\u003EHello World\u003C\/p\u003E" - // [...] other attributes - } - } - // [...] other includes - ] -} -``` - -### Create user - - POST /api/users - -```json -{ - "data": { - "attributes": { - "username": "Flarum", - "email": "flarum@example.com", - "password": "correcthorsebatterystaple" - } - } -} -``` - -## Errors - -Flarum uses various HTTP status code and includes error descriptions that follow the [JSON:API error spec](https://jsonapi.org/format/#errors). - -Below are a few common errors you might encounter when using the REST API: - -### CSRF Token Mismatch - -If you receive a 400 HTTP error with `csrf_token_mismatch` message, it means the `Authorization` header is absent or invalid and Flarum attempted to authenticate through the session cookie. - -```json -{ - "errors": [ - { - "status": "400", - "code": "csrf_token_mismatch" - } - ] -} -``` - -### Validation errors - -Validation errors are returned with 422 HTTP status code. The name of the invalid field is returned as the `pointer` value. There can be multiple errors for a single field at the same time. - -```json -{ - "errors": [ - { - "status": "422", - "code": "validation_error", - "detail": "The username has already been taken.", - "source":{ - "pointer":"\/data\/attributes\/username" - } - }, - { - "status": "422", - "code": "validation_error", - "detail": "The email has already been taken.", - "source": { - "pointer":"\/data\/attributes\/email" - } - } - ] -} -``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/scheduler.md b/i18n/es/docusaurus-plugin-content-docs/current/scheduler.md deleted file mode 100644 index 6123ce7c3..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/scheduler.md +++ /dev/null @@ -1,55 +0,0 @@ -# Scheduler - -The Flarum scheduler allows extensions to automate certain tasks effortlessly. In this guide we will see how to set it up. We won't go into the details of cron itself, but if you want to read more about it, I suggest you take a look at [this Wikipedia article](https://en.wikipedia.org/wiki/Cron) on cron. - -## Why should I care? - -Quite simply, a growing list of extensions now support handling certain functions automatically for you, completely behind the scenes. Wondering why `fof/drafts` 'scheduled drafts' are not posting, or `fof/best-answer` 'remind users to set a best answer after X days' does not fire? That'll be because they will setup themselves with the scheduler service, but without a one-liner cron job, nothing will happen! - -## What extensions currently use the scheduler? - -Some of the most popular examples are the following: - -- [FoF Best Answer](https://github.com/FriendsOfFlarum/best-answer) -- [FoF Drafts](https://github.com/FriendsOfFlarum/drafts) -- [FoF Sitemap](https://github.com/FriendsOfFlarum/sitemap) -- [FoF Open Collective](https://github.com/FriendsOfFlarum/open-collective) -- [FoF Github Sponsors](https://github.com/FriendsOfFlarum/github-sponsors) - -## Ok, let's get this setup! - -Most (if not all) Linux distros either come with, or can have, cron installed. For example, on Debian and Ubuntu based systems, you can install `cron` like this: - -``` -sudo apt-get update -sudo apt-get install cron -``` - -In case you are using a RHEL based Linux distribution (CentOS, AlmaLinux, Rocky Linux...), install cron like this: - -``` -sudo dnf update -sudo dnf install crontabs -``` - -Once you have cron installed, let's create the one and only entry you need for Flarum: - -``` -crontab -e -``` - -This will open the cron editor. You may or may not have other entries there. Add this line, and remember to leave an empty line at the bottom. - -``` -* * * * * cd /path-to-your-project && php flarum schedule:run >> /dev/null 2>&1 -``` - -`* * * * *` tells cron to run your command every minute. - -In case you want to use a different value and don't know exactly how cron expressions work, you can use a [cron expression generator](https://crontab.guru) to easily get the desired string. - -`cd /path-to-your-project && php flarum schedule:run` executes Flarum's scheduler to trigger any tasks currently waiting to be run. If PHP isn't in your system's path, you may need to experiment with setting the full path to PHP. - -Lastly `>> /dev/null 2>&1` suppresses any output from the command. - -Voila! Now any extension that registers a task to run, anything from every minute to daily, monthly, yearly - whatever - will now run on your server. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/themes.md b/i18n/es/docusaurus-plugin-content-docs/current/themes.md deleted file mode 100644 index 6900853ca..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/themes.md +++ /dev/null @@ -1,29 +0,0 @@ -# Theming - -While we've worked hard to make Flarum as beautiful as we can, each community will probably want to make some tweaks/modifications to fit their desired style. - -## Panel de Administración - -The [admin dashboard](admin.md)'s Appearance page is a great first place to start customizing your forum. Here, you can: - -- Select theme colors -- Toggle dark mode and a colored header -- Upload a logo and favicon (icon shown in browser tabs) -- Add HTML for custom headers and footers -- Add [custom LESS/CSS](#css-theming) to change how elements are displayed - -## CSS Theming - -El CSS es un lenguaje de hojas de estilo que indica a los navegadores cómo mostrar los elementos de una página web. Nos permite modificar todo, desde los colores hasta las fuentes, el tamaño de los elementos y su posicionamiento, y las animaciones. Añadir CSS personalizado puede ser una gran manera de modificar su instalación de Flarum para que coincida con un tema. - -Un tutorial de CSS está más allá del alcance de esta documentación, pero hay muchos recursos en línea para aprender los fundamentos de CSS. - -:::tip - -Flarum utiliza LESS, que facilita la escritura de CSS al permitir variables, condicionales y funciones. - -::: - -## Extensiones - -El flexible [sistema de extensiones](extensions.md) de Flarum te permite añadir, eliminar o modificar prácticamente cualquier parte de Flarum. Si quieres hacer modificaciones temáticas sustanciales más allá de cambiar colores/tamaños/estilos, una extensión personalizada es definitivamente el camino a seguir. Para aprender cómo hacer una extensión, ¡consulta nuestra [documentación de extensiones](extend/README.md)! diff --git a/i18n/es/docusaurus-plugin-content-docs/current/troubleshoot.md b/i18n/es/docusaurus-plugin-content-docs/current/troubleshoot.md deleted file mode 100644 index a71a7e175..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/troubleshoot.md +++ /dev/null @@ -1,56 +0,0 @@ -# Resolución de problemas - -Si Flarum no se instala o no funciona como se espera, lo primero que debes hacer es *comprobar de nuevo* si tu entorno cumple los [requisitos del sistema](install.md#server-requirements). Si te falta algo que Flarum necesita para funcionar, tendrás que remediarlo primero. - -A continuación, deberías tomarte unos minutos para buscar en el [foro de soporte](https://discuss.flarum.org/t/support) y en el [issue tracker](https://github.com/flarum/core/issues). Es posible que alguien ya haya informado del problema y que haya una solución disponible o en camino. Si has buscado a fondo y no puedes encontrar ninguna información sobre el problema, es hora de empezar a solucionar el problema. - -## Step 0: Activate debug mode - -:::danger Skip on Production - -These debugging tools are very useful, but can expose information that shouldn't be public. These are fine if you're on a staging or development environment, but if you don't know what you're doing, skip this step when on a production environment. - -::: - -Antes de continuar, debes habilitar las herramientas de depuración de Flarum. Simplemente abre **config.php** con un editor de texto, cambia el valor de `debug` a `true`, y guarda el archivo. Esto hará que Flarum muestre mensajes de error detallados, dándote una idea de lo que está fallando. - -Si ha estado viendo páginas en blanco y el cambio anterior no ayuda, intente establecer `display_errors` a `On` en su archivo de configuración **php.ini**. - -## Paso 1: Arreglos comunes - -A lot of issues can be fixed with the following: - -* Borrar la caché del navegador -* Borrar la caché del backend con [`php flarum cache:clear`](console.md). -* Asegúrese de que su base de datos está actualizada con [`php flarum migrate`](console.md). -* Asegúrese de que la [configuración de correo electrónico](mail.md) en su panel de administración es correcta: una configuración de correo electrónico no válida causará errores al registrarse, restablecer una contraseña, cambiar correos electrónicos y enviar notificaciones. -* Comprueba que su `config.php` es correcto. Por ejemplo, asegúrate de que se utiliza la "url" correcta. -* One potential culprit could be a custom header, custom footer, or custom LESS. If your issue is in the frontend, try temporarily removing those via the Appearance page of the admin dashboard. - -También querrás echar un vistazo a la salida de [`php flarum info`](console.md) para asegurarte de que nada importante está fuera de lugar. - -## Paso 2: Reproducir el problema - -Intenta que el problema se repita. Presta mucha atención a lo que estás haciendo cuando ocurre. Does it happen every time, or only now and then? Try changing a setting that you think might affect the problem, or the order in which you're doing things. ¿Sucede en algunas condiciones, pero no en otras? - -Si has añadido o actualizado recientemente una extensión, deberías desactivarla temporalmente para ver si el problema desaparece. Asegúrate de que todas tus extensiones fueron creadas para ser usadas con la versión de Flarum que estás ejecutando. Las extensiones desactualizadas pueden causar una variedad de problemas. - -En algún momento puedes tener una idea de lo que está causando tu problema, y encontrar una manera de arreglarlo. Pero incluso si eso no sucede, probablemente se encontrará con algunas pistas valiosas que nos ayudarán a averiguar lo que está pasando, una vez que haya presentado su informe de error. - -## Paso 3: Recoger información - -Si parece que vas a necesitar ayuda para resolver el problema, es hora de ponerse a recopilar datos. Busca mensajes de error u otra información sobre el problema en los siguientes lugares: - -* En la propia página -* En la consola del navegador (Chrome: Más herramientas -> Herramientas de desarrollo -> Consola) -* Registrados en el registro de errores del servidor (p. ej. `/var/log/nginx/error.log`) -* Registrado en el registro de errores de PHP-FPM (p. ej. `/var/log/php7.x-fpm.log`) -* Registrados por Flarum (`storage/logs/flarum.log`) - -Copie cualquier mensaje en un archivo de texto y anote algunas notas sobre *cuando* se produjo el error, *qué* estaba haciendo en ese momento, etc. Asegúrate de incluir cualquier información que hayas obtenido sobre las condiciones en las que se produce el problema y en las que no. Añade toda la información posible sobre el entorno de tu servidor: Versión del sistema operativo, versión del servidor web, versión y manejador de PHP, etc. - -## Paso 4: Preparar un informe - -Una vez que hayas reunido toda la información que puedas sobre el problema, estás listo para presentar un informe de error. Por favor, sigue las instrucciones en [Reportando Bugs](bugs.md). - -Si descubres algo nuevo sobre el problema después de presentar tu informe, por favor, añade esa información al final de tu mensaje original. Es una buena idea presentar un informe incluso si has resuelto el problema por tu cuenta, ya que otros usuarios también pueden beneficiarse de tu solución. Si has encontrado una solución temporal para el problema, asegúrate de mencionarla también. \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/update.md b/i18n/es/docusaurus-plugin-content-docs/current/update.md deleted file mode 100644 index 6d890df3c..000000000 --- a/i18n/es/docusaurus-plugin-content-docs/current/update.md +++ /dev/null @@ -1,110 +0,0 @@ -# Actualización - -## From the Admin Dashboard - -:::info - -If you have the extension manager extension installed you can simply run the update from its interface and skip this page entirely. - -::: - ---- - -To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. - -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. - -## General Steps - -**Step 1:** Make sure all your extensions have versions compatible with the Flarum version you're trying to install. This is only needed across major versions (e.g. you probably don't need to check this if upgrading from v1.0.0 to v1.1.0, assuming your extensions follow recommended versioning). You can check this by looking at the extension's [Discuss thread](https://discuss.flarum.org/t/extensions), searching for it on [Packagist](http://packagist.org/), or checking databases like [Extiverse](https://extiverse.com). You'll need to remove (not just disable) any incompatible extensions before updating. Please be patient with extension developers! - -**Step 2:** Take a look at your `composer.json` file. Unless you have a reason to require specific versions of extensions or libraries, you should set the version string of everything except `flarum/core` to `*` (including `flarum/tags`, `flarum/mentions`, and other bundled extensions). Make sure `flarum/core` is NOT set to `*`. If you're targeting a specific version of Flarum, set `flarum/core` to that (e.g. `"flarum/core": "v0.1.0-beta.16`). If you just want the most recent version, use `"flarum/core": "^1.0"`. - -**Step 3:** If your local install uses [local extenders](extenders.md), make sure they are up to date with changes in Flarum. - -**Step 4:** We recommend disabling third-party extensions in the admin dashboard before updating. This isn't strictly required, but will make debugging easier if you run into issues. - -**Step 5:** Make sure your PHP version is supported by the version of Flarum you are trying to upgrade to, and that you are using Composer 2 (`composer --version)`. - -**Step 6:** Finally, to update, run: - -``` -composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -php flarum migrate -php flarum cache:clear -``` - -**Step 7:** If applicable, restart your PHP process and opcache. - -## Major Version Update Guides - -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) - -1. Do steps 1-5 above. -2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. -3. Change `flarum/core`'s version string in `composer.json` from `^0.1.0` to `^1.0`. -4. Remove the `"minimum-stability": "beta",` line from your `composer.json` -5. Do steps 6 and 7 above. - -## Troubleshooting Issues - -Mientras Flarum esté en fase beta, las instrucciones sobre cómo actualizar se publicarán en cada [anuncio de lanzamiento](https://discuss.flarum.org/t/blog?sort=newest). - -### Errors While Updating - -Here we'll go through several common types of issues while trying to update Flarum. - ---- - -If the output is short and contains: - -``` -Nothing to modify in lock file -``` - -Or does not list `flarum/core` as an updated package, and you are not on the latest flarum version: - -- Revisit step 2 above, make sure that all third party extensions have an asterisk for their version string. -- Make sure your `flarum/core` version requirement isn't locked to a specific minor version (e.g. `v0.1.0-beta.16` is locked, `^1.0.0` isn't). If you're trying to update across major versions of Flarum, follow the related major version update guide above. - ---- - -For other errors, try running `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO` - -If the output looks something like this: - -``` -flarum/flarum - requires flarum/core (v0.1.0-beta.15) -fof/moderator-notes 0.4.4 requires flarum/core (>=0.1.0-beta.15 <0.1.0-beta.16) -jordanjay29/flarum-ext-summaries 0.3.2 requires flarum/core (>=0.1.0-beta.14 <0.1.0-beta.16) -flarum/core v0.1.0-beta.16 requires dflydev/fig-cookies (^3.0.0) -flarum/flarum - does not require dflydev/fig-cookies (but v2.0.3 is installed) -flarum/core v0.1.0-beta.16 requires franzl/whoops-middleware (^2.0.0) -flarum/flarum - does not require franzl/whoops-middleware (but 0.4.1 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/bus (^8.0) -flarum/flarum - does not require illuminate/bus (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/cache (^8.0) -flarum/flarum - does not require illuminate/cache (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/config (^8.0) -flarum/flarum - does not require illuminate/config (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/container (^8.0) -flarum/flarum - does not require illuminate/container (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/contracts (^8.0) -flarum/flarum - does not require illuminate/contracts (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/database (^8.0) -flarum/flarum - does not require illuminate/database (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/events (^8.0) -flarum/flarum - does not require illuminate/events (but v6.20.19 is installed) -... (this'll go on for a bit) -``` - -It is very likely that some of your extensions have not yet been updated. - -- Revisit step 1 again, make sure all your extensions have versions compatible with the core version you want to upgrade to. Remove any that don't. -- Make sure you're running `composer update` with all the flags specified in the update step. - -If none of this fixes your issue, feel free to reach out on our [Support forum](https://discuss.flarum.org/t/support). Make sure to include the output of `php flarum info` and `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO`. - -### Errors After Updating - -If you are unable to access your forum after updating, follow our [troubleshooting instructions](troubleshoot.md). diff --git a/i18n/es/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md b/i18n/es/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md index 96cdc4c5d..eb1deadc9 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md @@ -305,7 +305,7 @@ export default class NewPostNotification extends Notification { } ``` -En el ejemplo, el icono es una estrella, el enlace irá al nuevo post, y el contenido dirá que "{usuario} publicó". +En el ejemplo, el icono es una estrella, el enlace irá al nuevo post, y el contenido dirá que "`{usuario}` publicó". A continuación, tenemos que decirle a Flarum que la notificación que envía en el backend se corresponde con la notificación del frontend que acabamos de crear. diff --git a/i18n/es/docusaurus-plugin-content-docs/version-1.x/update.md b/i18n/es/docusaurus-plugin-content-docs/version-1.x/update.md index 6d890df3c..34acec449 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-1.x/update.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. +If updating across major versions (e.g. `<=0.1.0` to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. ## General Steps @@ -38,7 +38,7 @@ php flarum cache:clear ## Major Version Update Guides -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) +### Updating from Beta (`<=0.1.0`) to Stable v1 (^1.0.0) 1. Do steps 1-5 above. 2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/README.md b/i18n/it/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index fee28613d..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,45 +0,0 @@ -- - - -slug: / -- - - - -# Flarum? Cos'è? - -Flarum è un potente software per creare forum di discussione nel tuo sito web. Velocissimo e facile da utilizzare con tutte le feauture necessarie per la creazione del tuo forum di successo. È anche estremamente estensibile, consentendo la massima personalizzabilità. - -![Screenshot della schermata Home di Flarum](/en/img/home_screenshot.png) - -## Obiettivi - -Flarum è la potente evoluzione di [esoTalk](https://github.com/esotalk/esoTalk) e [FluxBB](https://fluxbb.org). Progettato per essere: - -* **Veloce e semplice.** Nessun disordine e niente dipendenze complesse. Flarum è progettato in PHP per essere facile e veloce da distribuire. L'interfaccia è basata su [Mithril](https://mithril.js.org), un potente e performante framework JavaScript dall'ingombro minimo. - -* **Bello e responsive.** Il suo design si adatta a dispositivi fissi, mobili e tablet in maniera responsive. Flarum è progettato con cura per essere coerente e intuitivo su tutte le piattaforme.. - -* **Potente ed estendibile.** Personalizza, estendi e integra Flarum per creare la tua community unica. L'architettura di Flarum è molto flessibile grazie alle sue [potenti API per le estensioni](/extend/). - -* **Gratuito e aperto.** Flarum è totalmente gratuito e rilasciato sotto [Licenza MIT](https://github.com/flarum/flarum/blob/master/LICENSE). - -Puoi leggere di più sulla nostra [filosofia di Flarum qui](https://discuss.flarum.org/d/28869-flarum-philosophy-and-values). - -## Aiuta il progetto Flarum - -Flarum è un[software libero, open source](https://github.com/flarum/core), gestito solo da volontari. Contiamo sui contributi della comunità per aiutarci a migliorare ed espandere Flarum. - -🧑 💻 Se sei uno sviluppatore, considera [di contribuire alle estensioni di Flarum o al core](contributing.md). Questo è **il** modo più efficiente per aiutare Flarum, e il vostro lavoro può avere un enorme impatto: ci sono migliaia di siti Flarum là fuori, con milioni di utenti finali totali. - -🧩 Se manca una funzionalità, o hai un'idea per un tema, [scrivere un'estensione personalizzata](extend/README.md) renderà Flarum molto più bello per te e per gli altri. - -✒️ Se hai esperienza nella scrittura tecnica, i tuoi contributi alla [nostra documentazione](https://github.com/flarum/docs/issues) potrebbero aiutare i futuri utenti, gli amministratori e gli sviluppatori a sfruttare al massimo Flarum. - -🌐 Se parli più lingue, potresti [contribuire alle traduzioni](extend/language-packs.md) per rendere Flarum accessibile a innumerevoli utenti in tutto il mondo. - -💸 La Fondazione Flarum non guadagna denaro da Flarum, ma ha allo stesso tempo fatture da pagare. Le donazioni tramite [GitHub Sponsors](https://github.com/sponsors/flarum) o [OpenCollective](https://opencollective.com/flarum) sono sempre gradite e aiutano a mantenere Flarum un software di alto livello. In passato siamo stati anche in grado di supportare finanziariamente alcuni dei nostri principali sviluppatori, in modo che potessero lavorare su Flarum part-time. Questo non sarebbe possibile senza il vostro sostegno finanziario. - -🧑‍🤝‍🧑 Unisciti a [la nostra community](https://discuss.flarum.org) per parlare dello sviluppo di Flarum, ottenere aiuto con la tua estensione, o semplicemente incontrare persone fantastiche! Se hai esperienza con Flarum, puoi anche aiutare chi si affaccia allo sviluppo per la prima volta! - -🐛 Se c'è un bug che ti preoccupa, o hai un un'idea in mente per qualche nuova funzionalità, non possiamo saperlo a meno che tu non ce lo dica! Tracciamo bug, suggerimenti e futuri piani di sviluppo [tramite le "issue" di GitHub](https://github.com/flarum/core/issues). Se c'è già un problema aperto, aggiungere mi piace e ulteriori informazioni può rivelarsi molto utile! - -📣 E se Flarum ti piace, considera l'idea di parlarne sul tuo blog/twitter/Facebook! Più persone conoscono Flarum significa che più persone contribuiscono al progetto, e quindi più attività, migliori estensioni e uno sviluppo più veloce. - -Flarum non sarebbe qui senza la nostra fenomenale community. Se sei interessato a contribuire, consulta il nostro link [contributo degli sviluppatori](contributing.md) e [altri documenti](contributing-docs-translations.md) per maggiori informazioni. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/admin.md b/i18n/it/docusaurus-plugin-content-docs/current/admin.md deleted file mode 100644 index 9107e5f0c..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/admin.md +++ /dev/null @@ -1,13 +0,0 @@ -# Pannello di amministrazione - -Il pannello di amministrazione di Flarum un'interfaccia user-friendly per la gestione del tuo forum. Per accedere al pannello di amministrazione, clicca sul tuo **Nome** nell'angolo in alto a destra dello schermo, e scegli **Amministrazione**. È disponibile solo per gli utenti nel gruppo [gruppo](permissions.md) "Admin". - -The Admin Dashboard has the following sections, being: -- **Dashboard** - Shows the main Admin Dashboard, containing statistics and other relevant information. -- **Basics** - Shows the options to set basic forum details such as Name, Description, and Welcome Banner. -- **Email** - Allows you to configure your E-Mail settings. Refer [here](https://docs.flarum.org/mail) for more information. -- **Permissions** - Shows the permissions for each user group, and allows you to configure global and specific scopes. -- **Appearance** - Allows you to customize the forum's colors, branding and add additional CSS for customization. -- **Users** - Provides you with a paginated list of all the users in the forum, and grants you the ability to edit the user or take administrative actions. - -Apart from the above mentioned sections, the Admin Dashboard also allows you to manage your Extensions (including the flarum core extensions such as Tags) under the _Features_ section. Extensions which modify the forum theme, or allow you to use multiple languages are categorized under the _Themes_ and _Languages_ section respectively. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/bugs.md b/i18n/it/docusaurus-plugin-content-docs/current/bugs.md deleted file mode 100644 index 85e8ea193..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/bugs.md +++ /dev/null @@ -1,28 +0,0 @@ -# Reporting Bugs - -:::danger Security Vulnerabilities - -If you discover a security vulnerability within Flarum, please follow our [security policy](https://github.com/flarum/core/security/policy) so we can address it promptly. - -::: - -Thank you for helping us test Flarum. We're happy to have you on the team! We need people who can *troubleshoot issues patiently* and *communicate them clearly*. As you probably know, good bug reporting takes some time and effort. If you're fine with that, then let's get started! - -## Duplicates - -Found a bug already? Wonderful! We'd love to hear about it — but first you should check around to make sure you're not wasting your time on a known issue: - -- Search our [Support forum](https://discuss.flarum.org/t/support) to see if it's already been reported. -- We could be working on a fix, so search our [issue tracker](https://github.com/flarum/core/issues) too. - -If you've searched *thoroughly* and come up empty-handed, we'll welcome your report. If it's just a simple issue (a misspelled word or graphics glitch, for example) skip to the next paragraph. But if you're seeing errors, or something is clearly broken, we'll need you to gather some information first. Please head over to our [Troubleshooting](troubleshoot.md) guide and follow the instructions there. Collect as much info as you can! - -## Reporting - -We track issues on GitHub. Make sure you open your issue in the [correct repository](https://github.com/flarum), and fill out all of the information in the Bug Report template. - -If you can, check if the issue is reproducible with the latest version of Flarum. If you are using a pre-release or development version, please indicate the specific version you are using. - -Remember: the goal of a bug report is to make it easy for us to replicate the bug and fix it. You might want to read [this article](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) for some useful tips on how to write an effective bug report. It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Issues with no clear reproduction steps will not be triaged. If an issue labeled "needs verification" receives no further input from the issue author for more than 5 days, it will be closed. - -Once you've posted your report, we'd ask that you please *follow the discussion* and wait patiently. We may need to ask for further details or clarification; but we've always got plenty to do, and it could be a while before we can give your report the time it deserves. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/code-of-conduct.md b/i18n/it/docusaurus-plugin-content-docs/current/code-of-conduct.md deleted file mode 100644 index 04147c78b..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/code-of-conduct.md +++ /dev/null @@ -1,51 +0,0 @@ -# Codice di Condotta - -### _Benvenuti nella community di Flarum!_ - -... E grazie di essere con noi! Siamo entusiasti di Flarum, e siamo sempre felici di vedere persone che la pensano come noi. Vogliamo che tutti possiate ottenere il massimo da Flarum e dalla comunità Flarum, quindi vi chiediamo di leggere e seguire queste linee guida. Queste ultime si applicano sia che tu stia utilizzando il nostro forum, la chat di Discord, la comunicazione su GitHub o qualsiasi altra forma di comunicazione senza la comunità di Flarum. - -### Prima di ogni cosa, sii calmo! - -Siamo tutti qui per parlare di Flarum, e lavorare insieme per renderlo un'applicazione sempre migliore. Criticare le idee (con ragionevoli argomenti, si intende) è una parte importante per noi. Ma non lasciamo che questo faccia sfociare un post in attacchi personal, la negativit� non porta a nulla di buono. Ti chiediamo pertanto di evitare quanto segue: - -- Linguaggio scurrile o offensivo, nonché qualsiasi tipo di incitamento all'odio -- Post destinati a molestare, impersonare o diffamare altri -- Cancellazione non necessaria del contenuto pubblicato -- Tentativi di estorcere o esporre le informazioni private di altri -- Contenuti osceni o sessualmente espliciti -- Spam, messaggi di phishing e qualsiasi azione intesa a deturpare questo sito -- Discussione sulla pirateria del software e argomenti simili - -*Tutte queste azioni sono passibili di azione da parte dei moderatori. Se hai un problema con un altro membro, ti chiediamo di non affrontarlo da solo. Se è sul forum, utilizza il comando Segnala sul post in questione, quindi lascia che sia lo staff a occuparsi della situazione. Otherwise, report the violation using our [contact page](https://flarum.org/foundation/contact), option Legal. - -I nostri moderatori possono modificare o eliminare qualsiasi contenuto offensivo o di disturbo al flusso di comunicazione. Reati gravi o ripetuti possono portare alla sospensione dell'account dell'utente offensivo. Detto ciò, sii sempre gentile e calmo. 😎 - -### Fatti sentire! - -Vuoi iniziare una nuova discussione? Innanzitutto, assicurati di leggere le [nostre FAQ](faq.md) e segui i link per assicurarti di essere completamente informato sul progetto. Quindi trascorri un po' di tempo a navigare nel forum, familiarizza con [il sistema dei tag](https://discuss.flarum.org/tags), e fai qualche ricerca per parole chiave correlate al tuo argomento: ci potrebbe essere qualcuno che ha già avviato una discussione simile o identica! - -Quando sei sicuro di essere pronto per iniziare una discussione, tieni presente i seguenti punti: - -- Dagli un buon titolo! Otterrai i migliori risultati se il tuo titolo chiarisce di cosa vuoi parlare. -- Scegli i tag giusti. Ciò aumenterà  le probabilità  che il tuo post venga letto e riceva risposte più in fretta. -- Non postare ripetutamente sullo stesso argomento, perchè così facendo potresti ottenere l'effetto opposto. -- If not using a tag set aside for multilingual use, *post in English only.* We can't help you if we don't understand your posts. -- Ricorda, non è necessario firmare i tuoi post. Abbiamo il tuo profilo per farci sapere chi sei. Abbiamo il tuo profilo per farci sapere chi sei. - -Per favore, sforzati di aiutarci a mantenere le cose organizzate. Il tempo speso a riordinare è tempo che non possiamo dedicare a conoscerti, discutere i tuoi problemi e parlare di Flarum. Che dopotutto è il nostro scopo principale. - -### Le tue risposte sono importanti - -Ti stai prendendo il tempo per partecipare a una discussione, nella speranza che gli altri leggano le tue idee e le tengano in considerazione. Allora perch� non fare lo sforzo di rendere la tua risposta degna di essere letta? - -- Non rispondere al titolo. Prenditi un po di tempo per leggere tutto attentamente, ed esamina per bene tutta la conversazione. -- Chiediti se la tua risposta aggiunge davvero qualcosa alla discussione. In caso contrario, pensaci ancora prima di pubblicare. -- Evita di rispondere con una sola parola come "grazie" o "ok"; puoi usare il tasto "Mi piace" per questo. -- Evita di creare più¹ post di seguito quando uno sarebbe sufficiente. Questo è un forum, non una chat room. -- Se è probabile che la tua risposta possa deviare il corso della discussione, valuta invece di iniziare una nuova discussione. -- Se vuoi solo pubblicare un po' di sciocchezze come test, fallo nel apposita sezione di test del forum. -- Assicurati che le tue risposte forniscano feedback e supporto costruttivi per consentire una comunità  inclusiva. - -Nessuno si lamenterà  dello scherzo occasionale o dell'osservazione intelligente. Ci piace mantenere l'atmosfera leggera! Ma anche per mantenere le cose produttive, ti chiediamo di cercare di evitare di far deragliare del tutto una discussione. - -> Grazie a Dominion per il suo aiuto nella stesura delle linee guida. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/composer.md b/i18n/it/docusaurus-plugin-content-docs/current/composer.md deleted file mode 100644 index 5731d8e80..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/composer.md +++ /dev/null @@ -1,152 +0,0 @@ - -# Composer - -Flarum usa [Composer](https://getcomposer.org) per gestire le sue dipendenze ed estensioni. Dovrai usare composer per: - -- Install or update Flarum through the command line -- Install, update, or remove Flarum extensions through the command line - -Questa guida è una piccola base per l'utilizzo di Composer. Raccomandiamo vivamente di consultare la [documentazione ufficiale](https://getcomposer.org/doc/00-intro.md) per maggiori informazioni. - -:::info Hosting condiviso - -On shared hosting it is recommended to use the Extension Manager extension instead of Composer. It is a graphical interface for Composer that allows you to install, update and remove extensions without the need for SSH access. You can directly install Flarum using an archive file, without the need for Composer. With the extension manager pre-installed, check the [installation guide](install.md#installing-by-unpacking-an-archive) for more information. - -::: - -## Che cos’è Composer? - -> Il compositore è uno strumento per la gestione delle dipendenze in PHP. Ti permette di dichiarare le librerie su cui dipende il tuo progetto e le gestirà (installazione/aggiornamento) per te. — [Introduzione a Composer](https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) - -Ogni installazione di Flarum consiste principalmente nell'installazione di Flarum core e una serie di [estensioni](extensions.md). Ognuna di queste ha le sue dipendenze. - -In principio, il framework del forum gestiva le estensioni manualmente, caricando file zip contenenti il codice delle estensioni. Sembrava abbastanza semplice, ma i problemi divennero subito evidenti: - -- Il caricamento di file zip casuali da internet tende ad essere una cattiva idea. Richiedere che le estensioni vengano scaricate da una fonte come [Packagist](https://packagist.org/) rende un rende lo spam o codice malevolo difficile da scaricare, e assicura che il codice sorgente sia disponibile su GitHub per estensioni gratuite/pubbliche. -- Diciamo che l'estensione A richiede la versione v4 di alcune librerie, e l'estensione B richiede la versione v5 di quella stessa libreria. Con una soluzione basata su zip, una delle due dipendenze potrebbe prevalere sull'altra, causando una serie di problemi. Oppure entrambi tenterebbero di funzionare contemporaneamente, il che causerebbe il crash di PHP (non è possibile dichiarare la stessa classe due volte). -- I file zip possono causare molti mal di testa se si tenta di automatizzare le distribuzioni, eseguire test automatici o scalare su più nodi del server. -- There is no good way to ensure conflicting extension versions can't be installed, or that system PHP version and extension requirements are met. -- Sure, we can upgrade extensions by replacing the zip file. But what about upgrading Flarum core? And how can we ensure that extensions can declare which versions of core they're compatible with? - -Composer takes care of all these issues, and more! - -## Flarum and Composer - -When you go to [install Flarum](install.md#installing), you're actually doing 2 things: - -1. Downloading a boilerplate "skeleton" for Flarum. This includes an `index.php` file that handles web requests, a `flarum` file that provides a CLI, and a bunch of web server config and folder setup. This is taken from the [`flarum/flarum` github repository](https://github.com/flarum/flarum), and doesn't actually contain any of the code necessary for Flarum to run. -2. Installing `composer` packages necessary for Flarum, namely Flarum core, and several bundled extensions. These are called by the `index.php` and `flarum` files from step 1, and are the implementation of Flarum. These are specified in a `composer.json` file included in the skeleton. - -When you want to update Flarum or add/update/remove extensions, you'll do so by running `composer` commands. Each command is different, but all commands follow the same general process: - -1. Update the `composer.json` file to add/remove/update the package. -2. Do a bunch of math to get the latest compatible versions of everything if possible, or figure out why the requested arrangement is impossible. -3. If everything works, download new versions of everything that needs to be updated. If not, revert the `composer.json` changes - -When running `composer.json` commands, make sure to pay attention to the output. If there's an error, it'll probably tell you if it's because of extension incompatibilities, an unsupported PHP version, missing PHP extensions, or something else. - -### The `composer.json` File - -As mentioned above, the entire composer configuration for your Flarum site is contained inside the `composer.json` file. You can consult the [composer documentation](https://getcomposer.org/doc/04-schema.md) for a specific schema, but for now, let's go over an annotated `composer.json` from `flarum/flarum`: - -```json -{ - // This following section is mostly just metadata about the package. - // For forum admins, this doesn't really matter. - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // End of metadata - - // This next section is the one we care about the most. - // It's a list of packages we want, and the versions for each. - // We'll discuss this shortly. - "require": { - "flarum/core": "^1.0", - "flarum/approval": "*", - "flarum/bbcode": "*", - "flarum/emoji": "*", - "flarum/lang-english": "*", - "flarum/flags": "*", - "flarum/likes": "*", - "flarum/lock": "*", - "flarum/markdown": "*", - "flarum/mentions": "*", - "flarum/nicknames": "*", - "flarum/pusher": "*", - "flarum/statistics": "*", - "flarum/sticky": "*", - "flarum/subscriptions": "*", - "flarum/suspend": "*", - "flarum/tags": "*" - }, - - // Various composer config. The ones here are sensible defaults. - // See https://getcomposer.org/doc/06-config.md for a list of options. - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // If composer can find a stable (not dev, alpha, or beta) version - // of a package, it should use that. Generally speaking, production - // sites shouldn't run beta software unless you know what you're doing. - "prefer-stable": true -} -``` - -Let's focus on that `require` section. Each entry is the name of a composer package, and a version string. To read more about version strings, see the relevant [composer documentation](https://semver.org/). - -For Flarum projects, there's several types of entries you'll see in the `require` section of your root install's `flarum/core`: - -- You MUST have a `flarum/core` entry. This should have an explicit version string corresponding to the major release you want to install. For Flarum 1.x versions, this would be `^1.0`. -- You should have an entry for each extension you've installed. Some bundled extensions are included by default (e.g. `flarum/tags`, `flarum/suspend`, etc), [others you'll add via composer commands](extensions.md). Unless you have a reason to do otherwise (e.g. you're testing a beta version of a package), we recommend using an asterisk as the version string for extensions (`*`). This means "install the latest version compatible with my flarum/core". -- Some extensions / features might require PHP packages that aren't Flarum extensions. For example, you need the guzzle library to use the [Mailgun mail driver](mail.md). In these cases, the instructions for the extension/feature in question should explain which version string to use. - -## How to install Composer? - -As with any other software, Composer must first be [installed](https://getcomposer.org/download/) on the server where Flarum is running. There are several options depending on the type of web hosting you have. - -### Dedicated Web Server - -In this case you can install composer as recommended in the Composer [guide](https://getcomposer.org/doc/00-intro.md#system-requirements) - -### Managed / Shared hosting - -If Composer is not preinstalled (you can check this by running `composer --version`), you can use a [manual installation](https://getcomposer.org/composer-stable.phar). Just upload the composer.phar to your folder and run `/path/to/your/php7 composer.phar COMMAND` for any command documented as `composer COMMAND`. - -:::danger - -Some articles on the internet will mention that you can use tools like a PHP shell. If you are not sure what you are doing or what they are talking about - be careful! An unprotected web shell is **extremely** dangerous. - -::: - -## How do I use Composer? - -You'll need to use Composer over the **C**ommand-**l**ine **i**nterface (CLI). Be sure you can access your server over **S**ecure **Sh**ell (SSH). - -Once you have Composer installed, you should be able to run Composer commands in your SSH terminal via `composer COMMAND`. - -:::info Optimizations - -After most commands, you'll want to run `composer dump-autoload -a`. Essentially, this caches PHP files so they run faster. - -::: diff --git a/i18n/it/docusaurus-plugin-content-docs/current/config.md b/i18n/it/docusaurus-plugin-content-docs/current/config.md deleted file mode 100644 index 84ae4122a..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/config.md +++ /dev/null @@ -1,35 +0,0 @@ -# File di configurazione - -C'è solo un un eccezione in cui la configurazione di Flarum non può essere modificata tramite il pannello di amministrazione (escluso il database), ed è il file `config.php` che si trova nella radice della tua installazione di Flarum. - -Questo file, sebbene piccolo, contiene dettagli cruciali per il corretto funzionamento dell'installazione di Flarum. - -Se il file esiste, dice a Flarum che è già stato installato. Fornisce inoltre a Flarum informazioni importanti sul database e altro ancora. - -Ecco una rapida panoramica di cosa significa con un file di esempio: - -```php - false, // abilita o disabilita il debug mode, utilizzato per la risoluzione dei problemi - 'offline' => false, // abilita o disabilita la modalità di manutenzione del sito. Questo rende il tuo sito inaccessibile a tutti gli utenti (compresi gli amministratori). - 'database' => - array ( - 'driver' => 'mysql', // il driver del database, es. MySQL, MariaDB... - 'host' => 'localhost', // l'host della connessione, localhost nella maggior parte dei casi a meno di non utilizzare un servizio esterno - 'database' => 'flarum', // il nome del database nell'istanza - 'username' => 'root', // nome utente del database - 'password' => '', // password del database - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', // il prefisso delle tabelle, utile se condividi lo stesso database con altri servizi - 'port' => '3306', // la porta di connessione, di default 3306 con MySQL - 'strict' => false, - ), - 'url' => 'https://flarum.localhost', // l'URL di installazione, vorrai cambiarlo se cambi domini - 'paths' => - array ( - 'api' => 'api', // /api punta alle API - 'admin' => 'admin', // /admin punta al pannello di amministrazione - ), -); -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/console.md b/i18n/it/docusaurus-plugin-content-docs/current/console.md deleted file mode 100644 index 749b95974..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# Console - -Oltre al pannello di amministrazione, Flarum fornisce diversi comandi eseguibili della console per aiutarti a gestire il tuo forum tramite il terminale. - -Using the console: - -1. `Collegarsi in ssh` nel server in cui è ospitata la tua installazione di flarum -2. `cd` to the folder that contains the file `flarum` -3. Lancia il comando `php flarum [command]` - -## Comandi di default - -### elenco - -Elenca tutti i comandi di gestione disponibili, nonché le istruzioni per l'utilizzo degli stessi - -### aiuto - -`php flarum help [command_name]` - -Mostra la guida e aiuti sul comando. - -È inoltre possibile visualizzare la guida in altri formati utilizzando il comando --format: - -`php flarum help --format=xml list` - -Per visualizzare l'elenco dei comandi disponibili, utilizzare il comando list - -### info - -`php flarum info` - -Get information about Flarum's core and installed extensions. Questo è molto utile per il debug dei problemi e dovrebbe essere condiviso quando si richiede supporto. - -### cache:clear - -`php flarum cache:clear` - -Cancella la cache del backend di Flarum, inclusi js / css generati, cache del formattatore di testo e traduzioni memorizzate. Questo comando dovrebbe essere eseguito dopo l'installazione o la rimozione di estensioni e la sua esecuzione dovrebbe essere il primo passaggio da effettuare quando si verificano problemi. - -### assets:publish - -`php flarum assets:publish` - -Publish assets from core and extensions (e.g. compiled JS/CSS, bootstrap icons, logos, etc). This is useful if your assets have become corrupted, or if you have switched [filesystem drivers](extend/filesystem.md) for the `flarum-assets` disk. - -### migrate - -`php flarum migrate` - -Esegue tutte le migrazioni in sospeso. Deve essere utilizzato quando viene aggiunta o aggiornata un'estensione che modifica il database. - -### migrate:reset - -`php flarum migrate:reset --extension [extension_id]` - -Reimposta tutte le migrazioni per un'estensione. Viene utilizzato principalmente dagli sviluppatori di estensioni, ma a volte potrebbe essere necessario eseguirlo se si rimuove un'estensione e si desidera cancellare tutti i suoi dati dal database. Tieni presente che l'estensione in questione deve essere attualmente installata (ma non necessariamente abilitata) affinché funzioni. - -### schedule:run - -`php flarum schedule:run` - -Many extensions use scheduled jobs to run tasks on a regular interval. This could include database cleanups, posting scheduled drafts, generating sitemaps, etc. If any of your extensions use scheduled jobs, you should add a [cron job](https://ostechnix.com/a-beginners-guide-to-cron-jobs/) to run this command on a regular interval: - -``` -* * * * * cd /path-to-your-flarum-install && php flarum schedule:run >> /dev/null 2>&1 -``` - -This command should generally not be run manually. - -Note that some hosts do not allow you to edit cron configuration directly. In this case, you should consult your host for more information on how to schedule cron jobs. - -### schedule:list - -`php flarum schedule:list` - -This command returns a list of scheduled commands (see `schedule:run` for more information). This is useful for confirming that commands provided by your extensions are registered properly. This **can not** check that cron jobs have been scheduled successfully, or are being run. \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/contributing-docs-translations.md b/i18n/it/docusaurus-plugin-content-docs/current/contributing-docs-translations.md deleted file mode 100644 index 7b17fc28e..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/contributing-docs-translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# Docs and Translation - -## Add Documentation - -Adding documentation can help countless future Flarum users. A few ideas of what to work on: - -- User guides to help Flarum end users with some advanced Flarum features. -- More [frequently asked questions](faq.md). -- Expanded [troubleshooting](troubleshoot.md) steps. -- Step-by-step tutorials for Flarum development or installation. -- [Technical reference guides](extend/README.md) for extension developers. -- Improving literally anything else you think we should elaborate on or explain better. - -A good way to find topics to write about is to look for common questions in the [support tag](https://discuss.flarum.org/t/support) of our community. - -## Translate Flarum - -We want Flarum to be accessible to everyone, regardless of language! By contributing translations, you make it possible for many more people to enjoy Flarum. Best of all, we use user-friendly GUIs for translations, so no technical skills are necessary to help! - -Translations for Flarum core, bundled extensions, and community extensions are managed through [Weblate](https://weblate.rob006.net/projects/flarum/). - -Translations for this documentation are managed through [Crowdin](https://crowdin.com/project/flarum-docs). - -The Flarum Foundation has created the "flarum-lang" organization to support translators and ensure continuous availability of language packs. You can learn more about this by [visiting the GitHub repository](https://github.com/flarum-lang/about). - -If you want to support an existing language pack, start a new translation, or you run into issues using weblate or crowdin, it's best to [get in touch with the `flarum-lang` team](https://discuss.flarum.org/d/27519-the-flarum-language-project). diff --git a/i18n/it/docusaurus-plugin-content-docs/current/contributing.md b/i18n/it/docusaurus-plugin-content-docs/current/contributing.md deleted file mode 100644 index 1d6e6b64f..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/contributing.md +++ /dev/null @@ -1,170 +0,0 @@ -# Contribuire a Flarum - -Interessato a contribuire allo sviluppo di Flarum? È fantastico! Dalla [segnalazione di un bug](bugs.md) alla creazione di richieste particolari: ogni contributo è apprezzato e utile. Flarum non sarebbe qui senza la nostra fenomenale community. - -Prima di contribuire, leggi il [codice di condotta](code-of-conduct.md). - -Questo documento è una guida per gli sviluppatori che vogliono contribuire con codice a Flarum. Se hai appena iniziato, ti consigliamo di leggere la documentazione [Per iniziare](/extend/start.md) (per ora in inglese) sul funzionamento di Flarum. - -## Su cosa lavorare - -⚡ **Have Real Impact.** There are thousands of Flarum instances, with millions of aggregate end users. By contributing to Flarum, your code will have a positive impact on all of them. - -🔮 **Shape the Future of Flarum.** We have a long backlog, and limited time. If you're willing to champion a feature or change, it's much more likely to happen, and you'll be able to enact your vision for it. Plus, our roadmap and milestones are set by our [core development team](https://flarum.org/team), and all of us started as contributors. The best road to influence is contributing. - -🧑‍💻 **Become a Better Engineer.** Our codebase is modern, and we heavily value good engineering and clean code. There's also a lot of interesting, challenging problems to solve regarding design, infrastructure, performance, and extensibility. Especially if you're a student or early in your career, working on Flarum is a great opportunity to build development skills. - -🎠 **It's Fun!** We really enjoy working on Flarum: there's a lot of interesting challenges and fun features to build. We also have an active community on [our forums](https://discuss.flarum.org) and [Discord server](https://flarum.org/chat). - -## Setup area di sviluppo - -Dai un occhiata ai nostri prossimi [Traduardi (in inglese)](https://github.com/flarum/core/milestones) per una panoramica di ciò che deve essere fatto. Consulta le [Primi problemi](https://github.com/flarum/core/labels/Good%20first%20issue) per un elenco di problemi con cui dovrebbe essere relativamente facile iniziare. Se c'è qualcosa di cui non sei sicuro, non esitare a chiedere! Abbiamo tutti cominciato dal principio. - -Se hai intenzione di andare avanti e lavorare su qualcosa, commenta il problema pertinente o creane uno nuovo prima. In questo modo possiamo garantire che il tuo prezioso lavoro non sia vano. - -Dal momento che Flarum è così estendibile, consigliamo vivamente [i nostri documenti per le estensioni](extend/README.md) come riferimento quando si lavora sul core, così come per le estensioni in bundle. Si dovrebbe iniziare con [l'introduzione](extend/README.md) per una migliore comprensione della nostra filosofia di estensibilità. - -## Flusso di lavoro nello sviluppo - -### Impostare un codice locale - -[flarum/flarum](https://github.com/flarum/flarum) is a "skeleton" application which uses Composer to download the core package and a bunch of extensions. Source code for Flarum core, extensions, and all packages used by the aforementioned is located in the Flarum monorepo [flarum/framework](https://github.com/flarum/framework). In order to contribute to these, you'll need to fork and clone the monorepo repository locally, and then add it to your dev environment as a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path): - -```bash -git clone https://github.com/flarum/flarum.git -cd flarum - -# Or, when you want to clone directly into the current directory -git clone https://github.com/flarum/flarum.git . -# Note, the directory must be empty - -# Set up a Composer path repository for Flarum monorepo packages -composer config repositories.0 path "PATH_TO_MONOREPO/*/*" -git clone https://github.com//framework.git PATH_TO_MONOREPO -``` - -Un esempio tipico di flusso di lavoro può essere questo: - -Infine, lancia `composer install` per completare l'installazione dal percorso della repository. - -Fatto ciò la tua installazione locale è impostata, assicurati di abilitare la modalità `debug` in **config.php**, e imposta `display_errors` su `On` nella tua configurazione php. Questo ti permetterà di vedere i dettagli dell'errore sia per Flarum che per PHP. Debug mode also forces a re-compilation of Flarum's asset files on each request, removing the need to call `php flarum cache:clear` after each change to the extension's JavaScript or CSS. - -Il codice front-end di Flarum è scritto in ES6 e trasferito in JavaScript. During development you will need to recompile the JavaScript using [Node.js](https://nodejs.org/) and [`yarn`](https://yarnpkg.com/). **Please do not commit the resulting `dist` files when sending PRs**; this is automatically taken care of when changes are merged into the `main` branch. - -To contribute to the frontend, first install the JavaScript dependencies. The monorepo uses [yarn workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) to easily install JS dependencies across all packages within. - -```bash -cd packages/framework -yarn install -``` - -Then you can watch JavaScript files for changes during development: - -```bash -cd framework/core/js -yarn dev -``` - -The process is the same for extensions. - -```bash -cd extensions/tags/js -yarn dev -``` - -### Strumenti di sviluppo - -After you've forked and cloned the repositories you'll be working on, you'll need to set up local hosting so you can test out your changes. Flarum doesn't currently come with a development server, so you'll need to set up Apache/NGINX/Caddy/etc to serve this local Flarum installation. - -Alternatively, you can use tools like, [Laravel Valet](https://laravel.com/docs/master/valet) (Mac), [XAMPP](https://www.apachefriends.org/index.html) (Windows), or [Docker-Flarum](https://github.com/mondediefr/docker-flarum) (Linux) to serve a local forum. - -Most Flarum contributors develop with [PHPStorm](https://www.jetbrains.com/phpstorm/download/) or [Visual Studio Code](https://code.visualstudio.com/). - -## Stile del codice - -A typical contribution workflow looks like this: - -0. 🌳 **Crea un branch** per le funzionalità partendo da un branch appropriato. - * * Le correzioni di bug* dovrebbero essere inviate all'ultimo branch stabile. - * *Funzionalità minori* che sono completamente retrocompatibili con l'attuale versione di Flarum possono essere inviate all'ultimo branch stabile. - -1. 🔨 **Scrivi** un po' di codice. - * Vedi sotto per lo [stile del codice](#stile-del-codice). - * *Funzionalità minori* che sono completamente retrocompatibili con l'attuale versione di Flarum possono essere inviate all'ultimo branch stabile. - * *Major* features should always be sent to the `main` branch, which contains the upcoming Flarum release. - * Internamente usiamo lo schema di denominazione `/` (es. `tz/refactor-frontend`). - -2. 🚦 **Testa** il tuo codice. - * Aggiungi unit test in base alle esigenze durante la correzione di bug o l'aggiunta di funzionalità. - -3. 💾 **Crea dei commit** per il tuo codice con un messaggio descrittivo. - * Se la modifica risolve un problema esistente (di solito, dovrebbe) includere "Fixes #123" in una nuova riga, dove 123 è il numero dell'issue GitHub. - * Scrivi un [buon messaggio accompagnatorio](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). - * Vedi [qui](extend/testing.md) per maggiori informazioni sui test in Flarum. - -4. 🎁 **Invia** una Pull Request su GitHub. - * Riempi i campi della richiesta. - * Follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) specification. - * *Fix* commits should describe the issue fixed, not how it was fixed. - -5. 🤝 **Coinvolgi il team** di Flarum per l'approvazione. - * Riempi i campi della richiesta (pull request). - * Quando lasci un feedback, aggiungi commenti invece di sovrascriverli o eliminarli (li uniremo noi). - * NON eseguire il check-in di JavaScript nei file `dist` Verra fatto automaticamente una volta uniti. Verrà compilato tutto automaticamente durante la fusione. - -6. 🕺 **Festeggia** per aver contribuito a Flarum! - * I membri del team esamineranno il tuo codice. Potremmo suggerire alcune modifiche o miglioramenti o alternative, ma per piccoli cambiamenti la tua richiesta pull dovrebbe essere accettata rapidamente. - * Quando lasci un feedback, aggiungi commenti invece di sovrascriverli o eliminarli (li uniremo noi). - -7. 🕺 **Festeggia** per aver contribuito a Flarum. - -## Strumenti di sviluppo - -In order to keep the Flarum codebase clean and consistent, we have a number of coding style guidelines that we follow. When in doubt, read the source code. - -Don't worry if your code styling isn't perfect! StyleCI and Prettier will automatically check formatting for every pull request. This allows us to focus on the content of the contribution, not the code style. - -### PHP - -Flarum follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard. On top of this, we conform to a number of [other style rules](https://github.com/flarum/framework/blob/main/.styleci.yml). We use PHP 7 type hinting and return type declarations where possible, and [PHPDoc](https://docs.phpdoc.org/) to provide inline documentation. Try and mimic the style used by the rest of the codebase in your contributions. - -* Gli spazi dei nomi dovrebbero essere in singolare (es. `Flarum\Discussion`, non `Flarum\Discussions`) -* Le interfacce dovrebbero avere il suffisso `Interface` (es. `MailableInterface`) -* Le classi astratte dovrebbero essere precedute da `Abstract` (es. `AbstractModel`) -* I tratti dovrebbero essere suffissi con `Trait` (es. `ScopeVisibilityTrait`) - -### JavaScript - -Flarum's JavaScript mostly follows the [Airbnb Style Guide](https://github.com/airbnb/javascript). We use [ESDoc](https://esdoc.org/manual/tags.html) to provide inline documentation. - -### Database - -**Columns** should be named according to their data type: -* DATETIME o TIMESTAMP: `{verbed}_at` (es. created_at, read_at) o `{verbed}_until` (eg. suspended_until) -* INT considerato come conteggio: `{noun}_count` (es. comment_count, word_count) -* Chiave esterna: `{verbed}_{entity}_id` (es. hidden_user_id) - * Il verbo può essere omesso per la relazione primaria (es. autore del post � semplicemente `user_id`) -* BOOL: `is_{adjective}` (es. is_locked) - -**Tables** should be named as follows: -* Usa la forma plurale (`discussions`) -* Separa più parole con il trattino basso (`access_tokens`) -* Per le tabelle delle relazioni, unisci i due nomi di tabella in forma singolare con un trattino basso in ordine alfabetico (es. `discussion_user`) - -### CSS - -Flarum's CSS classes roughly follow the [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) using the format `.ComponentName-descendentName--modifierName`. - -### Traduzioni - -We use a [standard key format](/extend/i18n.md#appendix-a-standard-key-format) to name translation keys descriptively and consistently. - -## Contratto di licenza del collaboratore - -By contributing your code to Flarum you grant the Flarum Foundation (Stichting Flarum) a non-exclusive, irrevocable, worldwide, royalty-free, sublicensable, transferable license under all of Your relevant intellectual property rights (including copyright, patent, and any other rights), to use, copy, prepare derivative works of, distribute and publicly perform and display the Contributions on any licensing terms, including without limitation: (a) open source licenses like the MIT license; and (b) binary, proprietary, or commercial licenses. Except for the licenses granted herein, You reserve all right, title, and interest in and to the Contribution. - -You confirm that you are able to grant us these rights. You represent that You are legally entitled to grant the above license. If Your employer has rights to intellectual property that You create, You represent that You have received permission to make the Contributions on behalf of that employer, or that Your employer has waived such rights for the Contributions. - -You represent that the Contributions are Your original works of authorship, and to Your knowledge, no other person claims, or has the right to claim, any right in any invention or patent related to the Contributions. You also represent that You are not legally obligated, whether by entering into an agreement or otherwise, in any way that conflicts with the terms of this license. - -The Flarum Foundation acknowledges that, except as explicitly described in this Agreement, any Contribution which you provide is on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/current.json b/i18n/it/docusaurus-plugin-content-docs/current/current.json deleted file mode 100644 index 033d82500..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/current.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.guideSidebar.category.Introduction": { - "message": "Introduzione", - "description": "The label for category Introduction in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Setting Up": { - "message": "Impostazioni", - "description": "The label for category Setting Up in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Management": { - "message": "Gestione", - "description": "The label for category Management in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Advanced": { - "message": "Advanced", - "description": "The label for category Advanced in sidebar guideSidebar" - }, - "sidebar.extendSidebar.category.Main Concepts": { - "message": "Concetti principali", - "description": "The label for category Main Concepts in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Reference Guides": { - "message": "Guide di riferimento", - "description": "The label for category Reference Guides in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Advanced Guides": { - "message": "Guide Avanzate", - "description": "The label for category Advanced Guides in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Update Guides": { - "message": "Update Guides", - "description": "The label for category Update Guides in sidebar extendSidebar" - }, - "sidebar.internalSidebar.category.Internal Docs": { - "message": "Internal Docs", - "description": "The label for category Internal Docs in sidebar internalSidebar" - } -} \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/README.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/README.md deleted file mode 100644 index 364634ce2..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/README.md +++ /dev/null @@ -1,40 +0,0 @@ -- - - -slug: /extend -- - - - -# Estensioni di Flarum - -Flarum è minimalista, ma è anche altamente estensibile. In effetti, la maggior parte delle funzionalità fornite con Flarum sono in realtà estensioni! - -Questo approccio rende Flarum estremamente personalizzabile. Un utente può disabilitare tutte le funzionalità che non utilizza sul proprio forum e installare altre estensioni per creare un forum "cucito" su misura per la sua community. - -Per ottenere questa estensibilità, Flarum è stato costruito con ricche API e punti di estensione. Con alcune conoscenze di programmazione, puoi sfruttare queste API per aggiungere quasi tutte le funzionalità che desideri. Questa sezione della documentazione ha lo scopo di insegnarti come funziona Flarum e come utilizzare le API in modo da poter creare le tue estensioni. - -## Core vs. Estensioni - -Dove tracciamo il confine tra il nucleo di Flarum e le sue estensioni? Perché alcune funzionalità sono incluse nel core e altre no? È importante comprendere questa distinzione in modo da poter mantenere la coerenza e la qualità all'interno dell'ecosistema di Flarum. - -** Il nucleo di Flarum ** non è pensato per essere pieno di funzionalità. Piuttosto, è una base, o un framework, che fornisce un appoggio affidabile su cui costruire le estensioni. Contiene solo funzionalità di base non avanzate che sono essenziali per un forum: discussioni, post, utenti, gruppi e notifiche. - -Le ** estensioni in bundle ** sono funzionalità incluse in Flarum e abilitate per impostazione predefinita. Sono estensioni come le altre e possono essere disabilitate e disinstallate. Sebbene il loro ambito non sia inteso ad affrontare tutti i casi d'uso, l'idea è di renderli abbastanza generici e configurabili da poter soddisfare la maggioranza degli utenti finali. - -** Le estensioni di terze parti ** sono funzionalità create da altri e non sono ufficialmente supportate dal team di Flarum. Possono essere costruite e utilizzate per affrontare casi d'uso più specifici. - -Se stai cercando di risolvere un bug o un difetto del core, o di un'estensione in bundle esistente, potrebbe essere appropriato * contribuire al rispettivo progetto * piuttosto che disperdere gli sforzi su una nuova estensione di terze parti. È una buona idea iniziare una discussione sulla [Community di Flarum](https://discuss.flarum.org/) per avere opinioni anche dagli sviluppatori di Flarum. - -## Risorse utili - -- [Questa documentazione](start.md) -- [Suggerimenti per sviluppatori principianti](https://discuss.flarum.org/d/5512-extension-development-tips) -- [Sviluppatori che spiegano il loro flusso di lavoro per lo sviluppo di estensioni](https://github.com/flarum/cli) -- [Suggerimenti per il namespace delle estensioni](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) -- [Documentazione js di Mithril](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) -- [Documenti API Laravel](https://mithril.js.org/) -- [Documenti delle API di Flarum](https://laravel.com/api/8.x/) -- [Documenti delle API di Flarum](https://api.flarum.org) -- [ES6 cheatsheet](https://github.com/DrkSephy/es6-cheatsheet) - -### Supporto - -- [Communiti ufficiale di sviluppatori di Flarum](https://discuss.flarum.org/t/dev) -- [Entra sulla nostra chat #extend su Discord](https://flarum.org/discord/) diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/admin.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/admin.md deleted file mode 100644 index 798b7c161..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/admin.md +++ /dev/null @@ -1,214 +0,0 @@ -# Pannello amministrazione - -La Beta 15 ha introdotto un pannello di amministrazione e un frontend per le API completamente riprogettati. Ora è più facile che mai aggiungere impostazioni o autorizzazioni alla tua estensione. - -Prima della beta 15, le impostazioni delle estensioni venivano aggiunte nel file `SettingsModal` o venivano aggiunte in una nuova pagina per impostazioni più complesse. Ora, ogni estensione ha una pagina contenente informazioni, impostazioni e autorizzazioni proprie dell'estensione. - -Puoi semplicemente registrare le impostazioni, estendere la base [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage), oppure fornire la tua pagina completamente personalizzata. - -## API Dati Estensione - -:::caution SettingsModal - -### Raccontare all'API la tua estensione - -Le impostazioni aggiunte tramite `SettingsModal` continueranno a funzionare nella beta 15, ma questo metodo **è ormai obsoleto** e verrà rimosso nelle future release. - -Semplicemente lancia la funzione `for` su `app.extensionData` passando l'ID della tua estensione. Per trovare l'ID estensione, prendi il nome del composer e sostituisci eventuali barre con trattini (esempio: 'fof/merge-discussions' diventa 'fof-merge-discussions'). Le estensioni che contengono nel nome `flarum-` e/o `flarum-ext-` verranno troncate (esempio: 'webbinaro/flarum-calendar' diventa 'webbinaro-calendar'). - -Questa nuova API ti consente di aggiungere impostazioni alla tua estensione con pochissime righe di codice. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') -}); -``` - -Prima di poter registrare qualsiasi cosa, è necessario dire a `ExtensionData` per quale estensione si vogliono ottenere i dati. - -:::info Note - -Per il seguente esempio, useremo l'estensione fittizia 'acme/interstellar': - -::: - -### Registrazione delle impostazioni - -L'aggiunta di campi delle impostazioni in questo modo è consigliata per elementi semplici. Come regola generale, se hai solo bisogno di memorizzare le cose nella tabella delle impostazioni, questi consigli ti saranno utili. - -Per aggiungere un campo, richiama la funzione `registerSetting` dopo `for` su `app.extensionData` e passagli un 'setting object' come primo argomento. Dietro le quinte `ExtensionData` trasforma effettivamente le tue impostazioni in un file [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), puoi passare un numero di priorità come secondo argomento. - -Ecco un esempio con un elemento switch (booleano): - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // Questa è la chiave con cui verranno salvate le impostazioni nella tabella delle impostazioni nel database. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // L'etichetta da mostrare che consente all'amministratore di sapere cosa fa l'impostazione. - help: app.translator.trans('acme-interstellar.admin.coordinates_help'), // Testo di aiuto opzionale dove poter commentare l'impostazione. - type: 'boolean', // Di che tipo di impostazione si tratta, le opzioni valide sono: boolean, text (o qualsiasi altro tipo di tag ) e select. - }, - 30 // Opzionale: Priorità - ) -}); -``` - -Se utilizzi `type: 'select'` l'oggetto ha un aspetto leggermente diverso: - -```js -{ - setting: 'acme-interstellar.fuel_type', - label: app.translator.trans('acme-interstellar.admin.fuel_type_label'), - type: 'select', - options: { - 'LOH': 'Liquid Fuel', // La chiave in questo oggetto è ciò che verrà memorizzato nel database, il valore è l'etichetta che l'amministratore vedrà (ricorda di usare le traduzioni se hanno senso nel tuo contesto). - 'RDX': 'Solid Fuel', - }, - default: 'LOH', -} -``` - -Inoltre, notare che ulteriori elementi nelle impostazioni saranno utilizzati come attributi del componente. Questo può essere utilizzato come testo di esempio (placeholder), restrizioni min/max, ecc: - -```js -{ - setting: 'acme-interstellar.crew_count', - label: app.translator.trans('acme-interstellar.admin.crew_count_label'), - type: 'number', - min: 1, - max: 10 -} -``` - -Se vuoi aggiungere qualcosa alle impostazioni come del testo extra o un input più complicato, puoi anche passare un callback come primo argomento che restituisce JSX. Questo callback verrà eseguito nel contesto di [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) e i valori di impostazione non verranno serializzati automaticamente. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - . or('acme-interstellar') - .registerSetting(function () { - if (app. ession.user. sername() === 'RocketMan') { - - return ( -
-

{app. ranslator.trans('acme-interstellar. dmin.you_are_rocket_man_label')}

- -
- ); - } - }) -}); -``` - -### Registrazione delle autorizzazioni - -Novità nella beta 15, le autorizzazioni ora possono essere trovate in 2 posizioni. Ora puoi visualizzare le autorizzazioni individuali di ciascuna estensione sulla loro pagina. Tutte le autorizzazioni possono ancora essere trovate nella pagina delle autorizzazioni. - -Affinché ciò avvenga, i permessi devono essere registrati con `ExtensionData`. Questo viene fatto in modo simile alle impostazioni, richiama `registerPermission`. - -Argomenti: - * Permessi Oggetto - * Che tipo di autorizzazione - vedere le funzioni di [`PermissionGrid`] (https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) per i tipi (rimuovi elementi dal nome) - * Priorità di `ItemList` - -Tornando alla nostra estensione "rocket" preferita: - -```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Icone Font-Awesome - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Etichetta di autorizzazione - permission: 'discussion.rocket_fly', // Nome effettivo dell'autorizzazione memorizzato nel database (e utilizzato durante il controllo dell'autorizzazione). - tagScoped: true, // Se è possibile applicare questo permesso ai Tag, non solo in maniera globale. Spiegato nel paragrafo successivo. - }, - 'start', // Il permesso di categoria verrà aggiunto alla griglia - 95 // Opzional: Priorità - ); -}); -``` - -Se la tua estensione interagisce con l'estensione [tag](https://github.com/flarum/tags) (che è abbastanza comune), si potrebbe desiderare un permesso per essere "tag scopable" (... applicato a livello del tag, non solo globalmente). Puoi farlo includendo un attributo `tagScoped`, come abbiamo visto sopra. Permessi che iniziano con la discussione `.` saranno automaticamente "tag scoped" a meno che `tagScoped: false` non sia indicato. - -Torniamo alla nostra estensione missilistica preferita: - -### Promemoria concatenamento - -Ricorda che queste funzioni possono essere tutte concatenate come: - -```js -app.extensionData - .for('acme-interstellar') - .registerSetting(...) - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); -``` - -### Estensione/sovrascrittura della pagina predefinita - -A volte hai impostazioni più complicate che pasticciano con le relazioni o semplicemente desideri che la pagina abbia un aspetto completamente diverso. In questo caso, dovrai dire a `ExtensionData` che vuoi fornire la tua versione della pagina. Nota che `buildSettingComponent`, l'util utilizzato per registrare le impostazioni fornendo un oggetto descrittivo, è disponibile come metodo su `ExtensionPage` (estensione da `AdminPage`, che è una base generica per tutte le pagine di amministrazione con alcuni metodi aggiuntivi). - -Crea una nuova classe che estenda il componente `Page` o`ExtensionPage` - -```js -import ExtensionPage from 'flarum/components/ExtensionPage'; - -export default class StarPage extends ExtensionPage { - content() { - return ( -

Ciao dalla sezione impostazioni!

- ) - } -} - -``` - -Quindi lancia `registerPage`: - -```js - -import StarPage from './components/StarPage'; - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); -}); -``` - -Questa pagina verrà visualizzata al posto di quella predefinita. - -Puoi estendere la [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) o estendere la base di `Page` e progettare la tua versione. - -## Metadati Composer.json - -Nella beta 15, le pagine di estensione lasciano spazio a informazioni aggiuntive che vengono estratte da composer.json . - -Per maggiori informationi, guarda [composer.json schema](https://getcomposer.org/doc/04-schema.md). - -| Descrizione | dovein composer.json | -| ---------------------------------------- | -------------------------------------------------------------------- | -| discuss.flarum.org link alla discussione | "forum" all'interno del tag "support" | -| Documentazione | "docs" all'interno del tag "support" | -| Supporto (email) | "email" all'interno del tag "support" | -| Sito Web | "homepage" chiave | -| Donazioni | chiave "funding" (Nota: verrà utilizzato solo il primo collegamento) | -| Sorgente | "source" all'interno del tag "support" | diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/api-throttling.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/api-throttling.md deleted file mode 100644 index 869c43a38..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/api-throttling.md +++ /dev/null @@ -1,58 +0,0 @@ -# Limitazione delle API - -Flarum viene fornito con `Flarum\Api\Middleware\ThrottleApi` [middleware](middleware.md) per limitare le richieste alle API. Questo viene eseguito su ogni percorso API e le estensioni possono aggiungere la propria logica personalizzata per limitarne le richieste. - -:::caution Percorsi del forum - -Alcuni percorsi del forum (login, registrazione, password dimenticata, etc) funzionano richiamando un API. `ThrottleApi` di middleware attualmente non viene eseguito per queste richieste, ma è in previsione per il futuro. - -::: - -## Throttlers personalizzati - -Il formato per un limitatore personalizzato è estremamente semplice: tutto ciò di cui hai bisogno è una classe di chiusura o invocabile che prenda la richiesta corrente come argomento e ne restituisca uno di: - -- `false`: Questo ignora esplicitamente la limitazione per questa richiesta, ignorando tutti gli altri limitatori -- `true`: Questo contrassegna la richiesta come da limitare. -- `null`: Significa che la limitazione non viene applicata. Qualsiasi altra uscita verrà ignorata, con lo stesso effetto di `null`. - -Le limitazioni si applicano a OGNI richiesta. Ad esempio, considera le limitazioni ai post di Flarum: - -```php -use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; -``` - -Le limitazioni possono essere aggiunte o rimosse tramite `ThrottleApi` in `extend.php`. Per esempio: - -```php -set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders -]; -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/api.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/api.md deleted file mode 100644 index 4121180ad..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/api.md +++ /dev/null @@ -1,353 +0,0 @@ -# API e flusso di dati - -Nel [precedente articolo](models.md)abbiamo appreso come Flarum utilizza i modelli per interagire con i dati. Qui impareremo come ottenere questi dati dal database in formato JSON-API nel frontend, e farli ritornare al backend. - -:::info - -To use the built-in REST API as part of an integration, see [Consuming the REST API](../rest-api.md). - -::: - -## Lifecycle delle richieste API - -Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical API request: - -![Flarum API Flowchart](/en/img/api_flowchart.png) - -1. Una richiesta HTTP viene inviata all'API di Flarum. In genere, avviene dal frontend di Flarum, tuttavia anche programmi esterni possono interagire con l'API. L'API di Flarum segue principalmente le specifiche [JSON:API](https://jsonapi.org/), quindi di conseguenza, le richieste dovrebbero seguire [dette specifiche](https://jsonapi.org/format/#fetching). -2. La richiesta viene eseguita tramite [middleware](middleware.md), e indirizzato al controller appropriato. Puoi saperne di più sui controller nel loro insieme nella nostra [routes and content documentation](routes.md). Supponendo che la richiesta sia all'API (come nel caso di questa sezione), il controller che gestisce la richiesta sarà una sottoclasse di `Flarum\Api\AbstractSerializeController`. -3. Vengono applicate tutte le modifiche apportate dalle estensioni al controller tramite [`ApiController` extender](#extending-api-controllers). Ciò potrebbe comportare la modifica dell'ordinamento, l'aggiunta di include, la modifica del serializzatore, ecc. -4. Viene chiamato il metodo `$ this-> data ()` del controller, che fornisce alcuni dati grezzi che dovrebbero essere restituiti al client. In genere, questi dati assumeranno la forma di una raccolta o istanza di Laravel Eloquent Model, che è stato recuperato dal database. Detto questo, i dati potrebbero essere qualsiasi cosa purché il serializzatore del controller possa elaborarli. Ogni controller è responsabile dell'implementazione del proprio metodo `data`. Nota che per richieste `PATCH`, `POST`, e `DELETE`, `data` eseguirà l'operazione in questione e restituirà l'istanza del modello modificata. -5. Questi dati vengono eseguiti tramite qualsiasi callback di pre-serializzazione che le estensioni registrano tramite [`ApiController` extender](#extending-api-controllers). -6. I dati passano attraverso un [serializer](#serializers), che lo converte dal backend, nel formato compatibile con il database in JSON: formato API previsto dal frontend. Inoltre allega tutti gli oggetti correlati, che vengono eseguiti tramite i propri serializzatori. Come spiegato qui sotto, l'estensione può [aggiungere / sovrascrivere relazioni e attributi](#attributes-and-relationships) a livello della serializzazione. -7. I dati serializzati vengono restituiti come JSON al frontend. -8. Se la richiesta ha avuto origine tramite il frontend di Flarum `Store`, i dati restituiti (inclusi eventuali oggetti correlati) verranno archiviati nel file [frontend models](#frontend-models) nel frontend. - -## API Endpoints - -We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. - -As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: - -- Elencare le istanze di un modello (possibilmente anche ricerca/filtraggio) -- Ottenere una singola istanza del modello -- Creare un'istanza del modello -- Aggiornare l'istanza del modello -- Eliminazione di una singola istanza di modello - -We'll go over each type of controller shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags. ndex', ListTagsController::class) - ->get('/tags/{id}', 'tags. come', ShowTagController::class) - ->post('/tags', 'tags. reate', CreateTagController::class) - ->patch('/tags/{id}', 'tags. pdate', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -:::cautela - -Paths to API endpoints are not arbitrary! To support interactions with frontend models: - -- Il percorso può essere `/prefix/{id}` per get/update/delete, o `/prefix` per list/create. -- il prefisso (`tags` nell'esempio sopra) deve corrispondere al modello JSON:API. Utilizzerai anche questo tipo di modello nell'attributo `$type` del tuo serializer, e durante la registrazione del modello frontend (`app. tore.models.TYPE = MODEL_CLASS`). -- I metodi devono corrispondere all'esempio sopra. - -Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! - -::: - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your endpoint controllers: -```bash -$ flarum-cli make backend api-controller -``` - -::: - -### Elenco risorse - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -#### Impaginazione - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // Il numero di record inclusi di default. - public $limit = 20; - - // Il numero massimo di record che possono essere richiesti. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. - -#### Ordinamento - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // ordinamento predefinito e l'ordine da usare. - public $sort = ['name' => 'asc']; - - // I campi disponibili per essere ordinati. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -use Illuminate\Support\Str; - -// ... - -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(Str::snake($field), $order); -} - -return $query->get(); -``` - -#### Cercare e Filtrare - -Read our [searching and filtering](search.md) guide for more information! - -### Mostrare una risorsa - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creare una risorsa - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Aggiornare una risorsa - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Cancellare una risorsa - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Includere Relazioni - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // Le relazioni che sono incluse di default. - public $include = ['user']; - - // Altre relazioni disponibili per essere incluse. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Estensione dei controller API - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Aggiungi la tua logica per personalizzare il controller - // prima che le query vengano eseguite. - }) -] -``` - -The `ApiController` extender can also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Serializers - -Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your serializer: -```bash -$ flarum-cli make backend api-serializer -``` - -::: - -### Attributi e relazioni - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -### Estendere i Serializers - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -### Serializzatori Non-Model e `ForumSerializer` - -Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/assets.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/assets.md deleted file mode 100644 index f2dfd46eb..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/assets.md +++ /dev/null @@ -1,7 +0,0 @@ -# Risorse Estensione - -Alcune estensioni potrebbero voler includere asset come immagini o file JSON nel loro codice sorgente (non si tratta di upload, che richiederebbe probabilmente un apposito [filesystem](filesystem.md)). - -Lavorare con gli asset è in realtà molto semplice. Basta creare una cartella `assets` nella radice principale della tua estensione, e posizionare tutti i file al suo interno. Flarum copierà automaticamente tali file nella propria directory `assets` (o altra posizione di archiviazione se [impostata da un estensione](filesystem.md)) ogni volta che l'estensione è abilitata o [`php flarum assets:publish`](../console.md) viene eseguito. - -Se si utilizza il driver di archiviazione predefinito, le risorse saranno disponibili all'url `https://FORUM_URL/assets/extensions/EXTENSION_ID/file.path`. Tuttavia, poiché altre estensioni potrebbero usare filesystem remoti, si consiglia di serializzare l'url alle risorse di cui hai bisogno nel backend. See [Flarum's serialization of the logo and favicon URLs](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Serializer/ForumSerializer.php#L85-L86) for an example. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/authorization.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/authorization.md deleted file mode 100644 index fcfdfce7f..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/authorization.md +++ /dev/null @@ -1,206 +0,0 @@ -# Autorizzazione - -Come con qualsiasi framework, Flarum consente di limitare determinate azioni e contenuti a determinati utenti. Esistono 2 sistemi paralleli per questo: - -- Il processo di autorizzazione determina se un utente può eseguire una determinata azione. -- La visibilità può essere applicata a una query di database per limitare in modo efficiente i record a cui gli utenti possono accedere. Questo è documentato nel nostro articolo [modelli di visibilità](model-visibility.md). - -## Processo di autorizzazione - -Il processo di autorizzazione viene utilizzato per verificare se una persona è autorizzata a eseguire determinate azioni. Ad esempio, vogliamo verificare se un utente è autorizzato prima di: - -- Poter accedere al pannello di amministrazione -- Iniziare una discussione -- Modificare un post -- Aggiornare il profilo di un altro utente - -Ciascuno di questi è determinato da criteri univoci: in alcuni casi è sufficiente un flag; altrimenti, potremmo aver bisogno di una logica personalizzata. - -## Visibility Scoping - -Le richieste di autorizzazione vengono effettuate con 3 parametri, con logica contenuta in [`Flarum\User\Gate`](https://api.docs.flarum.org/php/master/flarum/user/gate): - -1. L'attore: l'utente che tenta di eseguire l'azione -2. L'abilità: una stringa che rappresenta l'azione che l'attore sta tentando -3. Gli argomenti: di solito un'istanza di un modello di database che è l'oggetto dell'azione, ma potrebbe essere qualsiasi cosa. - -Per prima cosa, eseguiamo l'intera richiesta (tutti e tre i parametri) attraverso tutte le [policies](#policies) registrate dalle estensioni e dal core. Le policy sono blocchi di logica forniti dal core e dalle estensioni che determinano se l'attore può eseguire l'azione sugli argomenti. I criteri possono restituire uno dei seguenti valori: - -- `Flarum\User\Access\AbstractPolicy::ALLOW` (tramite `$this->allow()`) -- `Flarum\User\Access\AbstractPolicy::DENY` (tramite `$this->deny()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (tramite `$this->forceAllow()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (tramite `$this->forceDeny()`) - -I risultati delle policy sono considerati prioritari `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. Ad esempio, se viene restituita una singola policy `FORCE_DENY`, tutte le altre policy verranno ignorate. Se una policy restituisce `DENY` e altre 10 restituiscono `ALLOW`, la richiesta verrà rifiutata. Ciò consente di prendere decisioni indipendentemente dall'ordine in cui le estensioni vengono avviate. Le policy sono estremamente potenti: se l'accesso viene negato in fase di policy, questo sovrascriverà i permessi dei gruppi e i privilegi di amministratore. - -In secondo luogo, se tutte le policy restituiscono null (o non restituiscono nulla), controlliamo se l'utente è in un gruppo che ha un permesso che consenta l'azione (nota che sia i permessi che le azioni sono rappresentati sotto forma di stringhe). In tal caso, autorizziamo l'azione. Guarda la [Documentazione su gruppi e permessi](permissions.md) per maggiori informazioni. - -Quindi, se l'utente è nel gruppo admin, autorizzeremo l'azione. - -Infine, poiché abbiamo esaurito tutti i controlli, daremo per scontato che l'utente non sia autorizzato e negheremo la richiesta. - -## Autorizzazioni del frontend - -Il sistema di autorizzazione di Flarum è accessibile attraverso metodi pubblici delle classi `Flarum\User\User`. I più importanti sono elencati di seguito; altri sono documentati nelle [documentazioni PHP API](https://api.docs.flarum.org/php/master/flarum/user/user). - - -In questo esempio, useremo `$actor` come istanza di `Flarum\User\User`, `'viewForum'` e `'reply'` come esempi di abilità, e `$discussion` (istanza di `Flarum\Discussion\Discussion`) come esempio di argomento. - -```php -// Verifica se un utente può eseguire un'azione. -// ATTENZIONE: questo dovrebbe essere usato con cautela, poiché in realtà -// non viene eseguito attraverso il processo di autorizzazione, quindi non tiene conto delle policy. -$canDoSomething = $actor->can('viewForum'); - -// Verifica se un utente può eseguire un'azione su un argomento. -// Tuttavia, è utile nell'implementazione di criteri personalizzati. -$canDoSomething = $actor->can('reply', $discussion); - -// Genera un'eccezione PermissionDeniedException se un utente non può eseguire un'azione. -$actpr->assertAdmin(); - -// Controlla se uno dei gruppi dell'utente dispone di un'autorizzazione. -$actor->assertCan('viewForum'); -$actor->assertCan('reply', $discussion); - -// Genera un'eccezione NotAuthenticatedException se l'utente non ha efettuato il login. -$actor->assertRegistered(); - -// Genera un'eccezione PermissionDeniedException se l'utente non è un amministratore. -$actorHasPermission = $actor->hasPermission(`viewForum`); -``` - -## Policy personalizzate - -I criteri ci consentono di utilizzare una logica personalizzata oltre a semplici gruppi e autorizzazioni quando si valuta l'autorizzazione per un'abilità con un soggetto. Per esempio: - -- Vogliamo consentire agli utenti di modificare i post anche se non sono moderatori, ma solo i propri post. -- A seconda delle impostazioni, potremmo consentire agli utenti di rinominare le proprie discussioni a tempo indeterminato, per un breve periodo di tempo dopo la pubblicazione o per niente. - -Come descritto [qui](#how-it-works), ad ogni controllo di autorizzazione, interroghiamo tutte le politiche registrate per il modello del target o qualsiasi classe genitore del modello del target. Se non viene fornito alcun target, verranno applicati i criteri egistrati come "global". - -Quindi, come viene "verificato" un criterio? - -Innanzitutto, controlliamo se la classe del criterio ha un metodo con lo stesso nome dell'abilità che viene valutata. In tal caso, lo eseguiamo con l'attore e il soggetto come parametri. Se quel metodo restituisce un valore non nullo, restituiamo quel risultato. In caso contrario, si passa alla fase successiva (non necessariamente al criterio successivo). - -Quindi, controlliamo se la classe policy ha un metodo chiamato `can`. In tal caso, lo eseguiamo con l'attore, l'abilità e il soggetto e restituiamo il risultato. - -Se "can" non esiste o restituisce null, abbiamo finito con questo criterio e procediamo a quello successivo. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -È possibile utilizzare la CLI per generare automaticamente i criteri: -```bash -$ flarum-cli make backend policy -``` - -::: - -### Come funziona - -Diamo un'occhiata ad alcuni esempi tratti da [Flarum Tags](https://github.com/flarum/tags/blob/master/src/Access/TagPolicy). - -```php -is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); - } -} -``` - -Possiamo anche avere criteri globali, che vengono eseguiti quando `$ user-> can ()` viene chiamato senza un'istanza del modello di destinazione. Di nuovo dai tag: - -```php -settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewForum', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } - } -} -``` - -### Come utilizzare le autorizzazioni - -ed uno globale per il modelle `Discussion`: - -```php -use Flarum\Extend; -use Flarum\Tags\Tag; -use YourNamespace\Access; - -return [ - // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), - // Other extenders -]; -``` - -## Autorizzazioni del frontend - -Di solito, vorrai utilizzare i risultati dell'autorizzazione nella logica del frontend. Ad esempio, se un utente non dispone dell'autorizzazione per visualizzare gli utenti di ricerca, non dovremmo inviare richieste a quell'endpoint. E se un utente non ha il permesso di modificare gli utenti, non dovremmo mostrare le voci di menu che consentono di effettuare tali modifiche. - -Poiché non possiamo eseguire controlli di autorizzazione nel frontend, dobbiamo eseguirli nel backend e allegarli alla serializzazione dei dati che stiamo inviando. Permessi globali come (`viewForum`, `viewUserList`) possono essere inclusi in `ForumSerializer`, ma per l'autorizzazione specifica dell'oggetto, potremmo voler includere quelli con altri parametri. Ad esempio, quando restituiamo l'elenco delle discussioni, controlliamo se l'utente può rispondere, rinominare, modificare ed eliminarle oggetti, e memorizzare quei dati nel modello di discussione frontend. È quindi accessibile tramite `discussion.canReply()` o `discussion.canEdit()`, ma non c'è niente di magico qui: è solo un altro attributo inviato dal serializzatore. - -Esistono in realtà due tipi di scoper: diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/backend-events.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/backend-events.md deleted file mode 100644 index 8d7a4eda1..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/backend-events.md +++ /dev/null @@ -1,215 +0,0 @@ -# Eventi backend - -Spesso, un'estensione vorrà reagire ad alcuni eventi che si verificano da qualche parte in Flarum. Ad esempio, potremmo voler incrementare un contatore quando viene pubblicata una nuova discussione, inviare un'e-mail di benvenuto quando un utente accede per la prima volta o aggiungere tag a una discussione prima di salvarla nel database. Questi eventi sono noti come ** domain events ** e vengono trasmessi attraverso il framework [Laravel's event system](https://laravel.com/docs/6.x/events). - -Per un elenco completo degli eventi di backend, vedere la nostra [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). Le classi di eventi di dominio sono generalmente organizzate così `Flarum\TYPE\Event`. - - -:::info [Flarum CLI](https://github.com/flarum/cli) - -È possibile utilizzare la CLI per generare automaticamente gli Event Listener: -```bash -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) -]; - - -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -::: - -## Ascolto di eventi - -Puoi allegare un ascoltatore a un evento utilizzando il file [`Event`](https://api.docs.flarum.org/php/master/flarum/extend/event) [extender](start.md#extenders): - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` -```php -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -Come mostrato sopra, è possibile utilizzare una classe listener invece di un callback. Questo ti permette di [iniettare dipendenze](https://laravel.com/docs/6.x/container) alcune classi. In questo esempio risolviamo un'istanza di un traduttore, ma possiamo iniettare tutto ciò che vogliamo/di cui abbiamo bisogno. - -È inoltre possibile ascoltare più eventi in una sola volta tramite un event subscriber. Questo è utile per raggruppare le funzionalità comuni; per esempio, se si desidera aggiornare alcuni metadati sulle modifiche ai post: - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Flarum\Post\Event\Saving; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; -``` -```php -class PostEventSubscriber -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function subscribe($events) - { - $events->listen(Deleted::class, [$this, 'handleDeleted']); - $events->listen(Saving::class, [$this, 'handleSaving']); - } - - public function handleDeleted(Deleted $event) - { - // Your logic here - } - - public function handleSaving(Saving $event) - { - // Your logic here - } -} -``` - -## Invio di eventi - -L'invio di eventi è molto semplice. Tutto quello che devi fare è iniettare `Illuminate\Contracts\Events\Dispatcher` nella tua classe, e chiamare poi il metodo `dispatch`. Per esempio: - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` - -## Eventi personalizzati - -In qualità di sviluppatore di estensioni, puoi definire i tuoi eventi per consentire a te stesso (o ad altre estensioni) di reagire agli eventi nella tua estensione. Gli eventi sono generalmente istanze di classi semplici (non è necessario estendere nulla). Quando si definisce un nuovo evento, in genere si desidera utilizzare proprietà pubbliche e forse alcuni metodi per la comodità degli utenti. Ad esempio, se diamo un'occhiata a `Flarum\Post\Event\Deleted`, è solo un contenitore di alcuni dati: - -```php -post = $post; - $this->actor = $actor; - } -} -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/cli.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/cli.md deleted file mode 100644 index 5e9d65f17..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# Sviluppatori che spiegano il loro flusso di lavoro per lo sviluppo di estensioni - -The Flarum development ecosystem is oriented around many small, modules, interacting extensions. This is a very powerful and flexible paradigm, but it also brings the maintenance cost of creating and maintaining all these extensions. - -We've created the Flarum CLI (command line interface) as a tool to help developers by automating some repetitive and menial tasks, and allow them to get into the actual work without much hassle. - -Major updates about Flarum CLI will be published [on this discussion](https://discuss.flarum.org/d/28427-flarum-cli-v10). - -See the [package's readme](https://github.com/flarum/cli#readme) for information on: - -- Installazione -- Usage -- Upgrading -- Available commands -- Some implementation details, if you're interested diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/console.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/console.md deleted file mode 100644 index 6d2d24689..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/console.md +++ /dev/null @@ -1,70 +0,0 @@ -# Console - -Flarum consente agli sviluppatori di estensioni di aggiungere comandi personalizzati nella console oltre a [quelli di default](../console.md) insiti nel core di Flarum. - -Tutto lo sviluppo dei comandi della console viene eseguito nel back-end utilizzando PHP. Per creare un comando della console personalizzato, dovrai creare una classe che estende `\Flarum\Console\AbstractCommand`. - -```php -use Flarum\Console\AbstractCommand; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -class YourCommand implements AbstractCommand { - protected function configure() - { - $this - ->setName('IL TUO COMANDO QUI') - ->setDescription('LA DESCRIZIONE DLE TUO COMANDO'); - } - protected function fire() - { - // La tua logica qui! - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -:::tip Comandi pianificati -```bash -$ flarum-cli make backend command -``` - -::: - -## Registrazione dei comandi della Console - -Per registrare i comandi della console, usa l'estensore `Flarum\Extend\Console` nel file `extend.php` della tua estensione: - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Other extenders - (new Extend\Console())->command(CustomCommand::class) - // Other extenders -]; -``` - -## Scheduled Commands - -La [fof/console library](https://github.com/FriendsOfFlarum/console) consente di programmare l'esecuzione dei comandi a intervalli regolari! - - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; -use Illuminate\Console\Scheduling\Event; - -return [ - // Other extenders - (new Extend\Console())->schedule('cache:clear', function (Event $event) { - $event->everyMinute(); - }, ['Arg1', '--option1', '--option2']), - // Other extenders -]; -``` - -Nella callback fornita come secondo argomento, puoi chiamare metodi sull'oggetto [$event](https://laravel.com/api/8.x/Illuminate/Console/Scheduling/Event.html) per pianificare operazioni ricorrenti (o applicare altre opzioni). Vedi la documentazione [Laravel](https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands) per maggiori informazioni. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/data.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/data.md deleted file mode 100644 index faa5d5e86..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/data.md +++ /dev/null @@ -1,568 +0,0 @@ -# Lavorare con i dati - -I dati sono la base di qualsiasi forum, quindi dovrai giocarci bene se vuoi che la tua estensione faccia qualcosa di utile. Questo documento illustra il modo in cui i dati fluiscono in Flarum, dal database all'API JSON al frontend, e di nuovo indietro. - -Flarum fa uso di [componenti Database Laravel](https://laravel.com/docs/database). È necessario familiarizzare con questi componenti prima di procedere, poiché si presume che la conoscenza di questi sia assodata. - - -## Ciclo di vita delle richieste API - -Prima di entrare nei dettagli su come estendere l'API di dati di Flarum, vale la pena pensare al ciclo di vita di una tipica richiesta di dati: - -1. Una richiesta HTTP viene inviata all'API di Flarum. In genere, avviene dal frontend di Flarum, tuttavia anche programmi esterni possono interagire con l'API. L'API di Flarum segue principalmente le specifiche [JSON:API](https://jsonapi.org/), quindi di conseguenza, le richieste dovrebbero seguire [dette specifiche](https://jsonapi.org/format/#fetching). -2. La richiesta viene eseguita tramite [middleware](middleware.md), e indirizzato al controller appropriato. Puoi saperne di più sui controller nel loro insieme nella nostra [routes and content documentation](routes.md). Supponendo che la richiesta sia all'API (come nel caso di questa sezione), il controller che gestisce la richiesta sarà una sottoclasse di `Flarum\Api\AbstractSerializeController`. -3. Vengono applicate tutte le modifiche apportate dalle estensioni al controller tramite [`ApiController` extender](#extending-api-controllers). Ciò potrebbe comportare la modifica dell'ordinamento, l'aggiunta di include, la modifica del serializzatore, ecc. -4. Viene chiamato il metodo `$ this-> data ()` del controller, che fornisce alcuni dati grezzi che dovrebbero essere restituiti al client. In genere, questi dati assumeranno la forma di una raccolta o istanza di Laravel Eloquent Model, che è stato recuperato dal database. Detto questo, i dati potrebbero essere qualsiasi cosa purché il serializzatore del controller possa elaborarli. Ogni controller è responsabile dell'implementazione del proprio metodo `data`. Nota che per richieste `PATCH`, `POST`, e `DELETE`, `data` eseguirà l'operazione in questione e restituirà l'istanza del modello modificata. -5. Questi dati vengono eseguiti tramite qualsiasi callback di pre-serializzazione che le estensioni registrano tramite [`ApiController` extender](#extending-api-controllers). -6. I dati passano attraverso un [serializer](#serializers), che lo converte dal backend, nel formato compatibile con il database in JSON: formato API previsto dal frontend. Inoltre allega tutti gli oggetti correlati, che vengono eseguiti tramite i propri serializzatori. Come spiegato qui sotto, l'estensione può [aggiungere / sovrascrivere relazioni e attributi](#attributes-and-relationships) a livello della serializzazione. -7. I dati serializzati vengono restituiti come JSON al frontend. -8. Se la richiesta ha avuto origine tramite il frontend di Flarum `Store`, i dati restituiti (inclusi eventuali oggetti correlati) verranno archiviati nel file [frontend models](#frontend-models) nel frontend. - -## Migrazioni - -Se vogliamo utilizzare un modello personalizzato o aggiungere attributi a uno esistente, sarà necessario modificare il database per aggiungere tabelle / colonne. Di solito viene fatto tramite le migrazioni. - -Le migrazioni sono come il controllo della versione per il tuo database, permettendoti di modificare facilmente lo schema del database di Flarum in modo sicuro. Le migrazioni di Flarum sono molto simili a [Laravel's](https://laravel.com/docs/migrations), anche se ci sono alcune differenze. - -Le migrazioni risiedono all'interno di una cartella opportunamente denominata `migrations` nella directory delle estensioni. Le migrazioni dovrebbero essere denominate nel formato `YYYY_MM_DD_HHMMSS_snake_case_description` in modo che siano elencati ed eseguiti in ordine di creazione. - -### Struttura della migrazioni - -In Flarum, i file di migrazione dovrebbero ** restituire un array ** con due funzioni: `up` e `down`. La funzione `up` viene utilizzato per aggiungere nuove tabelle, colonne o indici al database, mentre la funziona `down` dovrebbe invertire queste operazioni. Queste funzioni ricevono un'istanza di [Laravel schema builder](https://laravel.com/docs/6.x/migrations#creating-tables) che puoi usare per modificare lo schema del database: - -```php - function (Builder $schema) { - // up migration - }, - 'down' => function (Builder $schema) { - // down migration - } -]; -``` - -Per attività comuni come la creazione di una tabella o l'aggiunta di colonne a una tabella esistente, Flarum fornisce alcuni helper che costruiscono questo array per te, e si occupano di scrivere la logica di migrazione `down` al tuo posto. Questi sono disponibili come metodi statici nelle classi `Flarum\Database\Migration`. - -### Ciclo di vita delle migrazioni - -Le migrazioni vengono applicate quando l'estensione viene abilitata per la prima volta o quando è abilitata e ci sono alcune migrazioni in sospeso. Le migrazioni eseguite vengono registrate nel database, e se ne vengono trovate alcune nella cartella migrazioni di un estensione, non ancora espletate, vengono eseguite. - -Le migrazioni possono anche essere applicate manualmente con il comando `php flarum migrate` necessario anche per aggiornare le migrazioni di un'estensione già abilitata. Per annullare le modifiche applicate dalle migrazioni, è necessario fare clic su "Disinstalla" accanto a un'estensione nel pannello di amministrazione, o utilizzare in alternativa il comando `php flarum migrate:reset`. Non può rompersi nulla eseguento il comando `php flarum migrate` anche se è stato appena eseguito - le migrazioni infatti non verranno reiterate. - -Al momento non sono presenti hook a livello del composer per la gestione delle migrazioni (es. aggiornare un estensione con `composer update` non eseguirà le sue migrazioni in sospeso). - -### Creazione di tabelle - -Per creare una tabella, utilizza l'helper `Migration::createTable`. `createTable` accetta due argomenti. Il primo è il nome della tabella, mentre il secondo è `Closure` che riceve un oggetto `Blueprint` che può essere utilizzato per definire la nuova tabella: - -```php -use Flarum\Database\Migration; -use Illuminate\Database\Schema\Blueprint; - -return Migration::createTable('users', function (Blueprint $table) { - $table->increments('id'); -}); -``` - -Quando si crea la tabella, è possibile utilizzare uno qualsiasi dei generatori di schemi [column methods](https://laravel.com/docs/6.x/migrations#creating-columns) -per definire le colonne della tabella. - -### Rinominare tabelle - -Per rinominare una tabella di database esistente, utilizzare il comando `Migration::renameTable`: - -```php -return Migration::renameTable($from, $to); -``` - -### Creazione / eliminazione di colonne - -Per aggiungere colonne ad una tabella esistente, utilizza l'helper `Migration::addColumns`.`addColumns` accetta due argomenti. Il primo è il nome della tabella. Il secondo è un array di definizioni di colonne, con la chiave che è il nome della colonna. Il valore di ogni elemento è un array con le definizioni della colonna, come inteso dal metodo Laravel `Illuminate\Database\Schema\Blueprint::addColumn()`. Il primo valore è il tipo di colonna a cui vengono passati tutti gli altri valori con `addColumn`. - -```php -return Migration::addColumns('users', [ - 'email' => ['string', 'nullable' => true], - 'discussion_count' => ['integer', 'unsigned' => true] -]); -``` - -Per eliminare colonne da una tabella esistente, utilizzare il domando `Migration::dropColumns`, che utilizza gli stessi argomenti di `addColumns`. Proprio come quando si rilasciano le tabelle, è necessario specificare le definizioni complete delle colonne in modo che la migrazione possa essere annullata in modo pulito. - -### Rinominare colonne - -Per rinominare le colonne utilizza il comando `Migration::renameColumns`.`renameColumns` accetta due argomenti. Il primo è il nome della tabella, mentre il secondo è un array di nomi di colonne da rinominare: - -```php -return Migration::renameColumns('users', ['from' => 'to']); -``` - -### Migrazioni dei dati (avanzatato) - -Una migrazione non deve modificare la struttura del database: è possibile utilizzare una migrazione per inserire, aggiornare o eliminare righe in una tabella. Ad esempio, potresti utilizzare le migrazioni per assegnare [permessi personalizzati](permissions.md) a gruppi diversi da Admin, o fornire alcuni dati iniziali per un modello Eloquent personalizzato. Dato che hai accesso a [Eloquent Schema Builder](https://laravel.com/docs/6.x/migrations#creating-tables), tutto è possibile (anche se, ovviamente, dovresti essere estremamente cauto e testare ampiamente la tua estensione). - -Le migrazioni dei dati sono il modo consigliato per specificare le impostazioni e le autorizzazioni predefinite. - -## Modelli di backend - -Con tutte le tue nuove eleganti tabelle e colonne di database, vorrai un modo per accedere ai dati sia nel backend che nel frontend. Sul back-end è piuttosto semplice: devi solo avere familiarità con [Eloquent](https://laravel.com/docs/6.x/eloquent). - -### Aggiunta di nuovi modelli - -Se hai aggiunto una nuova tabella, dovrai impostare un nuovo modello per essa. Piuttosto che estendere la classe `Model` direttamente, dovrai estendere `Flarum\Database\AbstractModel` che fornisce un po 'di funzionalità extra per consentire ai tuoi modelli di essere estesi da altre estensioni. - - - -### Relazioni - -Puoi aggiungere anche [relazioni](https://laravel.com/docs/6.x/eloquent-relationships) a modelli esistenti utilizzando i metodi `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`e `relationship` sull'estensore `Model`. Il primo argomento è il nome della relazione; il resto degli argomenti viene passato al metodo equivalente sul modello, quindi è possibile specificare il nome del modello correlato e, facoltativamente, sostituire i nomi di tabella e chiave: - -```php - new Extend\Model(User::class) - ->hasOne('phone', 'App\Phone', 'foreign_key', 'local_key') - ->belongsTo('country', 'App\Country', 'foreign_key', 'other_key') - ->hasMany('comment', 'App\Comment', 'foreign_key', 'local_key') - ->belongsToMany('role', 'App\Role', 'role_user', 'user_id', 'role_id') -``` - -Questi 4 dovrebbero coprire la maggior parte delle relazioni, ma a volte è necessaria una personalizzazione più precisa (es. `morphMany`, `morphToMany`, e `morphedByMany`). QUALSIASI relazione Eloquent valida è supportata dal metodo `relationship`: - -```php - new Extend\Model(User::class) - ->relationship('mobile', 'App\Phone', function ($user) { - // Return any Eloquent relationship here. - return $user->belongsToMany(Discussion::class, 'recipients') - ->withTimestamps() - ->wherePivot('removed_at', null); - }) -``` - - -## Serializzatori - -Il passaggio successivo consiste nell'esposizione dei nuovi dati nella JSON: API di Flarum in modo che possano essere utilizzati dal frontend. Dovresti acquisire familiarità con le [specifiche JSON:API](https://jsonapi.org/format/). JSON: API di Flarum è alimentato dalla libreria [tobscure/json-api](https://github.com/tobscure/json-api). - -JSON: le risorse API sono definite da ** serializzatori **. Per definire un nuovo tipo di risorsa, creare una nuova classe serializzatore extendendo `Flarum\Api\Serializer\AbstractSerializer`. Dovrai specificare la risorsa `$type` e implementare il metodo `getDefaultAttributes` che accetta l'istanza del modello come unico argomento: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -### Attributi e relazioni - -Puoi anche specificare le relazioni per la tua risorsa. Crea semplicemente un nuovo metodo con lo stesso nome della relazione sul tuo modello e restituisci una chiamata a `hasOne` o `hasMany` a seconda della natura della relazione. È necessario passare l'istanza del modello e il nome del serializzatore da utilizzare per le risorse correlate. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -Per aggiungere ** attributi ** e ** relazioni ** a un tipo di risorsa esistente, utilizzare l'estensore `ApiSerializer`: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -## API Endpoints - -Dopo aver definito le risorse nei serializzatori, sarà necessario esporle come endpoint API. - -Seguendo le convenzioni dell'API JSON, puoi aggiungere cinque itinerari standard per il tuo tipo di risorsa utilizzando l'estensore `Routes`: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -Lo spazio dei nomi `Flarum\Api\Controller` contiene un numero di classi astratte che puoi estendere per implementare facilmente le tue risorse JSON-API. - -### Elenco risorse - -Per il controller che elenca la tua risorsa, estendi la classe `Flarum\Api\Controller\AbstractListController`. Come minimo, è necessario specificare quale tipo di `$serializer` vuoi utilizzare per serializzare i tuoi modelli, e implementare `data` per restituire una raccolta di modelli. `data` accetta oggetti `Request` e tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -### Mostra una risorsa - -Per il controller che mostra una singola risorsa, estendi `Flarum\Api\Controller\AbstractShowController`. Come per il controller di elenco, è necessario specificare il `$serializer` che vuoi usare per serializzare i tuoi modelli, implementando `data` per restituire un singolo modello: - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creare una risorsa - -Per il controller che crea una risorsa, estendi `Flarum\Api\Controller\AbstractCreateController`. È lo stesso del controller "show", tranne per il fatto che il codice di stato della risposta verrà impostato automaticamente su `201 Created`. È possibile accedere al JSON/corpo del documento API tramite `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Aggiornare una risorsa - - -Per il controller che aggiorna una risorsa, estendi `Flarum\Api\Controller\AbstractShowController`. Come per il controller di creazione, puoi accedere al corpo del documento JSON:API in entrata tramite `$request->getParsedBody()`. - -### Cancellare una risorsa - -Per il controller che elimina una risorsa, estendi `Flarum\Api\Controller\AbstractDeleteController`. Dovrai solo implementarci `delete` che attua la cancellazione. Il controller restituirà automaticamente un responso `204 No Content`. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Includere Relazioni - -Per includere relazioni quando ** elenchi **, ** mostri ** o ** crei ** la tua risorsa, specificale nelle proprietà del controller con `$include` e `$optionalInclude`: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -È quindi possibile ottenere un elenco delle relazioni incluse utilizzando `extractInclude`. Questo può essere utilizzato per caricare le relazioni sui modelli prima che questi vengano serializzati: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Impaginazione - -Puoi consentire la personalizzazione del numero di risorse ** elencate ** specificando nel controlle le proprietà `limit` e `maxLimit`: - -```php - // Il numero di record inclusi per impostazione predefinita. - public $limit = 20; - - // Il numero massimo di record che possono essere richiesti. - public $maxLimit = 50; -``` - -È quindi possibile estrarre le informazioni sull'impaginazione dalla richiesta utilizzando `extractLimit` e `extractOffset`: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -Per aggiungere collegamenti di impaginazione al documento JSON:API, utilizzare il [`Document::addPaginationLinks` method](https://github.com/tobscure/json-api#meta--links). - -### Ordinamento - -È possibile consentire la personalizzazione dell'ordinamento delle risorse ** elencate ** specificando le proprietà `sort` e `sortField` nel tuo controller: - -```php - // Il campo di ordinamento predefinito e l'ordine da utilizzare. - public $sort = ['name' => 'asc']; - - // I campi disponibili per essere ordinati. - public $sortFields = ['firstName', 'lastName']; -``` - -È quindi possibile estrarre le informazioni sull'ordinamento dalla richiesta utilizzando `extractSort`. Ciò restituirà una serie di criteri di ordinamento che puoi applicare alla tua query: - -```php -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(snake_case($field), $order); -} - -return $query->get(); -``` - -### Estensione dei controller API - -È possibile personalizzare tutte queste opzioni sul controller _existing_ API tramite `ApiController`: - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -`ApiController` può essere utilizzato anche per regolare i dati prima della serializzazione: - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Modelli frontend - -Ora che hai esposto i tuoi dati nella JSON:API di Flarum, è finalmente giunto il momento di dargli vita e utilizzarli sul frontend. - -### Recupero dati - -Il frontend di Flarum contiene dati locali in `store` che fornisce un'interfaccia per interagire con JSON:API. Puoi recuperare le risorse dall'API utilizzando `find`, che restituisce sempre: - - -```js -// GET /api/discussions?sort=createdAt -app.store.find('discussions', {sort: 'createdAt'}).then(console.log); - -// GET /api/discussions/123 -app.store.find('discussions', 123).then(console.log); -``` - -Una volta che le risorse sono state caricate, verranno memorizzate nella cache nell'archivio in modo da poterle accedere nuovamente senza reiterare l'API utilizzando `all` e `getById`: - -```js -const discussions = app.store.all('discussions'); -const discussion = app.store.getById('discussions', 123); -``` - -Store racchiude i dati delle risorse API non elaborate in oggetti del modello che ne semplificano il lavoro. È possibile accedere ad attributi e relazioni tramite metodi di istanza predefiniti: - -```js -const id = discussion.id(); -const title = discussion.title(); -const posts = discussion.posts(); // array of Post models -``` - -Puoi saperne di più su "store" nella nostra [Documentazione API](https://api.docs.flarum.org/js/master/class/src/common/store.js~store). - -### Aggiunta di nuovi modelli - -Se hai aggiunto un nuovo tipo di risorsa, dovrai definirne un nuovo modello. I modelli devono estendere la classe `Model` e ridefinire gli attributi e le relazioni delle risorse: - - -```js -import Model from 'flarum/Model'; - -export default class Tag extends Model { - title = Model.attribute('title'); - createdAt = Model.attribute('createdAt', Model.transformDate); - parent = Model.hasOne('parent'); - discussions = Model.hasMany('discussions'); -} -``` - -È quindi necessario registrare il nuovo modello presso store: - -```js -app.store.models.tags = Tag; -``` - - - -### Modelli estensibili - -Per aggiungere attributi e relazioni ai modelli esistenti, modificare il prototipo della classe del modello: - -```js -Discussion.prototype.user = Model.hasOne('user'); -Discussion.prototype.posts = Model.hasMany('posts'); -Discussion.prototype.slug = Model.attribute('slug'); -``` - - - -### Risparmio di risorse - -Per inviare di nuovo i dati tramite l'API, chiama il metodo `save` su un'istanza del modello. Questo metodo restituisce un valore che si risolve con la stessa istanza del modello: - -```js -discussion.save({ title: 'Hello, world!' }).then(console.log); -``` - -Puoi anche salvare le relazioni passandole in `relationships`. Per le relazioni singole, passare una singola istanza del modello. Per le relazioni multiple, passare un array di istanze del modello. - -```js -user.save({ - relationships: { - groups: [ - store.getById('groups', 1), - store.getById('groups', 2) - ] - } -}) -``` - -### Creazione di nuove risorse - -Per creare una nuova risorsa, crea una nuova istanza del modello per il tipo di risorsa utilizzando `createRecord`, quindi `save`: - -```js -const discussion = app.store.createRecord('discussions'); - -discussion.save({ title: 'Hello, world!' }).then(console.log); -``` - -### Eliminazione di risorse - -Per eliminare una risorsa, usa `delete` su un'istanza del modello. Questo metodo restituisce: - -```js -discussion.delete().then(done); -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/distribution.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/distribution.md deleted file mode 100644 index fbfcb948f..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/distribution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Distribuzione - -Hai scritto una grande estensione e ora vuoi che il mondo intero sia in grado di usarla. Questo documento ti guiderà attraverso il processo di distribuzione, dalla configurazione di un repository Git per la tua estensione, alla pubblicazione su Packagist. - -## Configurazione di Git - -La prima cosa che devi fare è configurare un sistema di controllo della versione (VCS). Il VCS più popolare è [Git](https://git-scm.com/). In questa guida useremo Git, quindi assicurati di [installarlo](https://git-scm.com/downloads) prima di continuiare. Se non hai molta conoscenza di Git, ti consigliamo di controllare [queste risorse di apprendimento](https://try.github.io/). - -Dopo aver installato Git, dovrai inizializzare il tuo repository. Puoi utilizzare `git init` su riga di comando se ti è più familiare, o un interfaccia tipo [SourceTree](https://www.sourcetreeapp.com/) o [GitKraken](https://www.gitkraken.com/). - -Quindi, avrai bisogno di un account in un server di hosting Git, dove i sovrani sono[GitHub](https://github.com) e [GitLab](https://gitlab.com). Questi siti ti istruiranno su come collegare la tua repository locale con la repository "in remoto" online. - -## Contrassegnare una versione - -Mentre pubblicherai la tua estensione, ti consigliamo di assicurarti che le informazioni siano aggiornate. Prenditi un minuto per rivisitare `composer.json` e assicurati che il nome del pacchetto, la descrizione e le informazioni sull'estensione Flarum siano tutte corrette. Si consiglia di avere un file `README.md` nella tua repository per spiegare qual è e cosa fa l'estensione, quindi creane una se non lo hai già fatto. - -Quando sei pronto per il rilascio, salva i file della tua estensione nel repository e tagga la tua prima versione: - -```bash -git tag v0.1.0 -git push && git push --tags -``` - -## Pubblicazione su Packagist - -I pacchetti Composer sono pubblicati in una repository, solitamente [Packagist](https://packagist.org/). Avrai bisogno di un account per proseguire. - -Se questa è la prima versione della tua estensione che stai pubblicando, [carica il tuo pacchetto](https://packagist.org/packages/submit) utilizzando il suo URL repository pubblico. Se la tua estensione si trova su GitHub, questo URL avrà un aspetto simile `https://github.com/AUTHOR/NAME.git`. - -### Rilasci futuri - -Puoi configurare Packagist per [auto-aggiornare i pacchetti](https://packagist.org/about#how-to-update-packages). Quindi, per le versioni future, tutto ciò che dovrai fare con Git è eseguire il commit, il tag e il push al server remoto. - -## Promuovere la tua estensione - -Molto probabilmente vorrai creare una discussione sulla comunità Flarum sulla categoria [Estensioni](https://discuss.flarum.org/t/extensions). Altre persone potranno installare la tua estensione utilizzando il seguente comando: - -```bash -composer require autore/nome-estensione -``` \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/extending-extensions.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/extending-extensions.md deleted file mode 100644 index e91d4bf11..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/extending-extensions.md +++ /dev/null @@ -1,122 +0,0 @@ -# Estendere le Estensioni - -Le estensioni di Flarum non prevedono solo l'aggiunta di funzionalità al core: le estensioni possono estendere anche altre estensioni! - -:::tip - -Per imparare a rendere estensibile la tua estensione, consulta la [documentazione pertinente](extensibility.md) - -::: - -## Dipendenze - -Se la tua estensione si basa su un'altra estensione, ti assicurerai che: - -- L'altra estensione è installata e abilitata prima della tua attuale estensione. -- L'altra estensione non può essere disabilitata mentre la tua è abilitata. -- L'altra estensione viene avviata prima della tua estensione. - -Flarum rende tutto ciò molto facile: basta aggiungere l'altra estensione al file `composer.json`della tua estensione o nella sezione `require`. - -Ad esempio, se stai sviluppando un nuovo tema per l'estensione Tag Flarum, il tuo `composer.json` dovrebbe essere simile a questo: - -```json -{ - // ... - "require": { - "flarum/core": "^1.0.0", // Perchè tutte le estensioni necessitano del Core di Flarum. - "flarum/tags": "^1.1.0" // Questo dice a Flarum di trattare i tag come dipendenza della tua estensione. - }, - // ... -} -``` - -## Dipendenze opzionali - -A volte, l'estensione A potrebbe voler estendere l'estensione B solo se l'estensione B è abilitata. In questo caso, chiamiamo B una "Dipendenza opzionale" di A. Per esempio, l'estensione "Drafts" potrebbe voler aggiungere il supporto per salvare bozze di discussione private, ma solo se l'estensione di discussione privata è abilitata. - -Il primo passo quindi è quello di rilevare se l'estensione B è abilitata. Nel frontend, è facile: se l'estensione B fa qualcosa nel frontend, il suo ID di estensione apparirà come chiave nell'oggetto globale `flarum.extensions` . Per esempio: - -```js -if ('some-extension-id' in flarum.extensions) { - // fai qualcosa -} -``` - -Nel backend, dovrai iniettare un'istanza di `Flarum\Extension\ExtensionManager`e usare il metodo `isEnabled()`. Per esempio: - -```php -extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // fai qualcosa. - } - } -} -``` - -Generalmente, se la tua estensione ha dipendenze opzionali, vorrai che venga avviata dopo queste dipendenze opzionali. Tutto ciò è possibile farlo anche specificando i nomi dei pacchetti composer (NON ID dell' estensione flarum) in un array `extra.flarum-extension.optional-dependencies` del tuo file composer.json. - -Per esempio: - -```json -{ - // ... - "extra": { - "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] - } - }, - // ... -} -``` - -## Importazione da estensioni - -Nel backend, puoi importare le classi di cui hai bisogno tramite la dichiarazione PHP `use`: - -```php - { - // Il codice della tua estensione andrà qui -}) - -export { - // Tutto ciò che vuoi esportare invece andrà qui. -} -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/filesystem.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/filesystem.md deleted file mode 100644 index 455663d4a..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/filesystem.md +++ /dev/null @@ -1,129 +0,0 @@ -# Filesystem - -Flarum core si integra con il filesystem per memorizzare e servire asset (come JS/CSS compilato o caricare loghi/favicon) e avatar. - -Le estensioni possono utilizzare le utilità fornite da Flarum per le proprie interazioni con il filesystem e le esigenze di archiviazione dei file. Questo sistema si basa sugli strumenti del [filesystem di Laravel](https://laravel.com/docs/8.x/filesystem), che a loro volta si basano sulla libreria [Flysystem](https://github.com/thephpleague/flysystem). - -## Dischi - -I dischi **del filesystem** rappresentano le posizioni di archiviazione e sono supportati da driver di archiviazione, che approfondiremo più tardi. Flarum core ha 2 dischi: `flarum-assets` e `flarum-avatars`. - -### Utilizzo dei dischi esistenti - -Per accedere a un disco, è necessario recuperarlo dalla [Filesystem Factory](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Factory.html). Per farlo, dovresti iniettare il factory contract nella tua classe e accedere ai dischi di cui hai bisogno. - -Let's take a look at core's [`DeleteLogoController`](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Controller/DeleteLogoController.php#L19-L58) for an example: - -```php -settings = $settings; - $this->uploadDir = $filesystemFactory->disk('flarum-assets'); - } - - /** - * {@inheritdoc} - */ - protected function delete(ServerRequestInterface $request) - { - RequestUtil::getActor($request)->assertAdmin(); - - $path = $this->settings->get('logo_path'); - - $this->settings->set('logo_path', null); - - if ($this->uploadDir->exists($path)) { - $this->uploadDir->delete($path); - } - - return new EmptyResponse(204); - } -} -``` - -L'oggetto restituito da `$filesystemFactory->disk(DISK_NAME)` implementa l'interfaccia [Illuminate\Contracts\Filesystem\Cloud](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Cloud.html), e può essere utilizzato per creare/ottenere/spostare/eliminare file, e per ottenere l'URL di una risorsa. - -### Dichiarazione di nuovi dischi - -Alcune estensioni però potrebbero voler immagazzinare risorse/upload su un disco personalizzato invece di utilizzare `flarum-asset` o `flarum-avatars`. - -Questo può essere fatto tramite l'extender `Filesystem`: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->disk('flarum-uploads', function (Paths $paths, UrlGenerator $url) { - return [ - 'root' => "$paths->public/assets/uploads", - 'url' => $url->to('forum')->path('assets/uploads') - ]; - }); -``` - -Poiché tutti i dischi usano il filesystem locale per impostazione predefinita, è necessario fornire un percorso di base e un URL di base per il filesystem locale. - -L'array di configurazione può contenere altre voci supportate da [Array di configurazione dischi Laravel](https://laravel.com/docs/8.x/filesystem#configuration). La chiave `driver` non deve essere fornita, e verrà comunque ignorata. - -## Storage drivers - -Flarum seleziona il driver attivo per ogni disco controllando il `disk_driver.DISK_NAME` in [settings repository](settings.md) e [config.php](../config.md). Se nessun driver è configurato, o il driver configurato non è disponibile, Flarum utilizzerà il driver `local`. - -You can define new storage drivers by implementing the [`Flarum\Filesystem\DriverInterface` interface](https://github.com/flarum/framework/blob/main/framework/core/src/Filesystem/DriverInterface.php#L16), and registering it via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->driver('aws-with-cdn', AwsWithCdnDriver::class); -``` - -I driver di archiviazione del filesystem sono uno strumento molto potente che consente di personalizzare completamente le posizioni di archiviazione dei file, allegare CDN arbitrari, ed estendere il filesystem/cloud storage. - -:::Attenzione - -Alcuni driver potrebbero provare a indicizzare il loro filesystem ogni volta che il driver viene istanziato, anche se è necessario solo il metodo `url`. Ciò può avere gravi ripercussioni sulle prestazioni. Nella maggior parte dei casi, dovrai assicurarti che il metodo `url` del tuo driver non esegua il filesystem remoto. Allo stesso modo, il filesystem remoto di solito non dovrebbe essere accessibile fino a quando le operazioni non vengono effettivamente eseguite. - -::: - -## Configurazione interfaccia utente e amministratore - -Flarum al momento non fornisce una GUI per selezionare driver o per inserire impostazioni per i driver. Ma potrebbe essere aggiunta in futuro. Per ora, le estensioni sono responsabili di fornire una GUI per i loro dischi/driver. - -Come notato [sopra](#storage-drivers), se la tua estensione fornisce una GUI per selezionare driver di un disco, dovrà modificare il `disk_driver.DISK_NAME` nelle impostazioni. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/formatting.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/formatting.md deleted file mode 100644 index 41d5e867e..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/formatting.md +++ /dev/null @@ -1,42 +0,0 @@ -# Formattazione - -Flarum usa la potente libreria [s9e TextFormatter](https://github.com/s9e/TextFormatter) per formattare i post dal semplice markup in HTML. Dovresti familiarizzare con [come funziona TextFormatter](https://s9etextformatter.readthedocs.io/Getting_started/How_it_works/) prima di utilizzarlo. - -In Flarum, il contenuto del post è formattato con una configurazione TextFormatter minima per impostazione predefinita. Le estensioni ** Markdown ** e ** BBCode ** in bundle abilitano semplicemente i rispettivi plugin. - -## Configurazione - -Puoi configurare l'istanza di TextFormatter `Configurator`, così come eseguire la logica personalizzata durante l'analisi e il rendering, utilizzando l'estensione `Formatter`: - -```php -use Flarum\Extend; -use Psr\Http\Message\ServerRequestInterface as Request; -use s9e\TextFormatter\Configurator; -use s9e\TextFormatter\Parser; -use s9e\TextFormatter\Renderer; - -return [ - (new Extend\Formatter) - // Aggiungi la configurazione del formattatore di testo personalizzato - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modifica il testo grezzo prima che venga analizzato. - // Questa callback dovrebbe restituire il testo modificato. - ->parse(function (Parser $parser, $context, $text) { - // logica personalizzata qui - return $newText; - }) - //Modificare l'XML di cui eseguire il rendering. - // il suo callback dovrebbe restituire il nuovo XML. - // Ad esempio, nell'estensione menzioni, viene utilizzato per - // fornire il nome utente e il nome visualizzato dell'utente menzionato. - // Assicurati che l'ultimo argomento $request sia annullabile (o omesso completamente). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // logica personalizzata qui - return $newXml; - }) -]; -``` - -Una buona conoscenza di TextFormatter, ti consentirà di ottenere molti risultati, dalle semplici aggiunte di tag BBCode a compiti di formattazione più complessi come l'estensione ** Mentions ** di Flarum. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/forms.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/forms.md deleted file mode 100644 index 3d07c86ef..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/forms.md +++ /dev/null @@ -1,108 +0,0 @@ -# Moduli e richieste - -In questo articolo, esamineremo alcuni strumenti di frontend che sono a nostra disposizione per la creazione e la gestione di moduli, nonché come inviare richieste HTTP tramite Flarum. - -## Componenti Form - -Come con qualsiasi sito interattivo, probabilmente vorrai includere moduli in alcune pagine. Flarum fornisce alcuni componenti per rendere più facile la costruzione (e lo styling!) di questi ultimi. Si prega di consultare la documentazione API collegata per per saperne di più sugli attributi accettati. - -- Il [`flarum/components/FieldSet` componente](https://api.docs.flarum.org/js/master/class/src/common/components/fieldset.js~fieldset) racchiude i suoi "figli" in un tag fieldset HTML, con una legenda. -- Il [`flarum/components/Select` componente](https://api.docs.flarum.org/js/master/class/src/common/components/select.js~select) è un input di selezione stilizzato. -- [`flarum/components/Switch`](https://api.docs.flarum.org/js/master/class/src/common/components/switch.js~switch) e [`flarum/components/Checkbox` i componenti](https://api.docs.flarum.org/js/master/class/src/common/components/checkbox.js~checkbox) sono componenti di input delle caselle di controllo stilizzate. Il loro attributo `loading` può essere impostato su `true` per mostrare un indicatore di caricamento. -- Il componente [`flarum/components/Button`](https://api.docs.flarum.org/js/master/class/src/common/components/button.js~button) è un bottone stilizzato, frequentemente utilizzato su Flarum. - -In genere vorrai assegnare la logica per reagire ai cambiamenti di input tramite Mithril e l'attributo `on*`, non listener esterni (come è comune con jQuery o semplice JS). Per esempio: - -```jsx -import Component from 'flarum/Component'; -import FieldSet from 'flarum/components/FieldSet'; -import Button from 'flarum/components/Button'; -import Switch from 'flarum/components/Switch'; - - -class FormComponent extends Component { - oninit(vnode) { - this.textInput = ""; - this.booleanInput = false; - } - - view() { - return ( -
-
- this.textInput = e.target.value}> - - this.booleanInput = val}> - -
- -
- ) - } - - onsubmit() { - // Some form handling logic here - } -} -``` - -Don't forget to use [translations](translate.md)! - - -## Streams, bidi, e withAttr - -Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/util/Stream`. Questa è una struttura di dati molto potente, ma è più comunemente usata in Flarum come wrapper per i dati dei moduli form. Il suo utilizzo di base è: - -```js -import Stream from 'flarum/utils/Stream'; - - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true -``` - -Nei form di Flarum, i flussi sono spesso usati insieme all'attributo bidi. Bidi sta per associazione bidirezionale ed è un modello comune nei framework di frontend. Flarum applica al Mithril la [`m.attrs.bidi` libreria](https://github.com/tobyzerner/m.attrs. Questo astrae l'elaborazione degli input in Mithril. Per esempio: - -```jsx -import Stream from 'flarum/utils/Stream'; - -const value = Stream(); - -// Without bidi - value(e.target.value)}> - -// With bidi - -``` - -You can also use the `flarum/utils/withAttr` util for simplified form processing. `withAttr` chiama un callable, fornendo come argomento qualche attr dell'elemento DOM legato al componente in questione: - -```jsx -import Stream from 'flarum/utils/Stream'; -import withAttr from 'flarum/utils/withAttr'; - -const value = Stream(); - -// With a stream - - -// With any callable - { - // Some custom logic here -})}> -``` - -## Effettuare richieste - -Nella nostra [documentazione di modelli e dati](data.md), hai imparato come lavorare con i modelli e salvare la creazione del modello, le modifiche e l'eliminazione nel database tramite l'utilità Store, che è solo un wrapper attorno al sistema di richiesta di Flarum, che a sua volta è un altro wrapper [Sistema di richieste Mithril](https://mithril.js.org/request.html). - -Il sistema di richiesta di Flarum è disponibile a livello globale tramite `app.request(options)`, e presenta le seguenti differenze rispetto a Mithril `m.request(options)`: - -- Si legherà automaticamente all'header `X-CSRF-Token`. -- Convertirà richieste `PATCH` e `DELETE` in richieste `POST`, e si legherà all'heder `X-HTTP-Method-Override`. -- In caso di errore della richiesta, verrà visualizzato un avviso che, se in modalità debug, può essere cliccato per mostrare un modale di errore completo. -- Puoi fornire anche l'opzione `background: false`, che eseguirà la richiesta in modo sincrono. Tuttavia, questo non dovrebbe quasi mai essere fatto. - -Altrimenti, l'API per l'utilizzo `app.request` è la medesima di `m.request`. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/frontend-pages.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/frontend-pages.md deleted file mode 100644 index 234ceff95..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/frontend-pages.md +++ /dev/null @@ -1,226 +0,0 @@ -# Frontend e Resolver - -Come spiegato nella documentazione [percorsi e contenuti](routes.md#frontend-routes), possiamo usare il sistema di routing di Mithril per mostrare diversi [componenti](frontend.md#components) per differenti percorsi. Mithril ti consente di utilizzare qualsiasi componente che ti piace, anche un Modal o Alert, ma ti consigliamo di attenersi alle classi di componenti che ereditano il componente `Page`. - -## I componenti Page - -Forniamo `flarum/components/Page` come classe base per le pagine sia in `admin` che nel frontend di `forum`. Questi i vantaggi: - -- Aggiornamenti automatici di [`app.current` e `app.previous` PageState](#pagestate) quando si passa da un percorso ad un altro. -- Chiude automaticamente il modal quando si passa da un percorso a un altro. -- Si applica `this.bodyClass` (se definito) all'elemento HTML "#app" quando la pagina viene visualizzata. -- È anche utile per motivi di coerenza utilizzare una classe base comune per tutte le pagine. -- Se l'attributo delle pagine `scrollTopOnCreate` è impostato su `false` in `oninit`, la pagina non verrà spostata verso l'alto quando viene modificata. -- Se `useBrowserScrollRestoration` è impostato su `false` in `oninit`, il ripristino dello scorrimento automatico del browser non verrà utilizzato su quella pagina. - -I componenti della pagina funzionano esattamente come qualsiasi altro componente ereditato. Per esempio (molto semplice): - -```js -import Page from 'flarum/components/Page'; - - -export default class CustomPage extends Page { - view() { - return

Hello!

- } -} -``` - -### Usare i Route Resolvers - -Flarum utilizza un'impostazione per determinare quale pagina dovrebbe essere la homepage: questo dà flessibilità agli amministratori per personalizzare le loro community. Per aggiungere una pagina personalizzata alla homepage in Admin, è necessario estendere il metodo `BasicsPage.homePageItems` con il percorso della tua nuova pagina. - -I dati possono essere impostati e recuperati dallo stato della pagina utilizzando: - -```js -import IndexPage from 'flarum/components/DiscussionPage'; -import DiscussionPage from 'flarum/components/DiscussionPage'; - -// To just check page type -app.current.matches(DiscussionPage); - -// To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -Ad esempio, questo è il modo in cui la pagina di discussione fa la sua istanza di [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) disponibile a livello globale. - -### Resolvers personalizzati - -Spesso, la prima cosa che si modifica è il testo personalizzato che appare nel titolo della scheda del browser. Per esempio, una pagina di tag potrebbe voler mostrare "Tag - NOME FORUM", o una pagina di discussione potrebbe voler mostrare il titolo della discussione. - -Per fare ciò, dovrai aggiungere alla tua pagina la call `app.setTitle()` e `app.setTitleCount()` nel metodo `oncreate` del [lifecycle hook](frontend.md) (o quando i dati sono stati caricati, se richiesti tramite API). - -In realtà ci sono 3 modi per impostare il resolver di componenti / percorsi durante la registrazione di una route: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - oncreate(vnode) { - super.oncreate(vnode); - - app.setTitle("Cool Page"); - app.setTitleCount(0); - } - - view() { - // ... - } -} - -export default class CustomPageLoadsData extends Page { - oninit(vnode) { - super.oninit(vnode); - - app.store.find("users", 1).then(user => { - app.setTitle(user.displayName()); - app.setTitleCount(0); - }) - } - - view() { - // ... - } -} -``` - -Si prega di notare che se la pagina è [impostata come homepage](#setting-page-as-homepage), `app.setTitle()` cancellerà il titolo per semplicità. Dovrebbe comunque essere impostato, per evitare che i titoli delle pagine precedenti vengano applicati. - -## PageState - -A volte, vogliamo ottenere informazioni sulla pagina in cui ci troviamo attualmente o sulla pagina da cui proveniamo. Per consentire ciò, Flarum crea (e memorizza) istanze di [`PageState`](https://api.docs.flarum.org/js/master/class/src/common/states/pagestate.js~pagestate) come `app.current` e `app.previous`. Cioè: - -- La classe del componente utilizzata per la pagina -- Una raccolta di dati che ogni pagina imposta su se stessa. Il nome della rotta corrente è sempre incluso. - -I dati possono essere impostati e recuperati da Page State utilizzando: - -```js -app.current.set(KEY, DATA); -app.current.get(KEY); -``` - -Ad esempio, ecco come la Pagina di Discussione rende [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) disponibile globalmente. - -Puoi anche controllare il tipo e i dati di una pagina usando `PostStreamState` ed il metodo `matches`. Ad esempio, se vogliamo sapere se siamo attualmente su una pagina di discussione: - -```jsx -// Vedi sopra per un esempio di pagina personalizzata -import CustomPage from './components/CustomPage'; -// Vedi sotto per un esempio di resolver personalizzato -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Utilizza un'istanza del resolver di percorsi -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Usa una classe di resolver di percorsi personalizzata -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Usa la classe di default (`flarum/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -## Route resolver (avanzato) - -Vedi la documentazione [Pannello di amministrazione](admin.md) per ulteriori informazioni sugli strumenti disponibili per le pagine di amministrazione (e su come sovrascrivere la pagina di amministrazione per la tua estensione). - -## Route Resolvers (Avanzato) - -[Casi d'uso avanzati](https://mithril.js.org/route.html#advanced-component-resolution) possono ottenere vantaggi dal [sistema di risoluzione dei percorsi di Mithril](https://mithril.js.org/route.html#routeresolver). Flarum in realtà avvolge già tutti i suoi componenti nel resolver `flarum/resolvers/DefaultResolver`. Ciò ha i seguenti vantaggi: - -- Passa un attributo `routeName` alla pagina corrente, che poi lo fornisce a`PageState` -- Assegna una [chiave](https://mithril.js.org/keys.html#single-child-keyed-fragments) al componente della pagina di primo livello. Quando il percorso cambia, se la chiave del componente di primo livello è cambiata, verrà riprodotto completamente (per impostazione predefinita, Mithril non esegue il rendering dei componenti quando si passa da una pagina all'altra se entrambi sono gestiti dallo stesso componente). - -### Usare i Route Resolvers - -Ci sono in realtà 3 modi per impostare il componente/route resolver durante la registrazione di un nuovo percorso: - -- la chiave `resolver` può essere usata per fornire un ** istanza ** di un risolutore di percorsi. Questa istanza dovrebbe definire quale componente deve essere utilizzato e codificare il nome del percorso da passare al suo interno. Questa istanza verrà utilizzata senza alcuna modifica da Flarum. -- Le chiavi `resolverClass` e `component` possono essere usate per fornire una ** classe ** che sarà utilizzata per istanziare un risolutore di percorsi, da usare al posto di quella predefinita di Flarum, così come il componente da usare. Il suo costrutto dovrebbe avere 2 argomenti: `(component, routeName)`. -- La chiave `component` può essere usata da sola per un componente. Ciò comporterà un comportamento predefinito. - -Per esempio: - -```js -//Guarda in alto per le pagine personalizzate -import CustomPage from './components/CustomPage'; -// Guarda in basso per i resolver personalizzati di esempio -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Usa un route resolver -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Utilizza un resolver personalizzato -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Usa la classe di default (`flarum/common/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -### Resolver Personalizzati - -Consigliamo vivamente di estendere i risolutori di percorsi personalizzati `flarum/resolvers/DefaultResolver`. Per esempio, Flarum `flarum/resolvers/DiscussionPageResolver` assegna la stessa chiave a tutti i collegamenti alla stessa discussione (indipendentemente dal post corrente) e attiva lo scorrimento quando si utilizza `m.route.set` per passare da un post all'altro nella stessa pagina di discussione: - -```js -import DefaultResolver from '../../common/resolvers/DefaultResolver'; - -/** - * Non viene esportato in quanto si tratta di una misura temporanea. - * Un sistema più robusto verrà implementato insieme al supporto UTF-8 nella beta 15. - */ -function getDiscussionIdFromSlug(slug: string | undefined) { - if (!slug) return; - return slug.split('-')[0]; -} - -/** - * Un risolutore di percorsi personalizzato per DiscussionPage che genera la stessa chiave per tutti i post - * nella stessa discussione. Attiva uno scorrimento quando si passa da un post all'altro - * nella stessa discussione. - */ -export default class DiscussionPageResolver extends DefaultResolver { - static scrollToPostNumber: number | null = null; - - makeKey() { - const params = { ...m.route.param() }; - if ('near' in params) { - delete params.near; - } - params.id = getDiscussionIdFromSlug(params.id); - return this.routeName.replace('.near', '') + JSON.stringify(params); - } - - onmatch(args, requestedPath, route) { - if (route.includes('/d/:id') && getDiscussionIdFromSlug(args.id) === getDiscussionIdFromSlug(m.route.param('id'))) { - DiscussionPageResolver.scrollToPostNumber = parseInt(args.near); - } - - return super.onmatch(args, requestedPath, route); - } - - render(vnode) { - if (DiscussionPageResolver.scrollToPostNumber !== null) { - const number = DiscussionPageResolver.scrollToPostNumber; - // Scroll after a timeout to avoid clashes with the render. - setTimeout(() => app.current.get('stream').goToNumber(number)); - DiscussionPageResolver.scrollToPostNumber = null; - } - - return super.render(vnode); - } -} -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/frontend.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/frontend.md deleted file mode 100644 index 9cc8aa444..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/frontend.md +++ /dev/null @@ -1,502 +0,0 @@ -# Sviluppo del Frontend - -Questa pagina descrive come apportare modifiche all'interfaccia utente di Flarum. Come aggiungere pulsanti, cornici e testo lampeggiante. 🤩 - -[Ricorda](/extend/start.md#architecture), Il frontend di Flarum � un ** applicazione JavaScript a pagina singola **. Non ci sono Twig, Blade o qualsiasi altro tipo di modelli PHP di cui parlare. I pochi modelli presenti nel back-end vengono utilizzati solo per il rendering di contenuto ottimizzato per i motori di ricerca. Tutte le modifiche all'interfaccia utente devono essere apportate tramite JavaScript. - -Flarum ha due applicazioni frontend separate: - -* `forum`, la parte pubblica del forum in cui gli utenti creano discussioni e post. -* `admin`, il lato privato del tuo forum dove, come amministratore del tuo forum, configuri la tua installazione di Flarum. - -Condividono lo stesso codice di base, quindi una volta che sai come estenderne uno, sai come estenderli entrambi. - -:::tip Typings! - -Insieme al nuovo supporto TypeScript, abbiamo un pacchetto [`tsconfig`](https://www.npmjs.com/package/flarum-tsconfig) disponibile, che si dovrebbe installare come dipendenza per ottenere accesso ai nostri typings durante lo sviluppo. Assicurati di seguire le istruzioni contenute nel README del pacchetto - - per configurare il supporto ai typings. - -::: - - - -## Struttura dei File - -Questa parte della guida spiegher� la configurazione dei file necessaria per le estensioni. Ancora una volta, consigliamo vivamente di utilizzare [FoF extension generator (non ufficiale)](https://github.com/FriendsOfFlarum/extension-generator) per impostare la struttura di base per te. Detto questo, dovresti comunque leggere questa guida per capire cosa accade sotto la superficie. - -Prima di poter scrivere qualsiasi JavaScript, dobbiamo impostare un **transpiler**. Questo ti permetter� di utilizzare [TypeScript](https://www.typescriptlang.org/) e la sua magia nel nucleo e nelle estensioni di Flarum. - -Per fare ci�, devi lavorare in un ambiente adatto. No, non il tipo di ambiente di casa/ufficio - puoi lavorare in bagno per quel che ci importa! Stiamo parlando degli strumenti installati sul tuo sistema. Avrai bisogno: - -* Node.js e npm ([Download](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) - -Questo pu� essere complicato perch� il sistema di ognuno � diverso. Dal sistema operativo che stai utilizzando, alle versioni del programma che hai installato, alle autorizzazioni di accesso dell'utente – Ci vengono i brividi solo a pensarci! Se incappi nei guai, ~~ti salutiamo~~ usa [Google](https://google.com) per vedere se qualcuno ha riscontrato il tuo stesso errore e ha trovato una soluzione. In caso contrario, chiedi aiuto nel [Forum di Flarum](https://flarumit.it) o su [Discord chat](https://flarum.org/discord/). - -� ora di impostare il nostro piccolo progetto di traspilazione JavaScript. Crea una nuova cartella nella tua estensione chiamata `js`, quindi inserisci un paio di nuovi file. Una tipica estensione avr� la seguente struttura di frontend: - - - -``` -js -├── dist (compiled js is placed here) -├── src -│ ├── admin -│ └── forum -├── admin.js -├── forum.js -├── package.json -└── webpack.config.json -``` - - - - -### package.json - - - -```json -{ - "private": true, - "name": "@acme/flarum-hello-world", - "dependencies": { - "flarum-webpack-config": "0.1.0-beta.10", - "webpack": "^4.0.0", - "webpack-cli": "^3.0.7" - }, - "scripts": { - "dev": "webpack --mode development --watch", - "build": "webpack --mode production" - } -} -``` - - -Questo � un [pacchetto](https://docs.npmjs.com/files/package.json) standard di JS, usato da npm e Yarn (Gestori di pacchetto javascript). Puoi usarlo per aggiungere comandi, dipendenze js e metadati del pacchetto. In realt� non stiamo pubblicando un pacchetto npm: questo � semplicemente usato per raccogliere le dipendenze. - -Si prega di notare che non � necessario includere `flarum/core` o qualsiasi estensione flarum come dipendenze: verranno automaticamente pacchettizzate quando Flarum compila i frontend per tutte le estensioni. - - - -### webpack.config.js - - - -```js -const config = require('flarum-webpack-config'); - -module.exports = config(); -``` - - -[Webpack](https://webpack.js.org/concepts/) � il sistema che effettivamente compila e raggruppa tutto il javascript (e le sue dipendenze) per la nostra estensione. Per funzionare correttamente, le nostre estensioni dovrebbero utilizzare il [Webpack ufficiale di configurazione Flarum](https://github.com/flarum/flarum-webpack-config) (mostrato nell'esempio sopra). - - - -### admin.js e forum.js - - - -```json -{ - // Usa il tsconfig di Flarum come punto di partenza - "extends": "flarum-tsconfig", - // Questo corrisponderà a tutti . s, .tsx, .d.ts, .js, . file sx nella tua cartella `src` - // e dice anche al tuo server Typescript di leggere i typings globali del core per - // l'accesso a `dayjs` e `$` nel namespace globale. - "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"], - "compilerOptions": { - // This will output typings to `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] - } - } -} -``` - - -Questo è una configurazione standard per abilitare il supporto aTypescript con le opzioni di cui Flarum ha bisogno. - -Assicurati sempre di usare l'ultima versione del file: https://github.com/flarum/flarum-tsconfig#readme. - -Di seguito esamineremo gli strumenti disponibili per le estensioni. - -Per far funzionare i typings, dovrai eseguire `composer update` nella cartella delle tue estensioni per scaricare l'ultima copia del core di Flarum in una nuova cartella `vendor`. Ricordati di non eseguire il commit di questa cartella se stai usando un sistema come Git. - -Potrebbe essere necessario anche riavviare il server TypeScript dell'IDE. In Visual Studio Code, è possibile premere F1, quindi digitare "Riavvia TypeScript Server" e premere INVIO. Potrebbe richiedere qualche minuto per il suo completamento. - - - -### admin.js e forum.js - -Questi file contengono la radice del nostro JS di frontend effettivo. Potresti mettere qui l'intera estensione, ma non sarebbe ben organizzata. Per questo motivo, consigliamo di inserire il codice sorgente attuale in `src`, e avendo questi file solo esportare il contenuto di `src`. Per esempio: - - - -```js -// admin.js -export * from './src/admin'; - -// forum.js -export * from './src/forum'; -``` - - - - -### src - -Se si seguono le raccomandazioni per `admin.js` e `forum.js`, dovremmo avere 2 sottocartelle: una per il codice frontend di `admin`, ed una per il frontend fi `forum`. Se disponi di componenti, modelli, utilit� o altro codice condiviso tra entrambi i frontend, potresti voler creare un file `common` in una sottocartella. - -La struttura per `admin` e `forum` � identica, vi mostriamo quella di `forum` qui: - - - -``` -src/forum/ -├── components/ -|-- models/ -├── utils/ -└── index.js -``` - - -`components`, `models`, e `utils` sono directory che contengono file in cui � possibile definire [componenti personalizzati](#components), [modelli](data.md#frontend-models), e funzioni utili riutilizzabili. Tieni presente che questo � semplicemente un consiglio: non c'� nulla che ti costringa a utilizzare questa particolare struttura di file (o qualsiasi altra struttura di file). - -Il file pi� importante qui � `index.js`: tutto il resto � solo l'estrazione di classi e funzioni nei propri file. Esaminiamo un tipico `index.js`: - - - -```js -import {extend, override} from 'flarum/extend'; - -// We provide our extension code in the form of an "initializer". -// Questa è una callback che verrà eseguita dopo che il core è stato avviato. -app.initializers.add('our-extension', function(app) { - // Your Extension Code Here - console.log("EXTENSION NAME is working!"); -}); -``` - - -Vedremo gli strumenti disponibili per le estensioni qui sotto. - - - -### Transpilazione - -:::tip Librerie esterne - -Praticamente ogni estensione Flarum dovr� importare * qualcosa * da Flarum Core. Come la maggior parte delle estensioni, il codice sorgente JS di core � suddiviso in cartelle `admin`, `common`, e `forum`. Tuttavia, viene esportato tutto in `flarum`. Per elaborare: - -In alcuni casi, un'estensione potrebbe voler estendere il codice da un'altra estensione flarum. Questo � possibile solo per le estensioni che esportano esplicitamente il loro contenuto. - -* `flarum/tags` e `flarum/flags` sono attualmente le uniche estensioni in bundle che consentono di estendere il proprio JS. Puoi importare i loro contenuti da `flarum/{EXT_NAME}/PATH` (es. `flarum/tags/components/TagHero`). -* Il processo per estendere i plugin della community è diverso; è necessario consultare la documentazione per ogni singola estensione. - - - -### Transpilazione - -OK, � ora di accendere il transpiler. Esegui i seguenti comandi nella directory `js`: - - - -```bash -npm install -npm run dev -``` - - -Questo compilerà il tuo codice JavaScript pronto per il browser nel file `js/dist/forum.js`, e continuerà a compilarne le modifiche ai file di origine in tempo reale. Carino! - -Quando hai finito di sviluppare la tua estensione (o prima di una nuova versione), ti consigliamo di eseguire `npm run build` invece di `npm run dev`: questo crea l'estensione in modalità di produzione, che renderà il codice sorgente più snello e più veloce. - - - -## Registrazione Asset - - - -### JavaScript - -Affinché il JavaScript della tua estensione possa essere caricato nel frontend, dobbiamo dire a Flarum dove trovarlo. Possiamo farlo usando l'extender `Frontend` e metodo `js`. Aggiungilo alla tua estensione nel file `extend.php`: - - - -```php -js(__DIR__.'/js/dist/forum.js') -]; -``` - - -Flarum renderà tutto ciò che esporti con `export` da `forum.js` disponibile nell'oggetto `flarum.extensions['acme-hello-world']`. Inoltre, puoi scegliere di esporre la tua API pubblica per consentire ad altre estensioni di interagire. - -:::tip Librerie Esterne - -È consentito solo un file JavaScript principale per estensione. Se è necessario includere una libreria JavaScript esterna, è possibile sia installarla con NPM e `import` in modo che siano compilati nel tuo file JavaScript, o vedi [Percorsi e Contenuti](/extend/routes.md) per imparare ad aggiungere tag aggiuntivi `'; - }) -]; -``` - -You can also add content onto your frontend route registrations: - -```php -return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) -]; -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/search.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/search.md deleted file mode 100644 index 3872f2975..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/search.md +++ /dev/null @@ -1,202 +0,0 @@ -# Cerca - -Flarum tratta la ricerca e il filtraggio come processi paralleli ma distinti. Quale processo viene utilizzato per gestire una richiesta a [`List` API endpoint](/extend/api.md#api-endpoints) dipende dai parametri della query: - -- Il filtro viene applicato quando il parametro della query `filter[q]` viene omesso. I filtri rappresentano **query strutturate**: per esempio, potresti voler recuperare solo le discussioni in una determinata categoria, o gli utenti che si sono registrati prima di una certa data. Filtrando i risultati dei calcoli basati interamente sui parametri `filter[KEY] = VALORE` query. -- La ricerca viene applicata quando il `filter[q]` query param è incluso. Le ricerche rappresentano **query non strutturate** : l'utente invia una stringa arbitraria e i record di dati che "corrispondono" sono restituiti. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Ricerca dei risultati dei calcoli basata esclusivamente sull'analisi del parametro `filter[q]`: tutti gli altri `filter[KEY] = VALUE` vengono ignorati durante la ricerca. È importante notare che le ricerche non sono completamente strutturate: il set di dati ricercato può essere vincolato dai gambits (che sono molto simili ai filtri, e li vedremo più avanti). - -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. - -Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. - -One key advantage of this split is that it allows searching to be implemented via an external service, such as ElasticSearch. For larger communities, this can be significantly more performant and accurate. There isn't a dedicated extender for this yet, so for now, replacing the default Flarum search driver requires overriding the container bindings of `Searcher` classes. This is a highly advanced use case; if you're interested in doing this, please reach out on our [community forums](https://discuss.flarum.org/). - -Remember that the [JSON:API schema](https://jsonapi.org/format) is used for all API requests. - -:::tip Reuse Code - -Often, you might want to use the same class as both a `Filter` and a `Gambit` (both explained below). Your classes can implement both interface; see Flarum core's [`UnreadFilterGambit`](https://github.com/flarum/framework/blob/main/framework/core/src/Discussion/Query/UnreadFilterGambit.php) for an example. - -::: - -:::tip Query Builder vs Eloquent Builder - -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps - -::: - -## Filtering - -Filtering constrains queries based on `Filters` (highlighted in code to avoid confusion with the process of filtering), which are classes that implement `Flarum\Filter\FilterInterface` and run depending on query parameters. After filtering is complete, a set of callbacks called "filter mutators" run for every filter request. - -When the `filter` method on a `Filterer` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Filter/AbstractFilterer.php#L50-L93)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Filterer` class's `getQuery()` method. -2. We loop through all `filter[KEY] = VALUE` query params. For each of these, any `Filter`s registered to the model whose `getFilterKey()` method matches the query param `KEY` is applied. `Filter`s can be negated by providing the query param as `filter[-KEY] = VALUE`. Whether or not a `Filter` is negated is passed to it as an argument: implementing negation is up to the `Filter`s. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "filter mutators" are applied. These are callbacks that receive the filter state (a wrapper around the query builder and current user) and filter criteria, and perform some arbitrary changes. All "filter mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Filtering for an Existing Model - -Let's say you've added a `country` column to the User model, and would like to filter users by country. We'll need to define a custom `Filter`: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -Note that `FilterState` is a wrapper around the Eloquent builder's underlying Query builder and the current user. - -Also, let's pretend that for some reason, we want to omit any users that have a different country from the current user on ANY filter. We can use a "filter mutator" for this: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -Now, all we need to do is register these via the Filter extender: - -```php - // Other extenders - (new Extend\Filter(UserFilterer::class)) - ->addFilter(CountryFilter::class) - ->addFilterMutator(OnlySameCountryFilterMutator::class), - // Other extenders -``` - -### Add Filtering to a New Model - -To filter a model that doesn't support filtering, you'll need to create a subclass of `Flarum/Filter/AbstractFilterer` for that model. For an example, see core's [UserFilterer](https://github.com/flarum/framework/blob/main/framework/core/src/User/Filter/UserFilterer.php). - -Then, you'll need to use that filterer in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -## Searching - -Searching constrains queries by applying `Gambit`s, which are classes that implement `Flarum\Search\GambitInterface`, based on the `filter[q]` query param. After searching is complete, a set of callbacks called "search mutators" run for every search request. - -When the `search` method on a `Searcher` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Search/AbstractSearcher.php#L55-L79)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Searcher` class's `getQuery()` method. -2. The `filter[q]` param is split by spaces into "tokens". Each token is matched against the model's registered `Gambit`s (each gambit has a `match` method). For any tokens that match a gambit, that gambit is applied, and the token is removed from the query string. Once all regular `Gambit`s have ran, all remaining unmatched tokens are passed to the model's `FullTextGambit`, which implements the actual searching logic. For example if searching discussions, in the `filter[q]` string `'author:1 hello is:hidden' world`, `author:1` and `is:hidden` would get matched by core's Author and Hidden gambits, and `'hello world'` (the remaining tokens) would be passed to the `DiscussionFulltextGambit`. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "search mutators" are applied. These are callbacks that receive the search state (a wrapper around the query builder and current user) and criteria, and perform some arbitrary changes. All "search mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Searching for an Existing Model - -Let's reuse the "country" examples we used above, and see how we'd implement the same things for searching: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -:::warning No Spaces in Gambit Patterns! - -Flarum splits the `filter[q]` string into tokens by splitting it at spaces. This means that your custom gambits can NOT use spaces as part of their pattern. - -::: - -:::tip AbstractRegexGambit - -All a gambit needs to do is implement `Flarum\Search\GambitInterface`, which receives the search state and a token. It should return if this gambit applies for the given token, and if so, make whatever mutations are necessary to the query builder accessible as `$searchState->getQuery()`. - -However, for most gambits, the `AbstractRegexGambit` abstract class (used above) should be used as a base class. This makes it a lot simpler to match and apply gambits. - -::: - -Similarly, the search mutator we need is almost identical to the filter mutator from before: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -We can register these via the `SimpleFlarumSearch` extender (in the future, the `Search` extender will be used for registering custom search drivers): - -```php - // Other extenders - (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(CountryGambit::class) - ->addSearchMutator(OnlySameCountrySearchMutator::class), - // Other extenders -``` - -### Add Searching to a New Model - -To support searching for a model, you'll need to create a subclass of `Flarum/Search/AbstractSearcher` for that model. For an example, see core's [UserSearcher](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/UserSearcher.php). - -Then, you'll need to use that searcher in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -Every searcher **must** have a fulltext gambit (the logic that actually does the searching). Otherwise, it won't be booted by Flarum, and you'll get an error. See core's [FulltextGambit for users](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/Gambit/FulltextGambit.php) for an example. You can set (or override) the full text gambit for a searcher via the `SimpleFlarumSearch` extender's `setFullTextGambit()` method. - -### Search Drivers - -Coming soon! - -## Frontend Tools - -Coming soon! diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/service-provider.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/service-provider.md deleted file mode 100644 index 7d8590174..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/service-provider.md +++ /dev/null @@ -1,65 +0,0 @@ -# Provider di servizi - -Come notato in questa documentazione, Flarum utilizza [il contenitore dei servizi Laravel](https://laravel.com/docs/6.x/container) (o IoC container) per l'iniezione di dipendenze. [I provider di servizi](https://laravel.com/docs/6.x/providers) consentono la configurazione e la modifica del backend Flarum a basso livello. Il caso d'uso più comune per i provider di servizi è creare, modificare o sostituire i binding del contenitore. Detto questo, i provider di servizi consentono l'accesso completo per eseguire qualsiasi logica necessaria durante l'avvio dell'applicazione con accesso al contenitore. - -:::caution Solo per utenti avanzati!!! - -A differenza di altri estensori, il livello del provider di servizi NON è basato sul caso d'uso e NON è considerato API pubblica. È soggetto a modifiche in qualsiasi momento, senza preavviso. E dovrebbe essere usato solo se sai cosa stai facendo e gli altri extender non soddisfano il tuo caso d'uso. - -::: - -## Processi di Boot di Flarum - -Per comprendere i provider di servizi, devi prima capire l'ordine in cui Flarum si avvia. Most of this happens in [Flarum\Foundation\InstalledSite](https://github.com/flarum/framework/blob/main/framework/core/src/Foundation/InstalledSite.php) - -1. Il contenitore e l'applicazione vengono inizializzati e vengono registrati i collegamenti essenziali (configurazione, ambiente, logger) -2. Il metodo `register` di tutti i principali provider di servizi viene eseguito. -3. Il metodo `extend`di tutti gli extender utilizzati dalle estensioni sono avviati. -4. Il metodo `extend` di tutti gli extender utilizzati nel file Flarum `extend.php` è avviato. -5. Il metodo `boot` di tutti i provider di servizi principali è avviato. - -## Provider di servizi personalizzato - -Un provider di servizi personalizzato dovrebbe estendersi in `Flarum\Foundation\AbstractServiceProvider`, e può avere metodi `boot` e `register`. Per esempio: - -```php -container->resolving(SomeClass::class, function ($container) { - return new SomeClass($container->make('some.binding')); - }); - } - - public function boot(Container $container) - { - // custom logic here - } -} -``` - -Il metodo `register` verrà eseguito durante il passaggio (3) qui sopra, e il metodo `boot` verrà eseguito durante la fase (5). In entrambi i metodi, il contenitore è disponibile tramite `$this->app`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. - -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane) for more information. - -Per registrare effettivamente il tuo provider di servizi personalizzato, puoi utilizzare l'extender `ServiceProvider` in `extend.php`: - -```php -register(CustomServiceProvider::class), - // Other extenders -]; -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/settings.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/settings.md deleted file mode 100644 index a8e15e917..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/settings.md +++ /dev/null @@ -1,90 +0,0 @@ -# Impostazioni - -Ad un certo punto durante la creazione di un'estensione, potresti voler leggere alcune delle impostazioni del forum o memorizzare determinate impostazioni specifiche per la tua estensione. Per fortuna, Flarum lo rende molto semplice. - -## La repository Impostazioni - -La lettura o la modifica delle impostazioni può essere eseguita utilizzando un'implementazione di `SettingsRepositoryInterface`. Invece, puoi fare affidamento sul contenitore per istanziare la tua classe e inserire le dipendenze corrette. Poichè Flarum utilizza [il contenitore di servizi di Laravel](https://laravel.com/docs/6.x/container) (o IoC container)per l'inserimento di dipendenze, non è necessario preoccuparsi di dove ottenere tale repository o di come istanziarne una. - -```php -settings = $settings; - } -} -``` - -Grande! Perfetto, ora `SettingsRepositoryInterface` è disponibile tramite la classe `$this->settings`. - -### Leggere le impostazioni - -Per leggere le impostazioni, tutto ciò che dobbiamo fare è utilizzare la funzione della repository `get()`: - -`$this->settings->get('forum_title')` - -La funzione `get()` accetta i seguenti argomenti: - -1. Il nome dell'impostazione che stai tentando di leggere. -2. (Facoltativo) Un valore predefinito se non è stato memorizzato alcun valore per tale impostazione. Per impostazione predefinita, questo sarà `null`. - -### Memorizzazione delle impostazioni - -Memorizzare le impostazioni è altrettanto facile, usa la funzione `set()`: - -`$this->settings->set('forum_title', 'Super Awesome Forum')` - -La funzione `set` accetta i seguenti argomenti: - -1. Il nome dell'impostazione che stai tentando di modificare. -2. Il valore che desideri memorizzare per questa impostazione. - -### Altre funzioni - -La funzione `all()` restituisce un array di tutte le impostazioni conosciute. - -La funzione `delete($name)` ti consente di rimuovere un'impostazione con nome. - -## Impostazioni nel frontend - -### Modifica delle impostazioni - -Per ulteriori informazioni sulla gestione delle impostazioni tramite la dashboard dell'amministratore, consultare la [documentazione pertinente](admin.md). -### Accesso alle impostazioni - -Tutte le impostazioni sono disponibili nel frontend `admin` tramite `app.data.settings`. Tuttavia, questo non viene mostrato nel frontend `forum`, poiché chiunque può accedervi e non vorrai perdere tutte le tue impostazioni! (Scherzi a parte, potrebbe essere una violazione dei dati molto problematica). - -Se invece vogliamo utilizzare le impostazioni nel frontend `forum`, dovremo serializzarli e inviarli insieme al payload iniziale dei dati del forum. - -Questo può essere fatto tramite l'extender `Settings`. Per esempio: - -**extend.php** - -```php -use Flarum\Extend; - -return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }), -] -``` - -Ora, l'impostazione `my.cool.setting.key` sarà disponibile nel frontend come `app.forum.attribute("myCoolSetting")`, e il nostro valore modificato sarà accessibile tramite `app.forum.attribute("myCoolSettingModified")`. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/slugging.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/slugging.md deleted file mode 100644 index 288dc9269..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/slugging.md +++ /dev/null @@ -1 +0,0 @@ -# Modello Slugging diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/start.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/start.md deleted file mode 100644 index ce22a2d9d..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/start.md +++ /dev/null @@ -1,153 +0,0 @@ -# Iniziare - -Vuoi costruire un'estensione Flarum? Sei nel posto giusto! Questo documento ti guider� attraverso alcuni concetti essenziali, dopodich� costruirai la tua prima estensione Flarum da zero. - -## Architettura - -Per capire come estendere Flarum, prima dobbiamo capire un po' come � costruito Flarum. - -Tieni presente che Flarum utilizza alcuni linguaggi e strumenti _moderni_. Se hai mai creato solo plugin per WordPress prima, potresti sentirti un po' fuori dal tuo ambiente! Va bene, questo � un ottimo momento per imparare cose nuove e interessanti ed estendere le tue abilit�. Tuttavia, ti consigliamo di acquisire familiarit� con le tecnologie descritte di seguito prima di procedere. - -Flarum � composto da tre strati: - -* Primo, c'� il ** backend **. Questo � scritto in formato [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), e fa uso di un'ampia gamma di array e componenti [Laravel](https://laravel.com/) e pacchetti tramite [Composer](https://getcomposer.org/). Ti consigliamo anche di familiarizzare con il concetto di [iniezione dipendenze](https://laravel.com/docs/6.x/container), che viene utilizzato in tutto il nostro backend. - -* Secondo, il backend espone una ** API pubblica ** che consente ai client frontend di interfacciarsi con i dati del tuo forum. Questo � costruito secondo il [specifiche JSON:API](https://jsonapi.org/). - -* Ed ultimo, c'� l'interfaccia web predefinita che chiamiamo ** frontend **. Questa � una [applicazione a pagina singola](https://en.wikipedia.org/wiki/Single-page_application) che utilizza le API. � costruito con un semplice framework simile a React chiamato [Mithril.js](https://mithril.js.org). - -Le estensioni dovranno spesso interagire con tutti e tre questi livelli per far accadere le cose. Ad esempio, se si desidera creare un'estensione che aggiunga campi personalizzati ai profili utente, � necessario aggiungere le strutture di database appropriate nel ** backend **, esporre tali dati nell '** API pubblica ** e quindi visualizzare e consentire agli utenti di modificarlo sul ** frontend **. - -Allora ... come estendiamo questi livelli? - -## Extender - -Per estendere Flarum, useremo un concetto chiamato ** extender **. Gli extender sono oggetti * dichiarativi * che descrivono in termini semplici gli obiettivi che stai cercando di raggiungere (come aggiungere un nuovo percorso al tuo forum o eseguire del codice quando � stata creata una nuova discussione). - -Ogni extender � diverso. Tuttavia, saranno sempre in qualche modo simili a questo: - -```php -// Register a JavaScript and a CSS file to be delivered with the forum frontend -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') -``` - -Creare prima un'istanza dell'extender, quindi chiamare i metodi su di essa per un'ulteriore configurazione. Tutti questi metodi restituiscono l'extender stesso, in modo da poter ottenere l'intera configurazione semplicemente concatenando le chiamate ai metodi. - -Per mantenere le cose coerenti, usiamo questo concetto di estensori sia nel backend (nel mondo PHP) che nel frontend (mondo JavaScript). _Tutto_ quello che fai nella tua estensione dovrebbe essere fatto tramite extender, perch� sono una ** garanzia ** che ti stiamo dando che una futura versione minore di Flarum non interromper� la tua estensione. - -All of the extenders currently available to you from Flarum's core can be found in the [`Extend` namespace](https://github.com/flarum/framework/blob/main/framework/core/src/Extend) [(PHP API documentation)](https://api.docs.flarum.org/php/master/flarum/extend) Extensions may also offer their [own extenders](extensibility.md#custom-extenders). - -## Ciao Mondo - -Vuoi vedere un extender in azione? Il file `extend.php` nella root della tua installazione di Flarum � il modo pi� semplice per registrare gli extender per il tuo sito. Dovrebbe restituire un array di oggetti extender. Aprilo e aggiungi quanto segue: - -```php -content(function (Document $document) { - $document->head[] = ''; - }) -]; -``` - -Ora visita il tuo forum per un saluto piacevole (anche se estremamente invadente). 👋 - -Per semplici personalizzazioni specifiche del sito come l'aggiunta di un po 'di CSS / JavaScript personalizzato o l'integrazione con il sistema di autenticazione del tuo sito, il file il file `extend.php` � praticamente perfetto. Ma a un certo punto, la tua personalizzazione potrebbe diventare troppo grande. Or maybe you have wanted to build an extension to share with the community from the get-go. � ora di costruire un'estensione! - -## Pacchetto estensione - -[Composer](https://getcomposer.org) � un gestore delle dipendenze per PHP. Consente alle applicazioni di inserire facilmente librerie di codice esterne e rende facile mantenerle aggiornate in modo che la sicurezza e le correzioni di bug vengano propagate rapidamente. - -A quanto pare, ogni estensione Flarum � anche un pacchetto Composer. Ci� significa che l'installazione di Flarum di qualcuno pu� "richiedere" una certa estensione e Composer la inserir� e la manterr� aggiornata. Bello no? - -Durante lo sviluppo, puoi lavorare sulle tue estensioni localmente e configurare un [repository di Composer](https://getcomposer.org/doc/05-repositories.md#path) per installare la tua copia locale. Crea una nuova cartella `packages` nella radice della tua installazione di Flarum, quindi esegui questo comando per dire a Composer che pu� trovare i pacchetti qui: - -```bash -composer config repositories.0 path "packages/*" -``` - -Ora iniziamo a costruire la nostra prima estensione. Crea una nuova cartella all'interno di quella `packages` per la tua estensione, chiamata `hello-world`. Vi inseriremo due file, `extend.php` e `composer.json`. Questi file sono il cuore e l'anima dell'estensione. - -### extend.php - -Il file `extend.php` � proprio come quello nella radice del tuo sito. Restituir� un array di oggetti extender che dicono a Flarum cosa vuoi fare. Per ora, spostati sull'extender `Frontend` fatto prima. - -### composer.json - -Dobbiamo parlare un po' a Composer del nostro pacchetto, e possiamo farlo creando un file `composer.json`: - -```json -{ - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.15 <0.1.0-beta.16" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } - } -} -``` - -* ** nome ** � il nome del pacchetto Composer nel formato `creatore/pacchetto`. - * Dovresti scegliere un nome fornitore che sia univoco, ad esempio il tuo nome utente GitHub. Ai fini di questo tutorial, supporremo che tu stia utilizzando `acme`come nome creatore. - * Dovresti aggiungere il prefisso `package` con `flarum-` per indicare che si tratta di un pacchetto specificamente destinato all'uso con Flarum. - -* **description ** � una breve descrizione composta da una frase che spiega ci� che fa l'estensione. - -* **type** DEVE essere impostato su `flarum-extension`. Ci� garantisce che quando qualcuno "richiede" la tua estensione, verr� identificato come tale. - -* **require** contiene un elenco delle dipendenze della tua estensione. - * Dovrai specificare la versione di Flarum con cui la tua estensione � compatibile qui. - * Questo � anche il posto dove elencare altre librerie Composer di cui il tuo codice ha bisogno per funzionare. - -* **autoload** dice a Composer dove trovare le classi della tua estensione. Il nome qui dovrebbe riflettere il fornitore delle estensioni e il nome del pacchetto in CamelCase. - -* **extra.flarum-extension** contiene alcune informazioni specifiche di Flarum, come il nome visualizzato dell'estensione e come dovrebbe apparire la sua icona. - * **title** � il nome visualizzato della tua estensione. - * **icon** � un oggetto che definisce l'icona della tua estensione. La propriet� ** name ** � un icona [Font Awesome](https://fontawesome.com/icons). Tutte le altre propriet� vengono utilizzate dall'attributo `style` per l'icona della tua estensione. - -Guarda la documentazione [schema di composer.json](https://getcomposer.org/doc/04-schema.md) documentation per informazioni su altre propriet� da aggiungere a `composer.json`. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -Usa [FoF extension generator](https://github.com/FriendsOfFlarum/extension-generator) per creare automaticamente lo scheletro della tua estensione -```bash -$ flarum-cli init -``` - -::: - -### Installare la tua estensione - -L'ultima cosa che dobbiamo fare per essere operativi � installare la tua estensione. Vai alla directory root della tua installazione Flarum ed esegui il seguente comando - -```bash -composer require acme/flarum-hello-world *@dev -``` - -Una volta fatto, vai avanti e avvia la pagina di amministrazione del tuo forum. - -*crank, ching, crunk* - -Oopl�! Ciao a te estensione Hello World! - -Stiamo facendo buoni progressi. Abbiamo imparato come impostare la nostra estensione e utilizzare gli estensori, il che apre molte porte. Continua a leggere per scoprire come estendere il frontend di Flarum. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md deleted file mode 100644 index 28e6c4aa7..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md +++ /dev/null @@ -1,86 +0,0 @@ -# Static Code Analysis - -Static code analysis is the process of analyzing the source code against a set of rules to find bugs, code smells, and security vulnerabilities. This is a great way to improve the quality of your code and to find potential issues before they are deployed to production. An example is validating the typings of a function to ensure that the function is called with the correct arguments. - -Flarum provides a static code analysis package based on [PHPStan](https://phpstan.org/) that can be added to your extension. In this guide, we will show you how to add the package to your extension and how to run the analysis. - -## Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update the infrastructure for phpstan to your code: - -```bash -$ flarum-cli infra phpstan -``` - -::: - -First you need to require the `flarum/phpstan` package in your extension. You can do this by running the following command in the root of our extension: - -```bash -composer require --dev flarum/phpstan:^1.0 -``` - -Next, you need to create a `phpstan.neon` file in the root of your extension. This file contains [the configuration for PHPStan](https://phpstan.org/config-reference). You can copy the following configuration into the file: - -```neon -includes: - - vendor/flarum/phpstan/extension.neon - -parameters: - # The level will be increased in Flarum 2.0 - level: 5 - paths: - - src - - extend.php - excludePaths: - - *.blade.php - checkMissingIterableValueType: false - databaseMigrationsPath: ['migrations'] -``` - -Finally, you need to add the following script to your `composer.json` file: - -```json -{ - "scripts": { - "analyse:phpstan": "phpstan analyse", - "clear-cache:phpstan": "phpstan clear-result-cache" - }, - "scripts-descriptions": { - "analyse:phpstan": "Run static analysis" - } -} -``` - -## Running the analysis - -To run the analysis, you can run the following command in the root of your extension: - -```bash -composer analyse:phpstan -``` - -If you want to clear the cache before running the analysis, you can run the following command: - -```bash -composer clear-cache:phpstan && composer analyse:phpstan -``` - -## GitHub Actions - -You can also run the analysis using GitHub Actions. Checkout the page on [GitHub Actions](github-actions.md) for more information. - -## Tips - -### Extended model attribute types - -PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. - -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. - -```php -(new Extend\Model(User::class)) - ->cast('is_cool', 'bool'), -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/testing.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/testing.md deleted file mode 100644 index 7b45a1f70..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/testing.md +++ /dev/null @@ -1,565 +0,0 @@ -# Test - -Automated testing ensures that your extension performs as you expect it to, helps avoid introducing new bugs or regressions, and saves time on manual testing. Flarum currently provides tooling for automated backend unit and integration tests, and we plan to release support for frontend unit testing and E2E testing in the future. - -## Backend Tests - -The `flarum/testing` library is used by core and some bundled extensions for automated unit and integration tests. It is essentially a collection of utils that allow testing Flarum core and extensions with PHPUnit. - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update backend testing infrastructure to your code: - -```bash -$ flarum-cli infra backendTesting -``` - -::: - -```bash -composer require --dev flarum/testing:^1.0 -``` - -Then, you will need to set up a file structure for tests, and add PHPUnit configuration: - -``` -tests -├── fixtures (put any files needed by your tests here (blade templates, images, etc)) -├── integration -│ ├── setup.php (code below) -│ └── PUT INTEGRATION TESTS HERE (organizing into folder is generally a good idea) -├── unit -│ ├── PUT UNIT TESTS HERE -├── phpunit.integration.xml (code below) -└── phpunit.unit.xml (code below) -``` - -#### phpunit.integration.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for integration tests. You can tweak this as needed, but keep `backupGlobals`, `backupStaticAttributes`, and `processIsolation` unchanged. - -```xml - - - - - - - ./integration - - - -``` - -#### phpunit.unit.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for unit tests. You can tweak this as needed. - -```xml - - - - - - - ./unit - - - - - - -``` - -#### setup.php - -This script will be run to set up a testing database / file structure. - -```php -run(); -``` - -#### composer.json Modifications - -We will also want to add scripts to our `composer.json`, so that we can run our test suite via `composer test`. Add some variant of the following to your `composer.json`: - -```json -"scripts": { - "test": [ - "@test:unit", - "@test:integration" - ], - "test:unit": "phpunit -c tests/phpunit.unit.xml", - "test:integration": "phpunit -c tests/phpunit.integration.xml", - "test:setup": "@php tests/integration/setup.php" -}, -"scripts-descriptions": { - "test": "Runs all tests.", - "test:unit": "Runs all unit tests.", - "test:integration": "Runs all integration tests.", - "test:setup": "Sets up a database for use with integration tests. Execute this only once." -} -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - ---- - -Now that we have everything in place, we need to set up our testing site for integration tests. For this, we will need a MySQL or MariaDb instance, and a place to store testing files. - -Testing database information is configured via the `DB_HOST` (defaults to `localhost`), `DB_PORT` (defaults to `3306`), `DB_DATABASE` (defaults to `flarum_test`), `DB_USERNAME` (defaults to `root`), `DB_PASSWORD` (defaults to `root`), and `DB_PREFIX` (defaults to `''`) environmental variables. The testing tmp directory path is configured via the `FLARUM_TEST_TMP_DIR_LOCAL` or `FLARUM_TEST_TMP_DIR` environmental variables, with the former taking precedence over the latter. If neither are provided, a `tmp` directory will be created in the `vendor` folder of your extension's local install. - -Now that we've provided the needed information, all we need to do is run `composer test:setup` in our extension's root directory, and we have our testing environment ready to go! - -Since [(almost)](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/tests/integration/api/discussions/ListWithFulltextSearchTest.php#L29-L45) all database operations in integration tests are run in transactions, developers working on multiple extensions will generally find it more convenient to use one shared database and tmp directory for testing all their extensions. To do this, set the database config and `FLARUM_TEST_TMP_DIR` environmental variables in your `.bashrc` or `.bash_profile` to the path you want to use, and run the setup script for any one extension (you'll still want to include the setup file in every repo for CI testing via GitHub Actions). You should then be good to go for any Flarum extension (or core). - -### Using Integration Tests - -Flarum's integration test utils are contained in the `Flarum\Testing\integration\TestCase` class. It: - -- Boots (and makes available) an instance of the Flarum application. -- Allows pre-populating the database, enabling extensions, and adding extenders. -- Runs all database changes in transactions, so your test database retains the default post-installation state. -- Allows sending requests through the middleware stack to test HTTP endpoints. - -Your testcase classes should extend this class. - -#### Test Case Setup - -There are several important utilities available for your test cases: - -- The `setting($key, $value)` method allows you to override settings before the app has booted. This is useful if your boot process has logic depending on settings (e.g. which driver to use for some system). -- Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. -- The `extension($extensionId)` method will take Flarum IDs of extensions to enable as arguments. Your extension should always call this with your extension's ID at the start of test cases, unless the goal of the test case in question is to confirm some behavior present without your extension, and compare that to behavior when your extension is enabled. If your extension is dependent on other extensions, make sure they are included in the composer.json `require` field (or `require-dev` for [optional dependencies](extending-extensions.md)), and also list their composer package names when calling `extension()`. Note that you must list them in a valid order. -- The `extend($extender)` method takes instances of extenders as arguments, and is useful for testing extenders introduced by your extension for other extensions to use. -- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/8.x/queries#insert-statements). - -If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. - -:::warning - -The `TestCase` class will boot a Flarum instance the first time its `app()` method is called. Any uses of `prepareDatabase`, `extend`, or `extension` after this happens will have no effect. Make sure you have done all the setup you need in your test case before calling `app()`, or `database()`, `server()`, or `send()`, which call `app()` implicitly. If you need to make database modifications after the app has booted, you can use the regular Eloquent save method, or the `Illuminate\Database\ConnectionInterface` instance obtained via calling the `database()` method. - -::: - -Of course, since this is all based on PHPUnit, you can use the `setUp()` methods of your test classes for common setup tasks. - -Per esempio: - -```php -setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. - ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] - ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '

something

'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - - // ... -} -``` - -#### Sending Requests - -A common application of automated testing is pinging various HTTP endpoints with various data, authenticated as different users. You can use this to ensure that: - -- Users can't access content they're not supported to access. -- Permission-based create/edit/delete operations perform as expected. -- The type and schema of data returned is correct. -- Some desired side effect is applied when pinging an API. -- The basic API operations needed by your extension aren't erroring, and don't break when you make changes. - -`TestCase` provides several utilities: - -- The `request()` method constructs a `Psr\Http\Message\ServerRequestInterface` implementing object from a path, a method, and some options, which can be used for authentication, attaching cookies, or configuring the JSON request body. See the [method docblock](https://github.com/flarum/testing/blob/main/src/integration/TestCase.php) for more information on available options. -- Once you've created a request instance, you can send it (and get a response object back) via the `send()` method. - -Per esempio: - -```php -send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - // ... -} -``` - -:::cautela - -If you want to send query parameters in a GET request, you can't include them in the path; you'll need to add them afterwards with the `withQueryParams` method. - -::: - -:::cautela - -This is an extreme edge case, but note that MySQL does not update the fulltext index in transactions, so the standard approach won't work if you're trying to test a modified fulltext query. See [core's approach](https://github.com/flarum/framework/blob/main/framework/core/tests/integration/extenders/SimpleFlarumSearchTest.php) for an example of a workaround. - -::: - -#### Console Tests - -If you want to test custom console commands, you can extend `Flarum\Testing\integration\ConsoleTestCase` (which itself extends the regular `Flarum\Testing\integration\TestCase`). It provides 2 useful methods: - -- `$this->console()` returns an instance of `Symfony\Component\Console\Application` -- `$this->runCommand()` takes an array that will be wrapped in `Symfony\Component\Console\Input\ArrayInput`, and run. See the [Symfony code docblock](https://github.com/symfony/console/blob/5.x/Input/ArrayInput.php#L22) for more information. - -Per esempio: - -```php - 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } -} -``` - -### Using Unit Tests - -Unit testing in Flarum uses [PHPUnit](https://phpunit.de/getting-started/phpunit-9.html) and so unit testing in flarum is much like any other PHP application. You can find [general tutorials on testing](https://www.youtube.com/watch?v=9-X_b_fxmRM) if you're also new to php. - -When writing unit tests in Flarum, here are some helpful tips. - -#### Mocking Flarum Services - -Unlike the running app, or even integration tests, there is no app/container/etc to inject service instances into our classes. Now all the useful settings, or helpers your extension use require a _mock_ . We want to limit mocking to just the key services, supporting only the minimum interactions needed to test the contract of our individual functions. - -```php - public function setUp(): void - { - parent::setUp(); - // example - if our setting needs settings, we can mock the settings repository - $settingsRepo = m::mock(SettingsRepositoryInterface::class); - // and then control specific return values for each setting key - $settingsRepo->shouldReceive('get')->with('some-plugin-key')->andReturn('some-value-useful-for-testing'); - // construct your class under test, passing mocked services as needed - $this->serializer = new YourClassUnderTest($settingsRepo); - } -``` - -Some aspects require more mocks. If you're validating authorization interactions for instance you might need to mock your users `User::class` and the request's method that provides them as well! - -``` - $this->actor = m::mock(User::class); - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('getAttribute->getActor')->andReturn($this->actor); - $this->actor->shouldReceive('SOME PERMISSION')->andReturn(true/false); -``` - -NOTE: If you find your extension needs _lots and lots_ of mocks, or mocks that feel unrelated, it might be an opportunity to simplify your code, perhaps moving key logic into their own smaller functions (that dont require mocks). - -## Frontend Tests - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update frontend testing infrastructure to your code: - -```bash -$ flarum-cli infra frontendTesting -``` - -::: - -First, you need to install the Jest config dev dependency: - -```bash -$ yarn add --dev @flarum/jest-config -``` - -Then, add the following to your `package.json`: - -```json -{ - "type": "module", - "scripts": { - ..., - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" - } -} -``` - -Rename `webpack.config.js` to `webpack.config.cjs`. This is necessary because Jest doesn't support ESM yet. - -Create a `jest.config.cjs` file in the root of your extension: - -```js -module.exports = require('@flarum/jest-config')(); -``` - -If you are using TypeScript, create tsconfig.test.json with the following content: - -```json -{ - "extends": "./tsconfig.json", - "include": ["tests/**/*"], - "files": ["../../../node_modules/@flarum/jest-config/shims.d.ts"] -} -``` - -Then, you will need to set up a file structure for tests: - -``` -js -├── dist -├── src -├── tests -│ ├── unit -│ │ └── functionTest.test.js -│ ├── integration -│ │ └── componentTest.test.js -├── package.json -├── tsconfig.json -├── tsconfig.test.json -├── jest.config.cjs -└── webpack.config.cjs -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - -### Using Unit Tests - -Like any other JS project, you can use Jest to write unit tests for your frontend code. Checkout the [Jest docs](https://jestjs.io/docs/using-matchers) for more information on how to write tests. - -Here's a simple example of a unit test fo core's `abbreviateNumber` function: - -```ts -import abbreviateNumber from '../../../../src/common/utils/abbreviateNumber'; - -test('does not change small numbers', () => { - expect(abbreviateNumber(1)).toBe('1'); -}); - -test('abbreviates large numbers', () => { - expect(abbreviateNumber(1000000)).toBe('1M'); - expect(abbreviateNumber(100500)).toBe('100.5K'); -}); - -test('abbreviates large numbers with decimal places', () => { - expect(abbreviateNumber(100500)).toBe('100.5K'); - expect(abbreviateNumber(13234)).toBe('13.2K'); -}); -``` - -### Using Integration Tests - -Integration tests are used to test the components of your frontend code and the interaction between different components. For example, you might test that a page component renders the correct content based on certain parameters. - -Here's a simple example of an integration test for core's `Alert` component: - -```ts -import Alert from '../../../../src/common/components/Alert'; -import m from 'mithril'; -import mq from 'mithril-query'; -import { jest } from '@jest/globals'; - -describe('Alert displays as expected', () => { - it('should display alert messages with an icon', () => { - const alert = mq(m(Alert, { type: 'error' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toHaveElement('i.icon'); - }); - - it('should display alert messages with a custom icon when using a title', () => { - const alert = mq(Alert, { type: 'error', icon: 'fas fa-users', title: 'Woops..' }); - expect(alert).toContainRaw('Woops..'); - expect(alert).toHaveElement('i.fas.fa-users'); - }); - - it('should display alert messages with a title', () => { - const alert = mq(m(Alert, { type: 'error', title: 'Error Title' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toContainRaw('Error Title'); - expect(alert).toHaveElement('.Alert-title'); - }); - - it('should display alert messages with custom controls', () => { - const alert = mq(Alert, { type: 'error', controls: [m('button', { className: 'Button--test' }, 'Click me!')] }); - expect(alert).toHaveElement('button.Button--test'); - }); -}); - -describe('Alert is dismissible', () => { - it('should show dismiss button', function () { - const alert = mq(m(Alert, { dismissible: true }, 'Shoot!')); - expect(alert).toHaveElement('button.Alert-dismiss'); - }); - - it('should call ondismiss when dismiss button is clicked', function () { - const ondismiss = jest.fn(); - const alert = mq(Alert, { dismissible: true, ondismiss }); - alert.click('.Alert-dismiss'); - expect(ondismiss).toHaveBeenCalled(); - }); - - it('should not be dismissible if not chosen', function () { - const alert = mq(Alert, { type: 'error', dismissible: false }); - expect(alert).not.toHaveElement('button.Alert-dismiss'); - }); -}); -``` - -#### Methods - -These are the custom methods that are available for mithril component tests: -* **`toHaveElement(selector)`** - Checks if the component has an element that matches the given selector. -* **`toContainRaw(content)`** - Checks if the component HTML contains the given content. - -To negate any of these methods, simply prefix them with `not.`. For example, `expect(alert).not.toHaveElement('button.Alert-dismiss');`. For more information, check out the [Jest docs](https://jestjs.io/docs/using-matchers). For example you may need to check how to [mock functions](https://jestjs.io/docs/mock-functions), or how to use `beforeEach` and `afterEach` to set up and tear down tests. - - - -## E2E Tests - -Coming Soon! diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/theme.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/theme.md deleted file mode 100644 index e03310559..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/theme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Guida rapida - -Flarum "themes" are just extensions. Typically, you'll want to use the `Frontend` extender to register custom [Less](https://lesscss.org/#overview) and JS. Of course, you can use other extenders too: for example, you might want to support settings to allow configuring your theme. - -You can indicate that your extension is a theme by setting the "extra.flarum-extension.category" key to "theme". Per esempio: - -```json -{ - // other fields - "extra": { - "flarum-extension": { - "category": "theme" - } - } - // other fields -} -``` - -All this will do is show your extension in the "theme" section in the admin dashboard extension list. - -## Less Variable Customization - -You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. - -## Switching Between Themes - -Flarum doesn't currently have a comprehensive system that would support switching between themes. This is planned for future releases. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/translate.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/translate.md deleted file mode 100644 index cc787c0f3..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/translate.md +++ /dev/null @@ -1,40 +0,0 @@ -# Tradurre Flarum - -### LanguagePack - -Come extender, [`LanguagePack`](https://github.com/flarum/core/blob/master/src/Extend/LanguagePack.php) ti consente di definire che la tua estensione è appunto un language pack. - -Tutto quello che devi fare è istanziarlo, e assicurarti che il tuo language pack sia nella cartella `locale`, e sei a posto! - -Ecco un esempio veloce dal pacchetto [Flarum English](https://github.com/flarum/lang-english/blob/master/extend.php): - -```php -translator->trans('some.translation', ['{username}' => 'Some Username!'])`). -- Non c'è supporto per applicazioni complesse (pluralizzazione nidificata, selezione non basata su numero) -- Come risultato del punto precedente, la genderizzazione è impossibile. E questo è importante per molte lingue. - -### Nuovo sistema - -In v5, Symfony ha abbandonato il suo sistema proprietario `transChoice` a favore dello standard [ICU MessageFormat](https://symfony.com/doc/5.2/translation/message_format.html). Questo risolve praticamente ogni singolo problema sopra menzionato. In questa versione, Flarum passerà completamente a ICU MessageFormat. Cosa significa questo per le estensioni? - -- `transChoice` non dovrebbe essere usato affatto; invece, la variabile passata per la pluralizzazione dovrebbe essere inclusa nei dati. -- Le chiavi per le traduzioni del backend non hanno più bisogno di essere circondate da parentesi graffe. -- Le traduzioni possono ora utilizzare le sintassi [`select` e `plural`](https://symfony.com/doc/5.2/translation/message_format.html). Per `plural`, sono supportati il parametro `offset` e le variabili `#`. -- Queste sintassi `select` e `plural` possono essere annidate. Questa è spesso una cattiva idea anche se (oltre, ad esempio, 2 livelli), in quanto le cose possono diventare inutilmente complesse. - -Non è necessario alcun cambiamento nella denominazione del file di traduzione (Symfony docs dice che è necessario un suffisso `+intl-icu`, ma Flarum interpreterà tutti i file di traduzione come internazionalizzati). - -#### Cambiamenti Futuri - -In futuro ciò servirà da base per ulteriori caratteristiche: - -- I preprocessori consentiranno alle estensioni di modificare gli argomenti passati alle traduzioni. Questo abiliterà la genderizzazione (le estensioni potrebbero estrarre automaticamente un campo di genere da qualsiasi oggetto di tipo "utente" passato). -- We could support internationalized "magic variables" for numbers: currently, `one` is supported, but others (`few`, `many`, etc) currently aren't. -- We could support ordinal formatting in additional to just plural formatting. - -#### Changes Needed in Extensions - -The `transChoice` methods in the frontend and backend have been removed. The `trans` method should always be used for translating, regardless of pluralization. If a translation requires pluralization, make sure you pass in the controlling variable as one of the arguments. - -In the frontend, code that looked like this: - -```js -app.translator.transChoice('some-translation', guestCount, {host: hostName}); -``` - -should be changed to: - -```js -// This uses ES6 key-property shorthand notation. {guestCount: guestCount} is equivalent to {guestCount} -app.translator.trans('some-translation', {host: hostName, guestCount }); -``` - -Similarly, in the backend, - -```php -$translator->transChoice('some-translation', $guestCount, ['{host}' => $hostName]); -``` - -should be changed to: - -```php -$translator->trans('some-translation', ['host' => $hostName, 'guestCount' => $guestCount]); -``` - -Note that in the backend, translation keys were previously wrapped in curly braces. This is no longer needed. - -#### Changes Needed in Translations - -Translations that aren't using pluralization don't need any changes. - -Pluralized translations should be changed as follows: - -`For {count} minute|For {count} minutes` - -to - -`{count, plural, one {For # minute} other {For # minutes}}` - -Note that in this example, `count` is the variable that controls pluralization. If a different variable were used (such as guestCount in the example above), this would look like: - -`{guestCount, plural, one {For # minute} other {For # minutes}}` - -See [our i18n docs](i18n.md) for more information. - -### Permissions Changes - -For a long time, the `viewDiscussions` and `viewUserList` permissions have been confusing. Despite their names: - -- `viewDiscussions` controls viewing both discussions and users. -- `viewUserList` controls searching users, not viewing user profiles. - -To clear this up, in v1.0, these permissions have been renamed to `viewForum` and `searchUsers` respectively. A migration in core will automatically adjust all permissions in the database to use the new naming. However, any extension code using the old name must switch to the new ones immediately to avoid security issues. To help the transfer, a warning will be thrown if the old permissions are referenced. - -We have also slightly improved tag scoping for permissions. Currently, permissions can be applied to tags if: - -- The permission is `viewForum` -- The permission is `startDiscussion` -- The permission starts with `discussion.` - -However, this doesn't work for namespaced permissions (`flarum-acme.discussion.bookmark`), or permissions that don't really have anything to do with discussions, but should still be scoped (e.g. `viewTag`). To counter this, a `tagScoped` attribute can be used on the object passed to [`registerPermission`](admin.md) to explicitly indicate whether the permission should be tag scopable. If this attribute is not provided, the current rules will be used to determine whether the permission should be tag scopable. - -## Frontend - -### Tooltip Changes - -The `flarum/common/components/Tooltip` component has been introduced as a simpler and less framework-dependent way to add tooltips. If your code is creating tooltips directly (e.g. via `$.tooltip()` in `oncreate` methods), you should wrap your components in the `Tooltip` component instead. Per esempio: - -```tsx - - - -``` - -See [the source code](https://github.com/flarum/core/blob/master/js/src/common/components/Tooltip.tsx) for more examples and instructions. - -See [the PR](https://github.com/flarum/core/pull/2843/files) for examples of how to change existing code to use tooltips. - -### PaginatedListState - -The `flarum/common/states/PaginatedListState` state class has been introduced to abstract away most of the logic of `DiscussionListState` and `NotificationListState`. It provides support for loading and displaying paginated lists of JSON:API resources (usually models). In future releases, we will also provide an `PaginatedList` (or `InfiniteScroll`) component that can be used as a base class for these paginated lists. - -Please see [the source code](https://github.com/flarum/core/blob/master/js/src/common/states/PaginatedListState.ts) for a list of methods. - -Note that `flarum/forum/states/DiscussionListState`'s `empty` and `hasDiscussions` methods have been removed, and replaced with `isEmpty` and `hasItems` respectively. Questo è un cambiamento decisivo. - -### New Loading Spinner - -The old `spin.js` based loading indicator has been replaced with a CSS-based solution. For the most part, no changes should be needed in extensions, but in some cases, you might need to update your spinner. This change also makes it easier to customize the spinner. - -See [this discussion](https://discuss.flarum.org/d/26994-beta16-using-the-new-loading-spinner) for more information. - -### classList util - -Ever wrote messy code trying to put together a list of classes for some component? Well, no longer! The [clsx library](https://www.npmjs.com/package/clsx) is now available as the `flarum/common/utils/classList` util. - -### User List - -An extensible user list has been added to the admin dashboard. In future releases, we hope to extract a generic model table component that can be used to list any model in the admin dashboard. - -See [the source code](https://github.com/flarum/core/blob/master/js/src/admin/components/UserListPage.tsx#L41) for a list of methods to extend, and examples of how columns should look like (can be added by extending the `columns` method and adding items to the [ItemList](frontend.md)). - -### Varie - -- Components should now call `super` for ALL Mithril lifecycle methods they define. Before, this was only needed for `oninit`, `onbeforeupdate`, and `oncreate`. Now, it is also needed in `onupdate`, `onbeforeremove`, and `onremove`. See [this GitHub issue](https://github.com/flarum/core/issues/2446) for information on why this change was made. -- The `flarum/common/utils/insertText` and `flarum/common/utils/styleSelectedText` utils have been moved to core from `flarum/markdown`. See `flarum/markdown` for an example of usage. -- The `extend` and `override` utils can now modify several methods at once by passing in an array of method names instead of a single method name string as the second argument. This is useful for extending the `oncreate` and `onupdate` methods at once. -- The `EditUserModal` component is no longer available through the `flarum/forum` namespace, it has been moved to `flarum/common`. Imports should be adjusted. -- The `Model` and `Route` JS extenders have been removed for now. There aren't currently used in any extensions that we know of. We will be reintroducing JS extenders during v1.x releases. -- The `Search` component can now be used with the `SearchState` state class. Previously, `SearchState` was missing the `getInitialSearch` method expected by the `Search` component. - -## Backend - -### Filesystem Extenders - -In this release, we refactored our use of the filesystem to more consistently use [Laravel's filesystem API](https://laravel.com/docs/8.x/filesystem). Extensions can now declare new disks, more easily use core's `flarum-assets` and `flarum-avatars` disks, and create their own storage drivers, enabling CDN and cloud storage support. - -### Compat and Closure Extenders - -In early Flarum versions, the `extend.php` file allowed arbitrary functions that allowed execution of arbitrary code one extension boot. Per esempio: - -```php -return [ - // other extenders - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - } -]; -``` - -This approach was difficult to maintain and provide a well-tested public API for, frequently resolved classes early (breaking all sorts of things), and was not very descriptive. With the extender API completed in beta 16, this approach is no longer necessary. Support for these closures has been removed in this stable version. - -One type of functionality for which the extender replacement isn't obvious is container bindings ([e.g. flarum/pusher](https://github.com/flarum/pusher/blob/v0.1.0-beta.14/extend.php#L33-L49)). This can be done with via the service provider extender (e.g. [a newer version of flarum/pusher](https://github.com/flarum/pusher/blob/master/extend.php#L40-L41)). - -If you are unsure about which extenders should be used to replace your use of callbacks in `extend.php`, or are not sure that such an extender exists, please comment so below or reach out! We're in the final stages of finishing up the extender API, so now is the time to comment. - -### Scheduled Commands - -The [fof/console](https://github.com/FriendsOfFlarum/console) library has been a popular way to schedule commands (e.g. for publishing scheduled posts, running DB-heavy operations, etc) for several release. In Flarum 1.0, this functionality has been brought into core's `Console` extender. See our [console extension documentation](console.md) for more information on how to create schedule commands, and our [console user documentation](../console.md) for more information on how to run scheduled commands. - -### Eager Loading Extender - -As part of solving [N+1 Query issues](https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/) in some [Flarum API endpoints](https://github.com/flarum/core/issues/2637), we have introduced a `load` method on the `ApiController` extender that allows you to indicate relations that should be eager loaded. - -This should be done if you know a relation will always be included, or will always be referenced by controller / permission logic. For example, we will always need the tags of a discussion to check what permissions a user has on that discussion, so we should eager load the discussion's `tags` relationship. Per esempio: - -```php -return [ - // other extenders - (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) - ->addInclude(['tags', 'tags.state', 'tags.parent']) - ->load('tags'), -]; -``` - -### RequestUtil - -The `Flarum\Http\RequestUtil`'s `getActor` and `withActor` should be used for getting/setting the actor (user) on requests. `$request->getAttribute('actor')` and `$request->withAttribute('actor')` are deprecated, and will be removed in v2.0. - -### Varie - -- The `Formatter` extender now has an `unparse` method that allows modifying XML before unparsing content. -- All route names must now be unique. In beta 16, uniqueness was enforced per-method; now, it is mandatory for all routes. -- API requests sent through `Flarum\Api\Client` now run through middleware, including `ThrottleApi`. This means that it is now possible to throttle login/registration calls. -- In beta 16, registering custom [searchers](search.md) was broken. It has been fixed in stable. -- The `post_likes` table in the [flarum/likes](https://github.com/flarum/likes) extension now logs the timestamp when likes were created. This isn't used in the extension, but could be used in other extensions for analytics. -- The `help` attribute of [admin settings](admin.md) no longer disappears on click. -- The `generate:migration` console command has been removed. The [Flarum CLI](https://discuss.flarum.org/d/26525-rfc-flarum-cli-alpha) should be used instead. -- The `GambitManager` util class is now considered internal API, and should not be used directly by extensions. -- The `session` attribute is no longer available on the `User` class. This caused issues with queue drivers, and was not conceptually correct (a user can have multiple sessions). The current session is still available via the `$request` instance. -- The `app`, `base_path`, `public_path`, `storage_path`, and `event` global helpers have been restored, but deprecated perpetually. These exist in case Laravel packages need them; they **should not** be used directly by Flarum extension code. The `flarum/laravel-helpers` package has been abandoned. -- The following deprecated features from beta 16 have been removed: - - The `TextEditor`, `TextEditorButton`, and `SuperTextarea` components are no longer exported through the `flarum/forum` namespace, but through `flarum/common` (with the exception of `SuperTextarea`, which has been replaced with `flarum/common/utils/BasicEditorDriver`). - - Support for `Symfony\Component\Translation\TranslatorInterface` has been removed, `Symfony\Contracts\Translation\TranslatorInterface` should be used instead. - - All backwards compatibility layers for the [beta 16 access token refactors](update-b16.md#access-token-and-authentication-changes) have been removed - - The `GetModelIsPrivate` event has been removed. The `ModelPrivate` extender should be used instead. - - The `Searching` (for both `User` and `Discussion` models), `ConfigureAbstractGambits`, `ConfigureDiscussionGambits`, and `ConfigureUserGambits` events have been removed. The `SimpleFlarumSearch` extender should be used instead. - - The `ConfigurePostsQuery` event has been removed. The `Filter` extender should be used instead. - - The `ApiSerializer` extender's `mutate` method has been removed. The same class's `attributes` method should be used instead. - - The `SearchCriteria` and `SearchResults` util classes have been removed. `Flarum\Query\QueryCriteria` and `Flarum\Query\QueryResults` should be used instead. - - The `pattern` property of `AbstractRegexGambit` has been removed; the `getGambitPattern` method is now a required abstract method. - - The `AbstractSearch` util class has been removed. `Flarum\Search\SearchState` and `Flarum\Filter\FilterState` should be used instead. - - The `CheckingPassword` event has been removed, the `Auth` extender should be used instead. - -## Tags Extension Changes - -As mentioned above, [tag scopable permissions](#permissions-changes) can now be explicitly declared. - -We've also made several big refactors to significantly improve tags performance. - -Firstly, the [Tag](https://github.com/flarum/tags/blob/d093ca777ba81f826157522c96680717d3a90e24/src/Tag.php#L38-L38) model's static `getIdsWhereCan` and `getIdsWhereCannot` methods have been removed. These methods scaled horribly on forums with many tags, sometimes adding several seconds to response time. - -These methods have been replaced with a `whereHasPermission` [Eloquent dynamic scope](https://laravel.com/docs/8.x/eloquent#dynamic-scopes) that returns a query. Per esempio: - -`Tag::whereHasPermission($actor, 'viewDiscussions)`. - -That query can then be used in other DB queries, or further constricted to retrieve individual tags. - -Secondly, we no longer load in all tags as part of the initial payload. The initial payload contains all top-level primary tags, and the top 3 secondary tags. Other tags are loaded in as needed. Future releases will paginate secondary tags. This should enable forums to have thousands of secondary tags without significant performance impacts. These changes mean that extensions should not assume that all tags are available in the model store. - -## Testing Library Changes - -- Bundled extensions will not be automatically enabled; all enabled extensions must be specified in that test case. -- `setting` and `config` methods have been added that allow configuring settings and config.php values before the tested application boots. See [the testing docs](testing.md) for more information. -- The `php flarum test:setup` command will now drop the existing test DB tables before creating the database. This means that you can run `php flarum test:setup` to ensure a clean database without needing to go into the database and drop tables manually. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-1_x.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-1_x.md deleted file mode 100644 index ed17364ed..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-1_x.md +++ /dev/null @@ -1,139 +0,0 @@ -# Updating For 1.x - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## 1.7 - -### Frontend - -- Frontend extenders similar to the backend have been added, we highly recommend using them instead of the old method (https://docs.flarum.org/extend/models#adding-new-models-1), (https://docs.flarum.org/extend/routes#frontend-routes). -- There is a new tag selection component (https://github.com/flarum/framework/blob/360a2ba1d886df3fc6d326be932c5431ee9df8cf/extensions/tags/js/src/common/components/TagSelectionModal.tsx). - -### Backend - -- Support for php 8.2, deprecations are still thrown by some packages, the testing workflow has been updated to ignore deprecations on 8.2 -- The `/api` endpoint now contains the actor as an included relationship. -- The `Model::dateAttribute($attribute)` extender is deprecated, use `Model::cast($attribute, 'datetime')` instead. - -### Tooling - -- New `phpstan` package to run static code analysis on your extensions for code safety (https://docs.flarum.org/extend/static-code-analysis). -- New `jest-config` package to run frontend unit and component tests (https://docs.flarum.org/extend/testing). - -## 1.6 Changes - -### Backend - -- Added customizable session drivers through the `Session` extender. - -## 1.5 Changes - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Modals can be used in stacks, allowing for multiple modals to be open at once. This is useful for modals that open other modals: `app.modal.show(ModalComponent, { attrs }, true)`. - -### Backend - -- There is a new `createTableIfNotExists` migration helper, which can be used to create tables only if they don't already exist. - -## 1.4 Changes - -No developer-facing changes were made in Flarum v1.4. - -## 1.3 Changes - -Flarum v1.3 included mostly QoL improvements. Below are listed note worthy changes for extension developers: - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Frontend errors will no longer cause the forum to crash into a NoJs page. The extension will fail to execute its frontend code (initializer) and display an error to the admin through an alert, and to all users through the console. The frontend will continue to execute without the extension's frontend changes. -- The markdown toolbar can now be used on the admin side. - -### Backend - -- Calculation of the `number` attribute on `posts` has changed and no longer relies on the discussion model's `post_number_index` attribute which is now deprecated and will be removed in 2.0 -- Extension event listeners are now added after core even listeners, this should generally cause no changes in behavior. - -### Tooling - -- The backend tests workflow now automatically fails tests if there are any PHP warnings and notices. - -## 1.2 Changes - -Flarum v1.2 included quite a few bugfixes, internal refactors, and new features. The following recaps the most important changes for extension developers: - -### Frontend - -- Flarum core now passes TypeScript type checking (on the portion written in TypeScript). Additionally, major portions of the frontend (models, the application instance, and others) are now written in TypeScript. These changes should make it much easier and more fruitful to write extensions in TypeScript. -- Instead of directly using Less variables in CSS code, core now uses CSS variables. For the most part, we've just created CSS variables and set their values to the Less variables. This should make theming and customizing CSS a lot easier. https://github.com/flarum/core/pull/3146. -- Dropdowns can now be lazy-drawn to improve performance. You can do this by setting the lazy draw attr to "true". https://github.com/flarum/core/pull/2925. -- [Textarea-type settings](https://github.com/flarum/core/pull/3141) are now supported through the `app.extensionData.registerSetting` util. -- You can now use Webpack 5 to bundle your extension's code. This will offer minor bundle size improvements. -- A new `flarum/common/components/ColorPreviewInput` component [has been added](https://github.com/flarum/core/pull/3140). It can be used directly, or through the `color-preview` type when registered via `app.extensionData.registerSetting`. -- Extensions can now [modify the minimum search length](https://github.com/flarum/core/pull/3130) of the `Search` component. -- The following components are now extensible: - - The "colors" part of the Appearance page in the admin dashboard: https://github.com/flarum/core/pull/3186 - - The `StatusWidget` dropdown in the admin dashboard: https://github.com/flarum/core/pull/3189 - - `primaryControls` in the notification list: https://github.com/flarum/core/pull/3204 -- Extensions now have finer control over positioning when adding elements to the DiscussionPage sidebar items: https://github.com/flarum/core/pull/3165 -- - -### Backend - -- An [extender for settings defaults](https://github.com/flarum/core/pull/3127) has been added. This should be used instead of the `addSettings` migration helper, which has been deprecated. -- You can now [generate Less variables from setting values](https://github.com/flarum/core/pull/3011) via the `Settings` extender. -- Extensions can now [override/supplement blade template namespaces](https://github.com/flarum/core/pull/3167) through the `View` extender, meaning custom blade templates can be used instead of the default ones added by core or extensions. -- You can now define [custom Less functions through PHP](https://github.com/flarum/core/pull/3190), allowing you to use some backend logic in your Less theming. -- Extensions can now create [custom page title drivers](https://github.com/flarum/core/pull/3109/files) for titles in server-returned HTML. -- Custom logic can now be used when [deciding which relations to eager-load](https://github.com/flarum/core/pull/3116). -- Events [are now dispatched](https://github.com/flarum/core/pull/3203) for the `Notification\Read` and `Notification\ReadAll` events. -- An `ImageManager` instance is now [bound into the container](https://github.com/flarum/core/pull/3195), and can be configured to use either the `gd` or `imagick` backing drivers via the `"intervention.driver"` key in `config.php`. -- User IP addresses are now passed to the [API Client](https://github.com/flarum/core/pull/3124). -- A custom revision versioner implentation [can be set via container bindings](https://github.com/flarum/core/pull/3183) to customize how asset versions are named. -- A SlugManager instance [is now available](https://github.com/flarum/core/pull/3194) in blade templates via the `slugManager` variable. - -### Misc - -- Translations now support the `zero`, `one`, `two`, `few`, and `many` localized plural rules for `plural` ICU MessageFormat translations. This was done through the [`Intl.PluralRules` helper](https://github.com/flarum/core/issues/3072). -- Translations are now used for page titles, so that the format can be customized via language packs or [Linguist](https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease): https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228 -- API endpoints for retrieving single groups, as well as support for filtering groups on the plural get endpoint, [have been added](https://github.com/flarum/core/pull/3084). - - -### Tooling - - -- The `flarum-cli infra` command can now be used to update or enable various infrastructure features. You can now add the following to your extension in just one command: - - TypeScript - - Prettier for JS/TS formatting - - Backend testing with PHPUnit - - Code formatting with StyleCI - - EditorConfig support - - GitHub actions for automating testing, linting, type checking, and building. -- You can also exclude any files from these updates by adding their relative path to the "extra.flarum-cli" key's array in your extension's `composer.json` file. For example, if you wanted to exclude your tsconfig file from any updates by the infra system, the "extra.flarum-cli" key's value should be `["js/tsconfig.json"]`. -- The `flarum-cli audit infra` can be used to check that all infra modules your extension uses are up to date. The `--fix` flag can be used to automatically fix any issues, which has essentially the same effect as running `flarum-cli infra` for each outdated module. -- All `flarum-cli` commands can now be run with a `--no-interaction` flag to prevent prompts. Defaults will be used when possible, and errors will be thrown if a prompt is needed and there is no default. -- Frontend GH actions now support type-checking, as well as type coverage reports. - -## 1.1 Changes - -Flarum version 1.1 mostly focuses on bugfixes and quality-of-life improvements following our stable release earlier this year. These are mainly user-facing and internal infrastructure changes, so extensions are not significantly affected. - -### Frontend - -- Flarum now has an organization-wide prettier config package under [`@flarum/prettier-config`](https://github.com/flarum/prettier-config). -- Most custom (setting or data based) coloring in core is now done via [CSS custom properties](https://github.com/flarum/core/pull/3001). -- Typehinting for Flarum's globals are now [supported in extensions](https://github.com/flarum/core/pull/2992). -- You can now pass extra attrs to the `Select` component, and they will be [passed through to the DOM](https://github.com/flarum/core/pull/2959). -- The `DiscussionPage` component is now organized [as an item list](https://github.com/flarum/core/pull/3004), so it's easier for extensions to change its content. -- Extensions [can now edit](https://github.com/flarum/core/pull/2935) the `page` parameter of `PaginatedListState`. - -### Backend - -- Flarum now comes with a [Preload extender](https://github.com/flarum/core/pull/3057) for preloading any custom frontend assets. -- A new [Theme](https://github.com/flarum/core/pull/3008) extender now allows overriding Less files and internal imports. This allows themes to more easily completely replace Less modules. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b10.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b10.md deleted file mode 100644 index aaa98a2a5..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b10.md +++ /dev/null @@ -1,53 +0,0 @@ -# Updating For Beta 10 - -Beta 10 further solidifies the core architecture, offering new extenders as a stable, use-case-driven API for extending Flarum's core. A few small changes may necessitate updates to your extensions to make them compatible with Beta 10. These are detailed below. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- The `Flarum\Event\GetDisplayName` class has been moved to `Flarum\User\Event\GetDisplayName`. -- The `Flarum\Http\Exception\ForbiddenException` has been removed. Use `Flarum\User\Exception\PermissionDeniedException` instead. -- The `assertGuest()` method of the `Flarum\User\AssertPermissionTrait` has been removed without replacement. -- Old error handling middleware and exception handler classes were removed (see "New Features" for more details): - - `Flarum\Api\Middleware\HandleErrors` - - `Flarum\Http\Middleware\HandleErrorsWithView` - - `Flarum\Http\Middleware\HandleErrorsWithWhoops` - - `Flarum\Api\ErrorHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FloodingExceptionHandler` - - `Flarum\Api\ExceptionHandler\IlluminateValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidAccessTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidConfirmationTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\MethodNotAllowedExceptionHandler` - - `Flarum\Api\ExceptionHandler\ModelNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\PermissionDeniedExceptionHandler` - - `Flarum\Api\ExceptionHandler\RouteNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\TokenMismatchExceptionHandler` - - `Flarum\Api\ExceptionHandler\ValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - -## Recommendations - -- We tweaked the [recommended flarum/core version constraints for extensions](start.md#composer-json). We now recommend you mark your extension as compatible with the current and the upcoming beta release. (For beta.10, that would be any beta.10.x and beta.11.x version.) The core team will strive to make this work well by deprecating features before removing them. More details on this change in [this pull request](https://github.com/flarum/docs/pull/75). - -## New Features - -- New, extensible **error handling** stack in the `Flarum\Foundation\ErrorHandling` namespace: The `Registry` maps exceptions to "types" and HTTP status codes, `HttpFormatter` instances turn them into HTTP responses. Finally, `Reporter` instances are notified about unknown exceptions. - - You can build custom exception classes that will abort the current request (or console command). If they have semantic meaning to your application, they should implement the `Flarum\Foundation\KnownError` interface, which exposes a "type" that is used to render pretty error pages or dedicated error messages. - - More consistent use of HTTP 401 and 403 status codes. HTTP 401 should be used when logging in (i.e. authenticating) could make a difference; HTTP 403 is reserved for requests that fail because the already authenticated user is lacking permissions to do something. - - The `assertRegistered()` and `assertPermission()` methods of the `Flarum\User\AssertPermissionTrait` trait have been changed to match above semantics. See [this pull request](https://github.com/flarum/core/pull/1854) for more details. - - Error views are now determined based on error "type", not on status code (see [bdac88b](https://github.com/flarum/core/commit/bdac88b5733643b9c5dabae9e09a64d9f6e41d58)) -- **Queue support**: This release incorporates Laravel's illuminate/queue package, which allows offloading long-running tasks (such as email sending or regular cleanup jobs) onto a dedicated worker process. These changes are mostly under the hood, the next release(s) will start using the queue system for sending emails. By default, Flarum will use the "sync" queue driver, which executes queued tasks immediately. This is far from ideal and mostly guarantees a hassle-free setups. Production-grade Flarum installs are expected to upgrade to a more full-featured queue adapter. -- The `Flarum\Extend\LanguagePack` now accepts an optional path in its constructor. That way, language packs can store their locales in a different directory if they want to. -- The `formatContent()` method of `Flarum\Post\CommentPost` can now be called without an HTTP request instance, e.g. when rendering a post in an email template. - -## Deprecations - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- Laravel's global string and array helpers (e.g. `str_contains()` and `array_only()`) are deprecated in favor of their class based alternatives (`Illuminate\Support\Str::contains()` and `Illuminate\Support\Arr::only()`). See the [announcement](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers) and [pull request](https://github.com/laravel/framework/pull/26898) for more information. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b12.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b12.md deleted file mode 100644 index ce6b1aca2..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b12.md +++ /dev/null @@ -1,34 +0,0 @@ -# Updating For Beta 12 - -Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Deprecations / Upcoming breaking changes - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- PHP 7.1 support will be dropped in beta.13. -- Using library classes from the `Zend` namespace is now deprecated and will be removed in beta.13. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been deprecated. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been deprecated. We finally have a [proper replacement](middleware.md) - see "New Features" below. Therefore, it will be removed in beta.13. -- If you implement the `Flarum\Mail\DriverInterface`: - - Returning a plain array of field names from the `availableSettings()` method is deprecated, but still supported. It must now return an array of field names mapping to their type. See [the inline documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L25-L32) for more details. - - Implement the `validate()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L34-L48). - - Implement the `canSend()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L50-L54). - -## New Features - -- New **PHP extenders**: - - `Flarum\Extend\Middleware` offers methods for adding, removing or replacing middleware in our three middleware stacks (api, forum, admin). We also added [documentation](middleware.md) for this feature. - - `Flarum\Extend\ErrorHandling` lets you configure status codes and other aspects of our error handling stack depending on error types or exception classes. -- **JavaScript**: - - The `flarum/components/Select` component now supports a `disabled` prop. See [PR #1978](https://github.com/flarum/core/pull/1978). - -## Other changes / Recommendations - -- The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b13.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b13.md deleted file mode 100644 index 1b19a9714..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b13.md +++ /dev/null @@ -1,40 +0,0 @@ -# Updating For Beta 13 - -Beta 13 ships with several new extenders to simplify building and maintaining extensions. We do our best to create backward compatibility changes. We recommend changing to new Extenders as soon as they are available. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- Dropped support for PHP 7.1. -- Classes from the `Zend` namespace are now removed. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been removed including the class. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been removed. Use the [proper replacement](middleware.md). -- Several events used in Event Listeners have been removed, use their [replacement extender](start.md#extenders) instead. -- The LanguagePack extender only loads keys from extensions that are enabled. The translations loaded are based on the yaml files matching the [i18n namespace](i18n.md#appendix-a-standard-key-format). -- All notifications are now sent through the queue; without a queue driver they will run as usual. -- The implementation of avatar upload changed, we're [no longer storing files temporarily on disk](https://github.com/flarum/core/pull/2117). -- The SES mail driver [has been removed](https://github.com/flarum/core/pull/2011). -- Mail driver backward compatibility from beta 12 has been removed, use the new Mail extender or implement the [modified interface](https://github.com/flarum/core/blob/master/src/Mail/DriverInterface.php). - -## Recommendations - -- Beta 14 will ship with a rewrite in the frontend (javascript). If you're building for that release, make sure to follow our [progress](https://github.com/flarum/core/pull/2126). - -## New Features - -- A ton of new extenders: - - [Middleware extender](https://github.com/flarum/core/pull/2017) - - [Console extender](https://github.com/flarum/core/pull/2057) - - [CSRF extender](https://github.com/flarum/core/pull/2095) - - [Event extender](https://github.com/flarum/core/pull/2097) - - [Mail extender](https://github.com/flarum/core/pull/2012) - - [Model extender](https://github.com/flarum/core/pull/2100) - -## Deprecations - -- Several events [have been marked deprecated](https://github.com/flarum/core/commit/4efdd2a4f2458c8703aae654f95c6958e3f7b60b) to be removed in beta 14. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b14.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b14.md deleted file mode 100644 index 41a005884..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b14.md +++ /dev/null @@ -1,757 +0,0 @@ -# Updating For Beta 14 - -This release brings a large chunk of breaking changes - hopefully the last chunk of this size before our stable release. In order to prepare the codebase for the upcoming stable release, we decided it was time to modernize / upgrade / exchange some of the underlying JavaScript libraries that are used in the frontend. Due to the nature and size of these upgrades, we have to pass on some of the breaking changes to you, our extension developers. - -On the bright side, this overdue upgrade brings us closer to the conventions of best practices of [Mithril.js](https://mithril.js.org/), the mini-framework used for Flarum's UI. Mithril's 2.0 release sports a more consistent component interface, which should be a solid foundation for years to come. Where possible, we replicated old APIs, to ease the upgrade and give you time to do the full transition. Quite a few breaking changes remain, though - read more below. - -:::tip - -If you need help with the upgrade, our friendly community will gladly help you out either [on the forum](https://discuss.flarum.org/t/extensibility) or [in chat](https://flarum.org/chat/). - -::: - -To ease the process, we've clearly separated the changes to the [frontend (JS)](#frontend-javascript) from those in the [backend (PHP)](#backend-php) below. If your extension does not change the UI, consider yourself lucky. :-) - -A [summary of the frontend changes](#required-frontend-changes-recap) is available towards the end of this guide. - -## Frontend (JavaScript) - -### Mithril 2.0: Concepts - -Most breaking changes required by beta 14 are prompted by changes in Mithril 2. [Mithril's upgrade guide](https://mithril.js.org/migration-v02x.html) is an extremely useful resource, and should be consulted for more detailed information. A few key changes are explained below: - -#### props -> attrs; initProps -> initAttrs - -Props passed into component are now referred to as `attrs`, and can be accessed via `this.attrs` where you would prior use `this.props`. This was done to be closer to Mithril's preferred terminology. We have provided a temporary backwards compatibility layer for `this.props`, but recommend using `this.attrs`. - -Accordingly, `initProps` has been replaced with `initAttrs`, with a similar BC layer. - -#### m.prop -> `flarum/utils/Stream` - -Mithril streams, which were available via `m.prop` in Mithril 0.2, are now available via `flarum/utils/Stream`. `m.prop` will still work for now due to a temporary BC layer. - -#### m.withAttr -> withAttr - -The `m.withAttr` util has been removed from Mithril. We have provided `flarum/utils/withAttr`, which does the same thing. A temporary BC layer has been added for `m.withAttr`. - -#### Lifecycle Hooks - -In mithril 0.2, we had 2 "lifecycle hooks": - -`init`, an unofficial hook which ran when the component instance was initialized. - -`config`, which ran when components were created, and on every redraw. - - -Mithril 2 has the following hooks; each of which take `vnode` as an argument: - -- `oninit` -- `oncreate` -- `onbeforeupdate` -- `onupdate` -- `onbeforeremove` -- `onremove` - -Please note that if your component is extending Flarum's helper `Component` class, you must call `super.METHOD(vnode)` if using `oninit`, `oncreate`, and `onbeforeupdate`. - -More information about what each of these do can be found [in Mithril's documentation](https://mithril.js.org/lifecycle-methods.html). - -A trivial example of how the old methods map to the new is: - -```js -class OldMithrilComponent extends Component { - init() { - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - config(element, isInitialized) { - console.log('Code to run on every redraw AND when the element is first attached'); - - if (isInitialized) return; - - console.log('Code to execute only once when components are first created and attached to the DOM'); - - context.onunload = () => { - console.log('Code to run when the component is removed from the DOM'); - } - } - - view() { - // In mithril 0, you could skip redrawing a component (or part of a component) by returning a subtree retain directive. - // See https://mithril.js.org/archive/v0.2.5/mithril.render.html#subtree-directives - // dontRedraw is a substitute for logic; usually, this is used together with SubtreeRetainer. - if (dontRedraw()) return { subtree: 'retain' }; - - return

Hello World!

; - } -} - -class NewMithrilComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - oncreate(vnode) { - super.oncreate(vnode); - - console.log('Code to run when components are first created and attached to the DOM'); - } - - onbeforeupdate(vnode, oldVnode) { - super.onbeforeupdate(vnode); - - console.log('Code to run BEFORE diffing / redrawing components on every redraw'); - - // In mithril 2, if we want to skip diffing / redrawing a component, we return "false" in its onbeforeupdate lifecycle hook. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeupdate - // This is also typically used with SubtreeRetainer. - if (dontRedraw()) return false; - } - - onupdate(vnode) { - // Unlike config, this does NOT run when components are first attached. - // Some code might need to be replicated between oncreate and onupdate. - console.log('Code to run on every redraw AFTER the DOM is updated.'); - } - - onbeforeremove(vnode) { - // This is run before components are removed from the DOM. - // If a promise is returned, the DOM element will only be removed when the - // promise completes. It is only called on the top-level component that has - // been removed. It has no equivalent in Mithril 0.2. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeremove - return Promise.resolve(); - } - - onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); - } -} -``` - -#### Children vs Text Nodes - -In Mithril 0.2, every child of a vnode is another vnode, stored in `vnode.children`. For Mithril 2, as a performance optimization, vnodes with a single text child now store that text directly in `vnode.text`. For developers, that means that `vnode.children` might not always contain the results needed. Luckily, text being stored in `vnode.text` vs `vnode.children` will be the same each time for a given component, but developers should be aware that at times, they might need to use `vnode.text` and not `vnode.children`. - -Please see [the mithril documentation](https://mithril.js.org/vnodes.html#structure) for more information on vnode structure. - -#### Routing API - -Mithril 2 introduces a few changes in the routing API. Most of these are quite simple: - -- `m.route()` to get the current route has been replaced by `m.route.get()` -- `m.route(NEW_ROUTE)` to set a new route has been replaced by `m.route.set(NEW_ROUTE)` -- When registering new routes, a component class should be provided, not a component instance. - -Per esempio: - -```js -// Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } - -// Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } -``` - -Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. - -```js -// Mithril 0.2 -
Link Content - -// Mithril 2 -import Link from 'flarum/components/Link'; - -Link Content -``` - -You can also use `Link` to define external links, which will just render as plain `Children` html links. - -For a full list of routing-related changes, please see [the mithril documentation](https://mithril.js.org/migration-v02x.html). - -#### Redraw API - -Mithril 2 introduces a few changes in the redraw API. Most of these are quite simple: - -- Instead of `m.redraw(true)` for synchronous redraws, use `m.redraw.sync()` -- Instead of `m.lazyRedraw()`, use `m.redraw()` - -Remember that Mithril automatically triggers a redraw after DOM event handlers. The API for preventing a redraw has also changed: - -```js -// Mithril 0.2 - - -// Mithril 2 - -``` - -#### AJAX - -The `data` parameter of `m.request({...})` has been split up into `body` and `params`. - -For examples and other AJAX changes, see [the mithril documentation](https://mithril.js.org/migration-v02x.html#mrequest). - -#### Promises - -`m.deferred` has been removed, native promises should be used instead. Per esempio: - -```js -// Mithril 0.2 -const deferred = m.deferred(); - -app.store.find('posts').then(result => deferred.resolve(result)); - -return deferred.promise; - -// Mithril 2 -return app.store.find('posts'); -``` - -#### Component instances should not be stored - -Due to optimizations in Mithril's redrawing algorithms, [component instances should not be stored](https://mithril.js.org/components.html#define-components-statically,-call-them-dynamically). - -So whereas before, you might have done something like: - -```js -class ChildComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return

{this.counter}

; - } -} -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.child = new ChildComponent(); - } - - view() { - return ( -
- - {this.child.render()} -
- ) - } -} -``` - -That will no longer work. In fact; the Component class no longer has a render method. - -Instead, any data needed by a child component that is modified by a parent component should be passed in as an attr. Per esempio: - -```js -class ChildComponent extends Component { - view() { - return

{this.attrs.counter}

; - } -} - -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return ( -
- - -
- ) - } -} -``` - -For more complex components, this might require some reorganization of code. For instance, let's say you have data that can be modified by several unrelated components. In this case, it might be preferable to create a POJO "state instance' for this data. These states are similar to "service" singletons used in Angular and Ember. Per esempio: - -```js -class Counter { - constructor() { - this._counter = 0; - } - - increaseCounter() { - this._counter += 1; - } - - getCount() { - return this._counter; - } -} - -app.counter = new Counter(); - -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', -
-

Counter: {app.counter.getCount()}

-
- ); -}) - -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', -
- -
- ); -}) -``` - -This "state pattern" can be found throughout core. Some non-trivial examples are: - -- PageState -- SearchState and GlobalSearchState -- NotificationListState -- DiscussionListState - -### Changes in Core - -#### Modali - -Previously, modals could be opened by providing a `Modal` component instance: - -```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); -``` - -Since we don't store component instances anymore, we pass in the component class and any attrs separately. - -```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); -``` - -The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. Any modifications by extensions should accordingly be done to `ModalManagerState`. - -#### Avvisi - -Previously, alerts could be opened by providing an `Alert` component instance: - -```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); -``` - -Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: - -```js -app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); -``` - -Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. This replaces the old method of passing the alert instance itself to `dismiss`. - -The `show`, `dismiss`, and `clear` methods are still available through `app.alerts`, but `app.alerts` now points to an instance of `AlertManagerState`, not of the `AlertManager` component. Any modifications by extensions should accordingly be done to `AlertManagerState`. - -#### Composer - -Since we don't store a component instances anymore, a number of util methods from `Composer`, `ComposerBody` (and it's subclasses), and `TextEditor` have been moved onto `ComposerState`. - -For `forum/components/Composer`, `isFullScreen`, `load`, `clear`, `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen` have been moved to `forum/states/ComposerState`. They all remain accessible via `app.composer.METHOD` - -A `bodyMatches` method has been added to `forum/states/ComposerState`, letting you check whether a certain subclass of `ComposerBody` is currently open. - -Various input fields are now stored as [Mithril Streams](https://mithril.js.org/stream.html) in `app.composer.fields`. For instance, to get the current composer content, you could use `app.composer.fields.content()`. Previously, it was available on `app.composer.component.content()`. **This is a convention that `ComposerBody` subclasses that add inputs should follow.** - -`app.composer.component` is no longer available. - -- Instead of `app.composer.component instanceof X`, use `app.composer.bodyMatches(X)`. -- Instead of `app.composer.component.props`, use `app.composer.body.attrs`. -- Instead of `app.composer.component.editor`, use `app.composer.editor`. - -For `forum/components/TextEditor`, the `setValue`, `moveCursorTo`, `getSelectionRange`, `insertAtCursor`, `insertAt`, `insertBetween`, `replaceBeforeCursor`, `insertBetween` methods have been moved to `forum/components/SuperTextarea`. - -Also for `forum/components/TextEditor`, `this.disabled` is no longer used; `disabled` is passed in as an attr instead. It may be accessed externally via `app.composer.body.attrs.disabled`. - -Similarly to Modals and Alerts, `app.composer.load` no longer accepts a component instance. Instead, pass in the body class and any attrs. For instance, - -```js -// Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); - -// Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) -``` - -Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. - -#### Widget and DashboardWidget - -The redundant `admin/components/Widget` component has been removed. `admin/components/DashboardWidget` should be used instead. - -#### NotificationList - -For `forum/components/NotificationList`, the `clear`, `load`, `loadMore`, `parseResults`, and `markAllAsRead` methods have been moved to `forum/states/NotificationListState`. - -Methods for `isLoading` and `hasMoreResults` have been added to `forum/states/NotificationListState`. - -`app.cache.notifications` is no longer available; `app.notifications` (which points to an instance of `NotificationListState`) should be used instead. - -#### Checkbox - -Loading state in the `common/components/Checkbox` component is no longer managed through `this.loading`; it is now passed in as a prop (`this.attrs.loading`). - -#### Preference Saver - -The `preferenceSaver` method of `forum/components/SettingsPage` has been removed without replacement. This is done to avoid saving component instances. Instead, preferences should be directly saved. Per esempio: - -```js -// Old way -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value, component) => { - this.user.pushAttributes({ lastSeenAt: null }); - this.preferenceSaver('discloseOnline')(value, component); - }, -}) - -// Without preferenceSaver -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value) => { - this.discloseOnlineLoading = true; - - this.user.savePreferences({ discloseOnline: value }).then(() => { - this.discloseOnlineLoading = false; - m.redraw(); - }); - }, - loading: this.discloseOnlineLoading, -}) -``` - -A replacement will eventually be introduced. - -#### DiscussionListState - -For `forum/components/DiscussionList`, the `requestParams`, `sortMap`, `refresh`, `loadResults`, `loadMore`, `parseResults`, `removeDiscussion`, and `addDiscussion` methods have been moved to `forum/states/DiscussionListState`. - -Methods for `hasDiscussions`, `isLoading`, `isSearchResults`, and `empty` have been added to `forum/states/DiscussionListState`. - -`app.cache.discussions` is no longer available; `app.discussions` (which points to an instance of `DiscussionListState`) should be used instead. - -#### PageState - -`app.current` and `app.previous` no longer represent component instances, they are now instances of the `common/states/PageState` class. This means that: - -- Instead of `app.current instanceof X`, use `app.current.matches(X)` -- Instead of `app.current.PROPERTY`, use `app.current.get('PROPERTY')`. Please note that all properties must be exposed EXPLICITLY via `app.current.set('PROPERTY', VALUE)`. - -#### PostStream - -Logic from `forum/components/PostStreamScrubber`'s `update` method has been moved to `forum/components/PostStream`'s `updateScrubber` method. - -For `forum/components/PostStream`, the `update`, `goToFirst`, `goToLast`, `goToNumber`, `goToIndex`, `loadNearNumber`, `loadNearIndex`, `loadNext`, `loadPrevious`, `loadPage`, `loadRange`, `show`, `posts`, `reset`, `count`, and `sanitizeIndex` methods have been moved to `forum/states/PostStreamState`. - -Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStreamState`. - -#### SearchState and GlobalSearchState - -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. - -At the minimum, `SearchState` contains the following methods: - -- getValue -- setValue -- clear -- cache (adds a searched value to cache, meaning that we don't need to search for its results again) -- isCached (checks if a value has been searched for before) - -All of these methods have been moved from `Search` to `SearchState`. Additionally, Search's `stickyParams`, `params`, `changeSort`, `getInitialSearch`, and `clearInitialSearch` methods have been moved to `forum/states/GlobalSearchState`, which is now available via `app.search`. - -To use a custom search, you'll want to: - -1. Possibly create a custom subclass of `SearchState` -2. Create a custom subclass of `Search`, which overrides the `selectResult` method to handle selecting results as needed by your use case, and modify the `sourceItems` methods to contain the search sources you need. - -#### moment -> dayjs - -The `moment` library has been removed, and replaced by the `dayjs` library. The global `moment` can still be used for now, but is deprecated. `moment` and `dayjs` have very similar APIs, so very few changes will be needed. Please see the dayjs documentation [for more information](https://day.js.org/en/) on how to use it. - -#### Subtree Retainer - -`SubtreeRetainer` is a util class that makes it easier to avoid unnecessary redraws by keeping track of some pieces of data. When called, it checks if any of the data has changed; if not, it indicates that a redraw is not necessary. - -In mithril 0.2, its `retain` method returned a [subtree retain directive](https://mithril.js.org/archive/v0.1.25/mithril.render.html#subtree-directives) if no redraw was necessary. - -In mithril 2, we use its `needsRebuild` method in combination with `onbeforeupdate`. Per esempio: - -```js -class CustomComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - this.showContent = false; - - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) - } - - onbeforeupdate() { - // If needsRebuild returns true, mithril will diff and redraw the vnode as usual. Otherwise, it will skip this redraw cycle. - // In this example, this means that this component and its children will only be redrawn when extra content is toggled. - return this.subtree.needsRebuild(); - } - - view(vnode) { - return
- -

Hello World!{this.showContent ? ' Extra Content!' : ''}

-
; - } -} -``` - -#### attrs() method - -Previously, some components would have an attrs() method, which provided an extensible way to provide attrs to the top-level child vnode returned by `view()`. For instance, - -```js -class CustomComponent extends Component { - view() { - return

Hello World!

; - } - - attrs() { - return { - className: 'SomeClass', - onclick: () => console.log('click'), - }; - } -} -``` - -Since `this.attrs` is now used for attrs passed in from parent components, `attrs` methods have been renamed to `elementAttrs`. - -#### Children and .component - -Previously, an element could be created with child elements by passing those in as the `children` prop: - -```js -Button.component({ - className: 'Button Button--primary', - children: 'Button Text' -}); -``` - -This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: - -```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); -``` - -Children can still be passed in through JSX: - -```js - -``` - -#### Tag attr - -Because mithril uses 'tag' to indicate the actual html tag (or component class) used for a vnode, you can no longer pass `tag` as an attr to components extending Flarum's `Component` helper class. The best workaround here is to just use another name for this attr. - -#### affixSidebar - -The `affixSidebar` util has been removed. Instead, if you want to affix a sidebar, wrap the sidebar code in an `AffixedSidebar` component. For instance, - -```js -class OldWay extends Component { - view() { - return
-
-
- -
Actual Page Content
-
-
-
; - } -} - -class NewWay extends Component { - view() { - return
-
-
- - - -
Actual Page Content
-
-
-
; - } -} -``` - -#### Fragment - -**Warning: For Advanced Use Only** - -In some rare cases, we want to have extremely fine grained control over the rendering and display of some significant chunks of the DOM. These are attached with `m.render`, and do not experience automated redraws. Current use cases in core and bundled extensions are: - -- The "Reply" button that shows up when selecting text in a post -- The mentions autocomplete menu that shows up when typing -- The emoji autocomplete menu that shows up when typing - -For this purpose, we provide a helper class (`common/Fragment`), of which you can create an instance, call methods, and render via `m.render(DOM_ROOT, fragmentInstance.render())`. The main benefit of using the helper class is that it allows you to use lifecycle methods, and to access the underlying DOM via `this.$()`, like you would be able to do with a component. - -This should only be used when absolutely necessary. If you are unsure, you probably don't need it. If the goal is to not store component instances, the "state pattern" as described above is preferable. - -### Required Frontend Changes Recap - -Each of these changes has been explained above, this is just a recap of major changes for your convenience. - -- Component Methods: - - `view()` -> `view(vnode)` - - Lifecycle - - `init()` -> `oninit(vnode)` - - `config()` -> Lifecycle hooks `oncreate(vnode)` / `onupdate(vnode)` - - `context.onunload()` -> `onremove()` - - `SubtreeRetainer` -> `onbeforeupdate()` - - if present, `attrs()` method needs to be renamed -> convention `elementAttrs()` - - building component with `MyComponent.component()` -> `children` is now second parameter instead of a named prop/attr (first argument) -> JSX preferred -- Routing - - `m.route()` -> `m.route.get()` - - `m.route(name)` -> `m.route.set(name)` - - register routes with page class, not instance - - special case when passing props - - `` -> `` -- AJAX - - `m.request({...})` -> `data:` key split up into `body:` and `params:` - - `m.deferred` -> native `Promise` -- Redrawing - - `m.redraw(true)` -> `m.redraw.sync()` - - `m.redraw.strategy('none')` -> `e.redraw = false` in event handler - - `m.lazyRedraw()` -> `m.redraw()` - -#### Deprecated changes - -For the following changes, we currently provide a backwards-compatibility layer. This will be removed in time for the stable release. The idea is to let you release a new version that's compatible with Beta 14 to your users as quickly as possible. When you have taken care of the changes above, you should be good to go. For the following changes, we have bought you time until the stable release. Considering you have to make changes anyway, why not do them now? - -- `this.props` -> `this.attrs` -- static `initProps()` -> static `initAttrs()` -- `m.prop` -> `flarum/utils/Stream` -- `m.withAttr` -> `flarum/utils/withAttr` -- `moment` -> `dayjs` - -## Backend (PHP) - -### New Features - -#### Extension Dependencies - -Some extensions are based on, or add features to, other extensions. Prior to this release, there was no way to ensure that those dependencies were enabled before the extension that builds on them. Now, you cannot enable an extension unless all of its dependencies are enabled, and you cannot disable an extension if there are other enabled extensions depending on it. - -So, how do we specify dependencies for an extension? Well, all you need to do is add them as composer dependencies to your extension's `composer.json`! For instance, if we have an extension that depends on Tags and Mentions, our `composer.json` will look like this: - -```json -{ - "name": "my/extension", - "description": "Cool New Extension", - "type": "flarum-extension", - "license": "MIT", - "require": { - "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency - } - // other config -} -``` - -#### View Extender - -Previously, when extensions needed to register Laravel Blade views, they could inject a view factory in `extend.php` and call it's `addNamespace` method. For instance, - -```php -// extend.php -use Illuminate\Contracts\View\Factory; - -return [ - function (Factory $view) { - $view->addNamespace(NAME, RELATIVE PATH); - } -] -``` - -This should NOT be used, as it will break views for all extensions that boot after yours. Instead, the `View` extender should be used: - -```php -// extend.php -use Flarum\Extend\View; - -return [ - (new View)->namespace(NAME, RELATIVE PATH); -] -``` - -#### Application and Container - -Although Flarum uses multiple components of the Laravel framework, it is not a pure Laravel system. In beta 14, the `Flarum\Foundation\Application` class no longer implements `Illuminate\Contracts\Foundation\Application`, and no longer inherits `Illuminate\Container\Container`. Several things to note: - -- The `app` helper now points to an instance of `Illuminate\Container\Container`, not `Flarum\Foundation\Application`. You might need to resolve things through the container before using them: for instance, `app()->url()` will no longer work; you'll need to resolve or inject an instance of `Flarum\Foundation\Config` and use that. -- Injected or resolved instances of `Flarum\Foundation\Application` can no longer resolve things through container methods. `Illuminate\Container\Container` should be used instead. -- Not all public members of `Illuminate\Contracts\Foundation\Application` are available through `Flarum\Foundation\Application`. Please refer to our [API docs on `Flarum\Foundation\Application`](https://api.docs.flarum.org/php/master/flarum/foundation/application) for more information. - -#### Other Changes - -- We are now using Laravel 6. Please see [Laravel's upgrade guide](https://laravel.com/docs/6.x/upgrade) for more information. Please note that we do not use all of Laravel. -- Optional params in url generator now work. For instance, the url generator can now properly generate links to posts in discussions. -- A User Extender has been added, which replaces the deprecated `PrepareUserGroups` and `GetDisplayName` events. -- Error handler middleware can now be manipulated by the middleware extender through the `add`, `remove`, `replace`, etc methods, just like any other middleware. -- `Flarum/Foundation/Config` and `Flarum/Foundation/Paths` can now be injected where needed; previously their data was accessible through `Flarum/Foundation/Application`. - -### Deprecations - -- `url` provided in `config.php` is now an array, accessible via `$config->url()`, for an instance of `Config` - [PR](https://github.com/flarum/core/pull/2271#discussion_r475930358) -- AssertPermissionTrait has been deprecated - [Issue](https://github.com/flarum/core/issues/1320) -- Global path helpers and path methods of `Application` have been deprecated, the injectable `Paths` class should be used instead - [PR](https://github.com/flarum/core/pull/2155) -- `Flarum\User\Event\GetDisplayName` has been deprecated, the `displayNameDriver` method of the `User` extender should be used instead - [PR](https://github.com/flarum/core/pull/2174) - -### Removals - -- Do NOT use the old closure notation for configuring view namespaces. This will break all extensions that boot after your extension. The `View` extender MUST be used instead. -- app()->url() will no longer work: [`Flarum\Http\UrlGenerator`](routes.md) should be injected and used instead. An instance of `Flarum\Http\UrlGenerator` is available in `blade.php` templates via `$url`. -- As a part of the Laravel 6 upgrade, the [`array_` and `str_` helpers](https://laravel.com/docs/6.x/upgrade#helpers) have been removed. -- The Laravel translator interface has been removed; the Symfony translator interface should be used instead: `Symfony\Component\Translation\TranslatorInterface` -- The Mandrill mail driver is no longer provided in Laravel 6, and has been removed. -- The following events deprecated in Beta 13 [have been removed](https://github.com/flarum/core/commit/7d1ef9d89161363d1c8dea19cf8aebb30136e9e3#diff-238957b67e42d4e977398cd048c51c73): - - `AbstractConfigureRoutes` - - `ConfigureApiRoutes` - Use the `Routes` extender instead - - `ConfigureForumRoutes` - Use the `Frontend` or `Routes` extenders instead - - `ConfigureLocales` - Use the `LanguagePack` extender instead - - `ConfigureModelDates` - Use the `Model` extender instead - - `ConfigureModelDefaultAttributes` - Use the `Model` extender instead - - `GetModelRelationship` - Use the `Model` extender instead - - `Console\Event\Configuring` - Use the `Console` extender instead - - `BioChanged` - User bio has not been a core feature for several releases diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b15.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b15.md deleted file mode 100644 index c5763344c..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b15.md +++ /dev/null @@ -1,60 +0,0 @@ -# Aggiornamenti Beta 15 - -La Beta 15 presenta molti nuovi extender, una riprogettazione totale del dashboard di amministrazione e molte altre interessanti funzionalità per le estensioni. Come sempre, abbiamo fatto del nostro meglio per fornire livelli di compatibilità con le versioni precedenti e consigliamo di abbandonare i sistemi obsoleti il prima possibile per rendere le estensioni più stabili. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Nuove funzionalità / deprecazioni - -### Extender - -- `Flarum\Api\Event\WillGetData` e `Flarum\Api\Event\WillSerializeData` sono stati deprecati, l'extender `ApiController` va utilizzato al suo posto -- `Flarum\Api\Event\Serializing` e `Flarum\Event\GetApiRelationship` sono stati deprecati, l'extender `ApiSerializer` va utilizzato al suo posto -- `Flarum\Formatter\Event\Parsing` è obsoleto, il metodo `parse` di `Formatter` va utilizzato al suo posto -- `Flarum\Formatter\Event\Rendering` è obsoleto, il metodo `render` di `Formatter` va utilizzato al suo posto -- `Flarum\Notification\Event\Sending` è obsoleto, il metodo `driver` di `Notification` va utilizzato al suo posto - - Si noti che il nuovo sistema di driver di notifica non è un analogo esatto del vecchio evento `Sending`, poiché può solo aggiungere nuovi driver, non modificare la funzionalità del driver di avviso della campana di notifica predefinito. Se l'estensione deve modificare ** come ** o ** a chi ** vengono inviate le notifiche, potrebbe essere necessario sostituire `Flarum\Notification\NotificationSyncer`. -- `Flarum\Event\ConfigureNotificationTypes` è obsoleto, il metodo `type` di `Notification` va utilizzato al suo posto -- `Flarum\Event\ConfigurePostTypes` è obsoleto, il metodo `type` di `Post` va utilizzato al suo posto -- `Flarum\Post\Event\CheckingForFlooding` è ormai obsoleto come `Flarum\Post\Floodgate`. Sono stati sostituiti con un sistema di limitazione basato su middleware che si applica a TUTTE le richieste a / api / * e possono essere configurati tramite il `ThrottleApi`. Per favore guarda la documentazione [limitazioni API](api-throttling.md) per informazioni. -- `Flarum\Event\ConfigureUserPreferences` è ormai obsoleto, il metodo `registerPreference` di `User` va utilizzato al suo posto -- `Flarum\Foundation\Event\Validating` è ormai obsoleto, il metodo `configure` di `Validator` va utilizzato al suo posto - -- Il sistema delle politiche è stato leggermente rielaborato per essere più intuitivo. In precedenza, i criteri contenevano sia i criteri effettivi, che determinano se un utente può eseguire alcune capacità, sia gli ambiti di visibilità del modello, che consentivano un'efficace limitazione delle query solo agli elementi a cui gli utenti hanno accesso. Guarda [documentazione sulle autorizzazioni](authorization.md) per maggiori informazioni su questo sistema. Ora: - - `Flarum\Event\ScopeModelVisibility` è ormai obsoleto. Nuovi scopers possono essere registrati tramite l'extender `ModelVisibility`, e ogni query `Eloquent\Builder` può essere richiamata dal metodo `whereVisibleTo`, con l'abilità in questione come secondo argomento opzionale (il valore predefinito è `view`). - - `Flarum\Event\GetPermission` è ormai obsoleto. Le policy possono essere registrate tramite extender `Policy`. `Flarum\User\User::can` non è cambiato. Si prega di notare che le nuove policy devono restituire uno dei valori `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, non booleano. - -- L'extender `ModelUrl` è stato aggiunto, consentendo la registrazione di nuovi driver di slug. Ciò accompagna il nuovo sistema di slug di Flarum, che consente alle estensioni di definire strategie personalizzate per i modelli. L'estensore supporta modelli al di fuori del nucleo Flarum. Si prega di consultare il nostro file [model slugging](slugging.md) per informazioni. -- L'extender `Settings` è stato aggiunto, il metodo `serializeToForum` semplifica la serializzazione di un'impostazione nel forum. -- L'extender `ServiceProvider` è stato aggiunto. Questo dovrebbe essere usato con estrema cautela solo per casi d'uso avanzati, dove non ci sono alternative. Tieni presente che il livello del fornitore di servizi non è considerato API pubblica ed è soggetto a modifiche in qualsiasi momento, senza preavviso. - -### Pannello Amministrazione ridisegnato - -La dashboard dell'amministratore è stata completamente ridisegnata, con l'obiettivo di barre di navigazione per ogni estensione. Anche l'API per le estensioni per registrare impostazioni, autorizzazioni e pagine personalizzate è stata notevolmente semplificata. Ora puoi anche aggiornare la tua estensione `composer.json` per fornire link per finanziamenti, supporto, siti web e così via che verranno visualizzati nella pagina di amministrazione della tua estensione. Please see [our Admin JS documentation](admin.md) for more information on how to use the new system. - -### Altre feauture nuove - -- Sul backend, il nome del percorso è ora disponibile tramite `$request->getAttribute('routeName')`, e per il middleware che viene eseguito dopo `Flarum\Http\Middleware\ResolveRoute.php`. -- `Flarum\Api\Controller\UploadImageController.php` può ora essere utilizzato come classe base per i controller che caricano immagini (come per il logo e la favicon). -- AIl ripristino automatico dello scorrimento del browser ora può essere disabilitato per le singole pagine [vedere la nostra documentazione del frontend per maggiori informazioni](frontend-pages.md). - -## Cambiamenti decisivi - -- I seguenti layer BC deprecati del frontend sono stati rimossi: - - `momentjs` non funziona più come alias per `dayjs` - - `this.props` e `this.initProps` non più alias di `this.attrs` e `this.initAttrs` per la classe base `Component` - - `m.withAttr` e `m.stream` non più alias di `flarum/utils/withAttr` e `flarum/utils/Stream` - - `app.cache.discussionList` è stato rimosso - - `this.content` e `this.editor` sono stati rimossi da `ComposerBody` - - `this.component`, `this.content`, e `this.value` sono stati rimossi da `ComposerState` -- I seguenti layer BC back-end deprecati sono stati rimossi: - - `publicPath`, `storagePath`, e `vendorPath` di `Flarum\Foundation\Application` sono stati rimossi - - `base_path`, `public_path`, e `storage_path` sono stati rimossi - - `getEmailSubject` di `Flarum\Notification\MailableInterface` DEVE ora prendere un'istanza di traduttore come argomento - - `Flarum\User\AssertPermissionTrait` è stato rimosso, i metodi analoghi su `Flarum\User\User` andranno utilizzati al suo posto - - `Flarum\Event\PrepareUserGroups` è stato rimosso, usa invece l'extender `User` - - `Flarum\User\Event\GetDisplayName` è stato rimosso, usa invece l'extender `User` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b16.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b16.md deleted file mode 100644 index 0ab1aa8eb..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b16.md +++ /dev/null @@ -1,138 +0,0 @@ -# Aggiornamenti per Beta 16 - -La Beta 16 finalizza l'API extender PHP, introduce una libreria di test e le tipizzazioni JS, passa all'utilizzo di namespace per le importazioni JS, aumenta la robustezza della dipendenza dalle estensioni e consente l'override deli percorsi, tra le altre funzionalità. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Frontend - -- È stata introdotta una nuova astrazione del driver dell'editor, che consente alle estensioni di sostituire l'editor predefinito basato sull'area di testo con soluzioni più avanzate. -- I componenti `TextEditor` e `TextEditorButton`, così come `BasicEditorDriver` (che rimpiazza `SuperTextarea`) è stato spostato da `forum` a `common`. -- I namespace `forum`, `admin`, e `common` dovrebbero essere usati durante l'importazione. Quind invece di `import Component from 'flarum/Component'`, utilizzate `import Component from 'flarum/common/Component`. Il supporto per i vecchi stili di importazione sarà deprecato con la versione stabile e rimosso con Flarum 2.0. -- È stata rilasciata una libreria di digitazione per supportare il completamento automatico dell'editor per lo sviluppo del frontend, installabile tramite `npm install --save-dev flarum@0.1.0-beta.16`. -- Le categorie di estensioni sono state semplificate fino a `feature`, `theme`, e `language`. - -## Backend - -### Estensori - -- Tutti gli extender che supportano callback / chiusure ora supportano funzioni globali come `'boolval'` e funzioni array-type come `[ClassName::class, 'methodName']`. -- L'estensore `Settings` e metodo `serializeToFrontend` ora supporta un valore predefinito come quarto argomento. -- L'estensore `Event` ora supporta la registrazione di abbonati a più eventi contemporaneamente tramite metodo `subscribe`. -- L'estensore `Notification` utilizza ora il metodo `beforeSending`, che consente di modificare l'elenco dei destinatari prima che venga inviata una notifica. -- Il metodo `mutate` di `ApiSerializer` è ora deprecato, e rinominato come `attributes`. -- Il metodo `remove` negli estensori `Route` e `Frontend` può essere utilizzato per rimuovere (e quindi sostituire) le rotte. -- L'estensore `ModelPrivate` rimpiazza l'evento `GetModelIsPrivate`, ormai deprecato. -- I metodi sull'estensore `Auth` rimpiazzano l'evento `CheckingPassword`, ormai deprecato. -- Tutti gli eventi relativi alla ricerca sono ora deprecati a favore di estensori quali `SimpleFlarumSearch` e `Filter`; spiegato meglio qui sotto. - -### Laravel e Symfony - -Aggiornamenti beta 16 dalla v6.x alla v8.x dei componenti Laravel e dalla v4 alla v5 dei componenti Symfony. Consulta le rispettive guide all'upgrade di ciascuna per le modifiche che potresti dover apportare alle tue estensioni. La modifica più sostanziale è la deprecazione di `Symfony\Component\Translation\TranslatorInterface` in favore di `Symfony\Contracts\Translation\TranslatorInterface`. Il primo verrà rimosso nella beta 17. - -### Funzioni Helper - -I rimanenti helper `app` e `event` sono ora deprecati. `app` è stato rimpiazzato con `resolve`. - -Poiché alcune estensioni Flarum utilizzano librerie Laravel che presumono l'esistenza di alcuni helper globali, abbiamo ricreato alcuni helper comunemente usati nel pacchetto [flarum/laravel-helpers](https://github.com/flarum/laravel-helpers). Questi helper NON dovrebbero essere usati direttamente nel codice di estensione Flarum; sono disponibili in modo che le librerie basate su Laravel che si aspettano che esistano non funzionino male. - -### Cambiamenti alla Ricerca - -Come parte dei nostri continui sforzi per rendere il sistema di ricerca di Flarum più flessibile, abbiamo rifattorizzato parecchio codice nella beta 16. In particolare, il filtraggio e la ricerca sono ora trattati come meccanismi diversi e hanno condutture ed estensori separati. In sostanza, se una query ha `filter[q]` come parametro, verrà considerato come una ricerca e tutti gli altri parametri del filtro verranno ignorati. In caso contrario, verrà gestito dal sistema di filtraggio. Ciò consentirà alla fine di gestire le ricerche da driver alternativi (forniti dalle estensioni), come ElasticSearch, senza impattare i filtri (es. caricamento discussioni recenti). Le classi comuni a entrambi i sistemi sono state spostate sotto il namespace `Query`. - -Le implementazioni di filtro e ricerca predefinita di Core (denominate SimpleFlarumSearch) sono abbastanza simili, poiché entrambe sono alimentate dal database. L'API controller `List` richiama i metodi `search` / `filter` in una sottoclasse specifica delle risorse di `Flarum\Search\AbstractSearcher` o `Flarum\Filter\AbstractFilterer`. Gli argomenti sono un'istanza di `Flarum\Query\QueryCriteria`, oltre a informazioni su ordinamento, offset e limite. Entrambi i sistemi restituiscono un'istanza di `Flarum\Query\QueryResults`, che è effettivamente un involucro attorno a una collezione di modelli Eloquent. - -Anche i sistemi predefiniti sono in qualche modo simili nella loro implementazione. `Filterer`applica filtri (implementando `Flarum\Filter\FilterInterface`) in base ai parametri della query nel modulo `filter[FILTER_KEY] = FILTER_VALUE` (o `filter[-FILTER_KEY] = FILTER_VALUE` per filtri negati). SimpleFlarumSearch `Searcher` divide il parametro `filter[q]` da spazi in "termini", applica Gambits (implementando `Flarum\Search\GambitInterface`) che corrispondono ai termini e quindi applicano "Fulltext Gambit" per cercare in base a "termini" che non corrispondono ad un "auxiliary gambit". Entrambi i sistemi applicano quindi l'ordinamento, un offset e un limite di conteggio dei risultati e consentono alle estensioni di modificare il risultato della query tramite `searchMutators` o `filterMutators`. - -Le estensioni aggiungono "gambits" e "search mutators" per classi `Searcher` tramite estensore `SimpleFlarumSearch`. Possono aggiungere filtri a classi `Filterer` tramite estensore`Filter`. - -Per quanto riguarda l'aggiornamento, tieni presente quanto segue: - -- Cerca le mutazioni registrate con eventi `Searching`, per le discussioni e gli utenti verranno applicate le ricerche durante la fase di mutazione della ricerca tramite uno strato BC temporaneo. NON verranno applicati ai filtri. Questo è un cambiamento decisivo. Questi eventi sono stati deprecati. -- Search gambits registrati con eventi `ConfigureUserGambits` e `ConfigureDiscussionGambits` verrà applicato al ricercatore tramite un layer BC temporaneo. NON verranno applicati ai filtri. Questo è un cambiamento decisivo. Questi eventi sono stati deprecati. -- Filtri post registrati tramite eventi `ConfigurePostsQuery` verrà applicato ai filtri dei post tramite un layer BC temporaneo. Quell'evento è stato deprecato. - -### Libreria di test - -Il pacchetto `flarum/testing` fornisce utilità per test backend automatizzati basati su PHPUnit. Vedi [documentazione test](testing.md) per info. - -### Dipendenze opzionali - -La Beta 15 ha introdotto le "dipendenze delle estensioni", che richiedono tutte le estensioni elencate in `composer.json` e nella sezione `require` da abilitare prima che la tua estensione possa essere utilizzata. - -Con la beta 16, puoi specificare "dipendenze opzionali" elencando i nomi dei pacchetti del composer come un array nella tua estensione `extra.flarum-extension.optional-dependencies`. Qualsiasi dipendenza facoltativa abilitata verrà avviata prima dell'estensione, ma non è necessaria per l'abilitazione di quest'ultima. - -### Access Token e cambiamenti all'autenticazione - -#### Cambiamenti Estensioni API - -La firma per vari metodi relativi all'autenticazione è stata modificata in `$token` come parametro invece di `$userId`. Altre modifiche sono il risultato del passaggio da `$lifetime` a `$type` - -- `Flarum\Http\AccessToken::generate($userId)` non accetta più `$lifetime` come secondo parametro. Il parametro è stato mantenuto per compatibilità con le versioni precedenti ma non ha alcun effetto. Verrà rimosso nella beta 17. -- `Flarum\Http\RememberAccessToken::generate($userId)` dovrebbe essere usato per creare token di accesso da ricordare. -- `Flarum\Http\DeveloperAccessToken::generate($userId)` dovrebbe essere utilizzato per creare token di accesso sviluppatore (non scadono). -- `Flarum\Http\SessionAccessToken::generate()` può essere utilizzato come alias per `Flarum\Http\AccessToken::generate()`. Verrà deprecato `AccessToken::generate()` in futuro. -- `Flarum\Http\Rememberer::remember(ResponseInterface $response, AccessToken $token)`: passare `AccessToken` è stato deprecato. Passa un'istanza di `RememberAccessToken` al suo posto. Come livello di compatibilità temporaneo, il passaggio di qualsiasi altro tipo di token lo convertirà in un token di ricordo. Nella beta 17 la firma del metodo cambierà per accettare solo `RememberAccessToken`. -- `Flarum\Http\Rememberer::rememberUser()` è deprecata. Invece dovresti creare / recuperare un token manualmente con `RememberAccessToken::generate()` e passarlo a `Rememberer::remember()` -- `Flarum\Http\SessionAuthenticator::logIn(Session $session, $userId)` come secondo parametro è stato deprecato ed è stato sostituito con `$token`. Viene mantenuta la compatibilità con le versioni precedenti. Nella beta 17, la firma del secondo metodo del parametro cambierà in `AccessToken $token`. -- `AccessToken::generate()` ora salva il modello nel database prima di restituirlo. -- `AccessToken::find($id)` or `::findOrFail($id)` non può più essere utilizzato per trovare un token, perché la chiave primaria è stata modificata da `token` a `id`. Invece puoi utilizzare `AccessToken::findValid($tokenString)` -- Si consiglia di utilizzare `AccessToken::findValid($tokenString): AccessToken` o `AccessToken::whereValid(): Illuminate\Database\Eloquent\Builder` per trovare un token. Ciò consentirà automaticamente alla richiesta di restituire solo token validi. Sui forum con bassa attività questo aumenta la sicurezza poiché l'eliminazione automatica dei token obsoleti avviene in media solo ogni 50 richieste. - -#### Cambiamenti sessioni Symfony - -Se stai accedendo o manipolando direttamente l'oggetto sessione di Symfony, sono state apportate le seguenti modifiche: - -- L'attributo `user_id` non è più utilizzato. `access_token` è ora utilizzato al suo posto. È una stringa che mappa alla colonna `token` della tabella nel database `access_tokens`. - -Per recuperare l'utente corrente dall'interno di un'estensione Flarum, la soluzione ideale che era già presente in Flarum è quella di utilizzare `$request->getAttribute('actor')` che restituisce un istanza di `User` (quale potrebbe essere `Guest`) - -Per recuperare l'istanza del token da Flarum, puoi usare `Flarum\Http\AccessToken::findValid($tokenString)` - -Per recuperare i dati utente da un'applicazione non Flarum, dovrai effettuare una richiesta di database aggiuntiva per recuperare il token. L' user ID è presente come `user_id` nella tabella `access_tokens. - -#### Cambiamenti creazione Token - -La proprietà `lifetime` degli access token è stata rimossa. I token ora sono token di `session` con durata di 1 ora dopo l'ultima attività, o i token `session_remember` con 5 anni di vita dopo l'ultima attività. - -Il parametro `remember` precedentemente disponibile sull'endopoint `POST /login` è stato redo disponibile in `POST /api/token`. Non restituisce il cookie di memorizzazione stesso, ma il token restituito può essere utilizzato come cookie di memorizzazione. - -Il parametro `lifetime` di `POST /api/token` è stato deprecato e verrà rimosso in Flarum beta 17. È stata fornita una compatibilità con le versioni precedenti parziale laddove un valore `lifetime` con più di 3600 secondi viene interpretato come `remember=1`. Valori inferiori a 3600 secondi danno come risultato un normale token di non ricordo. - -Nuovi token `developer` tokens that don't expire have been introduced, che non scadono sono stati introdotti, tuttavia non possono essere attualmente creati tramite l'API REST. Gli sviluppatori possono creare token per sviluppatori da un'estensione utilizzando `Flarum\Http\DeveloperAccessToken::generate($userId)`. - -Se hai creato manualmente token nel database dall'esterno di Flarum, la colonna `type` è ora richiesta e deve contenere `session`, `session_remember` o `developer`. I token di tipo non riconosciuto non possono essere utilizzati per l'autenticazione, ma non verranno nemmeno eliminati dal garbage collector. In una versione futura le estensioni potranno registrare tipi di token di accesso personalizzati. - -#### Cambiamenti all'utilizzo dei token - -I [problemi di sicurezza in Flarum](https://github.com/flarum/core/issues/2075) causavano la non scadenza dei token. Ciò ha avuto un impatto sulla sicurezza limitato poiché i token sono caratteri lunghi e unici. Tuttavia, le integrazioni personalizzate che hanno salvato un token in un database esterno per un uso successivo potrebbero scoprire che i token non funzionano più se non sono stati utilizzati di recente. - -Se utilizzi token di accesso di breve durata per qualsiasi scopo, prendi nota del tempo di scadenza di 1 ora. La scadenza si basa sull'ora dell'ultimo utilizzo, quindi rimarrà valida finché continuerà ad essere utilizzata. - -A causa della grande quantità di token scaduti accumulati nel database e del fatto che la maggior parte dei token non è mai stata utilizzata più di una volta durante il processo di accesso, abbiamo scelto di eliminare tutti i token di accesso per una durata di 3600 secondi come parte della migrazione , Tutti i token rimanenti sono stati convertiti in `session_remember`. - -#### Ricorda cookie - -Il cookie di memorizzazione funziona ancora come prima, ma sono state apportate alcune modifiche che potrebbero interrompere implementazioni insolite. - -Ora accedi solo ai token creati con opzione `remember`. Qualsiasi altro tipo di token verrà ignorato. Ciò significa che se crei un token con `POST /api/token` e lo inserisci manualmente nel cookie, devi assicurati di aver impostato `remember=1` durante la sua creazione. - -#### Scadenza della sessione Web - -Nelle versioni precedenti di Flarum, una sessione poteva essere mantenuta in vita per sempre fino a quando i file della sessione di Symfony non venivano cancellati dal disco. - -Ora le sessioni sono collegate ai token di accesso. Un token in fase di eliminazione o in scadenza terminerà automaticamente la sessione web collegata. - -Un token collegato a una sessione Web verrà ora automaticamente eliminato dal database quando l'utente fa clic su Logout. Ciò impedisce il riutilizzo di qualsiasi token rubato, ma potrebbe interrompere l'integrazione personalizzata che in precedenza utilizzava un singolo token di accesso sia in una sessione Web che in qualcos'altro. - -### Varie - -- L'indirizzo IP è ora disponibile nelle richieste tramite `$request->getAttribute('ipAddress')` -- Le policy possono ora restituire `true` e `false` come alias per `$this->allow()` e `$this->deny()`, rispettivamente. -- I permessi `user.edit` sono stati divisi in `user.editGroups`, `user.editCredentials` (per email, username, e password), e `user.edit` (per altri attributi). -- Ci sono ora permessi (`bypassTagCounts`) che consentono agli utenti di ignorare i requisiti di conteggio dei tag. -- Flarum ora supporta PHP 7.3 - PHP 8.0, con supporto per PHP 7.2 ufficialmente abbandonato. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b8.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b8.md deleted file mode 100644 index 0bce7f03e..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/update-b8.md +++ /dev/null @@ -1,114 +0,0 @@ -# Updating For Beta 8 - -All extensions will need to be refactored in order to work with beta 8. Here are the main things you will need to do in order to make your extension compatible. - -:::cautela - -This guide is not comprehensive. You may encounter some changes we haven't documented. If you need help, start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## PHP Namespaces - -Beta 8 comes with large changes to the overall structure of the PHP backend. You will need to look through [this list](https://discuss.flarum.org/d/6572-help-us-namespace-changes) of namespace changes and make changes to your extension accordingly. - -[This script](https://gist.github.com/tobyzerner/55e7c05c95404e5efab3a9e43799d375) can help you to automate most of the namespace changes. Of course, you should still test your extension after running the script as it may miss something. - -## Database Naming - -Many database columns and JSON:API attributes have been renamed to conform to a [convention](/contributing.md#database). You will need to update any instances where your extension interacts with core data. You can see the changes in [#1344](https://github.com/flarum/core/pull/1344/files). - -## Extender - -Beta 8 introduces a new concept called **extenders** that replace the most common event listeners. You can learn more about how they work in the [updated extension docs](start.md#extenders). - -`bootstrap.php` has been renamed to `extend.php` and returns an array of extender instances and functions: - -```php -use Flarum\Extend; - -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] -``` - -If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. - -| Event | Extender | -| ------------------------------------- | --------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | - -_\* class no longer exists_ - -## JavaScript Tooling - -Previously Flarum and its extensions used a custom Gulp workflow to compile ES6 source code into something that browsers could understand. Beta 8 switches to a more conventional approach with Webpack. - -You will need to tweak the structure of your extension's `js` directory. Currently, your JS file hierarchy looks something like the following: - -``` -js -├── admin -│ ├── src -│ │ └── main.js -│ ├── dist -│ │ └── extension.js -│ ├── Gulpfile.js -│ └── package.json -└── forum - ├── src - │ └── main.js - ├── dist - │ └── extension.js - ├── Gulpfile.js - └── package.json -``` - -You'll need to make the following changes: - -1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.md#transpilation). - -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. - -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. - -4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. - -If everything went right, your folder structure should look something like this: - -``` -js -├── src -│ ├── admin -│ │ └── index.js -│ └── forum -│ └── index.js -├── dist -│ ├── admin.js -│ ├── admin.js.map -│ ├── forum.js -│ └── forum.js.map -├── admin.js -├── forum.js -├── package.json -└── webpack.config.js -``` - -Take a look at the [bundled extensions](https://github.com/flarum) for more examples. - -## Font Awesome Icons - -Beta 8 upgrades to Font Awesome 5, in which icon class names have changed. The `flarum/helpers/icon` helper now requires the **full Font Awesome icon class names** to be passed, eg. `fas fa-bolt`. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extend/views.md b/i18n/it/docusaurus-plugin-content-docs/current/extend/views.md deleted file mode 100644 index fc4a75a86..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extend/views.md +++ /dev/null @@ -1,63 +0,0 @@ -# Views and Blade - -Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. - -[Blade](https://laravel.com/docs/8.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). [Views](https://laravel.com/docs/8.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. - -For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). - -## Adding Views - -You will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->namespace('acme.hello-world', __DIR__.'/views'), -]; -``` - - -## Blade Templates - -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/8.x/blade). - -Once you've set up your views, you can render them to strings: - -```php -// Here, $view is of type `Illuminate\Contracts\View\Factory` -$renderedString = $view->make('acme.hello-world::greeting')->render(); - -// You can also pass variables to the view: -$renderedString = $view->make('acme.hello-world::greeting', ['varName' => true])->render(); -``` - -You can obtain the view factory instance through dependency injection. - -The format is `"VIEW_NAMESPACE::VIEW_NAME"`. If the view folder is organized as subdirectories, replace `/` with `.` in the pack. So if you have a file at `"forum/error.blade.php"` in a namespace called `"custom-views"`, you would use `"custom-views::forum.error"`. - -Note that all Blade templates rendered this way automatically have access to the following variables: - -- `$url`: a [URL generator](routes#generating-urls) instance. -- `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. -- `$slugManager`: a [SlugManager](slugging) instance. - -Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Serializer/ForumSerializer.php#L19). - -## Overriding Views - -If you want to override templates added by core or extensions, set up a view folder structure matching the one you are trying to override, containing just the files you are trying to override. Then use the `View` extender's `extendNamespace` method: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->extendNamespace('acme.hello-world', __DIR__.'/override_views'); -]; -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extenders.md b/i18n/it/docusaurus-plugin-content-docs/current/extenders.md deleted file mode 100644 index c680b9932..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extenders.md +++ /dev/null @@ -1,23 +0,0 @@ -# Local Extenders - -If there are customizations you want to make to your site without distributing an entire extension, you can do so by using **local extenders**. Each Flarum installation comes with an `extend.php` file where you can add extender instances, just like in a full extension. - -See our [extension documentation](extend/start.md) for more information about extenders (and even an [example of a local extender](extend/start.md#hello-world)). - -If you need to create new files (when adding a custom class to be imported for extenders), you'll need to adjust your composer.json a bit. Add the following: - -```json -"autoload": { - "psr-4": { - "App\\": "app/" - } -}, -``` - -Now you can create new PHP files in an `app` subdirectory using the `App\...` namespace. - -:::tip Local Extenders vs Extensions - -Local extenders can be good for small tweaks, but if you need large customizations, an extension might be a better choice: a separate codebase, cleaner handling of many files, developer tooling, and the ability to easily open source are big benefits. - -::: diff --git a/i18n/it/docusaurus-plugin-content-docs/current/extensions.md b/i18n/it/docusaurus-plugin-content-docs/current/extensions.md deleted file mode 100644 index 36868caa1..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/extensions.md +++ /dev/null @@ -1,118 +0,0 @@ -# Estensioni - -Flarum è minimalista, ma è anche altamente estensibile. In effetti, la maggior parte delle funzionalità fornite con Flarum sono in realtà estensioni! - -Questo approccio rende Flarum estremamente personalizzabile: Puoi disabilitare tutte le funzionalità che non ti servono e installare altre estensioni per rendere il tuo forum perfetto per la tua comunità. - -Per ulteriori informazioni sulla filosofia di Flarum su quali funzionalità includiamo nel core o se stai cercando di creare la tua estensione, consulta la [documentazione estensioni](extend/README.md). Questo articolo si concentrerà sulla gestione delle estensioni dal punto di vista dell'amministratore del forum. - -## Extension Manager - -The extension manager is an extension that comes bundled with Flarum when installed via an archive. It provides a graphical interface for installing and updating both extensions and Flarum itself. - -If you do not have the extension manager installed and you wish to install it, you can do so by running the following command in your Flarum directory: - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -![extension manager admin page](https://github.com/flarum/docs/assets/20267363/d0e1f7a5-e194-4acd-af63-7b8ddd95c26b) - - -## Trovare le estensioni - -Flarum ha un vasto ecosistema di estensioni, molte delle quali sono open source è grautie. Per trovare nuove e fantastiche estensioni, visita il tag [Estensioni](https://discuss.flarum.org/t/extensions) sul forum ufficiale di Flarum. Il non ufficiale [Database estensioni Extiverse](https://extiverse.com/) è anch'esso una valida alternativa. - -## Installare le estensioni - -### Through the interface - -Using the extension manager extension, you can install extensions directly from the admin dashboard. Once you have browsed the list of available extensions from the links above, and found one you want to install, you can install it by entering the extension's composer package name into the extension manager's installation input. - -![Installing an extension](/en/img/install-extension.png) - -### Through the command line - -Proprio come Flarum, le estensioni vengono installate tramite [Composer](https://getcomposer.org), usando SSH. Per installare un estensione: - -1. `cd` nella tua directory Flarum. `cd` fino alla cartella che contiene `composer.json`. Puoi controllare i contenuti della directory tramite `ls -la`. -2. Lancia `composer require COMPOSER_PACKAGE_NAME:*`. Questo solitamente compare nel post o nella documentazione dell'estensione. - -## Gestire le estensioni - -### Through the interface - -Using the extension manager extension, you can update extensions directly from the admin dashboard. You can run a check for updates by clicking the "Check for updates" button in the extension manager. If there are updates available, you can update all extensions by clicking the "Global update" button. Or, you can update individual extensions by clicking the "Update" button next to the extension you want to update. - -![Updating an extension](/en/img/update-extension.png) - -### Through the command line - -Seguire le istruzioni fornite dagli sviluppatori di estensioni. Se stai usando `*` come stringa di versione per le estensioni ([come raccomandato](composer.md)), eseguire i comandi elencati nella guida di aggiornamento di [Flarum](update.md) dovrebbe aggiornare tutte le estensioni. - -## Disinstallazione Delle Estensioni - -### Through the interface - -Using the extension manager extension, you can uninstall extensions directly from the admin dashboard. You can uninstall an extension by clicking the "Uninstall" button next to the extension you want to uninstall inside the extension's page. - -![Uninstalling an extension](/en/img/uninstall-extension.png) - -### Through the command line - -Analogamente all'installazione, per rimuovere un'estensione: - -0. If you want to remove all database tables created by the extension, click the "Purge" button in the admin dashboard. Per maggiori informazioni, vedere [qui sotto](#managing-extensions). -1. `cd` nella tua directory Flarum. -2. Lancia `composer require COMPOSER_PACKAGE_NAME`. Questo solitamente compare nel post o nella documentazione dell'estensione. - -## Gestire le estensioni - -Each individual extension page of the admin dashboard provides a convenient way to manage the extension. Potrai: - -- Enable or disable the extension. -- See the settings provided by the extension, and change them. -- Revert an extension's migrations to remove any database modifications it made (this can be done with the Purge button). Ciò rimuoverà TUTTI i dati associati all'estensione ed è irreversibile. Dovrebbe essere fatto solo quando rimuovi un'estensione e non prevedi di installarla di nuovo. È anche del tutto facoltativo. -- See the extension's README, if it has one. -- See the extension's version. -- Uninstall the extension if the extension manager is installed. - -## Configuring additional extension repository sources - -The extension manager uses `composer` under the hood, and as such, it looks for extension packages in the same places as `composer`. By default, this is [Packagist](https://packagist.org/). However, you can configure additional sources for the extension manager to look for extensions in. This is useful if you want to install an extension that is not available on Packagist. - -In the admin page of the extension manager, clicking the **Add Repository** button will open a modal where you can enter the name and URL of the repository you want to add. The name is just a label for the repository, and can be anything you want. The URL should be the URL of the repository which depends on the type of repository you want to add. - -### Adding a repository from a VCS - -If you want to add a repository from a VCS (e.g. GitHub, GitLab, BitBucket, etc), the URL should be the URL of the repository's VCS. For example, if you had a private GitHub repository at `https://github.com/acme/flarum-extension`, you would enter that URL into the URL field. If it is a private source, you will need to enter an authentication method through the **New authentication method** button. The token can be generated from your VCS provider's website, and the host should be the domain of the VCS provider (e.g. `github.com`). - -### Adding a composer repository - -Extiverse provides access to premium extensions. It is a good example of a composer repository. You would specify the URL as `https://flarum.org/composer/` and the name as `premium`. You would also need to enter an authentication method through the **New authentication method** button. The token can be generated from your Flarum account's [subscriptions](https://flarum.org/dashboard/subscriptions) page with the Instructions button. - -* Type: `HTTP Bearer` -* Host: `flarum.org` - -![Configure repositories](/en/img/config-repositories.png) - -:::info - -The configured repositories and auth methods will be active for both the command line and the admin dashboard. If you configure them from the command line however, you must not include the flag `--global`. - -::: - -## Installing Non-stable extensions - -If for whatever reason you want to install a non-stable extension (e.g. a beta, alpha or RC version) you must first update the **Minimum stability** setting to the wanted stability. - -* If you set it to Alpha, you will be able to install alpha, beta, RC (Release Candidate) and stable versions. -* If you set it to Beta, you will be able to install beta, RC and stable versions. -* If you set it to RC, you will be able to install RC and stable versions. -* If you set it to Stable, you will only be able to install stable versions. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/faq.md b/i18n/it/docusaurus-plugin-content-docs/current/faq.md deleted file mode 100644 index 5a166f573..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/faq.md +++ /dev/null @@ -1,35 +0,0 @@ -# FAQ - -### Flarum è stabile? - -Sì! Dopo 6 anni di sviluppo, Flarum 1.0.0 è finalmente arrivato. - -### Cosa succede dopo la versione stabile di Flarum? - -Stiamo ancora lavorando ad una roadmap formale. Abbiamo molti piani e idee e non vediamo l'ora di condividere un traguardo più approfondito con la community. - -### Posso donare denaro per accelerare lo sviluppo? - -Tutte le donazioni sono ben accette. Puoi effettuarle tramite [Github Sponsors](https://github.com/sponsors/flarum) o [OpenCollective](https://opencollective.com/flarum). - -Tuttavia, le donazioni non avranno un impatto diretto sulla velocità di sviluppo di Flarum. Incoraggiamo inoltre gli utenti a contribuire in altri modi, ad esempio [contribuire al codice](contributing.md), [creare estensioni](/extend/), scrivere documentazione, tradurre Flarum in altre lingue, fornire aiuto e supporto sul [forum](https://discuss.flarum.org/)... - -### Flarum avrà [nome feauture]? Quando? Perchè no? - -Al momento non è possibile, ma speriamo di lavorare su integrazioni come queste in futuro. - -### Perchè non è stato risolto ancora il [nome problema]? - -Anche in questo caso, la risposta è "prima le prime cose". Se non abbiamo ancora risolto un problema (o gli abbiamo assegnato un traguardo), è perché stiamo lavorando a qualcos'altro che è altrettanto importante. Per favore sii paziente; proveremo a farlo prima del rilascio. Oppure, se hai fretta, sentiti libero di aggiustarlo da solo e [contribuire al progetto](contributing.md)! - -### Perchè non è stato risolto ancora il [nome problema]? - -Attualmente non forniamo software di migrazione ufficiali, ma ci sono molte soluzioni della comunità già pronte all'uso. Una volta che siamo sicuri che Flarum è pronto per essere utilizzato in produzione, inizieremo a creare strumenti per importare dati da altri software per forum come esoTalk, FluxBB, phpBB, Discourse e altri. - -### Potrò migrare il mio forum su Flarum? - -> "Attraverso un'arcana e ardua prova, che coinvolge rituali mistici, pericolo di vita e avventure in terre lontane dove molti vanno e pochi tornano." ~ jordanjay29 - -La vera risposta è che generalmente teniamo d'occhio la nostra comunità per i membri eccezionali che potrebbero costituire un buon personale. Onestamente, per la maggior parte del nostro attuale staff, quello che hanno fatto prima di diventare parte del personale non era molto diverso da quello che fanno ora. - -Trova una passione e contribuisci come ritieni sia opportuno. Quindi lasciate che prenda il suo corso. Non devi avere un badge per essere rispettato qui. \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/install.md b/i18n/it/docusaurus-plugin-content-docs/current/install.md deleted file mode 100644 index 112e01ca0..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/install.md +++ /dev/null @@ -1,198 +0,0 @@ -# Installazione - -:::info Una veloce prova su strada? - -Fatti un giro sul nostro [forum di dimostrazione](https://discuss.flarum.org/d/21101) o sulla community verificata italiana [Flarum.it](https://flarum.it). Oppure crea il tuo forum in pochi secondi su [Free Flarum](https://www.freeflarum.com), un servizio gratuito non affiliato al team Flarum. - -::: - -## Requisiti del server - -Prima di installare Flarum, è importante verificare che il tuo server soddisfi i requisiti. Per eseguire Flarum, avrai bisogno di: - -* **Apache** (con mod\_rewrite abilitato) o **Nginx** -* **PHP 7.3+** with the following extensions: curl, dom, fileinfo, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+** o **MariaDB 10.0.5+** -* **SSH (command-line) access** to run potentially necessary software maintenance commands, and Composer if you intend on using the command-line to install and manage Flarum extensions. - -## Installare Flarum - -### Installing by unpacking an archive - -If you don't have SSH access to your server or you prefer not to use the command line, you can install Flarum by unpacking an archive. Below is a list of the available archives, make sure you choose the one that matches your PHP version and public path or lack thereof preference. - -| Flarum Version | PHP Version | Public Path | Type | Archive | -| -------------- | ----------------- | ----------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1.x | 8.3 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.zip) | -| 1.x | 8.3 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | Yes | ZIP | [flarum-v1.x-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.zip) | -| 1.x | 8.2 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.zip) | -| 1.x | 8.2 (recommended) | Yes | ZIP | [flarum-v1.x-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.zip) | -| 1.x | 8.1 | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.tar.gz) | -| 1.x | 8.1 | Yes | TAR.GZ | [flarum-v1.x-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.tar.gz) | -| 1.x | 8.1 | No | ZIP | [flarum-v1.x-no-public-dir-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.zip) | -| 1.x | 8.1 | Yes | ZIP | [flarum-v1.x-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.zip) | -| 1.x | 8.0 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.zip) | -| 1.x | 8.0 (end of life) | Yes | ZIP | [flarum-v1.x-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.zip) | -| 1.x | 7.4 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.zip) | -| 1.x | 7.4 (end of life) | Yes | ZIP | [flarum-v1.x-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.zip) | -| 1.x | 7.3 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.zip) | -| 1.x | 7.3 (end of life) | Yes | ZIP | [flarum-v1.x-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.zip) | - -### Installing using the Command Line Interface - -Flarum usa [Composer](https://getcomposer.org) per gestire le sue dipendenze ed estensioni. Prima di installare Flarum, sar� necessario [installare Composer](https://getcomposer.org) sulla tua macchina. Successivamente, esegui questo comando in una cartella vuota in cui desideri installare Flarum: - -```bash -compositore create-project flarum/flarum . -``` - -Mentre questo comando è in esecuzione, puoi configurare il tuo server web. Dovrai assicurarti che il tuo webroot sia impostato su `/percorso/del/tuo/forum/public`, e impostare [URL Rewriting](#url-rewriting) come descritto qui sotto. - -Quando tutto è pronto, accedi al tuo forum in un browser web e segui le istruzioni a video per completare l'installazione - -If you wish to install and update extensions from the admin dashboard, you need to also install the [Extension Manager](extensions.md) extension. - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -## Riscrittura URL - -### Apache - -Flarum include un file `.htaccess` nella cartella `public` – assicurati che sia stato caricato correttamente. **Flarum non funzionerà correttamente se `mod_rewrite` non è abilitato o il file `.htaccess` non è accessibile.** Assicurati di verificare con il tuo provider di hosting (o il tuo VPS) che queste funzionalità siano abilitate. Se gestisci il tuo server, potresti dover aggiungere quanto segue alla configurazione del tuo sito per abilitare i file `.htaccess`. - -``` - - AllowOverride All - -``` - -Ciò garantisce che gli override di htaccess siano consentiti in modo che Flarum possa riscrivere correttamente gli URL. - -I metodi per abilitare `mod_rewrite` dipendono dal tuo OS. Puoi abilitarli eseguendo `sudo a2enmod rewrite` su Ubuntu. `mod_rewrite` è abilitato di default su CentOS. Non dimenticare di riavviare Apache dopo aver apportato modifiche! - -### Nginx - -Flarum include il file `.nginx.conf` – assicurati che sia caricato correttamente. Quindi, supponendo che tu abbia un sito PHP impostato all'interno di Nginx, aggiungi quanto segue al blocco di configurazione del tuo server: - -```nginx -include /path/to/flarum/.nginx.conf; -``` - -### Caddy - -Caddy richiede una configurazione molto semplice affinché Flarum funzioni correttamente. Nota che devi sostituire l'URL con il tuo URL e il percorso con il tuo percorso della cartella `public`. Se stai usando una versione diversa di PHP, dovrai anche cambiare il percorso del file `fastcgi` per puntare al socket o all'URL di installazione PHP corretto. - -``` -www.example.com { - root * /var/www/flarum/public - php_fastcgi unix//var/run/php/php7.4-fpm.sock - header /assets/* { - +Cache-Control "public, must-revalidate, proxy-revalidate" - +Cache-Control "max-age=25000" - Pragma "public" - } - file_server -} -``` -## Proprietà della cartella - -Durante l'installazione, Flarum potrebbe richiedere di rendere scrivibili alcune directory. Modern operating systems are generally multi-user, meaning that the user you log in as is not the same as the user Flarum is running as. The user that Flarum is running as MUST have read + write access to: - -- The root install directory, so Flarum can edit `config.php`. -- The `storage` subdirectory, so Flarum can edit logs and store cached data. -- The `assets` subdirectory, so that logos and avatars can be uploaded to the filesystem. - -Extensions might require other directories, so you might want to recursively grant write access to the entire Flarum root install directory. - -There are several commands you'll need to run in order to set up file permissions. Please note that if your install doesn't show warnings after executing just some of these, you don't need to run the rest. - -First, you'll need to allow write access to the directory. On Linux: - -```bash -chmod 775 -R /path/to/directory -``` - -If that isn't enough, you may need to check that your files are owned by the correct group and user. By default, in most Linux distributions `www-data` is the group and user that both PHP and the web server operate under. You'll need to look into the specifics of your distro and web server setup to make sure. You can change the folder ownership in most Linux operating systems by running: - -```bash -chown -R www-data:www-data /path/to/directory -``` - -With `www-data` changed to something else if a different user/group is used for your web server. - -Additionally, you'll need to ensure that your CLI user (the one you're logged into the terminal as) has ownership, so that you can install extensions and manage the Flarum installation via CLI. To do this, add your current user (`whoami`) to the web server group (usually `www-data`) via `usermod -a -G www-data YOUR_USERNAME`. You will likely need to log out and back in for this change to take effect. - -Finally, if that doesn't work, you might need to configure [SELinux](https://www.redhat.com/en/topics/linux/what-is-selinux) to allow the web server to write to the directory. To do so, run: - -```bash -chcon -R -t httpd_sys_rw_content_t /path/to/directory -``` - -To find out more about these commands as well as file permissions and ownership on Linux, read [this tutorial](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). If you are setting up Flarum on Windows, you may find the answers to [this Super User question](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) useful. - -:::caution Environments may vary - -Your environment may vary from the documentation provided, please consult your web server configuration or web hosting provider for the proper user and group that PHP and the web server operate under. - -::: - -:::danger Never use permission 777 - -You should never set any folder or file to permission level `777`, as this permission level allows anyone to access the content of the folder and file regardless of user or group. - -::: - -## Personalizzare i percorsi - -By default Flarum's directory structure includes a `public` directory which contains only publicly-accessible files. This is a security best-practice, ensuring that all sensitive source code files are completely inaccessible from the web root. - -However, if you wish to host Flarum in a subdirectory (like `yoursite.com/forum`), or if your host doesn't give you control over your webroot (you're stuck with something like `public_html` or `htdocs`), you can set up Flarum without the `public` directory. - -If you intend to install Flarum using one of the archives, you can simply use the `no-public-dir` (Public Path = No) [archives](#installing-by-unpacking-an-archive) and skip the rest of this section. If you're installing via Composer, you'll need to follow the instructions below. - -Simply move all the files inside the `public` directory (including `.htaccess`) into the directory you want to serve Flarum from. Then edit `.htaccess` and uncomment lines 9-15 in order to protect sensitive resources. For Nginx, uncomment lines 8-11 of `.nginx.conf`. - -You will also need to edit the `index.php` file and change the following line: - -```php -$site = require './site.php'; -``` - - Edit the `site.php` and update the paths in the following lines to reflect your new directory structure: - -```php -'base' => __DIR__, -'public' => __DIR__, -'storage' => __DIR__.'/storage', -``` - -Finally, check `config.php` and make sure the `url` value is correct. - -## Importazione dati da altro forum - -If you have an existing community and don't want to start from scratch, you may be able to import your existing data into Flarum. While there are no official importers yet, the community has made several unofficial importers: - -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) - -These can be used for other forum software as well by migrating to phpBB first, then to Flarum. Be aware that we can't guarantee that these will work nor can we offer support for them. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/internal/README.md b/i18n/it/docusaurus-plugin-content-docs/current/internal/README.md deleted file mode 100644 index ff153a3bc..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/internal/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -slug: '/internal' ---- - -# Internal Team Docs - -This is a new documentation section, where we will be posting some docs used internally by the Flarum team. We are starting this section to provide our community with transparency as to how Flarum is run, and to help those hoping to contribute to Flarum. \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md b/i18n/it/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md deleted file mode 100644 index 555e7977c..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bundled Extensions Policy - -This document is to assist in deciding what core features should be bundled or maintained by the Flarum project team. - -Understand that Flarum aims to have a lean and efficient team. To guarantee a transparent workload, we intentionally have a "this could be an extension" mentality. The acronym D.O.R.C. spells out our decision-making process. - -- **Density**: prevent bloating Flarum so that it becomes a burden to install on shared hosting plans with limited space. -- **Opinionatedness**: no extensions should be bundled that is only useful by only a limited amount of communities or on specific hosting environments. -- **Responsibility**: extensions that could easily be maintained by others should be maintained by others. -- **Complexity**: extensions that are complex in terms of design, frontend or backend code should not be a responsibility of the Flarum project team. - -### Density - -To prevent the installation size of Flarum from continuously increasing we need to protect it from extensions that bloat it. We should ship extensions with Flarum that, for instance, have kilobytes in media files. - -### Opinionatedness - -Our goal is to allow installation of Flarum, in its vanilla form, by any community on any hosting environment. This includes shared hosting environment as well. - -Releasing Flarum with extensions that add functionality specific to cloud based (AWS) installations or for corporate support communities, as such, is unwanted. - -### Responsibility - -Protecting the time of the project team is key. To do so we should empower the ecosystem in building extensions that it needs. Therefor we distance ourselves from the responsibility of building every and all extensions. The responsibility of extension development is held primarily by our community. - -### Complexity - -Complex extensions require a vast amount of time, not just for development, but also documentation and support. To protect the lean and efficient principles of the team, we will not take ownership of extensions that add this complexity. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/internal/extension-manager.md b/i18n/it/docusaurus-plugin-content-docs/current/internal/extension-manager.md deleted file mode 100644 index c6ef1c890..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/internal/extension-manager.md +++ /dev/null @@ -1,87 +0,0 @@ -# Extension Manager -This contains an explanation of how the extension manager works and what it has to offer. - -slightly outdated: see [the extensions guide for more](/extensions.md). - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the extension manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the extension manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Extension Manager Queue Table Preview](/en/img/extension-manager-queue.png) - -## TODO -- Try on shared hosting. -- Better explanation on the UI about background tasks. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/internal/merging-policy.md b/i18n/it/docusaurus-plugin-content-docs/current/internal/merging-policy.md deleted file mode 100644 index 067e2809f..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/internal/merging-policy.md +++ /dev/null @@ -1,38 +0,0 @@ -# PR Merging Policy - -Technical contributions to the Flarum source code go through a review process. Over the years we have tuned this process based on our experiences, our targeted development speed and availability. - -## What makes a great Pull Request? - -Great pull requests: - -- Have the [Pull Request template](https://github.com/flarum/.github/blob/main/PULL_REQUEST_TEMPLATE.md) filled out completely when opening a pull request. -- Do not combine different changes. Although tempting, don't change formatting of unrelated code. Stick to the one feature or change you wish to contribute. -- Have a related issue where the technical implementation has been agreed upon by the core team, or has been approved on by the core team through discussion on the official forums or other channels like Discord. -- Clearly explain the need for the change and list the areas where the pull request requires discussion. - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. We usually find several commits from bots like StyleCI in these prefabricated commit messages, their commit messages should be removed. - -- After merging: - - Assign the related issue (if none exists, the pull request itself, but never both) to the appropriate milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/it/docusaurus-plugin-content-docs/current/internal/merging.md b/i18n/it/docusaurus-plugin-content-docs/current/internal/merging.md deleted file mode 100644 index 0408b1bee..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/internal/merging.md +++ /dev/null @@ -1,29 +0,0 @@ -# PR Merging Workflow - - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all of the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. - -- After merging: - - Make sure the *issue* (if none exists, the PR - but not both) belongs to the appropriate milestone and project board. - - PRs in extensions cannot be assigned to core milestones, so create a core issue that references it and add it to the milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/it/docusaurus-plugin-content-docs/current/internal/package-manager.md b/i18n/it/docusaurus-plugin-content-docs/current/internal/package-manager.md deleted file mode 100644 index 823599db5..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/internal/package-manager.md +++ /dev/null @@ -1,89 +0,0 @@ -# Package Manager -This contains an explanation of how the package manager works and what it has to offer. - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the package manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the package manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Package Manager Queue Table Preview](/en/img/package-manager-queue.png) - -## TODO -- Try on shared hosting. -- Composer command job must not overlap. -- Code TODOs. -- Better explanation on the UI about background tasks. -- Take into consideration a scenario where we're updating an extension that isn't a root required dependency, like bundles. -- Run one background task at a time, prevent user from triggering multiple tasks. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/languages.md b/i18n/it/docusaurus-plugin-content-docs/current/languages.md deleted file mode 100644 index cd0fcb21a..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/languages.md +++ /dev/null @@ -1,29 +0,0 @@ -# Lingue - -È facile aggiungere una nuova lingua all'installazione di base di Flarum. Segui le istruzioni seguenti per scaricare e installare il language pack di tua scelta. - -Dopo aver aggiunto un language pack, puoi [impostarlo come lingua principale](#setting-the-default-language) del tuo forum.E se ti accorgi di non aver bisogno di uno dei tuoi language pack installati, puoi sempre [disabilitarlo](#disabling-a-language-pack). E se non hai mai bisogno di uno dei language pack installati, puoi sempre [disattivarlo](#disabling-a-language-pack). Se stai utilizzando estensioni di terze parti, assicurati di [leggere qui](#third-party-extensions) prima di iniziare. - -## Installazione language pack - -Per iniziare, visita il tag [Extensions > Languages](https://discuss.flarum.org/t/languages) nella community di FLarum, e carca il language pack che vuoi installare. - -I language pack vengono installati con lo stesso metodo utilizzato per le [estensioni](extensions.md). La lingua verrà visualizzata nella pagina Estensioni dell'interfaccia di amministrazione e potrai attivarla da lì. - -Questo è tutto quelo che devi fare! Ora dovresti essere in grado di utilizzare il selettore della lingua nell'intestazione del tuo sito per cambiare la visualizzazione del forum nella nuova lingua. - -## Impostare lingua di default - -Dopo aver installato un language pack e verificato che funzioni, potresti volerlo impostare come lingua predefinita per i nuovi utenti e ospiti. Potrai farlo nel pannello amministrazione sotto la voce **Impostazioni di Base**. - -## Disabilitare un Language Pack - -Se decidi di non aver bisogno di una determinata lingua, dopotutto, puoi disattivarla. Individua semplicemente il language pack fra le tue **Estensioni** nel pannello di amministrazione, e disabilitala. - -La disattivazione di una lingua può essere utile se gestisci un sito monolingue e non desideri che il selettore della lingua venga visualizzato nell'intestazione del sito. Il selettore della lingua è nascosto quando è abilitata una sola lingua. - -## Estensioni della community - -Sebbene i language pack scaricati dal sito della community di Flarum includano generalmente traduzioni per tutte le estensioni fornite in bundle con Flarum, di regola non saranno tradotte le estensioni di terze parti che potresti aver installato. Spetta agli sviluppatori fornire e mantenere le traduzioni per le loro estensioni. - -Pertanto, prima di installare un'estensione della community, è necessario verificare che includa le traduzioni nella lingua di tuo interesse. Se scopri che un'estensione non supporta una lingua di cui hai bisogno, contatta direttamente lo sviluppatore e fai in modo che vengano aggiunte le traduzioni necessarie, o utilizza un estensione per tradurle tu stesso. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/mail.md b/i18n/it/docusaurus-plugin-content-docs/current/mail.md deleted file mode 100644 index 9fd59c479..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/mail.md +++ /dev/null @@ -1,29 +0,0 @@ -# Configurazione Email - -Qualsiasi comunità necessita di inviare e-mail per consentire la verifica, reimpostazioni della password, notifiche e altre comunicazioni agli utenti. Configurare il tuo forum per l'invio di email dovrebbe essere uno dei tuoi primi passi come amministratore: una configurazione errata causerà errori quando gli utenti tenteranno di registrarsi. - -## Driver disponibili - -Flarum fornisce diversi driver di default, e sono elencati e spiegati di seguito. Gli sviluppatori inoltre possono anche aggiungere [driver personalizzati tramite estensioni](extend/mail.md). - -### SMTP - -Questo è probabilmente il driver di posta elettronica più comunemente utilizzato, che consente di configurare un host, una porta / crittografia, un nome utente e una password per un servizio SMTP esterno. Nel campo crittografia sarà possibile utilizzare solamente `ssl` o `tls`. - -### Mail - -Il driver `mail` proverà a utilizzare il sistema di posta sendmail / postfix incluso in molti server di hosting. Devi installare e configurare correttamente sendmail sul tuo server affinché funzioni. - -### Mailgun - -Questo driver utilizza il tuo account [Mailgun](https://www.mailgun.com/) per inviare email. Avrai bisogno di una chiave segreta, così come il dominio e la regione reperibili dalla configurazione della tua mailgun. - -Per utilizzare il driver mailgun, è necessario installare il pacchetto Guzzle (un client HTTP PHP). Puoi farlo eseguendo `composer require guzzlehttp/guzzle:^6.0|^7.0` nella tua directory principale di Flarum. - -### Log - -Il driver Log NON INVIA EMAIL,ed è utilizzato principalmente dagli sviluppatori. Scrive il contenuto di qualsiasi messaggio di posta elettronica nel file di registro in `DIRECTORY_PRINCIPALE_FLARUM/storage/logs`. - -## Email di prova - -Dopo aver salvato una configurazione di posta elettronica, è possibile fare clic sul pulsante "Invia mail di prova" nella pagina Posta del pannello di amministratore per assicurarti che la tua configurazione funzioni. Se visualizzi un errore o non ricevi un'email, modifica la configurazione e riprova. Assicurati di controllare lo spam se non ci sono errori e se non viene visualizzato nulla nella tua posta in arrivo. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/releases.md b/i18n/it/docusaurus-plugin-content-docs/current/releases.md deleted file mode 100644 index 7c007fcc7..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/releases.md +++ /dev/null @@ -1,15 +0,0 @@ -# Note di rilascio - - - - -Le note di rilascio possono essere trovate facilmente nel [Forum di Flarum](https://discuss.flarum.org/t/blog?sort=newest). diff --git a/i18n/it/docusaurus-plugin-content-docs/current/rest-api.md b/i18n/it/docusaurus-plugin-content-docs/current/rest-api.md deleted file mode 100644 index 7e91238d3..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/rest-api.md +++ /dev/null @@ -1,375 +0,0 @@ -# Consuming the REST API - -Flarum exposes a REST API which is used by the single page application but also available for external scripts. - -The API follows the best practices defined by the [JSON:API](https://jsonapi.org/) specification. - -:::info - -To extend the REST API with new endpoints, see [API and Data Flow](extend/api.md) in the developer documentation. - -::: - -## Authentication - -The single page app uses session cookies to authenticate against the API. External scripts can use stateless authentication using [API Keys](#api-keys) or [Access Tokens](#access-tokens). - -`GET` endpoints can be used without authentication. Only content visible to guests will be returned. Other endpoints generally cannot be used without authentication because of the [CSRF protection](#csrf-protection). - -### API keys - -API Keys are the primary way for scripts, tools and integrations to interact with Flarum. - -#### Creation - -There is currently no UI to manage API Keys, but they can be created manually in the `api_keys` table of the database. - -The following attributes can be filled: - -- `key`: Generate a long unique token (recommended: alpha-numerical, 40 characters) and set it here, this will be the token used in the `Authorization` header. -- `user_id`: Optional. If set, the key can only be used to act as the given user. - -The remaining attributes are either automatically filled or currently not used: - -- `id`: Will be filled by MySQL auto-increment. -- `allowed_ips`: Not implemented. -- `scopes`: Not implemented. -- `created_at`: Can be set to any date, but is meant for the date of creation of the key. -- `last_activity_at`: Will be updated automatically when the token is used. - -#### Usage - -Attach your key value to each API request using the `Authorization` header. Then provide the user ID you want to interact as at the end of the header: - - Authorization: Token YOUR_API_KEY_VALUE; userId=1 - -If a `user_id` value has been set for the key in the database, `userId=` will be ignored. Otherwise, it can be set to any valid user ID that exists in the database. - -### Access Tokens - -Access Tokens are short-lived tokens that belong to a specific user. - -Those tokens are used behind the scenes for cookie sessions. Their use in stateless API requests has the same effect as a regular session. The user last activity will be updated each time the token is used. - -#### Creation - -All users are allowed to create access tokens. To create a token, use the `/api/token` endpoint with the credentials of your user: - -``` -POST /api/token HTTP/1.1 - -{ - "identification": "Toby", - "password": "pass7word" -} - -HTTP/1.1 200 OK - -{ - "token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX", - "userId": "1" -} -``` - -At the moment, 3 token types exist, although only 2 types can be created via the REST API. - -- `session` tokens expire after 1h of inactivity. This is the default token type. -- `session_remember` tokens expire after 5 years of inactivity. They can be obtained by specifying `remember=1` in the request attributes. -- `developer` tokens never expire. They can only be created manually in the database at the moment. - -**All access tokens are deleted when the user logs out** (this includes `developer` tokens, although it is planned to change it). - -#### Usage - -Attach the returned `token` value to each API request using the `Authorization` header: - - Authorization: Token YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX - -### CSRF Protection - -Most of the `POST`/`PUT`/`DELETE` API endpoints are protected against [Cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery). This means stateless requests are not possible without authentication. - -When using an API Key or Access Token, CSRF protection is bypassed. - -## Endpoints - -This part of the documentation is still in progress. We are researching options to provide an automated documentation of the endpoints. - -Every extension adds new endpoints and attributes so it's difficult to provide a complete documentation of all endpoints. A good way to discover endpoints is to use the browser development tools to inspect requests made by the single page application. - -Below are a few examples of commonly used endpoints. JSON has been truncated to make reading easier. - -### List discussions - - GET /api/discussions - -```json -{ - "links": { - "first": "https://flarum.tld/api/discussions", - "next": "https://flarum.tld/api/discussions?page%5Boffset%5D=20" - }, - "data": [ - { - "type": "discussions", - "id": "234", - "attributes": { - "title": "Lorem Ipsum", - "slug": "234-lorem-ipsum", - "commentCount": 10, - "participantCount": 3, - "createdAt": "2022-01-01T10:20:30+00:00", - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "lastPostNumber": 10, - "canReply": true, - "canRename": true, - "canDelete": true, - "canHide": true, - "isHidden": true, - "hiddenAt": "2022-01-06T10:20:30+00:00", - "lastReadAt": "2022-01-02T10:20:30+00:00", - "lastReadPostNumber": 2, - "isApproved": true, - "canTag": true, - "isLocked": false, - "canLock": true, - "isSticky": false, - "canSticky": true, - "canMerge": true, - "subscription": null - }, - "relationships": { - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - "lastPostedUser": { - "data": { - "type": "users", - "id": "64" - } - }, - "tags": { - "data": [ - { - "type": "tags", - "id": "3" - } - ] - }, - "firstPost": { - "data": { - "type": "posts", - "id": "668" - } - } - } - }, - { - "type": "discussions", - "id": "234", - "attributes": { - // [...] - }, - "relationships": { - // [...] - } - }, - // [...] more discussions - ], - "included": [ - { - "type": "users", - "id": "1", - "attributes": { - "username": "Admin", - "displayName": "Admin", - "avatarUrl": null, - "slug": "1" - } - }, - { - "type": "users", - "id": "64", - "attributes": { - "username": "Flarum", - "displayName": "Flarum", - "avatarUrl": "https://flarum.tld/assets/avatars/Z4hEncw0ndVqZ8be.png", - "slug": "64" - } - }, - { - "type": "tags", - "id": "3", - "attributes": { - "name": "Welcome", - "description": "Post interesting things here", - "slug": "welcome", - "color": "#888", - "backgroundUrl": null, - "backgroundMode": null, - "icon": "fas fa-bullhorn", - "discussionCount": 30, - "position": 1, - "defaultSort": null, - "isChild": false, - "isHidden": false, - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "canStartDiscussion": true, - "canAddToDiscussion": true, - "isRestricted": false - } - }, - { - "type": "posts", - "id": "668", - "attributes": { - "number": 1, - "createdAt": "2022-01-01T10:20:30+00:00", - "contentType": "comment", - "contentHtml": "

Hello World

" - } - }, - // [...] more includes for the other discussions - ] -} -``` - -### Create discussion - - POST /api/discussions - -```json -{ - "data":{ - "type": "discussions", - "attributes": { - "title": "Lorem Ipsum", - "content": "Hello World" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "1" - } - ] - } - } - } -} -``` - -The response includes the ID of the new discussion: - -```json -{ - "data": { - "type": "discussions", - "id": "42", - "attributes": { - "title": "Lorem Ipsum", - "slug": "42-lorem-ipsum", - "commentCount": 1 - // [...] other attributes - }, - "relationships": { - "posts": { - "data": [ - { - "type": "posts", - "id": "58" - } - ] - }, - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - // [...] other relationships - } - }, - "included":[ - { - "type": "posts", - "id": "38", - "attributes": { - "number": 1, - "contentType": "comment", - "contentHtml": "\u003Cp\u003EHello World\u003C\/p\u003E" - // [...] other attributes - } - } - // [...] other includes - ] -} -``` - -### Create user - - POST /api/users - -```json -{ - "data": { - "attributes": { - "username": "Flarum", - "email": "flarum@example.com", - "password": "correcthorsebatterystaple" - } - } -} -``` - -## Errors - -Flarum uses various HTTP status code and includes error descriptions that follow the [JSON:API error spec](https://jsonapi.org/format/#errors). - -Below are a few common errors you might encounter when using the REST API: - -### CSRF Token Mismatch - -If you receive a 400 HTTP error with `csrf_token_mismatch` message, it means the `Authorization` header is absent or invalid and Flarum attempted to authenticate through the session cookie. - -```json -{ - "errors": [ - { - "status": "400", - "code": "csrf_token_mismatch" - } - ] -} -``` - -### Validation errors - -Validation errors are returned with 422 HTTP status code. The name of the invalid field is returned as the `pointer` value. There can be multiple errors for a single field at the same time. - -```json -{ - "errors": [ - { - "status": "422", - "code": "validation_error", - "detail": "The username has already been taken.", - "source":{ - "pointer":"\/data\/attributes\/username" - } - }, - { - "status": "422", - "code": "validation_error", - "detail": "The email has already been taken.", - "source": { - "pointer":"\/data\/attributes\/email" - } - } - ] -} -``` diff --git a/i18n/it/docusaurus-plugin-content-docs/current/scheduler.md b/i18n/it/docusaurus-plugin-content-docs/current/scheduler.md deleted file mode 100644 index 6123ce7c3..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/scheduler.md +++ /dev/null @@ -1,55 +0,0 @@ -# Scheduler - -The Flarum scheduler allows extensions to automate certain tasks effortlessly. In this guide we will see how to set it up. We won't go into the details of cron itself, but if you want to read more about it, I suggest you take a look at [this Wikipedia article](https://en.wikipedia.org/wiki/Cron) on cron. - -## Why should I care? - -Quite simply, a growing list of extensions now support handling certain functions automatically for you, completely behind the scenes. Wondering why `fof/drafts` 'scheduled drafts' are not posting, or `fof/best-answer` 'remind users to set a best answer after X days' does not fire? That'll be because they will setup themselves with the scheduler service, but without a one-liner cron job, nothing will happen! - -## What extensions currently use the scheduler? - -Some of the most popular examples are the following: - -- [FoF Best Answer](https://github.com/FriendsOfFlarum/best-answer) -- [FoF Drafts](https://github.com/FriendsOfFlarum/drafts) -- [FoF Sitemap](https://github.com/FriendsOfFlarum/sitemap) -- [FoF Open Collective](https://github.com/FriendsOfFlarum/open-collective) -- [FoF Github Sponsors](https://github.com/FriendsOfFlarum/github-sponsors) - -## Ok, let's get this setup! - -Most (if not all) Linux distros either come with, or can have, cron installed. For example, on Debian and Ubuntu based systems, you can install `cron` like this: - -``` -sudo apt-get update -sudo apt-get install cron -``` - -In case you are using a RHEL based Linux distribution (CentOS, AlmaLinux, Rocky Linux...), install cron like this: - -``` -sudo dnf update -sudo dnf install crontabs -``` - -Once you have cron installed, let's create the one and only entry you need for Flarum: - -``` -crontab -e -``` - -This will open the cron editor. You may or may not have other entries there. Add this line, and remember to leave an empty line at the bottom. - -``` -* * * * * cd /path-to-your-project && php flarum schedule:run >> /dev/null 2>&1 -``` - -`* * * * *` tells cron to run your command every minute. - -In case you want to use a different value and don't know exactly how cron expressions work, you can use a [cron expression generator](https://crontab.guru) to easily get the desired string. - -`cd /path-to-your-project && php flarum schedule:run` executes Flarum's scheduler to trigger any tasks currently waiting to be run. If PHP isn't in your system's path, you may need to experiment with setting the full path to PHP. - -Lastly `>> /dev/null 2>&1` suppresses any output from the command. - -Voila! Now any extension that registers a task to run, anything from every minute to daily, monthly, yearly - whatever - will now run on your server. diff --git a/i18n/it/docusaurus-plugin-content-docs/current/themes.md b/i18n/it/docusaurus-plugin-content-docs/current/themes.md deleted file mode 100644 index 8c0aa5053..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/themes.md +++ /dev/null @@ -1,29 +0,0 @@ -# Aspetto e Temi - -Anche se abbiamo lavorato duramente per rendere Flarum il più bello possibile, ogni comunità probabilmente vorrà apportare alcune modifiche grafiche o di stile per adattarlo alle proprie esigenze. - -## Pannello di amministrazione - -The [admin dashboard](admin.md)'s Appearance page is a great first place to start customizing your forum. Da qui infatti si può: - -- Scegliere i colori principali del forum -- Attivare o meno la dark mode e scegliere il colore dell'header -- Caricare il tuo logo e favicon (l'icona visualizzata ai browser) -- Aggiungere html per personalizare header e footer -- Aggiungere [LESS/CSS](#css-theming) per cambiare la visualizzazione degli elementi - -## Il CSS nei temi - -CSS è un linguaggio per fogli di stile che indica ai browser come visualizzare gli elementi di una pagina web. Ci consente di modificare qualsiasi cosa, dai colori ai caratteri, alla dimensione degli elementi e al posizionamento delle animazioni. L'aggiunta di CSS personalizzati può essere un ottimo modo per modificare l'aspetto di Flarum in modo che corrisponda al tema del tuo sito. - -Un tutorial CSS va oltre lo scopo di questa documentazione, ma ci sono molte ottime risorse online per apprendere le basi dei fogli di stile. - -:::tip - -Flarum utilizza LESS, il che rende più facile scrivere CSS consentendo variabili, condizionali e funzioni. - -::: - -## Estensioni - -La flessibilità di Flarum nel [sistema di estensioni](extensions.md) ti consente di aggiungere, rimuovere o modificare praticamente ogni parte di Flarum. Se si desidera apportare modifiche sostanziali ai temi oltre a cambiare colori / dimensioni / stili, un'estensione personalizzata è sicuramente la strada da percorrere. Per sapere come creare un'estensione, dai un'occhiata alla [documentazione sulle estensioni](extend/README.md)! diff --git a/i18n/it/docusaurus-plugin-content-docs/current/troubleshoot.md b/i18n/it/docusaurus-plugin-content-docs/current/troubleshoot.md deleted file mode 100644 index 0a287f292..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/troubleshoot.md +++ /dev/null @@ -1,56 +0,0 @@ -# Risoluzione dei problemi - -Se Flarum non si installa o non funziona come previsto, la prima cosa da fare è controllare di nuovo se il proprio ambiente soddisfa [i requisiti necessari](install.md#server-requirements). Se ti manca qualcosa che è necessaria per l'esecuzione di Flarum, dovrai prima rimediare. - -Successivamente, dovresti impiegare alcuni minuti per cercare nel [Forum di supporto](https://discuss.flarum.org/t/support) e nell' [issue tracker](https://github.com/flarum/core/issues). È possibile che qualcuno abbia già segnalato il problema e una soluzione sia disponibile o in arrivo. Se hai cercato a fondo e non riesci a trovare alcuna informazione sul problema, è ora di iniziare la risoluzione dei problemi. - -## Step 0: Activate debug mode - -:::danger Salta in produzione - -Questi strumenti di debug sono molto utili, ma possono esporre informazioni che non dovrebbero essere pubbliche. These are fine if you're on a staging or development environment, but if you don't know what you're doing, skip this step when on a production environment. - -::: - -Prima di procedere, dovresti abilitare gli strumenti di debug di Flarum. Apri semplicemente il file **config.php** con un editor di testo, modifica il valore `debug` su `true`, e salva il file. uesto farà sì che Flarum visualizzi messaggi di errore dettagliati, dandoti un'idea di cosa non va. - -Se hai visto pagine vuote e la modifica sopra non aiuta, prova a impostare `display_errors` su `On` nel file di configurazione **php.ini**. - -## Step 1: Correzioni comuni - -A lot of issues can be fixed with the following: - -* Pulisci la cache del browser -* Pulisci la cache del backend con il comando [`php flarum cache:clear`](console.md). -* Assicurati che il tuo database sia aggiornato con il comando [`php flarum migrate`](console.md). -* Assicurati che [la configurazione email](mail.md) nel tuo pannello di amministrazione sia corretta: una configurazione e-mail non valida causerà errori durante la registrazione, la reimpostazione di una password, la modifica delle e-mail e l'invio di notifiche. -* Controlla che il tuo file `config.php` sia corretto. Ad esempio, assicurati di utilizzare un `url` corretto. -* One potential culprit could be a custom header, custom footer, or custom LESS. If your issue is in the frontend, try temporarily removing those via the Appearance page of the admin dashboard. - -Dovrai anche dare un'occhiata all'output di [`php flarum info`](console.md) per assicurarti che nulla di importante sia fuori posto. - -## Step 2: Riproduci il problema - -Prova a far sì che il problema si ripresenti. Presta molta attenzione a ciò che stai facendo quando si verifica. Succede ogni volta o solo di tanto in tanto? Prova a cambiare un'impostazione che ritieni possa influire sul problema o l'ordine in cui stai facendo le cose. Succede in alcune condizioni, ma non in altre? - -Se hai recentemente aggiunto o aggiornato un'estensione, dovresti disabilitarla temporaneamente per vedere se questo risolve il problema. Assicurati che tutte le tue estensioni siano destinate ad essere utilizzate con la versione di Flarum che stai utilizzando. Le estensioni obsolete possono causare una serie di problemi. - -Da qualche parte lungo la strada potresti avere un'idea di cosa sta causando il tuo problema e trovare un modo per risolverlo. Ma anche se ciò non accade, probabilmente ti imbatterai in alcuni preziosi indizi che ci aiuteranno a capire cosa sta succedendo, una volta che avrai presentato la tua segnalazione di bug. - -## Step 3: Raccogli informazioni - -Se sembra che avrai bisogno di aiuto per risolvere il problema, è ora di fare sul serio nella raccolta dei dati. Cerca messaggi di errore o altre informazioni sul problema nei seguenti punti: - -* Visualizzato nella pagina attuale -* Visualizzato nella console del browser (Chrome: More tools -> Developer Tools -> Console) -* Registrato nel registro degli errori del server (es. `/var/log/nginx/error.log`) -* Registrato nel log PHP-FPM's (es. `/var/log/php7.x-fpm.log`) -* Registrato da Flarum (`storage/logs/flarum.log`) - -Copia i messaggi in un file di testo e prendi nota di quando si è verificato l'errore, cosa stavi facendo in quel momento e così via. Assicurati di includere tutti gli approfondimenti che potresti aver raccolto sulle condizioni in cui il problema si verifica e non si verifica. Aggiungi quante più informazioni possibili sul tuo ambiente server: versione del sistema operativo, versione del server web, versione e gestore di PHP, ecc. - -## Step 4: Prepara un report - -Dopo aver raccolto tutte le informazioni possibili sul problema, sei pronto per presentare una segnalazione di bug. Si prega di seguire le istruzioni [per segnalare bug](bugs.md). - -Se scopri qualcosa di nuovo sul problema dopo aver inviato la segnalazione, aggiungi tali informazioni in fondo al tuo post originale. È una buona idea presentare un rapporto anche se hai risolto il problema da solo, poiché anche altri utenti potrebbero trarre vantaggio dalla tua soluzione. Se hai trovato una soluzione temporanea al problema, assicurati mettercene a conoscenza. \ No newline at end of file diff --git a/i18n/it/docusaurus-plugin-content-docs/current/update.md b/i18n/it/docusaurus-plugin-content-docs/current/update.md deleted file mode 100644 index fde68ef57..000000000 --- a/i18n/it/docusaurus-plugin-content-docs/current/update.md +++ /dev/null @@ -1,110 +0,0 @@ -# Aggiornare la versione di Flarum - -## From the Admin Dashboard - -:::info - -If you have the extension manager extension installed you can simply run the update from its interface and skip this page entirely. - -::: - ---- - -To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. - -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. - -## General Steps - -**Step 1:** Make sure all your extensions have versions compatible with the Flarum version you're trying to install. This is only needed across major versions (e.g. you probably don't need to check this if upgrading from v1.0.0 to v1.1.0, assuming your extensions follow recommended versioning). You can check this by looking at the extension's [Discuss thread](https://discuss.flarum.org/t/extensions), searching for it on [Packagist](http://packagist.org/), or checking databases like [Extiverse](https://extiverse.com). You'll need to remove (not just disable) any incompatible extensions before updating. Please be patient with extension developers! - -**Step 2:** Take a look at your `composer.json` file. Unless you have a reason to require specific versions of extensions or libraries, you should set the version string of everything except `flarum/core` to `*` (including `flarum/tags`, `flarum/mentions`, and other bundled extensions). Make sure `flarum/core` is NOT set to `*`. If you're targeting a specific version of Flarum, set `flarum/core` to that (e.g. `"flarum/core": "v0.1.0-beta.16`). If you just want the most recent version, use `"flarum/core": "^1.0"`. - -**Step 3:** If your local install uses [local extenders](extenders.md), make sure they are up to date with changes in Flarum. - -**Step 4:** We recommend disabling third-party extensions in the admin dashboard before updating. This isn't strictly required, but will make debugging easier if you run into issues. - -**Step 5:** Make sure your PHP version is supported by the version of Flarum you are trying to upgrade to, and that you are using Composer 2 (`composer --version)`. - -**Step 6:** Finally, to update, run: - -``` -composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -php flarum migrate -php flarum cache:clear -``` - -**Step 7:** If applicable, restart your PHP process and opcache. - -## Major Version Update Guides - -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) - -1. Do steps 1-5 above. -2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. -3. Change `flarum/core`'s version string in `composer.json` from `^0.1.0` to `^1.0`. -4. Remove the `"minimum-stability": "beta",` line from your `composer.json` -5. Do steps 6 and 7 above. - -## Troubleshooting Issues - -Mentre Flarum è in fase beta, le istruzioni e le modalità di aggiornamento verranno scritte direttamente nel forum inglese: [annunci sui rilasci](https://discuss.flarum.org/t/blog?sort=newest). - -### Errors While Updating - -Here we'll go through several common types of issues while trying to update Flarum. - ---- - -If the output is short and contains: - -``` -Nothing to modify in lock file -``` - -Or does not list `flarum/core` as an updated package, and you are not on the latest flarum version: - -- Revisit step 2 above, make sure that all third party extensions have an asterisk for their version string. -- Make sure your `flarum/core` version requirement isn't locked to a specific minor version (e.g. `v0.1.0-beta.16` is locked, `^1.0.0` isn't). If you're trying to update across major versions of Flarum, follow the related major version update guide above. - ---- - -For other errors, try running `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO` - -If the output looks something like this: - -``` -flarum/flarum - requires flarum/core (v0.1.0-beta.15) -fof/moderator-notes 0.4.4 requires flarum/core (>=0.1.0-beta.15 <0.1.0-beta.16) -jordanjay29/flarum-ext-summaries 0.3.2 requires flarum/core (>=0.1.0-beta.14 <0.1.0-beta.16) -flarum/core v0.1.0-beta.16 requires dflydev/fig-cookies (^3.0.0) -flarum/flarum - does not require dflydev/fig-cookies (but v2.0.3 is installed) -flarum/core v0.1.0-beta.16 requires franzl/whoops-middleware (^2.0.0) -flarum/flarum - does not require franzl/whoops-middleware (but 0.4.1 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/bus (^8.0) -flarum/flarum - does not require illuminate/bus (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/cache (^8.0) -flarum/flarum - does not require illuminate/cache (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/config (^8.0) -flarum/flarum - does not require illuminate/config (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/container (^8.0) -flarum/flarum - does not require illuminate/container (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/contracts (^8.0) -flarum/flarum - does not require illuminate/contracts (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/database (^8.0) -flarum/flarum - does not require illuminate/database (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/events (^8.0) -flarum/flarum - does not require illuminate/events (but v6.20.19 is installed) -... (this'll go on for a bit) -``` - -It is very likely that some of your extensions have not yet been updated. - -- Revisit step 1 again, make sure all your extensions have versions compatible with the core version you want to upgrade to. Remove any that don't. -- Make sure you're running `composer update` with all the flags specified in the update step. - -If none of this fixes your issue, feel free to reach out on our [Support forum](https://discuss.flarum.org/t/support). Make sure to include the output of `php flarum info` and `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO`. - -### Errori Dopo L'Aggiornamento - -Se non riesci ad accedere al tuo forum dopo l'aggiornamento, segui le nostre [istruzioni per la risoluzione dei problemi](troubleshoot.md). diff --git a/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/model-visibility.md b/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/model-visibility.md index f55fa7fc2..d53f30ff6 100644 --- a/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/model-visibility.md +++ b/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/model-visibility.md @@ -101,7 +101,7 @@ In generale, vorremo essere coerenti con i tipi di query che utilizziamo. Mescol Per le altro che non inizia con `view`, andrebbe visto caso per caso. Di norma: -- Se `whereVisibleTo($actor, 'someAbilityName')` è chiamato da codice normale (es. <`Discussion::query()->whereVisibleTo($actor, 'someAbilityName')`), gli scopers per `someAbilityName` dovrebbero avvolgere la loro logica in un `where`. +- Se `whereVisibleTo($actor, 'someAbilityName')` è chiamato da codice normale (es. `Discussion::query()->whereVisibleTo($actor, 'someAbilityName')`), gli scopers per `someAbilityName` dovrebbero avvolgere la loro logica in un `where`. - Se `whereVisibleTo($actor, 'someAbilityName')` è chiamato da un'altro visibility scoper , gli scopers per `someAbilityName` dovrebbero avvolgere la loro logica in un `orWhere`. Questo perché la logica dello scoper di alto livello dovrebbe vincolare la query più in basso, ma ognuno di questi vincoli potrebbe avere delle eccezioni, per le quali vorremmo aggiungere delle istanze. Ad esempio, gli utenti dovrebbero vedere le discussioni se: diff --git a/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md b/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md index b93863fbe..2073fd577 100644 --- a/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md +++ b/i18n/it/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md @@ -280,7 +280,7 @@ Innanzitutto, crea una classe che estenda il componente di notifica. Quindi, ci *Diamo un'occhiata al nostro esempio, vero?* -Nell'esempio, l'icona è una stella, il link andrà al nuovo post e il contenuto dirà che "{user} ha pubblicato". +Nell'esempio, l'icona è una stella, il link andrà al nuovo post e il contenuto dirà che "`{user}` ha pubblicato". ```jsx harmony import Notification from 'flarum/components/Notification'; diff --git a/i18n/it/docusaurus-plugin-content-docs/version-1.x/update.md b/i18n/it/docusaurus-plugin-content-docs/version-1.x/update.md index fde68ef57..d1668b050 100644 --- a/i18n/it/docusaurus-plugin-content-docs/version-1.x/update.md +++ b/i18n/it/docusaurus-plugin-content-docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. +If updating across major versions (e.g. `<=0.1.0` to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. ## General Steps @@ -38,7 +38,7 @@ php flarum cache:clear ## Major Version Update Guides -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) +### Updating from Beta (`<=0.1.0`) to Stable v1 (^1.0.0) 1. Do steps 1-5 above. 2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/README.md b/i18n/tr/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index 7e17cf8e2..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,45 +0,0 @@ -- - - -slug: / -- - - - -# Flarum Hakkında - -Flarum, web siteniz için oldukça basit bir tartışma platformudur. Başarılı bir topluluk yürütmek için ihtiyacınız olan tüm özelliklerle birlikte kullanımı hızlı ve kolaydır. Aynı zamanda son derece genişletilebilir olup, en üst düzeyde özelleştirilebilirliğe olanak tanır. - -![Flarum Ana Sayfa Ekran Görüntüsü](/en/img/home_screenshot.png) - -## Hedefler - -Flarum, [esoTalk](https://github.com/esotalk/esoTalk) ve [FluxBB](https://fluxbb.org)'nin birleşik halefidir. Şu şekilde tasarlanmıştır: - -* **Hızlı ve basit.** Dağınıklık yok, şişkinlik yok, karmaşık bağımlılıklar yok. Flarum PHP ile oluşturulmuştur, bu nedenle dağıtımı hızlı ve kolaydır. Arayüz, küçük bir ayak izine sahip, performanslı bir JavaScript çerçevesi olan [Mithril](https://mithril.js.org) tarafından desteklenmektedir. - -* **Güzel ve duyarlı.** Bu, insanlar için forum yazılımıdır. Flarum, kutudan çıkar çıkmaz tüm platformlarda tutarlı ve sezgisel olacak şekilde dikkatle tasarlanmıştır. - -* **Güçlü ve genişletilebilir.** Flarum'u topluluğunuza uyacak şekilde özelleştirin, genişletin ve entegre edin. Flarum’un mimarisi, [Güçlü Uzantı API'si](/extend/) ile inanılmaz derecede esnektir. - -* **Ücretsiz ve açıktır.** Flarum, [MIT lisansı](https://github.com/flarum/flarum/blob/master/LICENSE) altında yayınlanmıştır. - -[Flarum'a yönelik felsefemiz ve değerlerimiz](https://discuss.flarum.org/d/28869-flarum-philosophy-and-values) hakkında daha fazla bilgi edinebilirsiniz. - -## Flarum Projesine Yardım Edin - -Flarum, gönüllüler tarafından bakımı yapılan ve yönetilen [ücretsiz, açık kaynaklı](https://github.com/flarum/core) bir yazılımdır. Flarum'u geliştirmemize ve genişletmemize yardımcı olması için topluluk katkılarına güveniyoruz. - -🧑‍💻 Eğer bir geliştiriciyseniz, Flarum'un temeline veya paketlenmiş uzantılarına katkıda bulunmayı düşünebilirsiniz. Bu, Flarum'a yardımcı olmanın en etkili yolu ve çalışmalarınızın büyük bir etkisi olabilir: milyonlarca son kullanıcıya sahip binlerce Flarum sitesi mevcuttur. - -🧩Eksik olduğunu düşündüğünüz bir özellik veya aklınıza gelen bir tema fikri varsa, [özel bir uzantı yazmak](extend/README.md) Flarum'u siz ve diğerleri için çok daha iyi hale getirecektir. - -✒️ Teknik yazım konusunda deneyiminiz varsa, [belgelerimize](https://github.com/flarum/docs/issues) yapacağınız katkılar gelecekteki kullanıcıların, yöneticilerin ve geliştiricilerin Flarum'dan en iyi şekilde yararlanmasına yardımcı olabilir. - -🌐 Birden fazla dil konuşuyorsanız Flarum'un dünya çapındaki sayısız kullanıcı tarafından erişilebilir olmasına yardımcı olmak için [çevirilere katkıda bulunabilirsiniz](extend/language-packs.md). - -💸 Flarum Vakfı, Flarum'dan para kazanmıyor ancak ödenmesi gereken faturaları var. [GitHub Sponsorları](https://github.com/sponsors/flarum) veya [OpenCollective](https://opencollective.com/flarum) aracılığıyla yapılan bağışlar her zaman minnetle alınır. Geçmişte, bazı temel geliştiricilerimizi finansal olarak da destekleyebildik, böylece onların Flarum'da yarı zamanlı çalışabilmesini sağladık. Maddi desteğiniz olmadan bu mümkün olmazdı. - -🧑‍🤝‍🧑 Flarum geliştirme hakkında konuşmak, örneğinizle ilgili yardım almak veya sadece harika insanlarla tanışmak için [topluluğumuza](https://discuss.flarum.org) katılın! Flarum konusunda deneyiminiz varsa yeni başlayanlara da yardımcı olabilirsiniz! - -🐛 Canınızı sıkan bir hata ya da aklınızda bir özellik fikri varsa siz bize söylemediğiniz sürece bunu bilemeyiz! Hataları, önerileri ve gelecekteki geliştirme planlarını [GitHub sorunları](https://github.com/flarum/core/issues) aracılığıyla takip ediyoruz. Zaten açık bir sorun varsa, beğeniler ve (yapıcı) ek bilgiler eklemek çok yararlı olabilir! - -📣 Ve eğer Flarum'u seviyorsanız, lütfen bunun hakkında blog yazmayı/tweetlemeyi/konuşmayı düşünün! Flarum'dan haberdar olan daha fazla insan, daha fazla insanın Flarum'la etkileşime geçmesine ve dolayısıyla daha fazla aktiviteye, daha iyi uzantılara ve daha hızlı gelişime yol açar. - -Olağanüstü topluluğumuz olmadan Flarum mümkün olmazdı. Katkıda bulunmak istiyorsanız daha fazla bilgi için [geliştirici katkısı](contributing.md) ve [diğer katkı](contributing-docs-translations.md) belgelerimize bakın. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/admin.md b/i18n/tr/docusaurus-plugin-content-docs/current/admin.md deleted file mode 100644 index 3b3ed3318..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/admin.md +++ /dev/null @@ -1,13 +0,0 @@ -# Yönetici Gösterge Tablosu - -Flarum Yönetici Panosu, forumunuzu yönetmek için kullanıcı dostu bir arayüzdür. Yalnızca "Yönetici" grubundaki kullanıcılar tarafından kullanılabilir. Yönetici panosuna erişmek için ekranın sağ üst köşesindeki **Adınıza** tıklayın ve **Yönetim**'i seçin. - -Yönetici Kontrol Panelinde aşağıdaki bölümler bulunur: -- **Kontrol Paneli** - İstatistikleri ve diğer ilgili bilgileri içeren ana Yönetici Kontrol Panelini gösterir. -- **Temel Bilgiler** - Ad, Açıklama ve Hoş Geldiniz Banner'ı gibi temel forum ayrıntılarını ayarlama seçeneklerini gösterir. -- **E-posta** - E-Posta ayarlarınızı yapılandırmanıza olanak tanır. Daha fazla bilgi için [buraya](https://docs.flarum.org/mail) bakın. -- **İzinler** - Her kullanıcı grubunun izinlerini gösterir ve genel ve belirli kapsamları yapılandırmanıza olanak tanır. -- **Görünüm** - Forumun renklerini, markasını özelleştirmenize ve özelleştirme için ek CSS eklemenize olanak tanır. -- **Kullanıcılar** - Forumdaki tüm kullanıcıların sayfalandırılmış bir listesini sağlar ve size kullanıcıyı düzenleme veya idari işlemler gerçekleştirme olanağı verir. - -Yönetici Kontrol Paneli, yukarıda bahsedilen bölümlerin dışında, _Özellikler_ bölümü altında Uzantılarınızı (Etiketler gibi flarum çekirdek uzantıları dahil) yönetmenize de olanak tanır. Forum temasını değiştiren veya birden fazla dil kullanmanıza olanak tanıyan uzantılar, sırasıyla _Temalar_ ve _Diller_ bölümünde kategorize edilmiştir. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/bugs.md b/i18n/tr/docusaurus-plugin-content-docs/current/bugs.md deleted file mode 100644 index 85e8ea193..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/bugs.md +++ /dev/null @@ -1,28 +0,0 @@ -# Reporting Bugs - -:::danger Security Vulnerabilities - -If you discover a security vulnerability within Flarum, please follow our [security policy](https://github.com/flarum/core/security/policy) so we can address it promptly. - -::: - -Thank you for helping us test Flarum. We're happy to have you on the team! We need people who can *troubleshoot issues patiently* and *communicate them clearly*. As you probably know, good bug reporting takes some time and effort. If you're fine with that, then let's get started! - -## Duplicates - -Found a bug already? Wonderful! We'd love to hear about it — but first you should check around to make sure you're not wasting your time on a known issue: - -- Search our [Support forum](https://discuss.flarum.org/t/support) to see if it's already been reported. -- We could be working on a fix, so search our [issue tracker](https://github.com/flarum/core/issues) too. - -If you've searched *thoroughly* and come up empty-handed, we'll welcome your report. If it's just a simple issue (a misspelled word or graphics glitch, for example) skip to the next paragraph. But if you're seeing errors, or something is clearly broken, we'll need you to gather some information first. Please head over to our [Troubleshooting](troubleshoot.md) guide and follow the instructions there. Collect as much info as you can! - -## Reporting - -We track issues on GitHub. Make sure you open your issue in the [correct repository](https://github.com/flarum), and fill out all of the information in the Bug Report template. - -If you can, check if the issue is reproducible with the latest version of Flarum. If you are using a pre-release or development version, please indicate the specific version you are using. - -Remember: the goal of a bug report is to make it easy for us to replicate the bug and fix it. You might want to read [this article](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) for some useful tips on how to write an effective bug report. It is **required** that you clearly describe the steps necessary to reproduce the issue you are running into. Issues with no clear reproduction steps will not be triaged. If an issue labeled "needs verification" receives no further input from the issue author for more than 5 days, it will be closed. - -Once you've posted your report, we'd ask that you please *follow the discussion* and wait patiently. We may need to ask for further details or clarification; but we've always got plenty to do, and it could be a while before we can give your report the time it deserves. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/code-of-conduct.md b/i18n/tr/docusaurus-plugin-content-docs/current/code-of-conduct.md deleted file mode 100644 index 6041c1b6e..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/code-of-conduct.md +++ /dev/null @@ -1,51 +0,0 @@ -# Davranış Kuralları - -### _Flarum Topluluğuna Hoş Geldiniz!_ - -... Ve bize katıldığınız için teşekkürler! Flarum için heyecanlıyız ve aynı şekilde hisseden insanlarla tanışmaktan her zaman mutluyuz. *Herkesin* Flarum ve Flarum topluluğundan en iyi şekilde yararlanmasını istiyoruz, bu nedenle bu yönergeleri okuyup uygulamanızı rica ediyoruz. Bunlar, forumumuzu, Discord sohbetini, GitHub'da iletişim kurmayı veya Flarum topluluğu olmadan başka herhangi bir iletişim biçimini kullanıyor olsanız da geçerlidir. - -### Her Şeyden Önce Sakin Olun! - -Hepimiz Flarum hakkında konuşmak ve onu daha iyi bir uygulama haline getirmek için birlikte çalışmak için buradayız. Fikirleri eleştirmek (elbette gerekçeli argümanlar aracılığıyla) bunun önemli bir parçasıdır. Ama kendimizi kaptırıp kişisel saldırılara geçmeyelim, çünkü olumsuzluk sadece araya girer. Aşağıdakilerden kaçınmanızı rica ediyoruz: - -- Saldırgan veya taciz edici dil ve ayrıca her türlü nefret söylemi -- Başkalarını taciz etmeyi, taklit etmeyi veya karalamayı amaçlayan gönderiler -- Gönderilen içeriğin gereksiz yere silinmesi -- Başkalarının özel bilgilerini kötüye kullanma veya ifşa etme girişimleri -- Müstehcen içerik -- Spam, kimlik avı gönderileri ve bu siteyi tahrif etmeye yönelik her türlü eylem -- Yazılım korsanlığı ve benzeri konuların tartışılması - -*Yukarıdakilerin tümü moderatör eylemi gerekçesidir.* Başka bir üyeyle bir sorununuz varsa, lütfen onlarla kendi başınıza yüzleşmemenizi rica ederiz. Forumdaysa, lütfen söz konusu gönderide *Report* komutunu kullanın, ardından durumla ilgilenmesi için bunu yetkiliye bırakın. Aksi takdirde ihlali [iletişim sayfamızdaki](https://flarum.org/foundation/contact) Yasal seçeneğini kullanarak bildirin. - -Moderatörlerimiz, saldırgan veya iletişim akışını aksatan herhangi bir içeriği düzenleyebilir veya silebilir. Ciddi veya tekrarlanan suçlar, ihlalde bulunan kullanıcının hesabının askıya alınmasına neden olabilir. Yani, bilirsin, *sakin ol*. 😎 - -### Duyulmasını Sağlayın - -Yeni bir tartışma başlatmak ister misiniz? Öncelikle [SSS](faq.md) bölümünü okuduğunuzdan ve proje hakkında tam olarak bilgi sahibi olduğunuzdan emin olmak için bağlantıları takip ettiğinizden emin olun. Daha sonra foruma göz atmak için biraz zaman ayırın, [etiket sistemi](https://discuss.flarum.org/tags) hakkında bilgi edinin ve konunuzla ilgili anahtar kelimeler için birkaç arama yapın: *birisi çoktan bunun hakkında bir tartışma başlamış olabilir!* - -Bir tartışma başlatmaya hazır olduğunuzdan emin olduğunuzda lütfen aşağıdaki noktaları aklınızda bulundurun: - -- Ona iyi bir başlık ver! Başlığınız ne hakkında konuşmak istediğinizi netleştirirse en iyi sonuçları alırsınız. -- Doğru etiketleri seçin. Bu, gönderinizin hemen okunma ve yanıtlanma olasılığını artıracaktır. -- Aynı tartışma ilgili tekrar tekrar *yayınlamayın*, çünkü bunu yapmak ters etki yaratır. -- Çok dilli kullanıma ayrılmış bir etiket kullanmıyorsanız *yalnızca İngilizce yayınlayın.* Gönderilerinizi anlamazsak size yardımcı olamayız. -- Unutmayın, yazılarınızı imzalamanıza gerek yok. Kim olduğunuzu bize bildirmek için profilinize bakıyoruz. - -Lütfen işleri organize etmemize yardımcı olmak için çaba gösterin. Toparlanmak için harcanan zaman, sizi tanımak, sorunlarınızı tartışmak ve Flarum hakkında konuşmak için harcayamayacağımız zamandır. Ve sonuçta, hepimiz yapmak için buradayız! - -### Yanıtınızı Sayın - -Başkalarının fikirlerinizi okuyup dikkate alması umuduyla bir tartışmaya katılmak için zaman ayırıyorsunuz. Öyleyse neden yanıtınızı okumaya değer kılmak için çaba harcamıyorsunuz? - -- Bir başlığı yanıtlamayın. İlk gönderiyi *okumak* için biraz zaman ayırın ve en azından tartışmanın geri kalanına *göz atın*. -- Cevabınızın tartışmaya katkıda bulunup bulunmadığını kendinize sorun. Olmazsa, yayınlamadan önce biraz daha düşünün. -- Birisiyle aynı fikirde olmak için tek kelimelik yazılar yapmaktan kaçının; bunun için "Like" düğmesini kullanabilirsiniz. -- Yeterli olduğunda arka arkaya birden fazla gönderi yapmaktan kaçının. Bu bir forum, sohbet odası değil. -- Cevabınız tartışmanın yönünü değiştirecekse, bunun yerine yeni bir tartışma başlatmayı düşünün. -- Test olarak biraz saçma sapan yayınlamak istiyorsanız, lütfen bunu [Test Posting](https://discuss.flarum.org/t/sandbox) etiketinde yapın. -- Yanıtlarınızın, kapsayıcı bir topluluğa izin vermek için yapıcı geri bildirim ve destek sağladığından emin olun. - -Hiç kimse ara sıra yapılan şakadan veya akıllıca sözlerden şikayet etmeyecek. Ruh halini hafif tutmayı seviyoruz! Ama aynı zamanda her şeyi üretken tutmak için, bir tartışmayı tamamen raydan çıkarmaktan kaçınmanızı istiyoruz. - -> Bu kuralları bir araya getirmedeki yardımlarından dolayı Dominion'a teşekkürler. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/composer.md b/i18n/tr/docusaurus-plugin-content-docs/current/composer.md deleted file mode 100644 index f8c126903..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/composer.md +++ /dev/null @@ -1,152 +0,0 @@ - -# Composer - -Flarum uses a program called [Composer](https://getcomposer.org) to manage its dependencies and extensions. You'll need to use composer if you want to: - -- Install or update Flarum through the command line -- Install, update, or remove Flarum extensions through the command line - -This guide is provided as a brief explanation of Composer. We highly recommend consulting the [official documentation](https://getcomposer.org/doc/00-intro.md) for more information. - -:::tip Paylaşımlı Hosting - -On shared hosting it is recommended to use the Extension Manager extension instead of Composer. It is a graphical interface for Composer that allows you to install, update and remove extensions without the need for SSH access. You can directly install Flarum using an archive file, without the need for Composer. With the extension manager pre-installed, check the [installation guide](install.md#installing-by-unpacking-an-archive) for more information. - -::: - -## What is Composer? - -> Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. — [Composer Introduction](https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) - -Each Flarum installation consists primarily of Flarum core and a set of [extensions](extensions.md). Each of these has its own dependencies and releases. - -Back in the day, forum frameworks would manage extensions by having users upload zip files with the extension code. That seems simple enough, but issues quickly become evident: - -- Uploading random zip files from the internet tends to be a bad idea. Requiring that extensions be downloaded from a central source like [Packagist](https://packagist.org/) makes it somewhat more tedious to spam malicious code, and ensures that source code is available on GitHub for free/public extensions. -- Let's say Extension A requires v4 of some library, and Extension B requires v5 of that same library. With a zip-based solution, either one of the two dependencies could override the other, causing all sorts of inconsistent problems. Or both would attempt to run at once, which would cause PHP to crash (you can't declare the same class twice). -- Zip files can cause a lot of headache if trying to automate deployments, run automated tests, or scale to multiple server nodes. -- There is no good way to ensure conflicting extension versions can't be installed, or that system PHP version and extension requirements are met. -- Sure, we can upgrade extensions by replacing the zip file. But what about upgrading Flarum core? And how can we ensure that extensions can declare which versions of core they're compatible with? - -Composer takes care of all these issues, and more! - -## Flarum and Composer - -When you go to [install Flarum](install.md#installing), you're actually doing 2 things: - -1. Downloading a boilerplate "skeleton" for Flarum. This includes an `index.php` file that handles web requests, a `flarum` file that provides a CLI, and a bunch of web server config and folder setup. This is taken from the [`flarum/flarum` github repository](https://github.com/flarum/flarum), and doesn't actually contain any of the code necessary for Flarum to run. -2. Installing `composer` packages necessary for Flarum, namely Flarum core, and several bundled extensions. These are called by the `index.php` and `flarum` files from step 1, and are the implementation of Flarum. These are specified in a `composer.json` file included in the skeleton. - -When you want to update Flarum or add/update/remove extensions, you'll do so by running `composer` commands. Each command is different, but all commands follow the same general process: - -1. Update the `composer.json` file to add/remove/update the package. -2. Do a bunch of math to get the latest compatible versions of everything if possible, or figure out why the requested arrangement is impossible. -3. If everything works, download new versions of everything that needs to be updated. If not, revert the `composer.json` changes - -When running `composer.json` commands, make sure to pay attention to the output. If there's an error, it'll probably tell you if it's because of extension incompatibilities, an unsupported PHP version, missing PHP extensions, or something else. - -### The `composer.json` File - -As mentioned above, the entire composer configuration for your Flarum site is contained inside the `composer.json` file. You can consult the [composer documentation](https://getcomposer.org/doc/04-schema.md) for a specific schema, but for now, let's go over an annotated `composer.json` from `flarum/flarum`: - -```json -{ - // This following section is mostly just metadata about the package. - // For forum admins, this doesn't really matter. - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // End of metadata - - // This next section is the one we care about the most. - // It's a list of packages we want, and the versions for each. - // We'll discuss this shortly. - "require": { - "flarum/core": "^1.0", - "flarum/approval": "*", - "flarum/bbcode": "*", - "flarum/emoji": "*", - "flarum/lang-english": "*", - "flarum/flags": "*", - "flarum/likes": "*", - "flarum/lock": "*", - "flarum/markdown": "*", - "flarum/mentions": "*", - "flarum/nicknames": "*", - "flarum/pusher": "*", - "flarum/statistics": "*", - "flarum/sticky": "*", - "flarum/subscriptions": "*", - "flarum/suspend": "*", - "flarum/tags": "*" - }, - - // Various composer config. The ones here are sensible defaults. - // See https://getcomposer.org/doc/06-config.md for a list of options. - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // If composer can find a stable (not dev, alpha, or beta) version - // of a package, it should use that. Generally speaking, production - // sites shouldn't run beta software unless you know what you're doing. - "prefer-stable": true -} -``` - -Let's focus on that `require` section. Each entry is the name of a composer package, and a version string. To read more about version strings, see the relevant [composer documentation](https://semver.org/). - -For Flarum projects, there's several types of entries you'll see in the `require` section of your root install's `flarum/core`: - -- You MUST have a `flarum/core` entry. This should have an explicit version string corresponding to the major release you want to install. For Flarum 1.x versions, this would be `^1.0`. -- You should have an entry for each extension you've installed. Some bundled extensions are included by default (e.g. `flarum/tags`, `flarum/suspend`, etc), [others you'll add via composer commands](extensions.md). Unless you have a reason to do otherwise (e.g. you're testing a beta version of a package), we recommend using an asterisk as the version string for extensions (`*`). This means "install the latest version compatible with my flarum/core". -- Some extensions / features might require PHP packages that aren't Flarum extensions. For example, you need the guzzle library to use the [Mailgun mail driver](mail.md). In these cases, the instructions for the extension/feature in question should explain which version string to use. - -## How to install Composer? - -As with any other software, Composer must first be [installed](https://getcomposer.org/download/) on the server where Flarum is running. There are several options depending on the type of web hosting you have. - -### Dedicated Web Server - -In this case you can install composer as recommended in the Composer [guide](https://getcomposer.org/doc/00-intro.md#system-requirements) - -### Managed / Shared hosting - -If Composer is not preinstalled (you can check this by running `composer --version`), you can use a [manual installation](https://getcomposer.org/composer-stable.phar). Just upload the composer.phar to your folder and run `/path/to/your/php7 composer.phar COMMAND` for any command documented as `composer COMMAND`. - -:::danger - -Some articles on the internet will mention that you can use tools like a PHP shell. If you are not sure what you are doing or what they are talking about - be careful! An unprotected web shell is **extremely** dangerous. - -::: - -## How do I use Composer? - -You'll need to use Composer over the **C**ommand-**l**ine **i**nterface (CLI). Be sure you can access your server over **S**ecure **Sh**ell (SSH). - -Once you have Composer installed, you should be able to run Composer commands in your SSH terminal via `composer COMMAND`. - -:::info Optimizations - -After most commands, you'll want to run `composer dump-autoload -a`. Essentially, this caches PHP files so they run faster. - -::: diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/config.md b/i18n/tr/docusaurus-plugin-content-docs/current/config.md deleted file mode 100644 index 59a6e2328..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/config.md +++ /dev/null @@ -1,35 +0,0 @@ -# Yapılandırma Dosyası - -Flarum yapılandırmasının Flarum yönetici panosu (veritabanı hariç) aracılığıyla değiştirilemeyeceği tek bir yer vardır ve bu, Flarum kurulu klasörde bulunan `config.php` dosyasıdır. - -Bu dosya küçük de olsa Flarum kurulumunuzun çalışması için çok önemli olan ayrıntıları içerir. - -Dosya varsa, Flarum'a zaten kurulu olduğunu söyler. Ayrıca Flarum'a veritabanı bilgisi ve daha fazlasını sağlar. - -Örnek bir dosyayla her şeyin ne anlama geldiğine dair hızlı bir genel bakış: - -```php - false, // sorunları gidermek için kullanılan hata ayıklama modunu etkinleştirir veya devre dışı bırakır - 'offline' => false, // site bakım modunu etkinleştirir veya devre dışı bırakır. Bu, sitenizi tüm kullanıcılar (yöneticiler dahil) için erişilemez hale getirir. - 'database' => - array ( - 'driver' => 'mysql', // veritabanı sürücüsü, yani MySQL, MariaDB... - 'host' => 'localhost', // bağlantının ana bilgisayarı, harici bir hizmet kullanılmadığı sürece çoğu durumda localhost - 'database' => 'flarum', // veritabanının adı - 'username' => 'root', // veritabanı kullanıcı adı - 'password' => '', // veritabanı şifresi - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', / veritabanındaki tablolar için önek, aynı veritabanını başka bir hizmetle paylaşıyorsanız kullanışlıdır - 'port' => '3306', // veritabanı bağlantısının portu, MySQL ile varsayılan olarak 3306'dır - 'strict' => false, - ), - 'url' => 'https://flarum.localhost', // URL kurulumu, etki alanlarını değiştirirseniz bunu değiştirmek isteyeceksiniz - 'paths' => - array ( - 'api' => 'api', // /api , API'ye gider. - 'admin' => 'admin', // /admin , yönetici paneline gider. - ), -); -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/console.md b/i18n/tr/docusaurus-plugin-content-docs/current/console.md deleted file mode 100644 index ded88ead0..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# Konsol - -Yönetici kontrol paneline ek olarak Flarum, forumunuzu terminal üzerinden yönetmenize yardımcı olmak için çeşitli konsol komutları sağlar. - -Konsolu kullanma: - -1. Flarum kurulumunuzun barındırıldığı sunucuya `ssh`ile bağlanın. -2. `cd` komutu ile `flarum` klasörüne git -3. `php flarum [command]` komutunu çalıştırın. - -## Varsayılan Komutlar - -### list - -Mevcut tüm yönetim komutlarını ve ayrıca yönetim komutlarını kullanma talimatlarını listeler. - -### help - -`php flarum help [command_name]` - -Belirli bir komut için yardım çıktısını görüntüler. - -`--format` seçeneğini kullanarak yardımın çıktısını başka formatlarda da yapabilirsiniz: - -`php flarum help --format=xml list` - -Mevcut komutların listesini görüntülemek için lütfen `list` komutunu kullanın. - -### info - -`php flarum info` - -Flarum'un çekirdeği ve yüklü uzantıları hakkında bilgi edinin. Bu, hata ayıklama sorunları için çok kullanışlıdır ve destek talep edilirken paylaşılmalıdır. - -### cache:clear - -`php flarum cache:clear` - -Oluşturulan js/css, metin biçimlendirici önbelleği ve önbelleğe alınmış çeviriler dahil olmak üzere arka uç Flarum önbelleğini temizler. Bu, uzantıları yükledikten veya kaldırdıktan sonra çalıştırılmalıdır ve sorun ortaya çıktığında bunu çalıştırmak ilk adım olmalıdır. - -### assets:publish - -`php flarum assets:publish` - -Publish assets from core and extensions (e.g. compiled JS/CSS, bootstrap icons, logos, etc). This is useful if your assets have become corrupted, or if you have switched [filesystem drivers](extend/filesystem.md) for the `flarum-assets` disk. - -### migrate - -`php flarum migrate` - -Bekleyen tüm geçişleri çalıştırır. Bu, veritabanını değiştiren bir uzantı eklendiğinde veya güncellendiğinde kullanılmalıdır. - -### migrate:reset - -`php flarum migrate:reset --extension [extension_id]` - -Bir uzantı için tüm geçişleri sıfırlayın. Bu, çoğunlukla uzantı geliştiricileri tarafından kullanılır, ancak bazen, bir uzantıyı kaldırıyorsanız ve tüm verilerini veritabanından temizlemek istiyorsanız bunu çalıştırmanız gerekebilir. Lütfen bunun çalışması için söz konusu uzantının şu anda yüklü olması ancak mutlaka etkinleştirilmesi gerekmediğini unutmayın. - -### schedule:run - -`php flarum schedule:run` - -Many extensions use scheduled jobs to run tasks on a regular interval. This could include database cleanups, posting scheduled drafts, generating sitemaps, etc. If any of your extensions use scheduled jobs, you should add a [cron job](https://ostechnix.com/a-beginners-guide-to-cron-jobs/) to run this command on a regular interval: - -``` -* * * * * cd /path-to-your-flarum-install && php flarum schedule:run >> /dev/null 2>&1 -``` - -This command should generally not be run manually. - -Note that some hosts do not allow you to edit cron configuration directly. In this case, you should consult your host for more information on how to schedule cron jobs. - -### schedule:list - -`php flarum schedule:list` - -This command returns a list of scheduled commands (see `schedule:run` for more information). This is useful for confirming that commands provided by your extensions are registered properly. This **can not** check that cron jobs have been scheduled successfully, or are being run. \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/contributing-docs-translations.md b/i18n/tr/docusaurus-plugin-content-docs/current/contributing-docs-translations.md deleted file mode 100644 index 7b17fc28e..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/contributing-docs-translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# Docs and Translation - -## Add Documentation - -Adding documentation can help countless future Flarum users. A few ideas of what to work on: - -- User guides to help Flarum end users with some advanced Flarum features. -- More [frequently asked questions](faq.md). -- Expanded [troubleshooting](troubleshoot.md) steps. -- Step-by-step tutorials for Flarum development or installation. -- [Technical reference guides](extend/README.md) for extension developers. -- Improving literally anything else you think we should elaborate on or explain better. - -A good way to find topics to write about is to look for common questions in the [support tag](https://discuss.flarum.org/t/support) of our community. - -## Translate Flarum - -We want Flarum to be accessible to everyone, regardless of language! By contributing translations, you make it possible for many more people to enjoy Flarum. Best of all, we use user-friendly GUIs for translations, so no technical skills are necessary to help! - -Translations for Flarum core, bundled extensions, and community extensions are managed through [Weblate](https://weblate.rob006.net/projects/flarum/). - -Translations for this documentation are managed through [Crowdin](https://crowdin.com/project/flarum-docs). - -The Flarum Foundation has created the "flarum-lang" organization to support translators and ensure continuous availability of language packs. You can learn more about this by [visiting the GitHub repository](https://github.com/flarum-lang/about). - -If you want to support an existing language pack, start a new translation, or you run into issues using weblate or crowdin, it's best to [get in touch with the `flarum-lang` team](https://discuss.flarum.org/d/27519-the-flarum-language-project). diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/contributing.md b/i18n/tr/docusaurus-plugin-content-docs/current/contributing.md deleted file mode 100644 index f6b7b0d32..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/contributing.md +++ /dev/null @@ -1,170 +0,0 @@ -# Katkıda Bulunmak - -Flarum gelişimine katkıda bulunmak ister misiniz? Bu harika! [Bir hata raporu açmaktan](bugs.md) bir çekme isteği (PR) oluşturmaya kadar: her katkı takdir edilir ve memnuniyetle karşılanır. Flarum wouldn't be possible without our community contributions. - -Katkıda bulunmadan önce lütfen [davranış kurallarını](code-of-conduct.md) okuyun. - -Bu belge, Flarum'a kod katkısında bulunmak isteyen geliştiriciler için bir kılavuzdur. Yeni başlıyorsanız, Flarum'un nasıl çalıştığı hakkında biraz daha fazla bilgi edinmek için Uzantı belgelerindeki [Başlarken](/extend/start.md) belgelerini okumanızı öneririz. - -## Ne Üzerinde Çalışmalı - -⚡ **Have Real Impact.** There are thousands of Flarum instances, with millions of aggregate end users. By contributing to Flarum, your code will have a positive impact on all of them. - -🔮 **Shape the Future of Flarum.** We have a long backlog, and limited time. If you're willing to champion a feature or change, it's much more likely to happen, and you'll be able to enact your vision for it. Plus, our roadmap and milestones are set by our [core development team](https://flarum.org/team), and all of us started as contributors. The best road to influence is contributing. - -🧑‍💻 **Become a Better Engineer.** Our codebase is modern, and we heavily value good engineering and clean code. There's also a lot of interesting, challenging problems to solve regarding design, infrastructure, performance, and extensibility. Especially if you're a student or early in your career, working on Flarum is a great opportunity to build development skills. - -🎠 **It's Fun!** We really enjoy working on Flarum: there's a lot of interesting challenges and fun features to build. We also have an active community on [our forums](https://discuss.flarum.org) and [Discord server](https://flarum.org/chat). - -## Geliştirme Kurulumu - -Nelerin yapılması gerektiğine dair genel bir bakış için [Milestones](https://github.com/flarum/core/milestones) dönüm noktalarına göz atın. Başlaması nispeten kolay olması gereken sorunların bir listesi için [Good first issue](https://github.com/flarum/core/labels/Good%20first%20issue) etiketine bakın. If there's anything you're unsure of, don't hesitate to ask! All of us were just starting out once. - -Devam etmeyi ve bir şey üzerinde çalışmayı planlıyorsanız, lütfen ilgili konu hakkında yorum yapın veya önce yeni bir sorun oluşturun. Bu şekilde değerli çalışmalarınızın boşuna olmamasını sağlayabiliriz. - -Since Flarum is so extension-driven, we highly recommend [our extension docs](extend/README.md) as a reference when working on core, as well as for bundled extensions. You should start with [the introduction](extend/README.md) for a better understanding of our extension philosophy. - -## Geliştirme İş Akışı - -### Setting Up a Local Codebase - -[flarum/flarum](https://github.com/flarum/flarum) is a "skeleton" application which uses Composer to download the core package and a bunch of extensions. Source code for Flarum core, extensions, and all packages used by the aforementioned is located in the Flarum monorepo [flarum/framework](https://github.com/flarum/framework). In order to contribute to these, you'll need to fork and clone the monorepo repository locally, and then add it to your dev environment as a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path): - -```bash -git clone https://github.com/flarum/flarum.git -cd flarum - -# Or, when you want to clone directly into the current directory -git clone https://github.com/flarum/flarum.git . -# Note, the directory must be empty - -# Set up a Composer path repository for Flarum monorepo packages -composer config repositories.0 path "PATH_TO_MONOREPO/*/*" -git clone https://github.com//framework.git PATH_TO_MONOREPO -``` - -Tipik bir katkı iş akışı şuna benzer: - -Son olarak, kurulumu dizin havuzlarından tamamlamak için `composer install` çalıştırın. - -Yerel kurulumunuz kurulduktan sonra, **config.php** içinde `debug` modunu etkinleştirdiğinizden ve php yapılandırmanızda `display_errors` u `On` olarak ayarladığınızdan emin olun. Bu, hem Flarum hem de PHP için hata ayrıntılarını görmenize olanak sağlar. Debug mode also forces a re-compilation of Flarum's asset files on each request, removing the need to call `php flarum cache:clear` after each change to the extension's JavaScript or CSS. - -Flarum'un ön uç kodu ES6'da yazılır ve JavaScript'e aktarılır. During development you will need to recompile the JavaScript using [Node.js](https://nodejs.org/) and [`yarn`](https://yarnpkg.com/). **Please do not commit the resulting `dist` files when sending PRs**; this is automatically taken care of when changes are merged into the `main` branch. - -To contribute to the frontend, first install the JavaScript dependencies. The monorepo uses [yarn workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) to easily install JS dependencies across all packages within. - -```bash -cd packages/framework -yarn install -``` - -Daha sonra geliştirme sırasındaki değişiklikler için JavaScript dosyalarını izleyebilirsiniz: - -```bash -cd framework/core/js -yarn dev -``` - -Uzantılar için de süreç aynıdır. - -```bash -cd extensions/tags/js -yarn de -``` - -### Geliştirme araçları - -Üzerinde çalışacağınız depoları çatallayıp klonladıktan sonra, değişikliklerinizi test edebilmeniz için yerel barındırma kurmanız gerekecektir. Flarum şu anda bir geliştirme sunucusuyla birlikte gelmiyor, dolayısıyla bu yerel Flarum kurulumuna hizmet etmek için Apache/NGINX/Caddy/etc'yi kurmanız gerekecek. - -Alternatif olarak, bir hizmet sunmak için [Laravel Valet](https://laravel.com/docs/master/valet) (Mac), [XAMPP](https://www.apachefriends.org/index.html) (Windows) veya [Docker-Flarum](https://github.com/mondediefr/docker-flarum) (Linux) gibi araçları kullanabilirsiniz. yerel forum. - -Flarum'a katkıda bulunanların çoğu [PHPStorm](https://www.jetbrains.com/phpstorm/download/) veya [Visual Studio Code](https://code.visualstudio.com/) ile geliştirir. - -## Kodlama Stili - -A typical contribution workflow looks like this: - -0. 🌳 Uygun **dalı** yeni bir özellik dalına ayırın. - * *Hata düzeltmeleri* en son kararlı dala gönderilmelidir. - * Mevcut Flarum sürümüyle geriye dönük olarak tamamen uyumlu olan *Küçük* özellikler, en son kararlı dala gönderilebilir. - -1. 🔨 Bir **kod** yazın. - * [Kodlama Stili](#Kodlama-Stili) hakkında aşağıya bakın. - * *Ana* özellikler her zaman gelecek Flarum sürümünü içeren "ana" şubeye gönderilmelidir. - * *Major* features should always be sent to the `main` branch, which contains the upcoming Flarum release. - * Dahili olarak `/` (eg. `tz/refactor-frontend`) adlandırma şemasını kullanıyoruz. - -2. 🚦 **Kodunuzu** test edin. - * Hataları giderirken veya özellikler eklerken gerektiği gibi birim testleri ekleyin. - -3. 💾 Kodunuzu açıklayıcı bir mesajla **işleyin**. - * Add unit tests as necessary when fixing bugs or adding features. - * Test paketini ilgili paket klasöründeki `vendor/bin/phpunit` ile çalıştırın. - * See [here](extend/testing.md) for more information about testing in Flarum. - -4. 🎁 GitHub'da bir Çekme İsteği (PR) **gönderin**. - * Değişikliğiniz mevcut bir sorunu çözüyorsa (genellikle bu, 123 numaralı sorun numarası olmak üzere yeni satırda "123 numaralı düzeltmeleri" içermelidir). - * [Geleneksel Taahhütler](https://www.conventionalcommits.org/en/v1.0.0/#summary) spesifikasyonunu izleyin. - * *Fix* commits should describe the issue fixed, not how it was fixed. - -5. 🤝 Onay için Flarum ekibiyle **iletişim kurun**. - * Çekme talebi şablonunu doldurun. - * Değişikliğiniz görselse, değişikliği gösteren bir ekran görüntüsü veya GIF ekleyin. - * JavaScript `dist` dosyalarını DERLEMEYİN. Bunlar birleştirme sırasında otomatik olarak derlenecektir. - -6. 🕺 **Dans et** tıpkı Flarum'a katkıda bulunduğun gibi. - * Ekip üyeleri kodunuzu inceleyecek. Bazı değişiklikler veya iyileştirmeler veya alternatifler önerebiliriz, ancak küçük değişiklikler için çekme talebinizin hızla kabul edilmesi gerekir. - * Geri bildirimi ele alırken, üzerine yazmak veya ezmek yerine ek taahhütleri itin (birleştireceğiz). - -7. 🕺 **Dance** like you just contributed to Flarum. - -## Geliştirme araçları - -In order to keep the Flarum codebase clean and consistent, we have a number of coding style guidelines that we follow. When in doubt, read the source code. - -Don't worry if your code styling isn't perfect! StyleCI and Prettier will automatically check formatting for every pull request. This allows us to focus on the content of the contribution, not the code style. - -### PHP - -Flarum follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard. On top of this, we conform to a number of [other style rules](https://github.com/flarum/framework/blob/main/.styleci.yml). We use PHP 7 type hinting and return type declarations where possible, and [PHPDoc](https://docs.phpdoc.org/) to provide inline documentation. Try and mimic the style used by the rest of the codebase in your contributions. - -* `Flarum\Discussion`, not `Flarum\Discussions`) -* Arayüzlerin sonuna `Interface` eklenmelidir (ör. `MailableInterface`) -* Abstract sınıflarının önüne `Abstract` yazılmalıdır (ör `AbstractModel`) -* Özelliklerin sonuna `Trait` eklenmelidir (ör. `ScopeVisibilityTrait`) - -### JavaScript - -Flarum's JavaScript mostly follows the [Airbnb Style Guide](https://github.com/airbnb/javascript). We use [ESDoc](https://esdoc.org/manual/tags.html) to provide inline documentation. - -### Çeviriler - -**Columns** should be named according to their data type: -* DATETIME veya TIMESTAMP: `{verbed}_at` (ör. created_at, read_at) veya `{verbed}_until` (ör. suspended_until) -* INT bu bir sayıdır: `{noun}_count` (ör. comment_count, word_count) -* Yabancı anahtar: `{verbed}_{entity}_id` (ör. hidden_user_id) - * Fiil birincil ilişki için ihmal edilebilir (ör. Yazının yazarı sadece `user_id`) -* BOOL: `is_{adjective}` (ör. is_locked) - -**Tables** should be named as follows: -* Çoğul biçim kullanın (`discussions`) -* Birden çok kelimeyi alt çizgilerle ayırın (`access_tokens`) -* İlişki tabloları için, iki tablo adını alfabetik sırayla bir alt çizgi ile tekil biçimde birleştirin (ör. `discussion_user`) - -### CSS - -Flarum's CSS classes roughly follow the [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) using the format `.ComponentName-descendentName--modifierName`. - -### Çeviriler - -We use a [standard key format](/extend/i18n.md#appendix-a-standard-key-format) to name translation keys descriptively and consistently. - -## Katılımcı Lisans Sözleşmesi - -By contributing your code to Flarum you grant the Flarum Foundation (Stichting Flarum) a non-exclusive, irrevocable, worldwide, royalty-free, sublicensable, transferable license under all of Your relevant intellectual property rights (including copyright, patent, and any other rights), to use, copy, prepare derivative works of, distribute and publicly perform and display the Contributions on any licensing terms, including without limitation: (a) open source licenses like the MIT license; and (b) binary, proprietary, or commercial licenses. Except for the licenses granted herein, You reserve all right, title, and interest in and to the Contribution. - -You confirm that you are able to grant us these rights. You represent that You are legally entitled to grant the above license. If Your employer has rights to intellectual property that You create, You represent that You have received permission to make the Contributions on behalf of that employer, or that Your employer has waived such rights for the Contributions. - -You represent that the Contributions are Your original works of authorship, and to Your knowledge, no other person claims, or has the right to claim, any right in any invention or patent related to the Contributions. You also represent that You are not legally obligated, whether by entering into an agreement or otherwise, in any way that conflicts with the terms of this license. - -The Flarum Foundation acknowledges that, except as explicitly described in this Agreement, any Contribution which you provide is on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/current.json b/i18n/tr/docusaurus-plugin-content-docs/current/current.json deleted file mode 100644 index cc8d5bdce..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/current.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - "sidebar.guideSidebar.category.Introduction": { - "message": "Giriş", - "description": "The label for category Introduction in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Setting Up": { - "message": "Ayarlama", - "description": "The label for category Setting Up in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Management": { - "message": "Yönetim", - "description": "The label for category Management in sidebar guideSidebar" - }, - "sidebar.guideSidebar.category.Advanced": { - "message": "Advanced", - "description": "The label for category Advanced in sidebar guideSidebar" - }, - "sidebar.extendSidebar.category.Main Concepts": { - "message": "Ana Kavramlar", - "description": "The label for category Main Concepts in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Reference Guides": { - "message": "Referans Kılavuzları", - "description": "The label for category Reference Guides in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Advanced Guides": { - "message": "Gelişmiş Kılavuzlar", - "description": "The label for category Advanced Guides in sidebar extendSidebar" - }, - "sidebar.extendSidebar.category.Update Guides": { - "message": "Update Guides", - "description": "The label for category Update Guides in sidebar extendSidebar" - }, - "sidebar.internalSidebar.category.Internal Docs": { - "message": "Internal Docs", - "description": "The label for category Internal Docs in sidebar internalSidebar" - } -} \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/README.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/README.md deleted file mode 100644 index 78328a2ea..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/README.md +++ /dev/null @@ -1,40 +0,0 @@ -- - - -slug: /extend -- - - - -# Flarum'u Genişletmek - -Flarum minimalisttir, ancak aynı zamanda oldukça genişletilebilir. Aslında, Flarum ile birlikte gelen özelliklerin çoğu aslında uzantılardır! - -This approach makes Flarum extremely customizable. A user can disable any features they don't use on their forum, and install other extensions to make a forum perfect for their community. - -In order to achieve this extensibility, Flarum has been built with rich APIs and extension points. With some programming knowledge, you can leverage these APIs to add just about any feature you want. This section of the documentation aims to teach you how Flarum works, and how to use the APIs so that you can build your own extensions. - -## Çekirdek ve Uzantılar - -Where do we draw the line between Flarum's core and its extensions? Why are some features included in the core, and others aren't? It is important to understand this distinction so that we can maintain consistency and quality within Flarum's ecosystem. - -**Flarum's core** is not intended to be packed full of features. Rather, it is a scaffold, or a framework, which provides a reliable foundation on which extensions can build. It contains only basic, unopinionated functionality that is essential to a forum: discussions, posts, users, groups, and notifications. - -**Bundled extensions** are features that are packaged with Flarum and enabled by default. They are extensions just like any other, and may be disabled and uninstalled. While their scope is not intended to address all use-cases, the idea is to make them generic and configurable enough that they can satisfy the majority. - -**Third-party extensions** are features which are made by others and are not officially supported by the Flarum team. They can be built and used to address more specific use-cases. - -If you are aiming to address a bug or shortcoming of the core, or of an existing bundled extension, it may be appropriate to *contribute to the respective project* rather than disperse effort on a new third-party extension. It is a good idea to start a discussion on the [Flarum Community](https://discuss.flarum.org/) to get the perspective of the Flarum developers. - -## Yararlı Kaynaklar - -- [Bu Belge](start.md) -- [Tips for Beginning Developers](https://discuss.flarum.org/d/5512-extension-development-tips) -- [Flarum CLI](https://github.com/flarum/cli) -- [Developers explaining their workflow for extension development](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) -- [Extension namespace tips](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) -- [Mithril js documentation](https://mithril.js.org/) -- [Laravel API Dokümanları](https://laravel.com/api/8.x/) -- [Flarum API Dokümanları](https://api.flarum.org) -- [ES6 cheatsheet](https://github.com/DrkSephy/es6-cheatsheet) - -### Flarum Genişletme - -- [Official Flarum Dev Community](https://discuss.flarum.org/t/dev) -- [Join us on #extend in our discord chat](https://flarum.org/discord/) diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/admin.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/admin.md deleted file mode 100644 index 6cb877127..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/admin.md +++ /dev/null @@ -1,214 +0,0 @@ -# Yönetici Gösterge Tablosu - -Beta 15, tamamen yeniden tasarlanmış bir yönetici paneli ve frontend API'sini tanıttı. Uzantınıza ayar veya izin eklemek artık her zamankinden daha kolay. - -Beta 15'ten önce, uzantı ayarları ya bir `SettingsModal`'a ekleniyordu ya da daha karmaşık ayarlar için yeni bir sayfa ekleniyordu. Artık her uzantının bilgileri, ayarları ve uzantının kendi izinlerini içeren bir sayfası var. - -Ayarları kolayca kaydedebilir, temel [`Uzantı Sayfası`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) genişletebilir veya kendi tamamen özel sayfanızı sağlayabilirsiniz. - -## Uzantı Veri API'si - -Bu yeni API, çok az kod satırıyla uzantınıza ayarlar eklemenizi sağlar. - -### Telling the API about your extension - -Before you can register anything, you need to tell `ExtensionData` what extension it is about to get data for. - -Simply run the `for` function on `app.extensionData` passing in the id of your extension. To find you extension id, take the composer name and replace any slashes with dashes (example: 'fof/merge-discussions' becomes 'fof-merge-discussions'). Extensions with the `flarum-` and `flarum-ext-` will omit those from the name (example: 'webbinaro/flarum-calendar' becomes 'webbinaro-calendar'). - -For the following example, we will use the fictitious extension 'acme/interstellar': - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') -}); -``` - -Once that is done, you can begin adding settings and permissions. - -:::tip Note - -All registration functions on `ExtensionData` are chainable, meaning you can call them one after another without running `for` again. - -::: - -### Registering Settings - -Adding settings fields in this way is recommended for simple items. As a rule of thumb, if you only need to store things in the settings table, this should be enough for you. - -To add a field, call the `registerSetting` function after `for` on `app.extensionData` and pass a 'setting object' as the first argument. Behind the scenes `ExtensionData` actually turns your settings into an [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), you can pass a priority number as the second argument. - -Here's an example with a switch (boolean) item: - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // This is the key the settings will be saved under in the settings table in the database. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // The label to be shown letting the admin know what the setting does. - help: app.translator.trans('acme-interstellar.admin.coordinates_help'), // Optional help text where a longer explanation of the setting can go. - type: 'boolean', // What type of setting this is, valid options are: boolean, text (or any other tag type), and select. - }, - 30 // Optional: Priority - ) -}); -``` - -If you use `type: 'select'` the setting object looks a little bit different: - -```js -{ - setting: 'acme-interstellar.fuel_type', - label: app.translator.trans('acme-interstellar.admin.fuel_type_label'), - type: 'select', - options: { - 'LOH': 'Liquid Fuel', // The key in this object is what the setting will be stored as in the database, the value is the label the admin will see (remember to use translations if they make sense in your context). - 'RDX': 'Solid Fuel', - }, - default: 'LOH', -} -``` - -Also, note that additional items in the setting object will be used as component attrs. This can be used for placeholders, min/max restrictions, etc: - -```js -{ - setting: 'acme-interstellar.crew_count', - label: app.translator.trans('acme-interstellar.admin.crew_count_label'), - type: 'number', - min: 1, - max: 10 -} -``` - -If you want to add something to the settings like some extra text or a more complicated input, you can also pass a callback as the first argument that returns JSX. This callback will be executed in the context of [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) and setting values will not be automatically serialized. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( -
-

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

- -
- ); - } - }) -}); -``` - -### Registering Permissions - -New in beta 15, permissions can now be found in 2 places. Now, you can view each extension's individual permissions on their page. All permissions can still be found on the permissions page. - -In order for that to happen, permissions must be registered with `ExtensionData`. This is done in a similar way to settings, call `registerPermission`. - -Arguments: - * Permission object - * What type of permission - see [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid)'s functions for types (remove items from the name) - * `ItemList` priority - -Back to our favorite rocket extension: - -```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Font-Awesome Icon - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Permission Label - permission: 'discussion.rocket_fly', // Actual permission name stored in database (and used when checking permission). - tagScoped: true, // Whether it be possible to apply this permission on tags, not just globally. Explained in the next paragraph. - }, - 'start', // Category permission will be added to on the grid - 95 // Optional: Priority - ); -}); -``` - -If your extension interacts with the [tags extension](https://github.com/flarum/tags) (which is fairly common), you might want a permission to be tag scopable (i.e. applied on the tag level, not just globally). You can do this by including a `tagScoped` attribute, as seen above. Permissions starting with `discussion.` will automatically be tag scoped unless `tagScoped: false` is indicated. - -To learn more about Flarum permissions, see [the relevant docs](permissions.md). - -### Chaining Reminder - -Remember these functions can all be chained like: - -```js -app.extensionData - .for('acme-interstellar') - .registerSetting(...) - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); -``` - -### Extending/Overriding the Default Page - -Sometimes you have more complicated settings that mess with relationships, or just want the page to look completely different. In this case, you will need to tell `ExtensionData` that you want to provide your own page. Note that `buildSettingComponent`, the util used to register settings by providing a descriptive object, is available as a method on `ExtensionPage` (extending from `AdminPage`, which is a generic base for all admin pages with some util methods). - -Create a new class that extends the `Page` or `ExtensionPage` component: - -```js -import ExtensionPage from 'flarum/admin/components/ExtensionPage'; - -export default class StarPage extends ExtensionPage { - content() { - return ( -

Hello from the settings section!

- ) - } -} - -``` - -Then, simply run `registerPage`: - -```js - -import StarPage from './components/StarPage'; - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); -}); -``` - -This page will be shown instead of the default. - -You can extend the [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) or extend the base `Page` and design your own! - -## Composer.json Metadata - -In beta 15, extension pages make room for extra info which is pulled from extensions' composer.json. - -For more information, see the [composer.json schema](https://getcomposer.org/doc/04-schema.md). - -| Description | Where in composer.json | -| ---------------------------------- | ------------------------------------------------------------ | -| discuss.flarum.org discussion link | "forum" key inside "support" | -| Documentation | "docs" key inside "support" | -| Support (email) | "email" key inside "support" | -| Website | "homepage" key | -| Donate | "funding" key block (Note: Only the first link will be used) | -| Source | "source" key inside "support" | diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/api-throttling.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/api-throttling.md deleted file mode 100644 index cb9be17e7..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/api-throttling.md +++ /dev/null @@ -1,58 +0,0 @@ -# API Azaltma - -Flarum comes with a builtin `Flarum\Api\Middleware\ThrottleApi` [middleware](middleware.md) for throttling requests to the API. This runs on every API route, and extensions can add their own custom logic to throttle requests. - -:::caution Forum Routes - -Some forum routes (login, register, forgot password, etc) work by calling an API route under the surface. The `ThrottleApi` middleware does not currently run for these requests, but that is planned for the future. - -::: - -## Custom Throttlers - -The format for a custom throttler is extremely simple: all you need is a closure or invokable class that takes the current request as an argument, and returns one of: - -- `false`: This explicitly bypasses throttling for this request, overriding all other throttlers -- `true`: This marks the request as to be throttled. -- `null`: This means that this throttler doesn't apply. Any other outputs will be ignored, with the same effect as `null`. - -Throttlers will be run on EVERY request, and are responsible for figuring out whether or not they apply. For example, consider Flarum's post throttler: - -```php -use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; -``` - -Throttlers can be added or removed via the `ThrottleApi` middleware in `extend.php`. For example: - -```php -set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders -]; -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/api.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/api.md deleted file mode 100644 index 200a2f954..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/api.md +++ /dev/null @@ -1,353 +0,0 @@ -# API and Data Flow - -In the [previous article](models.md), we learned how Flarum uses models to interact with data. Here, we'll learn how to get that data from the database to the JSON-API to the frontend, and all the way back again. - -:::bilgi - -To use the built-in REST API as part of an integration, see [Consuming the REST API](../rest-api.md). - -::: - -## API Request Lifecycle - -Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical API request: - -![Flarum API Flowchart](/en/img/api_flowchart.png) - -1. An HTTP request is sent to Flarum's API. Typically, this will come from the Flarum frontend, but external programs can also interact with the API. Flarum's API mostly follows the [JSON:API](https://jsonapi.org/) specification, so accordingly, requests should follow [said specification](https://jsonapi.org/format/#fetching). -2. The request is run through [middleware](middleware.md), and routed to the proper controller. You can learn more about controllers as a whole on our [routes and content documentation](routes.md). Assuming the request is to the API (which is the case for this section), the controller that handles the request will be a subclass of `Flarum\Api\AbstractSerializeController`. -3. Any modifications done by extensions to the controller via the [`ApiController` extender](#extending-api-controllers) are applied. This could entail changing sort, adding includes, changing the serializer, etc. -4. The `$this->data()` method of the controller is called, yielding some raw data that should be returned to the client. Typically, this data will take the form of a Laravel Eloquent model collection or instance, which has been retrieved from the database. That being said, the data could be anything as long as the controller's serializer can process it. Each controller is responsible for implementing its own `data` method. Note that for `PATCH`, `POST`, and `DELETE` requests, `data` will perform the operation in question, and return the modified model instance. -5. That data is run through any pre-serialization callbacks that extensions register via the [`ApiController` extender](#extending-api-controllers). -6. The data is passed through a [serializer](#serializers), which converts it from the backend, database-friendly format to the JSON:API format expected by the frontend. It also attaches any related objects, which are run through their own serializers. As we'll explain below, extensions can [add / override relationships and attributes](#attributes-and-relationships) at the serialization level. -7. The serialized data is returned as a JSON response to the frontend. -8. If the request originated via the Flarum frontend's `Store`, the returned data (including any related objects) will be stored as [frontend models](#frontend-models) in the frontend store. - -## API Endpoints - -We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. - -As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: - -- Listing instances of a model (possibly including searching/filtering) -- Getting a single model instance -- Creating a model instance -- Updating a model instance -- Deleting a single model instance - -We'll go over each type of controller shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -:::caution - -Paths to API endpoints are not arbitrary! To support interactions with frontend models: - -- The path should either be `/prefix/{id}` for get/update/delete, or `/prefix` for list/create. -- the prefix (`tags` in the example above) must correspond to the JSON:API model type. You'll also use this model type in your serializer's `$type` attribute, and when registering the frontend model (`app.store.models.TYPE = MODEL_CLASS`). -- The methods must match the example above. - -Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! - -::: - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your endpoint controllers: -```bash -$ flarum-cli make backend api-controller -``` - -::: - -### Listing Resources - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -#### Pagination - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // The number of records included by default. - public $limit = 20; - - // The maximum number of records that can be requested. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. - -#### Sorting - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // The default sort field and order to use. - public $sort = ['name' => 'asc']; - - // The fields that are available to be sorted by. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -use Illuminate\Support\Str; - -// ... - -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(Str::snake($field), $order); -} - -return $query->get(); -``` - -#### Arama - -Read our [searching and filtering](search.md) guide for more information! - -### Showing a Resource - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creating a Resource - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Updating a Resource - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Deleting a Resource - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Including Relationships - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Extending API Controllers - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -The `ApiController` extender can also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Serializers - -Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your serializer: -```bash -$ flarum-cli make backend api-serializer -``` - -::: - -### Attributes and Relationships - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -### Extending Serializers - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -### Non-Model Serializers and `ForumSerializer` - -Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/assets.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/assets.md deleted file mode 100644 index 16b401fc3..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/assets.md +++ /dev/null @@ -1,7 +0,0 @@ -# Extension Assets - -Some extensions might want to include assets like images or JSON files in their source code (note that this is not the same as uploads, which would probably require a [filesystem disk](filesystem.md)). - -This is actually very easy to do. Just create an `assets` folder at the root of your extension, and place any asset files there. Flarum will then automatically copy those files to its own `assets` directory (or other storage location if [one is offered by extensions](filesystem.md)) every time the extension is enabled or [`php flarum assets:publish`](../console.md) is executed. - -If using the default storage driver, assets will be available at `https://FORUM_URL/assets/extensions/EXTENSION_ID/file.path`. However, since other extensions might use remote filesystems, we recommend serializing the url to assets you need in the backend. See [Flarum's serialization of the logo and favicon URLs](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Serializer/ForumSerializer.php#L85-L86) for an example. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/authorization.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/authorization.md deleted file mode 100644 index 0ffc13bbb..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/authorization.md +++ /dev/null @@ -1,206 +0,0 @@ -# Yetkilendirme - -As with any framework, Flarum allows certain actions and content to be restricted to certain users. There are 2 parallel systems for this: - -- The authorization process dictates whether a user can take a certain action. -- Visibility scoping can be applied to a database query to efficiently restrict the records that users can access. This is documented in our [model visibility](model-visibility.md) article. - -## Yetkilendirme Süreci - -The authorization process is used to check whether a person is allowed to perform certain actions. For instance, we want to check if a user is authorized before they: - -- Access the admin dashboard -- Start a discussion -- Edit a post -- Update another user's profile - -Each of these is determined by unique criteria: in some cases a flag is sufficient; otherwise, we might need custom logic. - -## Nasıl Çalışır - -Authorization queries are made with 3 parameters, with logic contained in [`Flarum\User\Gate`](https://api.docs.flarum.org/php/master/flarum/user/access/gate): - -1. The actor: the user attempting to perform the action -2. The ability: a string representing the action the actor is attempting -3. The arguments: usually an instance of a database model which is the subject of the attempted ability, but could be anything. - -First, we run the entire request (all three parameters) through all [policies](#policies) registered by extensions and core. Policies are blocks of logic provided by core and extensions that determine whether the actor can perform the ability on the arguments. Policies can return one of the following: - -- `Flarum\User\Access\AbstractPolicy::ALLOW` (via `$this->allow()`) -- `Flarum\User\Access\AbstractPolicy::DENY` (via `$this->deny()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (via `$this->forceAllow()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (via `$this->forceDeny()`) - -Policy results are considered in the priority `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. For example, if a single policy returns `FORCE_DENY`, all other policies will be ignored. If one policy returns `DENY` and 10 policies return `ALLOW`, the request will be denied. This allows decisions to be made regardless of the order in which extensions are booted. Note that policies are extremely powerful: if access is denied at the policy stage, that will override group permissions and even admin privileges. - -Secondly, if all policies return null (or don't return anything), we check if the user is in a group that has a permission equal to the ability (note that both permissions and abilities are represented as strings). If so, we authorize the action. See our [Groups and Permissions documentation](permissions.md) for more information on permissions. - -Then, if the user is in the admin group, we will authorize the action. - -Finally, as we have exhausted all checks, we will assume that the user is unauthorized and deny the request. - -## Yetkilendirme Nasıl Kullanılır - -Flarum's authorization system is accessible through public methods of the `Flarum\User\User` class. The most important ones are listed below; others are documented in our [PHP API documentation](https://api.docs.flarum.org/php/master/flarum/user/user). - - -In this example, we will use `$actor` as an instance of `Flarum\User\User`, `'viewForum'` and `'reply'` as examples of abilities, and `$discussion` (instance of `Flarum\Discussion\Discussion`) as an example argument. - -```php -// Check whether a user can perform an action. -$canDoSomething = $actor->can('viewForum'); - -// Check whether a user can perform an action on a subject. -$canDoSomething = $actor->can('reply', $discussion); - -// Raise a PermissionDeniedException if a user cannot perform an action. -$actor->assertCan('viewForum'); -$actor->assertCan('reply', $discussion); - -// Raise a NotAuthenticatedException if the user is not logged in. -$actor->assertRegistered(); - -// Raise a PermissionDeniedException if the user is not an admin. -$actor->assertAdmin(); - -// Check whether one of the user's groups have a permission. -// WARNING: this should be used with caution, as it doesn't actually -// run through the authorization process, so it doesn't account for policies. -// It is, however, useful in implementing custom policies. -$actorHasPermission = $actor->hasPermission(`viewForum`); -``` - -## Özel Politikalar - -Policies allow us to use custom logic beyond simple groups and permissions when evaluating authorization for an ability with a subject. For instance: - -- We want to allow users to edit posts even if they aren't moderators, but only their own posts. -- Depending on settings, we might allow users to rename their own discussions indefinitely, for a short period of time after posting, or not at all. - -As described [above](#how-it-works), on any authorization check, we query all policies registered for the target's model, or any parent classes of the target's model. If no target is provided, any policies registered as `global` will be applied. - -So, how does a policy get "checked"? - -First, we check if the policy class has a method with the same name as the ability being evaluated. If so, we run it with the actor and subject as parameters. If that method returns a non-null value, we return that result. Otherwise, we continue to the next step (not necessarily the next policy). - -Then, we check if the policy class has a method called `can`. If so, we run it with the actor, ability, and subject, and return the result. - -If `can` doesn't exist or returns null, we are done with this policy, and we proceed to the next one. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate policies: -```bash -$ flarum-cli make backend policy -``` - -::: - -### Örnek Politikalar - -Let's take a look at an example policy from [Flarum Tags](https://github.com/flarum/tags/blob/master/src/Access): - -```php -is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); - } -} -``` - -We can also have global policies, which are run when `$user->can()` is called without a target model instance. Again from Tags: - -```php -settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewForum', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } - } -} -``` - -### Kayıt Politikaları - -Both model-based and global policies can be registered with the `Policy` extender in your `extend.php` file: - -```php -use Flarum\Extend; -use Flarum\Tags\Tag; -use YourNamespace\Access; - -return [ - // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), - // Other extenders -]; -``` - -## Ön Uç Yetkilendirmesi - -Commonly, you'll want to use authorization results in frontend logic. For example, if a user doesn't have permission to see search users, we shouldn't send requests to that endpoint. And if a user doesn't have permission to edit users, we shouldn't show menu items for that. - -Because we can't do authorization checks in the frontend, we have to perform them in the backend, and attach them to serialization of data we're sending. Global permissions (`viewForum`, `viewUserList`) can be included on the `ForumSerializer`, but for object-specific authorization, we may want to include those with the subject object. For instance, when we return lists of discussions, we check whether the user can reply, rename, edit, and delete them, and store that data on the frontend discussion model. It's then accessible via `discussion.canReply()` or `discussion.canEdit()`, but there's nothing magic there: it's just another attribute sent by the serializer. - -For an example of how to attach data to a serializer, see a [similar case for transmitting settings](settings.md#accessing-settings). diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/backend-events.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/backend-events.md deleted file mode 100644 index 60b6f37f9..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/backend-events.md +++ /dev/null @@ -1,172 +0,0 @@ -# Arka Uç Etkinlikleri - -Often, an extension will want to react to some events occuring elsewhere in Flarum. For instance, we might want to increment a counter when a new discussion is posted, send a welcome email when a user logs in for the first time, or add tags to a discussion before saving it to the database. These events are known as **domain events**, and are broadcasted across the framework through [Laravel's event system](https://laravel.com/docs/8.x/events). - -For a full list of backend events, see our [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). Domain events classes are organized by namespace, usually `Flarum\TYPE\Event`. - - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate event listeners: -```bash -$ flarum-cli make backend event-listener -``` - -::: - -## Etkinliği Dinlemek - -You can attach a listener to an event using the [`Event`](https://api.docs.flarum.org/php/master/flarum/extend/event) [extender](start.md#extenders): - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) -]; -``` -```php -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -As shown above, a listener class can be used instead of a callback. This allows you to [inject dependencies](https://laravel.com/docs/8.x/container) into your listener class via constructor parameters. In this example we resolve a translator instance, but we can inject anything we want/need. - -You can also listen to multiple events at once via an event subscriber. This is useful for grouping common functionality; for instance, if you want to update some metadata on changes to posts: - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Flarum\Post\Event\Saving; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; -``` -```php -class PostEventSubscriber -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function subscribe($events) - { - $events->listen(Deleted::class, [$this, 'handleDeleted']); - $events->listen(Saving::class, [$this, 'handleSaving']); - } - - public function handleDeleted(Deleted $event) - { - // Your logic here - } - - public function handleSaving(Saving $event) - { - // Your logic here - } -} -``` - -## Dispatching Events - -Dispatching events is very simple. All you need to do is inject `Illuminate\Contracts\Events\Dispatcher` into your class, and then call its `dispatch` method. For instance: - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` - -## Özel Etkinlikler - -As an extension developer you can define your own events to allow yourself (or other extensions) to react to events in your extension. Events are generally instances of simple classes (no need to extend anything). When defining a new event, you'll typically want to use public properties, and maybe some methods for convenience of users. For example, if we take a look at `Flarum\Post\Event\Deleted`, it's just a wrapping around some data: - -```php -post = $post; - $this->actor = $actor; - } -} -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/cli.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/cli.md deleted file mode 100644 index 80e069bce..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# Flarum CLI - -The Flarum development ecosystem is oriented around many small, modules, interacting extensions. This is a very powerful and flexible paradigm, but it also brings the maintenance cost of creating and maintaining all these extensions. - -We've created the Flarum CLI (command line interface) as a tool to help developers by automating some repetitive and menial tasks, and allow them to get into the actual work without much hassle. - -Major updates about Flarum CLI will be published [on this discussion](https://discuss.flarum.org/d/28427-flarum-cli-v10). - -See the [package's readme](https://github.com/flarum/cli#readme) for information on: - -- Kurulum Belgeleri -- Usage -- Upgrading -- Available commands -- Some implementation details, if you're interested diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/console.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/console.md deleted file mode 100644 index 60c5cf3b8..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/console.md +++ /dev/null @@ -1,70 +0,0 @@ -# Konsol - -Flarum allows extension developers to add custom console commands in addition to the [default ones](../console.md) provided by flarum core. - -All console command development is done in the backend using PHP. To create a custom console command, you'll need to create a class that extends `\Flarum\Console\AbstractCommand`. - -```php -use Flarum\Console\AbstractCommand; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -class YourCommand extends AbstractCommand { - protected function configure() - { - $this - ->setName('YOUR COMMAND NAME') - ->setDescription('YOUR COMMAND DESCRIPTION'); - } - protected function fire() - { - // Your logic here! - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate and register a console command: -```bash -$ flarum-cli make backend command -``` - -::: - -## Registering Console Commands - -To register console commands, use the `Flarum\Extend\Console` extender in your extension's `extend.php` file: - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Other extenders - (new Extend\Console())->command(CustomCommand::class) - // Other extenders -]; -``` - -## Scheduled Commands - -The `Flarum\Extend\Console`'s `schedule` method allows extension developers to create scheduled commands that run on an interval: - - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; -use Illuminate\Console\Scheduling\Event; - -return [ - // Other extenders - (new Extend\Console())->schedule('cache:clear', function (Event $event) { - $event->everyMinute(); - }, ['Arg1', '--option1', '--option2']), - // Other extenders -]; -``` - -In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/8.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands) for more information. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/data.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/data.md deleted file mode 100644 index b53e7c35c..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/data.md +++ /dev/null @@ -1,3 +0,0 @@ -# Verilerle Çalışma - -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/distribution.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/distribution.md deleted file mode 100644 index 73058d3b1..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/distribution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Dağıtım - -You've written a great extension — and now you want the whole world to be able to use it. This document will take you through the process of distribution, from setting up a Git repository for your extension, to publishing it on Packagist. - -## Setting Up Git - -The first thing you'll need to do is set up a version control system (VCS). The most popular VCS is [Git](https://git-scm.com/). In this guide we'll be using Git, so make sure you have it [installed](https://git-scm.com/downloads) before continuing. If you don't have much Git knowledge, you may want to check out [these learning resources](https://try.github.io/). - -After you have installed Git, you'll need to initialize your repository. You can use `git init` on the command line if you're comfortable, or use a GUI tool like [SourceTree](https://www.sourcetreeapp.com/) or [GitKraken](https://www.gitkraken.com/). - -Then, you'll need an account in a Git hosting server, the most popular being [GitHub](https://github.com) and [GitLab](https://gitlab.com). These will instruct you on how to hook up your local repository with the online "remote" repository. - -## Tagging a Release - -As you are going to be publishing this extension, you'll want to make sure that the information is up to date. Take a minute to revisit `composer.json` and make sure package name, description, and Flarum extension information are all correct. It is recommended to have a `README.md` file in your repository to explain what the extension is, so create one if you haven't already. - -When you're ready to release, commit your extension's files to the repo and tag your first version: - -```bash -git tag v0.1.0 -git push && git push --tags -``` - -## Publishing on Packagist - -Composer packages are published to a Composer repository, usually [Packagist](https://packagist.org/). You will need an account to proceed. - -If this is the first release you are publishing of your extension, you will need to [submit your package](https://packagist.org/packages/submit) using its public repository URL. If your extension is located on GitHub, this URL will look something like `https://github.com/AUTHOR/NAME.git`. - -### Future Releases - -You can set up Packagist to [auto-update packages](https://packagist.org/about#how-to-update-packages). Then for future releases, all you will need to do with Git is commit, tag, and push it to the remote server. - -## Promoting Your Extension - -You will most likely want to create a discussion on the Flarum Community in the [Extensions tag](https://discuss.flarum.org/t/extensions). Other people can install your extension using the following command: - -```bash -composer require vendor/package -``` \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/extending-extensions.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/extending-extensions.md deleted file mode 100644 index 7a8db4f8c..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/extending-extensions.md +++ /dev/null @@ -1,122 +0,0 @@ -# Extending Extensions - -Flarum extensions aren't just for adding features to core: extensions can extend other extensions! - -:::tip - -To learn how to make your extension extensible, see the [relevant documentation](extensibility.md) - -::: - -## Dependencies - -If your extension relies on another extension, you'll want to ensure that: - -- The other extension is installed and enabled before yours can be. -- The other extension can't be disabled while yours is enabled. -- The other extension is booted before your extension. - -Flarum makes this very easy: just add the other extension to your extension's `composer.json`'s `require` section. - -For example, if you were building a new theme for the Flarum Tags extension, your `composer.json` would look like this: - -```json -{ - // ... - "require": { - "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. - "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. - }, - // ... -} -``` - -## Optional Dependencies - -Sometimes, extension A might want to extend extension B only if extension B is enabled. In this case, we call B an "Optional Dependency" of A. For instance, a drafts extension might want to add support for saving private discussion drafts, but only if the private discussion extension is enabled. - -The first step here is detecting whether extension B is enabled. In the frontend, this is easy: if extension B does anything in the frontend, its extension ID will appear as a key in the `flarum.extensions` global object. For instance: - -```js -if ('some-extension-id' in flarum.extensions) { - // do something -} -``` - -In the backend, you'll need to inject an instance of `Flarum\Extension\ExtensionManager`, and use its `isEnabled()` method. For instance: - -```php -extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // do something. - } - } -} -``` - -Generally, if your extension has optional dependencies, you'll want it to be booted after said optional dependencies. You can also do this by specifying composer package names (NOT flarum extension IDs) in an array for the `extra.flarum-extension.optional-dependencies` key of your composer.json. - -For instance: - -```json -{ - // ... - "extra": { - "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] - } - }, - // ... -} -``` - -## Importing from Extensions - -In the backend, you can import the classes you need via regular PHP `use` statements: - -```php - { - // Your Extension Code Here -}) - -export { - // Put all the stuff you want to export here. -} -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/filesystem.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/filesystem.md deleted file mode 100644 index ef202b2c7..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/filesystem.md +++ /dev/null @@ -1,129 +0,0 @@ -# Filesystem - -Flarum core integrates with the filesystem to store and serve assets (like compiled JS/CSS or upload logos/favicons) and avatars. - -Extensions can use Flarum's provided utils for their own filesystem interaction and file storage needs. This system is based around [Laravel's filesystem tools](https://laravel.com/docs/8.x/filesystem), which are in turn based on the [Flysystem library](https://github.com/thephpleague/flysystem). - -## Disks - -Filesystem **disks** represent storage locations, and are backed by storage drivers, which we'll cover later. Flarum core has 2 disks: `flarum-assets` and `flarum-avatars`. - -### Using existing disks - -To access a disk, you'll need to retrieve it from the [Filesystem Factory](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Factory.html). To do so, you should inject the factory contract in your class, and access the disks you need. - -Let's take a look at core's [`DeleteLogoController`](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Controller/DeleteLogoController.php#L19-L58) for an example: - -```php -settings = $settings; - $this->uploadDir = $filesystemFactory->disk('flarum-assets'); - } - - /** - * {@inheritdoc} - */ - protected function delete(ServerRequestInterface $request) - { - RequestUtil::getActor($request)->assertAdmin(); - - $path = $this->settings->get('logo_path'); - - $this->settings->set('logo_path', null); - - if ($this->uploadDir->exists($path)) { - $this->uploadDir->delete($path); - } - - return new EmptyResponse(204); - } -} -``` - -The object returned by `$filesystemFactory->disk(DISK_NAME)` implements the [Illuminate\Contracts\Filesystem\Cloud](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Cloud.html) interface, and can be used to create/get/move/delete files, and to get the URL to a resource. - -### Declaring new disks - -Some extensions will want to group their resources / uploads onto a custom disk as opposed to using `flarum-assets` or `flarum-avatars`. - -This can be done via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->disk('flarum-uploads', function (Paths $paths, UrlGenerator $url) { - return [ - 'root' => "$paths->public/assets/uploads", - 'url' => $url->to('forum')->path('assets/uploads') - ]; - }); -``` - -Since all disks use the local filesystem by default, you'll need to provide a base path and base URL for the local filesystem. - -The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/8.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. - -## Storage drivers - -Flarum selects the active driver for each disk by checking the `disk_driver.DISK_NAME` key in the [settings repository](settings.md) and [config.php file](../config.md). If no driver is configured, or the configured driver is unavailable, Flarum will default to the `local` driver. - -You can define new storage drivers by implementing the [`Flarum\Filesystem\DriverInterface` interface](https://github.com/flarum/framework/blob/main/framework/core/src/Filesystem/DriverInterface.php#L16), and registering it via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->driver('aws-with-cdn', AwsWithCdnDriver::class); -``` - -Filesystem storage drivers are a very powerful tool that allows you to completely customize file storage locations, attach arbitrary CDNs, and otherwise extend the filesystem / cloud storage integration layer. - -:::danger - -Some drivers might try to index their filesystem every time the driver is instantiated, even if only the `url` method is needed. This can have serious performance implications. In most cases, you'll want to ensure that your driver's `url` method does not ping the remote filesystem. Similarly, the remote filesystem should usually not be accessed until operations are actually executed. - -::: - -## GUI and Admin Configuration - -Flarum does not currently provide a GUI for selecting drivers for disks, or for entering settings for drivers. This might be added in the future. For now, extensions are responsible for providing a GUI for their disks and drivers. - -As noted [above](#storage-drivers), if your extension provides a GUI for selecting drivers for a disk, it should modify the `disk_driver.DISK_NAME` key in settings. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/formatting.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/formatting.md deleted file mode 100644 index 95ccd4d71..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/formatting.md +++ /dev/null @@ -1,42 +0,0 @@ -# Biçimlendirme - -Flarum uses the powerful [s9e TextFormatter](https://github.com/s9e/TextFormatter) library to format posts from plain markup into HTML. You should become familiar with [how TextFormatter works](https://s9etextformatter.readthedocs.io/Getting_started/How_it_works/) before you attempt to extend it. - -In Flarum, post content is formatted with a minimal TextFormatter configuration by default. The bundled **Markdown** and **BBCode** extensions simply enable the respective plugins on this TextFormatter configuration. - -## Configuration - -You can configure the TextFormatter `Configurator` instance, as well as run custom logic during parsing and rendering, using the `Formatter` extender: - -```php -use Flarum\Extend; -use Psr\Http\Message\ServerRequestInterface as Request; -use s9e\TextFormatter\Configurator; -use s9e\TextFormatter\Parser; -use s9e\TextFormatter\Renderer; - -return [ - (new Extend\Formatter) - // Add custom text formatter configuration - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modify raw text before it is parsed. - // This callback should return the modified text. - ->parse(function (Parser $parser, $context, $text) { - // custom logic here - return $newText; - }) - // Modify the XML to be rendered before rendering. - // This callback should return the new XML. - // For example, in the mentions extension, this is used to - // provide the username and display name of the user being mentioned. - // Make sure that the last $request argument is nullable (or omitted entirely). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // custom logic here - return $newXml; - }) -]; -``` - -With a good understanding of TextFormatter, this will allow you to achieve anything from simple BBCode tag additions to more complex formatting tasks like Flarum's **Mentions** extension. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/forms.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/forms.md deleted file mode 100644 index 682243c95..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/forms.md +++ /dev/null @@ -1,108 +0,0 @@ -# Formlar ve İstekler - -In this article, we'll go over some frontend tools that are available to us for building and managing forms, as well how to send HTTP requests via Flarum. - -## Form Components - -As with any interactive site, you will likely want to include forms in some pages and modals. Flarum provides some components to make building (and styling!) these forms easier. Please see the linked API documentation for each of these to learn more about its accepted attrs. - -- The [`flarum/common/components/FieldSet` component](https://api.docs.flarum.org/js/master/class/src/common/components/fieldset.js~fieldset) wraps its children in a HTML fieldset tag, with a legend. -- The [`flarum/common/components/Select` component](https://api.docs.flarum.org/js/master/class/src/common/components/select.js~select) is a stylized select input. -- The [`flarum/common/components/Switch`](https://api.docs.flarum.org/js/master/class/src/common/components/switch.js~switch) and [`flarum/common/components/Checkbox` components](https://api.docs.flarum.org/js/master/class/src/common/components/checkbox.js~checkbox) are stylized checkbox input components. Their `loading` attr can be set to `true` to show a loading indicator. -- The [`flarum/common/components/Button` component](https://api.docs.flarum.org/js/master/class/src/common/components/button.js~button) is a stylized button, and is used frequently throughout Flarum. - -You'll typically want to assign logic for reacting to input changes via Mithril's `on*` attrs, not external listeners (as is common with jQuery or plain JS). For example: - -```jsx -import Component from 'flarum/common/Component'; -import FieldSet from 'flarum/common/components/FieldSet'; -import Button from 'flarum/common/components/Button'; -import Switch from 'flarum/common/components/Switch'; - - -class FormComponent extends Component { - oninit(vnode) { - this.textInput = ""; - this.booleanInput = false; - } - - view() { - return ( -
-
- this.textInput = e.target.value}> - - this.booleanInput = val}> - -
- -
- ) - } - - onsubmit() { - // Some form handling logic here - } -} -``` - -Don't forget to use [translations](i18n.md)! - - -## Streams, bidi, and withAttr - -Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/common/util/Stream`. This is a very powerful reactive data structure, but is most commonly used in Flarum as a wrapper for form data. Its basic usage is: - -```js -import Stream from 'flarum/common/utils/Stream'; - - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true -``` - -In Flarum forms, streams are frequently used together with the bidi attr. Bidi stands for bidirectional binding, and is a common pattern in frontend frameworks. Flarum patches Mithril with the [`m.attrs.bidi` library](https://github.com/tobyzerner/m.attrs. This abstracts away input processing in Mithril. For instance: - -```jsx -import Stream from 'flarum/common/utils/Stream'; - -const value = Stream(); - -// Without bidi - value(e.target.value)}> - -// With bidi - -``` - -You can also use the `flarum/common/utils/withAttr` util for simplified form processing. `withAttr` calls a callable, providing as an argument some attr of the DOM element tied to the component in question: - -```jsx -import Stream from 'flarum/common/utils/Stream'; -import withAttr from 'flarum/common/utils/withAttr'; - -const value = Stream(); - -// With a stream - - -// With any callable - { - // Some custom logic here -})}> -``` - -## Making Requests - -In our [models](models.md) documentation, you learned how to work with models, and save model creation, changes, and deletion to the database via the Store util, which is just a wrapper around Flarum's request system, which itself is just a wrapper around [Mithril's request system](https://mithril.js.org/request.html). - -Flarum's request system is available globally via `app.request(options)`, and has the following differences from Mithril's `m.request(options)`: - -- It will automatically attach `X-CSRF-Token` headers. -- It will convert `PATCH` and `DELETE` requests into `POST` requests, and attach a `X-HTTP-Method-Override` header. -- If the request errors, it will show an alert which, if in debug mode, can be clicked to show a full error modal. -- You can supply a `background: false` option, which will run the request synchronously. However, this should almost never be done. - -Otherwise, the API for using `app.request` is the same as that for `m.request`. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend-pages.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend-pages.md deleted file mode 100644 index d01da8e41..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend-pages.md +++ /dev/null @@ -1,218 +0,0 @@ -# Ön Uç Sayfaları ve Çözücüler - -As explained in the [Routes and Content](routes.md#frontend-routes) documentation, we can use Mithril's routing system to show different [components](frontend.md#components) for different routes. Mithril allows you to use any component you like, even a Modal or Alert, but we recommend sticking to component classes that inherit the `Page` component. - -## The Page Component - -We provide `flarum/common/components/Page` as a base class for pages in both the `admin` and `forum` frontends. It has a few benefits: - -- Automatically updates [`app.current` and `app.previous` PageState](#pagestate) when switching from one route to another. -- Automatically closes the modal and drawer when switching from one route to another. -- Applies `this.bodyClass` (if defined) to the '#app' HTML element when the page renders. -- It's also good for consistency's sake to use a common base class for all pages. -- If the page's `scrollTopOnCreate` attribute is set to `false` in `oninit`, the page won't be scrolled to the top when changed. -- If the page's `useBrowserScrollRestoration` is set to `false` in `oninit`, the browser's automatic scroll restoration won't be used on that page. - -Page components work just like any other inherited component. For a (very simple) example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - view() { - return

Hello!

- } -} -``` - -### Setting Page as Homepage - -Flarum uses a setting to determine which page should be the homepage: this gives admins flexibility to customize their communities. To add your custom page to the homepage options in Admin, you'll need to extend the `BasicsPage.homePageItems` method with your page's path. - -An example from the [Tags extension](https://github.com/flarum/tags/blob/master/js/src/admin/addTagsHomePageOption.js): - -```js -import { extend } from 'flarum/common/extend'; -import BasicsPage from 'flarum/common/components/BasicsPage'; - -export default function() { - extend(BasicsPage.prototype, 'homePageItems', items => { - items.add('tags', { - path: '/tags', - label: app.translator.trans('flarum-tags.admin.basics.tags_label') - }); - }); -} -``` - -To learn how to set up a path/route for your custom page, see the [relevant documentation](routes.md). - -### Page Titles - -Often, you'll want some custom text to appear in the browser tab's title for your page. For instance, a tags page might want to show "Tags - FORUM NAME", or a discussion page might want to show the title of the discussion. - -To do this, your page should include calls to `app.setTitle()` and `app.setTitleCount()` in its `oncreate` [lifecycle hook](frontend.md) (or when data is loaded, if it pulls in data from the API). - -For example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - oncreate(vnode) { - super.oncreate(vnode); - - app.setTitle("Cool Page"); - app.setTitleCount(0); - } - - view() { - // ... - } -} - -export default class CustomPageLoadsData extends Page { - oninit(vnode) { - super.oninit(vnode); - - app.store.find("users", 1).then(user => { - app.setTitle(user.displayName()); - app.setTitleCount(0); - }) - } - - view() { - // ... - } -} -``` - -Please note that if your page is [set as the homepage](#setting-page-as-homepage), `app.setTitle()` will clear the title for simplicity. It should still be called though, to prevent titles from previous pages from carrying over. - -## PageState - -Sometimes, we want to get information about the page we're currently on, or the page we've just come from. To allow this, Flarum creates (and stores) instances of [`PageState`](https://api.docs.flarum.org/js/master/class/src/common/states/pagestate.js~pagestate) as `app.current` and `app.previous`. These store: - -- The component class being used for the page -- A collection of data that each page sets about itself. The current route name is always included. - -Data can be set to, and retrieved from, Page State using: - -```js -app.current.set(KEY, DATA); -app.current.get(KEY); -``` - -For example, this is how the Discussion Page makes its [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) instance globally available. - -You can also check the type and data of a page using `PostStreamState`'s `matches` method. For instance, if we want to know if we are currently on a discussion page: - -```jsx -import IndexPage from 'flarum/forum/components/DiscussionPage'; -import DiscussionPage from 'flarum/forum/components/DiscussionPage'; - -// To just check page type -app.current.matches(DiscussionPage); - -// To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -## Admin Pages - -See the [Admin Dashboard documentation](admin.md) for more information on tools specifically available to admin pages (and how to override the admin page for your extension). - -## Route Resolvers (Advanced) - -[Advanced use cases](https://mithril.js.org/route.html#advanced-component-resolution) can take advantage of Mithril's [route resolver system](https://mithril.js.org/route.html#routeresolver). Flarum actually already wraps all its components in the `flarum/common/resolvers/DefaultResolver` resolver. This has the following benefits: - -- It passes a `routeName` attr to the current page, which then provides it to `PageState` -- It assigns a [key](https://mithril.js.org/keys.html#single-child-keyed-fragments) to the top level page component. When the route changes, if the top level component's key has changed, it will be completely rerendered (by default, Mithril does not rerender components when switching from one page to another if both are handled by the same component). - -### Using Route Resolvers - -There are actually 3 ways to set the component / route resolver when registering a route: - -- the `resolver` key can be used to provide an **instance** of a route resolver. This instance should define which component should be used, and hardcode the route name to be passed into it. This instance will be used without any modifications by Flarum. -- The `resolverClass` key AND `component` key can be used to provide a **class** that will be used to instantiate a route resolver, to be used instead of Flarum's default one, as well as the component to use. Its constructor should take 2 arguments: `(component, routeName)`. -- The `component` key can be used alone to provide a component. This will result in the default behavior. - -For example: - -```js -// See above for a custom page example -import CustomPage from './components/CustomPage'; -// See below for a custom resolver example -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Use a route resolver instance -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Use a custom route resolver class -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Use the default resolver class (`flarum/common/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -### Custom Resolvers - -We strongly encourage custom route resolvers to extend `flarum/common/resolvers/DefaultResolver`. For example, Flarum's `flarum/forum/resolvers/DiscussionPageResolver` assigns the same key to all links to the same discussion (regardless of the current post), and triggers scrolling when using `m.route.set` to go from one post to another on the same discussion page: - -```js -import DefaultResolver from '../../common/resolvers/DefaultResolver'; - -/** - * This isn't exported as it is a temporary measure. - * A more robust system will be implemented alongside UTF-8 support in beta 15. - */ -function getDiscussionIdFromSlug(slug: string | undefined) { - if (!slug) return; - return slug.split('-')[0]; -} - -/** - * A custom route resolver for DiscussionPage that generates the same key to all posts - * on the same discussion. It triggers a scroll when going from one post to another - * in the same discussion. - */ -export default class DiscussionPageResolver extends DefaultResolver { - static scrollToPostNumber: number | null = null; - - makeKey() { - const params = { ...m.route.param() }; - if ('near' in params) { - delete params.near; - } - params.id = getDiscussionIdFromSlug(params.id); - return this.routeName.replace('.near', '') + JSON.stringify(params); - } - - onmatch(args, requestedPath, route) { - if (route.includes('/d/:id') && getDiscussionIdFromSlug(args.id) === getDiscussionIdFromSlug(m.route.param('id'))) { - DiscussionPageResolver.scrollToPostNumber = parseInt(args.near); - } - - return super.onmatch(args, requestedPath, route); - } - - render(vnode) { - if (DiscussionPageResolver.scrollToPostNumber !== null) { - const number = DiscussionPageResolver.scrollToPostNumber; - // Scroll after a timeout to avoid clashes with the render. - setTimeout(() => app.current.get('stream').goToNumber(number)); - DiscussionPageResolver.scrollToPostNumber = null; - } - - return super.render(vnode); - } -} -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend.md deleted file mode 100644 index b8af97c41..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/frontend.md +++ /dev/null @@ -1,422 +0,0 @@ -# Ön Uç Geliştirme - -This page describes how to make changes to Flarum's user interface. How to add buttons, marquees, and blinking text. 🤩 - -[Remember](/extend/start.md#architecture), Flarum's frontend is a **single-page JavaScript application**. There's no Twig, Blade, or any other kind of PHP template to speak of. The few templates that are present in the backend are only used to render search-engine-optimized content. All changes to the UI need to be made via JavaScript. - -Flarum has two separate frontend applications: - -* `forum`, the public side of your forum where users create discussions and posts. -* `admin`, the private side of your forum where, as an administrator of your forum, you configure your Flarum installation. - -They share the same foundational code, so once you know how to extend one, you know how to extend both. - -:::tip Typings! - -Along with new TypeScript support, we have a [`tsconfig` package](https://www.npmjs.com/package/flarum-tsconfig) available, which you should install as a dev dependency to gain access to our typings. Make sure you follow the instructions in the [package's README](https://github.com/flarum/flarum-tsconfig#readme) to configure typings support. - -::: - -## Transpilation and File Structure - -This portion of the guide will explain the necessary file setup for extensions. Once again, we highly recommend using the [Flarum CLI](https://github.com/flarum/cli) to set up the file structure for you. That being said, you should still read this to understand what's going on beneath the surface. - -Before we can write any JavaScript, we need to set up a **transpiler**. This allows us to use [TypeScript](https://www.typescriptlang.org/) and its magic in Flarum core and extensions. - -In order to do this transpilation, you need to be working in a capable environment. No, not the home/office kind of environment – you can work in the bathroom for all I care! I'm talking about the tools that are installed on your system. You'll need: - -* Node.js and npm ([Download](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) - -This can be tricky because everyone's system is different. From the OS you're using, to the program versions you have installed, to the user access permissions – I get chills just thinking about it! If you run into trouble, ~~tell him I said hi~~ use [Google](https://google.com) to see if someone has encountered the same error as you and found a solution. If not, ask for help from the [Flarum Community](https://discuss.flarum.org) or on the [Discord chat](https://flarum.org/discord/). - -It's time to set up our little JavaScript transpilation project. Create a new folder in your extension called `js`, then pop in a couple of new files. A typical extension will have the following frontend structure: - -``` -js -├── dist (compiled js is placed here) -├── src -│ ├── admin -│ └── forum -├── admin.js -├── forum.js -├── package.json -├── tsconfig.json -└── webpack.config.js -``` - -### package.json - -```json -{ - "private": true, - "name": "@acme/flarum-hello-world", - "dependencies": { - "flarum-webpack-config": "^1.0.0", - "webpack": "^4.0.0", - "webpack-cli": "^4.0.0" - }, - "devDependencies": { - "flarum-tsconfig": "^1.0.0" - }, - "scripts": { - "dev": "webpack --mode development --watch", - "build": "webpack --mode production" - } -} -``` - -This is a standard JS [package-description file](https://docs.npmjs.com/files/package.json), used by npm and Yarn (Javascript package managers). You can use it to add commands, js dependencies, and package metadata. We're not actually publishing a npm package: this is simply used to collect dependencies. - -Please note that we do not need to include `flarum/core` or any flarum extensions as dependencies: they will be automatically packaged when Flarum compiles the frontends for all extensions. - -### webpack.config.js - -```js -const config = require('flarum-webpack-config'); - -module.exports = config(); -``` - -[Webpack](https://webpack.js.org/concepts/) is the system that actually compiles and bundles all the javascript (and its dependencies) for our extension. To work properly, our extensions should use the [official flarum webpack config](https://github.com/flarum/flarum-webpack-config) (shown in the above example). - -### tsconfig.json - -```json -{ - // Use Flarum's tsconfig as a starting point - "extends": "flarum-tsconfig", - // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder - // and also tells your Typescript server to read core's global typings for - // access to `dayjs` and `$` in the global namespace. - "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"], - "compilerOptions": { - // This will output typings to `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] - } - } -} -``` - -This is a standard configuration file to enable support for Typescript with the options that Flarum needs. - -Always ensure you're using the latest version of this file: https://github.com/flarum/flarum-tsconfig#readme. - -Even if you choose not to use TypeScript in your extension, which is supported natively by our Webpack config, it's still recommended to install the `flarum-tsconfig` package and to include this configuration file so that your IDE can infer types for our core JS. - -To get the typings working, you'll need to run `composer update` in your extension's folder to download the latest copy of Flarum's core into a new `vendor` folder. Remember not to commit this folder if you're using a version control system such as Git. - -You may also need to restart your IDE's TypeScript server. In Visual Studio Code, you can press F1, then type "Restart TypeScript Server" and hit ENTER. This might take a minute to complete. - -### admin.js and forum.js - -These files contain the root of our actual frontend JS. You could put your entire extension here, but that would not be well organized. For this reason, we recommend putting the actual source code in `src`, and having these files just export the contents of `src`. For instance: - -```js -// admin.js -export * from './src/admin'; - -// forum.js -export * from './src/forum'; -``` - -### src - -If following the recommendations for `admin.js` and `forum.js`, we'll want to have 2 subfolders here: one for `admin` frontend code, and one for `forum` frontend code. If you have components, models, utils, or other code that is shared across both frontends, you may want to create a `common` subfolder and place it there. - -Structure for `admin` and `forum` is identical, so we'll just show it for `forum` here: - -``` -src/forum/ -├── components/ -|-- models/ -├── utils/ -└── index.js -``` - -`components`, `models`, and `utils` are directories that contain files where you can define custom [components](#components), [models](models.md#frontend-models), and reusable util helper functions. Please note that this is all simply a recommendation: there's nothing forcing you to use this particular file structure (or any other file structure). - -The most important file here is `index.js`: everything else is just extracting classes and functions into their own files. Let's go over a typical `index.js` file structure: - -```js -import { extend, override } from 'flarum/common/extend'; - -// We provide our extension code in the form of an "initializer". -// This is a callback that will run after the core has booted. -app.initializers.add('acme-flarum-hello-world', function(app) { - // Your Extension Code Here - console.log("EXTENSION NAME is working!"); -}); -``` - -We'll go over tools available for extensions below. - -### Importing - -You should familiarize yourself with proper syntax for [importing js modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), as most extensions larger than a few lines will split their js into multiple files. - -Pretty much every Flarum extension will need to import *something* from Flarum Core. Like most extensions, core's JS source code is split up into `admin`, `common`, and `forum` folders. You can import the file by prefixing its path in the Flarum core source code with `flarum`. So `admin/components/AdminLinkButton` is available as `flarum/admin/components/AdminLinkButton`, `common/Component` is available as `flarum/common/Component`, and `forum/states/PostStreamState` is available as `flarum/forum/states/PostStreamState`. - -In some cases, an extension may want to extend code from another flarum extension. This is only possible for extensions which explicitly export their contents. - -* `flarum/tags` and `flarum/flags` are currently the only bundled extensions that allow extending their JS. You can import their contents from `flarum/{EXT_NAME}/PATH` (e.g. `flarum/tags/components/TagHero`). -* The process for extending each community extension is different; you should consult documentation for each individual extension. - -### Transpilation - -OK, time to fire up the transpiler. Run the following commands in the `js` directory: - -```bash -npm install -npm run dev -``` - -This will compile your browser-ready JavaScript code into the `js/dist/forum.js` file, and keep watching for changes to the source files. Nifty! - -When you've finished developing your extension (or before a new release), you'll want to run `npm run build` instead of `npm run dev`: this builds the extension in production mode, which makes the source code smaller and faster. - -## Asset Registration - -### JavaScript - -In order for your extension's JavaScript to be loaded into the frontend, we need to tell Flarum where to find it. We can do this using the `Frontend` extender's `js` method. Add it to your extension's `extend.php` file: - -```php -js(__DIR__.'/js/dist/forum.js') -]; -``` - -Flarum will make anything you `export` from `forum.js` available in the global `flarum.extensions['acme-hello-world']` object. Thus, you may choose to expose your own public API for other extensions to interact with. - -:::tip External Libraries - -Only one main JavaScript file per extension is permitted. If you need to include any external JavaScript libraries, either install them with NPM and `import` them so they are compiled into your JavaScript file, or see [Routes and Content](/extend/routes.md) to learn how to add extra `'; - }) -]; -``` - -You can also add content onto your frontend route registrations: - -```php -return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) -]; -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/search.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/search.md deleted file mode 100644 index 19486a0fd..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/search.md +++ /dev/null @@ -1,202 +0,0 @@ -# Arama - -Flarum treats searching and filtering as parallel but distinct processes. Which process is used to handle a request to a [`List` API endpoint](/extend/api.md#api-endpoints) depends on the query parameters: - -- Filtering is applied when the `filter[q]` query param is omitted. Filters represent **structured** queries: for instance, you might want to only retrieve discussions in a certain category, or users who registered before a certain date. Filtering computes results based entirely on `filter[KEY] = VALUE` query parameters. -- Searching is applied when the `filter[q]` query param is included. Searches represent **unstructured** queries: the user submits an arbitrary string, and data records that "match" it are returned. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Searching computes results based solely on parsing the `filter[q]` query param: all other `filter[KEY] = VALUE` params are ignored when searching. It's important to note that searches aren't entirely unstructured: the dataset being searched can be constrained by gambits (which are very similar to filters, and will be explained later). - -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. - -Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. - -One key advantage of this split is that it allows searching to be implemented via an external service, such as ElasticSearch. For larger communities, this can be significantly more performant and accurate. There isn't a dedicated extender for this yet, so for now, replacing the default Flarum search driver requires overriding the container bindings of `Searcher` classes. This is a highly advanced use case; if you're interested in doing this, please reach out on our [community forums](https://discuss.flarum.org/). - -Remember that the [JSON:API schema](https://jsonapi.org/format) is used for all API requests. - -:::tip Reuse Code - -Often, you might want to use the same class as both a `Filter` and a `Gambit` (both explained below). Your classes can implement both interface; see Flarum core's [`UnreadFilterGambit`](https://github.com/flarum/framework/blob/main/framework/core/src/Discussion/Query/UnreadFilterGambit.php) for an example. - -::: - -:::tip Query Builder vs Eloquent Builder - -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps - -::: - -## Filtering - -Filtering constrains queries based on `Filters` (highlighted in code to avoid confusion with the process of filtering), which are classes that implement `Flarum\Filter\FilterInterface` and run depending on query parameters. After filtering is complete, a set of callbacks called "filter mutators" run for every filter request. - -When the `filter` method on a `Filterer` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Filter/AbstractFilterer.php#L50-L93)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Filterer` class's `getQuery()` method. -2. We loop through all `filter[KEY] = VALUE` query params. For each of these, any `Filter`s registered to the model whose `getFilterKey()` method matches the query param `KEY` is applied. `Filter`s can be negated by providing the query param as `filter[-KEY] = VALUE`. Whether or not a `Filter` is negated is passed to it as an argument: implementing negation is up to the `Filter`s. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "filter mutators" are applied. These are callbacks that receive the filter state (a wrapper around the query builder and current user) and filter criteria, and perform some arbitrary changes. All "filter mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Filtering for an Existing Model - -Let's say you've added a `country` column to the User model, and would like to filter users by country. We'll need to define a custom `Filter`: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -Note that `FilterState` is a wrapper around the Eloquent builder's underlying Query builder and the current user. - -Also, let's pretend that for some reason, we want to omit any users that have a different country from the current user on ANY filter. We can use a "filter mutator" for this: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -Now, all we need to do is register these via the Filter extender: - -```php - // Other extenders - (new Extend\Filter(UserFilterer::class)) - ->addFilter(CountryFilter::class) - ->addFilterMutator(OnlySameCountryFilterMutator::class), - // Other extenders -``` - -### Add Filtering to a New Model - -To filter a model that doesn't support filtering, you'll need to create a subclass of `Flarum/Filter/AbstractFilterer` for that model. For an example, see core's [UserFilterer](https://github.com/flarum/framework/blob/main/framework/core/src/User/Filter/UserFilterer.php). - -Then, you'll need to use that filterer in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -## Searching - -Searching constrains queries by applying `Gambit`s, which are classes that implement `Flarum\Search\GambitInterface`, based on the `filter[q]` query param. After searching is complete, a set of callbacks called "search mutators" run for every search request. - -When the `search` method on a `Searcher` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Search/AbstractSearcher.php#L55-L79)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Searcher` class's `getQuery()` method. -2. The `filter[q]` param is split by spaces into "tokens". Each token is matched against the model's registered `Gambit`s (each gambit has a `match` method). For any tokens that match a gambit, that gambit is applied, and the token is removed from the query string. Once all regular `Gambit`s have ran, all remaining unmatched tokens are passed to the model's `FullTextGambit`, which implements the actual searching logic. For example if searching discussions, in the `filter[q]` string `'author:1 hello is:hidden' world`, `author:1` and `is:hidden` would get matched by core's Author and Hidden gambits, and `'hello world'` (the remaining tokens) would be passed to the `DiscussionFulltextGambit`. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "search mutators" are applied. These are callbacks that receive the search state (a wrapper around the query builder and current user) and criteria, and perform some arbitrary changes. All "search mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Searching for an Existing Model - -Let's reuse the "country" examples we used above, and see how we'd implement the same things for searching: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -:::warning No Spaces in Gambit Patterns! - -Flarum splits the `filter[q]` string into tokens by splitting it at spaces. This means that your custom gambits can NOT use spaces as part of their pattern. - -::: - -:::tip AbstractRegexGambit - -All a gambit needs to do is implement `Flarum\Search\GambitInterface`, which receives the search state and a token. It should return if this gambit applies for the given token, and if so, make whatever mutations are necessary to the query builder accessible as `$searchState->getQuery()`. - -However, for most gambits, the `AbstractRegexGambit` abstract class (used above) should be used as a base class. This makes it a lot simpler to match and apply gambits. - -::: - -Similarly, the search mutator we need is almost identical to the filter mutator from before: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -We can register these via the `SimpleFlarumSearch` extender (in the future, the `Search` extender will be used for registering custom search drivers): - -```php - // Other extenders - (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(CountryGambit::class) - ->addSearchMutator(OnlySameCountrySearchMutator::class), - // Other extenders -``` - -### Add Searching to a New Model - -To support searching for a model, you'll need to create a subclass of `Flarum/Search/AbstractSearcher` for that model. For an example, see core's [UserSearcher](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/UserSearcher.php). - -Then, you'll need to use that searcher in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -Every searcher **must** have a fulltext gambit (the logic that actually does the searching). Otherwise, it won't be booted by Flarum, and you'll get an error. See core's [FulltextGambit for users](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/Gambit/FulltextGambit.php) for an example. You can set (or override) the full text gambit for a searcher via the `SimpleFlarumSearch` extender's `setFullTextGambit()` method. - -### Search Drivers - -Coming soon! - -## Frontend Tools - -Coming soon! diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/service-provider.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/service-provider.md deleted file mode 100644 index 30fef15df..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/service-provider.md +++ /dev/null @@ -1,65 +0,0 @@ -# Servis Sağlayıcı - -As noted throughout this documentation, Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection. [Service Providers](https://laravel.com/docs/8.x/providers) allow low-level configuration and modification of the Flarum backend. The most common use case for service providers is to create, modify, or replace container bindings. That being said, service providers allow you full access to run whatever logic you need during application boot with access to the container. - -:::caution Advanced Use Only!!! - -Unlike with other extenders, the Service Provider layer is NOT use-case driven, and is NOT considered public API. It is subject to change at any time, without notice or deprecation. This should only be used if you know what you're doing, and the other extenders don't satisfy your use case. - -::: - -## Flarum Boot Process - -To understand service providers, you must first understand the order in which Flarum boots. Most of this happens in [Flarum\Foundation\InstalledSite](https://github.com/flarum/framework/blob/main/framework/core/src/Foundation/InstalledSite.php) - -1. The container and application are initialized, and essential bindings (config, environment, logger) are registered -2. The `register` methods of all core service providers are run. -3. The `extend` methods of all extenders used by all enabled extensions are run. -4. The `extend` methods of all extenders used in the Flarum site's local `extend.php` are run. -5. The `boot` methods of all core service providers are run. - -## Custom Service Providers - -A custom service provider should extend `Flarum\Foundation\AbstractServiceProvider`, and can have a `boot` and a `register` method. For example: - -```php -container->resolving(SomeClass::class, function ($container) { - return new SomeClass($container->make('some.binding')); - }); - } - - public function boot(Container $container) - { - // custom logic here - } -} -``` - -The `register` method will run during step (3) above, and the `boot` method will run during step (5) above. In the `register` method, the container is available via `$this->container`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. - -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane) for more information. - -To actually register your custom service provider, you can use the `ServiceProvider` extender in `extend.php`: - -```php -register(CustomServiceProvider::class), - // Other extenders -]; -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/settings.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/settings.md deleted file mode 100644 index 4fe60d6aa..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/settings.md +++ /dev/null @@ -1,90 +0,0 @@ -# Ayarlar - -At some point while making an extension, you might want to read some of the forum's settings or store certain settings specific to your extension. Thankfully, Flarum makes this very easy. - -## The Settings Repository - -Reading or changing settings can be done using an implementation of the `SettingsRepositoryInterface`. Because Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection, you don't need to worry about where to obtain such a repository, or how to instantiate one. Instead, you can rely on the container to instantiate your class and inject the correct dependencies. - -```php -settings = $settings; - } -} -``` - -Great! Now the `SettingsRepositoryInterface` is available through `$this->settings` to our class. - -### Reading Settings - -To read settings, all we have to do is use the repository's `get()` function: - -`$this->settings->get('forum_title')` - -The `get()` function accepts two arguments: - -1. The name of the setting you are trying to read. -2. (Optional) A default value if no value has been stored for such a setting. By default, this will be `null`. - -### Storing Settings - -Storing settings ist just as easy, use the `set()` function: - -`$this->settings->set('forum_title', 'Super Awesome Forum')` - -The `set` function also accepts two arguments: - -1. The name of the setting you are trying to change. -2. The value you want to store for this setting. - -### Other Functions - -The `all()` function returns an array of all known settings. - -The `delete($name)` function lets you remove a named setting. - -## Settings in the Frontend - -### Editing Settings - -To learn more about adding settings through the admin dashboard, see the [relevant documentation](admin.md). -### Accessing Settings - -All settings are available in the `admin` frontend via the `app.data.settings` global. However, this is not done in the `forum` frontend, as anyone can access it, and you wouldn't want to leak all your settings! (Seriously, that could be a very problematic data breach). - -Instead, if we want to use settings in the `forum` frontend, we'll need to serialize them and send them alongside the initial forum data payload. - -This can be done via the `Settings` extender. For example: - -**extend.php** - -```php -use Flarum\Extend; - -return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }, "default value!"), -] -``` - -Now, the `my.cool.setting.key` setting will be accessible in the frontend as `app.forum.attribute("myCoolSetting")`, and our modified value will be accessible via `app.forum.attribute("myCoolSettingModified")`. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/slugging.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/slugging.md deleted file mode 100644 index 5eb3657ad..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/slugging.md +++ /dev/null @@ -1 +0,0 @@ -# Model Yavaşlatma diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/start.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/start.md deleted file mode 100644 index 418dee766..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/start.md +++ /dev/null @@ -1,153 +0,0 @@ -# Başlangıç - -Flarum eklentisi mi yazmak istiyorsunuz? Doğru yere geldiniz! Bu dökümantasyon sizi bazı temel kavramlara götürecek ve ardından ilk Flarum uzantınızı sıfırdan oluşturacaksınız. - -## Architecture - -Flarum'un nasıl büyüteceğimizi anlamak için, önce Flarum'un nasıl inşa edildiğini biraz anlamamız gerekiyor. - -Flarum'un _ modern _ programlama dillerini ve araçlarını kullandığını bilin. Daha önce sadece WordPress eklentileri oluşturduysanız, kendinizi biraz yetersiz hissedebilirsiniz! Sorun Değil - yeni şeyler öğrenmek ve becerilerinizi geliştirmek için harika bir zaman. However, we would advise that you become somewhat familiar with the technologies described below before proceeding. - -Flarum is made up of three layers: - -* First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/8.x/container), which is used throughout our backend. - -* Second, the backend exposes a **public API** which allows frontend clients to interface with your forum's data. This is built according to the [JSON:API specification](https://jsonapi.org/). - -* Finally, there is the default web interface which we call the **frontend**. This is a [single-page application](https://en.wikipedia.org/wiki/Single-page_application) which consumes the API. It's built with a simple React-like framework called [Mithril.js](https://mithril.js.org). - -Extensions will often need to interact with all three of these layers to make things happen. For example, if you wanted to build an extension that adds custom fields to user profiles, you would need to add the appropriate database structures in the **backend**, expose that data in the **public API**, and then display it and allow users to edit it on the **frontend**. - -So... how do we extend these layers? - -## Extenders - -In order to extend Flarum, we will be using a concept called **extenders**. Extenders are *declarative* objects that describe in plain terms the goals you are trying to achieve (such as adding a new route to your forum, or executing some code when a new discussion was created). - -Every extender is different. However, they will always look somewhat similar to this: - -```php -// Register a JavaScript and a CSS file to be delivered with the forum frontend -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') -``` - -You first create an instance of the extender, and then call methods on it for further configuration. All of these methods return the extender itself, so that you can achieve your entire configuration just by chaining method calls. - -To keep things consistent, we use this concept of extenders in both the backend (in PHP land) and the frontend (in JavaScript land). _Everything_ you do in your extension should be done via extenders, because they are a **guarantee** we are giving to you that a future minor release of Flarum won't break your extension. - -All of the extenders currently available to you from Flarum's core can be found in the [`Extend` namespace](https://github.com/flarum/framework/blob/main/framework/core/src/Extend) [(PHP API documentation)](https://api.docs.flarum.org/php/master/flarum/extend) Extensions may also offer their [own extenders](extensibility.md#custom-extenders). - -## Hello World - -Want to see an extender in action? The `extend.php` file in the root of your Flarum installation is the easiest way to register extenders just for your site. It should return an array of extender objects. Pop it open and add the following: - -```php -content(function (Document $document) { - $document->head[] = ''; - }) -]; -``` - -Now pay your forum a visit for a pleasant (albeit extremely obtrusive) greeting. 👋 - -For simple site-specific customizations – like adding a bit of custom CSS/JavaScript, or integrating with your site's authentication system – the `extend.php` file in your forum's root is great. But at some point, your customization might outgrow it. Or maybe you have wanted to build an extension to share with the community from the get-go. Time to build an extension! - -## Extension Packaging - -[Composer](https://getcomposer.org) is a dependency manager for PHP. It allows applications to easily pull in external code libraries and makes it easy to keep them up-to-date so that security and bug fixes are propagated rapidly. - -As it turns out, every Flarum extension is also a Composer package. That means someone's Flarum installation can "require" a certain extension and Composer will pull it in and keep it up-to-date. Nice! - -During development, you can work on your extensions locally and set up a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path) to install your local copy. Create a new `packages` folder in the root of your Flarum installation, and then run this command to tell Composer that it can find packages in here: - -```bash -composer config repositories.0 path "packages/*" -``` - -Now let's start building our first extension. Make a new folder inside `packages` for your extension called `hello-world`. We'll put two files in it: `extend.php` and `composer.json`. These files serve as the heart and soul of the extension. - -### extend.php - -The `extend.php` file is just like the one in the root of your site. It will return an array of extender objects that tell Flarum what you want to do. For now, just move over the `Frontend` extender that you had earlier. - -### composer.json - -We need to tell Composer a bit about our package, and we can do this by creating a `composer.json` file: - -```json -{ - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": "^1.0.0" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } - } -} -``` - -* **name** is the name of the Composer package in the format `vendor/package`. - * You should choose a vendor name that’s unique to you — your GitHub username, for example. For the purposes of this tutorial, we’ll assume you’re using `acme` as your vendor name. - * You should prefix the `package` part with `flarum-` to indicate that it’s a package specifically intended for use with Flarum. - -* **description** is a short one-sentence description of what the extension does. - -* **type** MUST be set to `flarum-extension`. This ensures that when someone "requires" your extension, it will be identified as such. - -* **require** contains a list of your extension's own dependencies. - * You'll want to specify the version of Flarum that your extension is compatible with here. - * This is also the place to list other Composer libraries your code needs to work. - -* **autoload** tells Composer where to find your extension's classes. The namespace in here should reflect your extensions' vendor and package name in CamelCase. - -* **extra.flarum-extension** contains some Flarum-specific information, like your extension's display name and how its icon should look. - * **title** is the display name of your extension. - * **icon** is an object which defines your extension's icon. The **name** property is a [Font Awesome icon class name](https://fontawesome.com/icons). All other properties are used as the `style` attribute for your extension's icon. - -See [the composer.json schema](https://getcomposer.org/doc/04-schema.md) documentation for information about other properties you can add to `composer.json`. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -Use the CLI to automatically create your extension's scaffolding: -```bash -$ flarum-cli init -``` - -::: - -### Installing Your Extension - -The final thing we need to do to get up and running is to install your extension. Navigate to the root directory of your Flarum install and run the following command: - -```bash -composer require acme/flarum-hello-world *@dev -``` - -Once that's done, go ahead and fire 'er up on your forum's Administration page, then navigate back to your forum. - -*whizzing, whirring, metal clunking* - -Woop! Hello to you too, extension! - -We're making good progress. We've learned how to set up our extension and use extenders, which opens up a lot of doors. Read on to learn how to extend Flarum's frontend. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md deleted file mode 100644 index 28e6c4aa7..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md +++ /dev/null @@ -1,86 +0,0 @@ -# Static Code Analysis - -Static code analysis is the process of analyzing the source code against a set of rules to find bugs, code smells, and security vulnerabilities. This is a great way to improve the quality of your code and to find potential issues before they are deployed to production. An example is validating the typings of a function to ensure that the function is called with the correct arguments. - -Flarum provides a static code analysis package based on [PHPStan](https://phpstan.org/) that can be added to your extension. In this guide, we will show you how to add the package to your extension and how to run the analysis. - -## Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update the infrastructure for phpstan to your code: - -```bash -$ flarum-cli infra phpstan -``` - -::: - -First you need to require the `flarum/phpstan` package in your extension. You can do this by running the following command in the root of our extension: - -```bash -composer require --dev flarum/phpstan:^1.0 -``` - -Next, you need to create a `phpstan.neon` file in the root of your extension. This file contains [the configuration for PHPStan](https://phpstan.org/config-reference). You can copy the following configuration into the file: - -```neon -includes: - - vendor/flarum/phpstan/extension.neon - -parameters: - # The level will be increased in Flarum 2.0 - level: 5 - paths: - - src - - extend.php - excludePaths: - - *.blade.php - checkMissingIterableValueType: false - databaseMigrationsPath: ['migrations'] -``` - -Finally, you need to add the following script to your `composer.json` file: - -```json -{ - "scripts": { - "analyse:phpstan": "phpstan analyse", - "clear-cache:phpstan": "phpstan clear-result-cache" - }, - "scripts-descriptions": { - "analyse:phpstan": "Run static analysis" - } -} -``` - -## Running the analysis - -To run the analysis, you can run the following command in the root of your extension: - -```bash -composer analyse:phpstan -``` - -If you want to clear the cache before running the analysis, you can run the following command: - -```bash -composer clear-cache:phpstan && composer analyse:phpstan -``` - -## GitHub Actions - -You can also run the analysis using GitHub Actions. Checkout the page on [GitHub Actions](github-actions.md) for more information. - -## Tips - -### Extended model attribute types - -PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. - -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. - -```php -(new Extend\Model(User::class)) - ->cast('is_cool', 'bool'), -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/testing.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/testing.md deleted file mode 100644 index 56124ff0e..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/testing.md +++ /dev/null @@ -1,565 +0,0 @@ -# Deneme - -Automated testing ensures that your extension performs as you expect it to, helps avoid introducing new bugs or regressions, and saves time on manual testing. Flarum currently provides tooling for automated backend unit and integration tests, and we plan to release support for frontend unit testing and E2E testing in the future. - -## Backend Tests - -The `flarum/testing` library is used by core and some bundled extensions for automated unit and integration tests. It is essentially a collection of utils that allow testing Flarum core and extensions with PHPUnit. - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update backend testing infrastructure to your code: - -```bash -$ flarum-cli infra backendTesting -``` - -::: - -```bash -composer require --dev flarum/testing:^1.0 -``` - -Then, you will need to set up a file structure for tests, and add PHPUnit configuration: - -``` -tests -├── fixtures (put any files needed by your tests here (blade templates, images, etc)) -├── integration -│ ├── setup.php (code below) -│ └── PUT INTEGRATION TESTS HERE (organizing into folder is generally a good idea) -├── unit -│ ├── PUT UNIT TESTS HERE -├── phpunit.integration.xml (code below) -└── phpunit.unit.xml (code below) -``` - -#### phpunit.integration.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for integration tests. You can tweak this as needed, but keep `backupGlobals`, `backupStaticAttributes`, and `processIsolation` unchanged. - -```xml - - - - - - - ./integration - - - -``` - -#### phpunit.unit.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for unit tests. You can tweak this as needed. - -```xml - - - - - - - ./unit - - - - - - -``` - -#### setup.php - -This script will be run to set up a testing database / file structure. - -```php -run(); -``` - -#### composer.json Modifications - -We will also want to add scripts to our `composer.json`, so that we can run our test suite via `composer test`. Add some variant of the following to your `composer.json`: - -```json -"scripts": { - "test": [ - "@test:unit", - "@test:integration" - ], - "test:unit": "phpunit -c tests/phpunit.unit.xml", - "test:integration": "phpunit -c tests/phpunit.integration.xml", - "test:setup": "@php tests/integration/setup.php" -}, -"scripts-descriptions": { - "test": "Runs all tests.", - "test:unit": "Runs all unit tests.", - "test:integration": "Runs all integration tests.", - "test:setup": "Sets up a database for use with integration tests. Execute this only once." -} -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - ---- - -Now that we have everything in place, we need to set up our testing site for integration tests. For this, we will need a MySQL or MariaDb instance, and a place to store testing files. - -Testing database information is configured via the `DB_HOST` (defaults to `localhost`), `DB_PORT` (defaults to `3306`), `DB_DATABASE` (defaults to `flarum_test`), `DB_USERNAME` (defaults to `root`), `DB_PASSWORD` (defaults to `root`), and `DB_PREFIX` (defaults to `''`) environmental variables. The testing tmp directory path is configured via the `FLARUM_TEST_TMP_DIR_LOCAL` or `FLARUM_TEST_TMP_DIR` environmental variables, with the former taking precedence over the latter. If neither are provided, a `tmp` directory will be created in the `vendor` folder of your extension's local install. - -Now that we've provided the needed information, all we need to do is run `composer test:setup` in our extension's root directory, and we have our testing environment ready to go! - -Since [(almost)](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/tests/integration/api/discussions/ListWithFulltextSearchTest.php#L29-L45) all database operations in integration tests are run in transactions, developers working on multiple extensions will generally find it more convenient to use one shared database and tmp directory for testing all their extensions. To do this, set the database config and `FLARUM_TEST_TMP_DIR` environmental variables in your `.bashrc` or `.bash_profile` to the path you want to use, and run the setup script for any one extension (you'll still want to include the setup file in every repo for CI testing via GitHub Actions). You should then be good to go for any Flarum extension (or core). - -### Using Integration Tests - -Flarum's integration test utils are contained in the `Flarum\Testing\integration\TestCase` class. It: - -- Boots (and makes available) an instance of the Flarum application. -- Allows pre-populating the database, enabling extensions, and adding extenders. -- Runs all database changes in transactions, so your test database retains the default post-installation state. -- Allows sending requests through the middleware stack to test HTTP endpoints. - -Your testcase classes should extend this class. - -#### Test Case Setup - -There are several important utilities available for your test cases: - -- The `setting($key, $value)` method allows you to override settings before the app has booted. This is useful if your boot process has logic depending on settings (e.g. which driver to use for some system). -- Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. -- The `extension($extensionId)` method will take Flarum IDs of extensions to enable as arguments. Your extension should always call this with your extension's ID at the start of test cases, unless the goal of the test case in question is to confirm some behavior present without your extension, and compare that to behavior when your extension is enabled. If your extension is dependent on other extensions, make sure they are included in the composer.json `require` field (or `require-dev` for [optional dependencies](extending-extensions.md)), and also list their composer package names when calling `extension()`. Note that you must list them in a valid order. -- The `extend($extender)` method takes instances of extenders as arguments, and is useful for testing extenders introduced by your extension for other extensions to use. -- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/8.x/queries#insert-statements). - -If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. - -:::warning - -The `TestCase` class will boot a Flarum instance the first time its `app()` method is called. Any uses of `prepareDatabase`, `extend`, or `extension` after this happens will have no effect. Make sure you have done all the setup you need in your test case before calling `app()`, or `database()`, `server()`, or `send()`, which call `app()` implicitly. If you need to make database modifications after the app has booted, you can use the regular Eloquent save method, or the `Illuminate\Database\ConnectionInterface` instance obtained via calling the `database()` method. - -::: - -Of course, since this is all based on PHPUnit, you can use the `setUp()` methods of your test classes for common setup tasks. - -For example: - -```php -setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. - ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] - ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '

something

'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - - // ... -} -``` - -#### Sending Requests - -A common application of automated testing is pinging various HTTP endpoints with various data, authenticated as different users. You can use this to ensure that: - -- Users can't access content they're not supported to access. -- Permission-based create/edit/delete operations perform as expected. -- The type and schema of data returned is correct. -- Some desired side effect is applied when pinging an API. -- The basic API operations needed by your extension aren't erroring, and don't break when you make changes. - -`TestCase` provides several utilities: - -- The `request()` method constructs a `Psr\Http\Message\ServerRequestInterface` implementing object from a path, a method, and some options, which can be used for authentication, attaching cookies, or configuring the JSON request body. See the [method docblock](https://github.com/flarum/testing/blob/main/src/integration/TestCase.php) for more information on available options. -- Once you've created a request instance, you can send it (and get a response object back) via the `send()` method. - -For example: - -```php -send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - // ... -} -``` - -:::caution - -If you want to send query parameters in a GET request, you can't include them in the path; you'll need to add them afterwards with the `withQueryParams` method. - -::: - -:::caution - -This is an extreme edge case, but note that MySQL does not update the fulltext index in transactions, so the standard approach won't work if you're trying to test a modified fulltext query. See [core's approach](https://github.com/flarum/framework/blob/main/framework/core/tests/integration/extenders/SimpleFlarumSearchTest.php) for an example of a workaround. - -::: - -#### Console Tests - -If you want to test custom console commands, you can extend `Flarum\Testing\integration\ConsoleTestCase` (which itself extends the regular `Flarum\Testing\integration\TestCase`). It provides 2 useful methods: - -- `$this->console()` returns an instance of `Symfony\Component\Console\Application` -- `$this->runCommand()` takes an array that will be wrapped in `Symfony\Component\Console\Input\ArrayInput`, and run. See the [Symfony code docblock](https://github.com/symfony/console/blob/5.x/Input/ArrayInput.php#L22) for more information. - -For example: - -```php - 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } -} -``` - -### Using Unit Tests - -Unit testing in Flarum uses [PHPUnit](https://phpunit.de/getting-started/phpunit-9.html) and so unit testing in flarum is much like any other PHP application. You can find [general tutorials on testing](https://www.youtube.com/watch?v=9-X_b_fxmRM) if you're also new to php. - -When writing unit tests in Flarum, here are some helpful tips. - -#### Mocking Flarum Services - -Unlike the running app, or even integration tests, there is no app/container/etc to inject service instances into our classes. Now all the useful settings, or helpers your extension use require a _mock_ . We want to limit mocking to just the key services, supporting only the minimum interactions needed to test the contract of our individual functions. - -```php - public function setUp(): void - { - parent::setUp(); - // example - if our setting needs settings, we can mock the settings repository - $settingsRepo = m::mock(SettingsRepositoryInterface::class); - // and then control specific return values for each setting key - $settingsRepo->shouldReceive('get')->with('some-plugin-key')->andReturn('some-value-useful-for-testing'); - // construct your class under test, passing mocked services as needed - $this->serializer = new YourClassUnderTest($settingsRepo); - } -``` - -Some aspects require more mocks. If you're validating authorization interactions for instance you might need to mock your users `User::class` and the request's method that provides them as well! - -``` - $this->actor = m::mock(User::class); - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('getAttribute->getActor')->andReturn($this->actor); - $this->actor->shouldReceive('SOME PERMISSION')->andReturn(true/false); -``` - -NOTE: If you find your extension needs _lots and lots_ of mocks, or mocks that feel unrelated, it might be an opportunity to simplify your code, perhaps moving key logic into their own smaller functions (that dont require mocks). - -## Frontend Tests - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update frontend testing infrastructure to your code: - -```bash -$ flarum-cli infra frontendTesting -``` - -::: - -First, you need to install the Jest config dev dependency: - -```bash -$ yarn add --dev @flarum/jest-config -``` - -Then, add the following to your `package.json`: - -```json -{ - "type": "module", - "scripts": { - ..., - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" - } -} -``` - -Rename `webpack.config.js` to `webpack.config.cjs`. This is necessary because Jest doesn't support ESM yet. - -Create a `jest.config.cjs` file in the root of your extension: - -```js -module.exports = require('@flarum/jest-config')(); -``` - -If you are using TypeScript, create tsconfig.test.json with the following content: - -```json -{ - "extends": "./tsconfig.json", - "include": ["tests/**/*"], - "files": ["../../../node_modules/@flarum/jest-config/shims.d.ts"] -} -``` - -Then, you will need to set up a file structure for tests: - -``` -js -├── dist -├── src -├── tests -│ ├── unit -│ │ └── functionTest.test.js -│ ├── integration -│ │ └── componentTest.test.js -├── package.json -├── tsconfig.json -├── tsconfig.test.json -├── jest.config.cjs -└── webpack.config.cjs -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - -### Using Unit Tests - -Like any other JS project, you can use Jest to write unit tests for your frontend code. Checkout the [Jest docs](https://jestjs.io/docs/using-matchers) for more information on how to write tests. - -Here's a simple example of a unit test fo core's `abbreviateNumber` function: - -```ts -import abbreviateNumber from '../../../../src/common/utils/abbreviateNumber'; - -test('does not change small numbers', () => { - expect(abbreviateNumber(1)).toBe('1'); -}); - -test('abbreviates large numbers', () => { - expect(abbreviateNumber(1000000)).toBe('1M'); - expect(abbreviateNumber(100500)).toBe('100.5K'); -}); - -test('abbreviates large numbers with decimal places', () => { - expect(abbreviateNumber(100500)).toBe('100.5K'); - expect(abbreviateNumber(13234)).toBe('13.2K'); -}); -``` - -### Using Integration Tests - -Integration tests are used to test the components of your frontend code and the interaction between different components. For example, you might test that a page component renders the correct content based on certain parameters. - -Here's a simple example of an integration test for core's `Alert` component: - -```ts -import Alert from '../../../../src/common/components/Alert'; -import m from 'mithril'; -import mq from 'mithril-query'; -import { jest } from '@jest/globals'; - -describe('Alert displays as expected', () => { - it('should display alert messages with an icon', () => { - const alert = mq(m(Alert, { type: 'error' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toHaveElement('i.icon'); - }); - - it('should display alert messages with a custom icon when using a title', () => { - const alert = mq(Alert, { type: 'error', icon: 'fas fa-users', title: 'Woops..' }); - expect(alert).toContainRaw('Woops..'); - expect(alert).toHaveElement('i.fas.fa-users'); - }); - - it('should display alert messages with a title', () => { - const alert = mq(m(Alert, { type: 'error', title: 'Error Title' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toContainRaw('Error Title'); - expect(alert).toHaveElement('.Alert-title'); - }); - - it('should display alert messages with custom controls', () => { - const alert = mq(Alert, { type: 'error', controls: [m('button', { className: 'Button--test' }, 'Click me!')] }); - expect(alert).toHaveElement('button.Button--test'); - }); -}); - -describe('Alert is dismissible', () => { - it('should show dismiss button', function () { - const alert = mq(m(Alert, { dismissible: true }, 'Shoot!')); - expect(alert).toHaveElement('button.Alert-dismiss'); - }); - - it('should call ondismiss when dismiss button is clicked', function () { - const ondismiss = jest.fn(); - const alert = mq(Alert, { dismissible: true, ondismiss }); - alert.click('.Alert-dismiss'); - expect(ondismiss).toHaveBeenCalled(); - }); - - it('should not be dismissible if not chosen', function () { - const alert = mq(Alert, { type: 'error', dismissible: false }); - expect(alert).not.toHaveElement('button.Alert-dismiss'); - }); -}); -``` - -#### Methods - -These are the custom methods that are available for mithril component tests: -* **`toHaveElement(selector)`** - Checks if the component has an element that matches the given selector. -* **`toContainRaw(content)`** - Checks if the component HTML contains the given content. - -To negate any of these methods, simply prefix them with `not.`. For example, `expect(alert).not.toHaveElement('button.Alert-dismiss');`. For more information, check out the [Jest docs](https://jestjs.io/docs/using-matchers). For example you may need to check how to [mock functions](https://jestjs.io/docs/mock-functions), or how to use `beforeEach` and `afterEach` to set up and tear down tests. - - - -## E2E Tests - -Coming Soon! diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/theme.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/theme.md deleted file mode 100644 index a8aa44456..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/theme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Hızlı Başlangıç - -Flarum "themes" are just extensions. Typically, you'll want to use the `Frontend` extender to register custom [Less](https://lesscss.org/#overview) and JS. Of course, you can use other extenders too: for example, you might want to support settings to allow configuring your theme. - -You can indicate that your extension is a theme by setting the "extra.flarum-extension.category" key to "theme". For example: - -```json -{ - // other fields - "extra": { - "flarum-extension": { - "category": "theme" - } - } - // other fields -} -``` - -All this will do is show your extension in the "theme" section in the admin dashboard extension list. - -## Less Variable Customization - -You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. - -## Switching Between Themes - -Flarum doesn't currently have a comprehensive system that would support switching between themes. This is planned for future releases. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/translate.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/translate.md deleted file mode 100644 index f9d08d0a8..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/translate.md +++ /dev/null @@ -1,3 +0,0 @@ -# Flarum Çeviri - -**Yakında Türkçe belgeler eklenecektir.** \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_0.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_0.md deleted file mode 100644 index 7ba6adcbf..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_0.md +++ /dev/null @@ -1,257 +0,0 @@ -# Updating For 1.0 - -Flarum version 1.0 is the long-awaited stable release! This release brings a number of refactors, cleanup, and small improvements that should make your Flarum experience just a bit better! - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Full Stack - -### Translations and transChoice - -#### Background - -Historically, Flarum has used Symfony for backend translations, and a port for frontend translations to keep format consistent. There are a few limitations to this approach though: - -- Developers need to decide between using `trans` or `transChoice` for pluralization -- The pluralization format is proprietary to Symfony -- We have to maintain the JS port ourselves -- Keys for values provided to backend translations need to be wrapped in curly braces. (e.g. `$this->translator->trans('some.translation', ['{username}' => 'Some Username!'])`). -- There's no support for complex applications (nested pluralization, non-number-based selection) -- As a result of the previous point, genderization is impossible. And that's kinda important for a lot of languages. - -### New System - -In v5, Symfony dropped their proprietary `transChoice` system in favor of the more-or-less standard [ICU MessageFormat](https://symfony.com/doc/5.2/translation/message_format.html). This solves pretty much every single one of the aforementioned issues. In this release, Flarum will be fully switching to ICU MessageFormat as well. What does this mean for extensions? - -- `transChoice` should not be used at all; instead, the variable passed for pluralization should be included in the data. -- Keys for backend translations no longer need to be surrounded by curly braces. -- Translations can now use the [`select` and `plural`](https://symfony.com/doc/5.2/translation/message_format.html) formatter syntaxes. For the `plural` formatter, the `offset` parameter and `#` magic variables are supported. -- These `select` and `plural` syntaxes can be nested to arbitrary depth. This is often a bad idea though (beyond, say, 2 levels), as things can get unnecessarily complex. - -No change to translation file naming is necessary (Symfony docs say that an `+intl-icu` suffix is necessary, but Flarum will now interpret all translation files as internationalized). - -#### Future Changes - -In the future, this will serve as a basis for additional features: - -- Translator preprocessors will allow extensions to modify arguments passed to translations. This will enable genderization (extensions could automatically extract a gender field from any objects of type "user" passed in). -- We could support internationalized "magic variables" for numbers: currently, `one` is supported, but others (`few`, `many`, etc) currently aren't. -- We could support ordinal formatting in additional to just plural formatting. - -#### Changes Needed in Extensions - -The `transChoice` methods in the frontend and backend have been removed. The `trans` method should always be used for translating, regardless of pluralization. If a translation requires pluralization, make sure you pass in the controlling variable as one of the arguments. - -In the frontend, code that looked like this: - -```js -app.translator.transChoice('some-translation', guestCount, {host: hostName}); -``` - -should be changed to: - -```js -// This uses ES6 key-property shorthand notation. {guestCount: guestCount} is equivalent to {guestCount} -app.translator.trans('some-translation', {host: hostName, guestCount }); -``` - -Similarly, in the backend, - -```php -$translator->transChoice('some-translation', $guestCount, ['{host}' => $hostName]); -``` - -should be changed to: - -```php -$translator->trans('some-translation', ['host' => $hostName, 'guestCount' => $guestCount]); -``` - -Note that in the backend, translation keys were previously wrapped in curly braces. This is no longer needed. - -#### Changes Needed in Translations - -Translations that aren't using pluralization don't need any changes. - -Pluralized translations should be changed as follows: - -`For {count} minute|For {count} minutes` - -to - -`{count, plural, one {For # minute} other {For # minutes}}` - -Note that in this example, `count` is the variable that controls pluralization. If a different variable were used (such as guestCount in the example above), this would look like: - -`{guestCount, plural, one {For # minute} other {For # minutes}}` - -See [our i18n docs](i18n.md) for more information. - -### Permissions Changes - -For a long time, the `viewDiscussions` and `viewUserList` permissions have been confusing. Despite their names: - -- `viewDiscussions` controls viewing both discussions and users. -- `viewUserList` controls searching users, not viewing user profiles. - -To clear this up, in v1.0, these permissions have been renamed to `viewForum` and `searchUsers` respectively. A migration in core will automatically adjust all permissions in the database to use the new naming. However, any extension code using the old name must switch to the new ones immediately to avoid security issues. To help the transfer, a warning will be thrown if the old permissions are referenced. - -We have also slightly improved tag scoping for permissions. Currently, permissions can be applied to tags if: - -- The permission is `viewForum` -- The permission is `startDiscussion` -- The permission starts with `discussion.` - -However, this doesn't work for namespaced permissions (`flarum-acme.discussion.bookmark`), or permissions that don't really have anything to do with discussions, but should still be scoped (e.g. `viewTag`). To counter this, a `tagScoped` attribute can be used on the object passed to [`registerPermission`](admin.md) to explicitly indicate whether the permission should be tag scopable. If this attribute is not provided, the current rules will be used to determine whether the permission should be tag scopable. - -## Frontend - -### Tooltip Changes - -The `flarum/common/components/Tooltip` component has been introduced as a simpler and less framework-dependent way to add tooltips. If your code is creating tooltips directly (e.g. via `$.tooltip()` in `oncreate` methods), you should wrap your components in the `Tooltip` component instead. For example: - -```tsx - - - -``` - -See [the source code](https://github.com/flarum/core/blob/master/js/src/common/components/Tooltip.tsx) for more examples and instructions. - -See [the PR](https://github.com/flarum/core/pull/2843/files) for examples of how to change existing code to use tooltips. - -### PaginatedListState - -The `flarum/common/states/PaginatedListState` state class has been introduced to abstract away most of the logic of `DiscussionListState` and `NotificationListState`. It provides support for loading and displaying paginated lists of JSON:API resources (usually models). In future releases, we will also provide an `PaginatedList` (or `InfiniteScroll`) component that can be used as a base class for these paginated lists. - -Please see [the source code](https://github.com/flarum/core/blob/master/js/src/common/states/PaginatedListState.ts) for a list of methods. - -Note that `flarum/forum/states/DiscussionListState`'s `empty` and `hasDiscussions` methods have been removed, and replaced with `isEmpty` and `hasItems` respectively. This is a breaking change. - -### New Loading Spinner - -The old `spin.js` based loading indicator has been replaced with a CSS-based solution. For the most part, no changes should be needed in extensions, but in some cases, you might need to update your spinner. This change also makes it easier to customize the spinner. - -See [this discussion](https://discuss.flarum.org/d/26994-beta16-using-the-new-loading-spinner) for more information. - -### classList util - -Ever wrote messy code trying to put together a list of classes for some component? Well, no longer! The [clsx library](https://www.npmjs.com/package/clsx) is now available as the `flarum/common/utils/classList` util. - -### User List - -An extensible user list has been added to the admin dashboard. In future releases, we hope to extract a generic model table component that can be used to list any model in the admin dashboard. - -See [the source code](https://github.com/flarum/core/blob/master/js/src/admin/components/UserListPage.tsx#L41) for a list of methods to extend, and examples of how columns should look like (can be added by extending the `columns` method and adding items to the [ItemList](frontend.md)). - -### Miscellaneous - -- Components should now call `super` for ALL Mithril lifecycle methods they define. Before, this was only needed for `oninit`, `onbeforeupdate`, and `oncreate`. Now, it is also needed in `onupdate`, `onbeforeremove`, and `onremove`. See [this GitHub issue](https://github.com/flarum/core/issues/2446) for information on why this change was made. -- The `flarum/common/utils/insertText` and `flarum/common/utils/styleSelectedText` utils have been moved to core from `flarum/markdown`. See `flarum/markdown` for an example of usage. -- The `extend` and `override` utils can now modify several methods at once by passing in an array of method names instead of a single method name string as the second argument. This is useful for extending the `oncreate` and `onupdate` methods at once. -- The `EditUserModal` component is no longer available through the `flarum/forum` namespace, it has been moved to `flarum/common`. Imports should be adjusted. -- The `Model` and `Route` JS extenders have been removed for now. There aren't currently used in any extensions that we know of. We will be reintroducing JS extenders during v1.x releases. -- The `Search` component can now be used with the `SearchState` state class. Previously, `SearchState` was missing the `getInitialSearch` method expected by the `Search` component. - -## Backend - -### Filesystem Extenders - -In this release, we refactored our use of the filesystem to more consistently use [Laravel's filesystem API](https://laravel.com/docs/8.x/filesystem). Extensions can now declare new disks, more easily use core's `flarum-assets` and `flarum-avatars` disks, and create their own storage drivers, enabling CDN and cloud storage support. - -### Compat and Closure Extenders - -In early Flarum versions, the `extend.php` file allowed arbitrary functions that allowed execution of arbitrary code one extension boot. For example: - -```php -return [ - // other extenders - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - } -]; -``` - -This approach was difficult to maintain and provide a well-tested public API for, frequently resolved classes early (breaking all sorts of things), and was not very descriptive. With the extender API completed in beta 16, this approach is no longer necessary. Support for these closures has been removed in this stable version. - -One type of functionality for which the extender replacement isn't obvious is container bindings ([e.g. flarum/pusher](https://github.com/flarum/pusher/blob/v0.1.0-beta.14/extend.php#L33-L49)). This can be done with via the service provider extender (e.g. [a newer version of flarum/pusher](https://github.com/flarum/pusher/blob/master/extend.php#L40-L41)). - -If you are unsure about which extenders should be used to replace your use of callbacks in `extend.php`, or are not sure that such an extender exists, please comment so below or reach out! We're in the final stages of finishing up the extender API, so now is the time to comment. - -### Scheduled Commands - -The [fof/console](https://github.com/FriendsOfFlarum/console) library has been a popular way to schedule commands (e.g. for publishing scheduled posts, running DB-heavy operations, etc) for several release. In Flarum 1.0, this functionality has been brought into core's `Console` extender. See our [console extension documentation](console.md) for more information on how to create schedule commands, and our [console user documentation](../console.md) for more information on how to run scheduled commands. - -### Eager Loading Extender - -As part of solving [N+1 Query issues](https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/) in some [Flarum API endpoints](https://github.com/flarum/core/issues/2637), we have introduced a `load` method on the `ApiController` extender that allows you to indicate relations that should be eager loaded. - -This should be done if you know a relation will always be included, or will always be referenced by controller / permission logic. For example, we will always need the tags of a discussion to check what permissions a user has on that discussion, so we should eager load the discussion's `tags` relationship. For example: - -```php -return [ - // other extenders - (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) - ->addInclude(['tags', 'tags.state', 'tags.parent']) - ->load('tags'), -]; -``` - -### RequestUtil - -The `Flarum\Http\RequestUtil`'s `getActor` and `withActor` should be used for getting/setting the actor (user) on requests. `$request->getAttribute('actor')` and `$request->withAttribute('actor')` are deprecated, and will be removed in v2.0. - -### Miscellaneous - -- The `Formatter` extender now has an `unparse` method that allows modifying XML before unparsing content. -- All route names must now be unique. In beta 16, uniqueness was enforced per-method; now, it is mandatory for all routes. -- API requests sent through `Flarum\Api\Client` now run through middleware, including `ThrottleApi`. This means that it is now possible to throttle login/registration calls. -- In beta 16, registering custom [searchers](search.md) was broken. It has been fixed in stable. -- The `post_likes` table in the [flarum/likes](https://github.com/flarum/likes) extension now logs the timestamp when likes were created. This isn't used in the extension, but could be used in other extensions for analytics. -- The `help` attribute of [admin settings](admin.md) no longer disappears on click. -- The `generate:migration` console command has been removed. The [Flarum CLI](https://discuss.flarum.org/d/26525-rfc-flarum-cli-alpha) should be used instead. -- The `GambitManager` util class is now considered internal API, and should not be used directly by extensions. -- The `session` attribute is no longer available on the `User` class. This caused issues with queue drivers, and was not conceptually correct (a user can have multiple sessions). The current session is still available via the `$request` instance. -- The `app`, `base_path`, `public_path`, `storage_path`, and `event` global helpers have been restored, but deprecated perpetually. These exist in case Laravel packages need them; they **should not** be used directly by Flarum extension code. The `flarum/laravel-helpers` package has been abandoned. -- The following deprecated features from beta 16 have been removed: - - The `TextEditor`, `TextEditorButton`, and `SuperTextarea` components are no longer exported through the `flarum/forum` namespace, but through `flarum/common` (with the exception of `SuperTextarea`, which has been replaced with `flarum/common/utils/BasicEditorDriver`). - - Support for `Symfony\Component\Translation\TranslatorInterface` has been removed, `Symfony\Contracts\Translation\TranslatorInterface` should be used instead. - - All backwards compatibility layers for the [beta 16 access token refactors](update-b16.md#access-token-and-authentication-changes) have been removed - - The `GetModelIsPrivate` event has been removed. The `ModelPrivate` extender should be used instead. - - The `Searching` (for both `User` and `Discussion` models), `ConfigureAbstractGambits`, `ConfigureDiscussionGambits`, and `ConfigureUserGambits` events have been removed. The `SimpleFlarumSearch` extender should be used instead. - - The `ConfigurePostsQuery` event has been removed. The `Filter` extender should be used instead. - - The `ApiSerializer` extender's `mutate` method has been removed. The same class's `attributes` method should be used instead. - - The `SearchCriteria` and `SearchResults` util classes have been removed. `Flarum\Query\QueryCriteria` and `Flarum\Query\QueryResults` should be used instead. - - The `pattern` property of `AbstractRegexGambit` has been removed; the `getGambitPattern` method is now a required abstract method. - - The `AbstractSearch` util class has been removed. `Flarum\Search\SearchState` and `Flarum\Filter\FilterState` should be used instead. - - The `CheckingPassword` event has been removed, the `Auth` extender should be used instead. - -## Tags Extension Changes - -As mentioned above, [tag scopable permissions](#permissions-changes) can now be explicitly declared. - -We've also made several big refactors to significantly improve tags performance. - -Firstly, the [Tag](https://github.com/flarum/tags/blob/d093ca777ba81f826157522c96680717d3a90e24/src/Tag.php#L38-L38) model's static `getIdsWhereCan` and `getIdsWhereCannot` methods have been removed. These methods scaled horribly on forums with many tags, sometimes adding several seconds to response time. - -These methods have been replaced with a `whereHasPermission` [Eloquent dynamic scope](https://laravel.com/docs/8.x/eloquent#dynamic-scopes) that returns a query. For example: - -`Tag::whereHasPermission($actor, 'viewDiscussions)`. - -That query can then be used in other DB queries, or further constricted to retrieve individual tags. - -Secondly, we no longer load in all tags as part of the initial payload. The initial payload contains all top-level primary tags, and the top 3 secondary tags. Other tags are loaded in as needed. Future releases will paginate secondary tags. This should enable forums to have thousands of secondary tags without significant performance impacts. These changes mean that extensions should not assume that all tags are available in the model store. - -## Testing Library Changes - -- Bundled extensions will not be automatically enabled; all enabled extensions must be specified in that test case. -- `setting` and `config` methods have been added that allow configuring settings and config.php values before the tested application boots. See [the testing docs](testing.md) for more information. -- The `php flarum test:setup` command will now drop the existing test DB tables before creating the database. This means that you can run `php flarum test:setup` to ensure a clean database without needing to go into the database and drop tables manually. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_x.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_x.md deleted file mode 100644 index ed17364ed..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-1_x.md +++ /dev/null @@ -1,139 +0,0 @@ -# Updating For 1.x - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## 1.7 - -### Frontend - -- Frontend extenders similar to the backend have been added, we highly recommend using them instead of the old method (https://docs.flarum.org/extend/models#adding-new-models-1), (https://docs.flarum.org/extend/routes#frontend-routes). -- There is a new tag selection component (https://github.com/flarum/framework/blob/360a2ba1d886df3fc6d326be932c5431ee9df8cf/extensions/tags/js/src/common/components/TagSelectionModal.tsx). - -### Backend - -- Support for php 8.2, deprecations are still thrown by some packages, the testing workflow has been updated to ignore deprecations on 8.2 -- The `/api` endpoint now contains the actor as an included relationship. -- The `Model::dateAttribute($attribute)` extender is deprecated, use `Model::cast($attribute, 'datetime')` instead. - -### Tooling - -- New `phpstan` package to run static code analysis on your extensions for code safety (https://docs.flarum.org/extend/static-code-analysis). -- New `jest-config` package to run frontend unit and component tests (https://docs.flarum.org/extend/testing). - -## 1.6 Changes - -### Backend - -- Added customizable session drivers through the `Session` extender. - -## 1.5 Changes - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Modals can be used in stacks, allowing for multiple modals to be open at once. This is useful for modals that open other modals: `app.modal.show(ModalComponent, { attrs }, true)`. - -### Backend - -- There is a new `createTableIfNotExists` migration helper, which can be used to create tables only if they don't already exist. - -## 1.4 Changes - -No developer-facing changes were made in Flarum v1.4. - -## 1.3 Changes - -Flarum v1.3 included mostly QoL improvements. Below are listed note worthy changes for extension developers: - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Frontend errors will no longer cause the forum to crash into a NoJs page. The extension will fail to execute its frontend code (initializer) and display an error to the admin through an alert, and to all users through the console. The frontend will continue to execute without the extension's frontend changes. -- The markdown toolbar can now be used on the admin side. - -### Backend - -- Calculation of the `number` attribute on `posts` has changed and no longer relies on the discussion model's `post_number_index` attribute which is now deprecated and will be removed in 2.0 -- Extension event listeners are now added after core even listeners, this should generally cause no changes in behavior. - -### Tooling - -- The backend tests workflow now automatically fails tests if there are any PHP warnings and notices. - -## 1.2 Changes - -Flarum v1.2 included quite a few bugfixes, internal refactors, and new features. The following recaps the most important changes for extension developers: - -### Frontend - -- Flarum core now passes TypeScript type checking (on the portion written in TypeScript). Additionally, major portions of the frontend (models, the application instance, and others) are now written in TypeScript. These changes should make it much easier and more fruitful to write extensions in TypeScript. -- Instead of directly using Less variables in CSS code, core now uses CSS variables. For the most part, we've just created CSS variables and set their values to the Less variables. This should make theming and customizing CSS a lot easier. https://github.com/flarum/core/pull/3146. -- Dropdowns can now be lazy-drawn to improve performance. You can do this by setting the lazy draw attr to "true". https://github.com/flarum/core/pull/2925. -- [Textarea-type settings](https://github.com/flarum/core/pull/3141) are now supported through the `app.extensionData.registerSetting` util. -- You can now use Webpack 5 to bundle your extension's code. This will offer minor bundle size improvements. -- A new `flarum/common/components/ColorPreviewInput` component [has been added](https://github.com/flarum/core/pull/3140). It can be used directly, or through the `color-preview` type when registered via `app.extensionData.registerSetting`. -- Extensions can now [modify the minimum search length](https://github.com/flarum/core/pull/3130) of the `Search` component. -- The following components are now extensible: - - The "colors" part of the Appearance page in the admin dashboard: https://github.com/flarum/core/pull/3186 - - The `StatusWidget` dropdown in the admin dashboard: https://github.com/flarum/core/pull/3189 - - `primaryControls` in the notification list: https://github.com/flarum/core/pull/3204 -- Extensions now have finer control over positioning when adding elements to the DiscussionPage sidebar items: https://github.com/flarum/core/pull/3165 -- - -### Backend - -- An [extender for settings defaults](https://github.com/flarum/core/pull/3127) has been added. This should be used instead of the `addSettings` migration helper, which has been deprecated. -- You can now [generate Less variables from setting values](https://github.com/flarum/core/pull/3011) via the `Settings` extender. -- Extensions can now [override/supplement blade template namespaces](https://github.com/flarum/core/pull/3167) through the `View` extender, meaning custom blade templates can be used instead of the default ones added by core or extensions. -- You can now define [custom Less functions through PHP](https://github.com/flarum/core/pull/3190), allowing you to use some backend logic in your Less theming. -- Extensions can now create [custom page title drivers](https://github.com/flarum/core/pull/3109/files) for titles in server-returned HTML. -- Custom logic can now be used when [deciding which relations to eager-load](https://github.com/flarum/core/pull/3116). -- Events [are now dispatched](https://github.com/flarum/core/pull/3203) for the `Notification\Read` and `Notification\ReadAll` events. -- An `ImageManager` instance is now [bound into the container](https://github.com/flarum/core/pull/3195), and can be configured to use either the `gd` or `imagick` backing drivers via the `"intervention.driver"` key in `config.php`. -- User IP addresses are now passed to the [API Client](https://github.com/flarum/core/pull/3124). -- A custom revision versioner implentation [can be set via container bindings](https://github.com/flarum/core/pull/3183) to customize how asset versions are named. -- A SlugManager instance [is now available](https://github.com/flarum/core/pull/3194) in blade templates via the `slugManager` variable. - -### Misc - -- Translations now support the `zero`, `one`, `two`, `few`, and `many` localized plural rules for `plural` ICU MessageFormat translations. This was done through the [`Intl.PluralRules` helper](https://github.com/flarum/core/issues/3072). -- Translations are now used for page titles, so that the format can be customized via language packs or [Linguist](https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease): https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228 -- API endpoints for retrieving single groups, as well as support for filtering groups on the plural get endpoint, [have been added](https://github.com/flarum/core/pull/3084). - - -### Tooling - - -- The `flarum-cli infra` command can now be used to update or enable various infrastructure features. You can now add the following to your extension in just one command: - - TypeScript - - Prettier for JS/TS formatting - - Backend testing with PHPUnit - - Code formatting with StyleCI - - EditorConfig support - - GitHub actions for automating testing, linting, type checking, and building. -- You can also exclude any files from these updates by adding their relative path to the "extra.flarum-cli" key's array in your extension's `composer.json` file. For example, if you wanted to exclude your tsconfig file from any updates by the infra system, the "extra.flarum-cli" key's value should be `["js/tsconfig.json"]`. -- The `flarum-cli audit infra` can be used to check that all infra modules your extension uses are up to date. The `--fix` flag can be used to automatically fix any issues, which has essentially the same effect as running `flarum-cli infra` for each outdated module. -- All `flarum-cli` commands can now be run with a `--no-interaction` flag to prevent prompts. Defaults will be used when possible, and errors will be thrown if a prompt is needed and there is no default. -- Frontend GH actions now support type-checking, as well as type coverage reports. - -## 1.1 Changes - -Flarum version 1.1 mostly focuses on bugfixes and quality-of-life improvements following our stable release earlier this year. These are mainly user-facing and internal infrastructure changes, so extensions are not significantly affected. - -### Frontend - -- Flarum now has an organization-wide prettier config package under [`@flarum/prettier-config`](https://github.com/flarum/prettier-config). -- Most custom (setting or data based) coloring in core is now done via [CSS custom properties](https://github.com/flarum/core/pull/3001). -- Typehinting for Flarum's globals are now [supported in extensions](https://github.com/flarum/core/pull/2992). -- You can now pass extra attrs to the `Select` component, and they will be [passed through to the DOM](https://github.com/flarum/core/pull/2959). -- The `DiscussionPage` component is now organized [as an item list](https://github.com/flarum/core/pull/3004), so it's easier for extensions to change its content. -- Extensions [can now edit](https://github.com/flarum/core/pull/2935) the `page` parameter of `PaginatedListState`. - -### Backend - -- Flarum now comes with a [Preload extender](https://github.com/flarum/core/pull/3057) for preloading any custom frontend assets. -- A new [Theme](https://github.com/flarum/core/pull/3008) extender now allows overriding Less files and internal imports. This allows themes to more easily completely replace Less modules. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b10.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b10.md deleted file mode 100644 index 9f2353ff9..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b10.md +++ /dev/null @@ -1,53 +0,0 @@ -# Beta 10 için Güncelleme - -Beta 10 further solidifies the core architecture, offering new extenders as a stable, use-case-driven API for extending Flarum's core. A few small changes may necessitate updates to your extensions to make them compatible with Beta 10. These are detailed below. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- The `Flarum\Event\GetDisplayName` class has been moved to `Flarum\User\Event\GetDisplayName`. -- The `Flarum\Http\Exception\ForbiddenException` has been removed. Use `Flarum\User\Exception\PermissionDeniedException` instead. -- The `assertGuest()` method of the `Flarum\User\AssertPermissionTrait` has been removed without replacement. -- Old error handling middleware and exception handler classes were removed (see "New Features" for more details): - - `Flarum\Api\Middleware\HandleErrors` - - `Flarum\Http\Middleware\HandleErrorsWithView` - - `Flarum\Http\Middleware\HandleErrorsWithWhoops` - - `Flarum\Api\ErrorHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FloodingExceptionHandler` - - `Flarum\Api\ExceptionHandler\IlluminateValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidAccessTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidConfirmationTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\MethodNotAllowedExceptionHandler` - - `Flarum\Api\ExceptionHandler\ModelNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\PermissionDeniedExceptionHandler` - - `Flarum\Api\ExceptionHandler\RouteNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\TokenMismatchExceptionHandler` - - `Flarum\Api\ExceptionHandler\ValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - -## Recommendations - -- We tweaked the [recommended flarum/core version constraints for extensions](start.md#composer-json). We now recommend you mark your extension as compatible with the current and the upcoming beta release. (For beta.10, that would be any beta.10.x and beta.11.x version.) The core team will strive to make this work well by deprecating features before removing them. More details on this change in [this pull request](https://github.com/flarum/docs/pull/75). - -## New Features - -- New, extensible **error handling** stack in the `Flarum\Foundation\ErrorHandling` namespace: The `Registry` maps exceptions to "types" and HTTP status codes, `HttpFormatter` instances turn them into HTTP responses. Finally, `Reporter` instances are notified about unknown exceptions. - - You can build custom exception classes that will abort the current request (or console command). If they have semantic meaning to your application, they should implement the `Flarum\Foundation\KnownError` interface, which exposes a "type" that is used to render pretty error pages or dedicated error messages. - - More consistent use of HTTP 401 and 403 status codes. HTTP 401 should be used when logging in (i.e. authenticating) could make a difference; HTTP 403 is reserved for requests that fail because the already authenticated user is lacking permissions to do something. - - The `assertRegistered()` and `assertPermission()` methods of the `Flarum\User\AssertPermissionTrait` trait have been changed to match above semantics. See [this pull request](https://github.com/flarum/core/pull/1854) for more details. - - Error views are now determined based on error "type", not on status code (see [bdac88b](https://github.com/flarum/core/commit/bdac88b5733643b9c5dabae9e09a64d9f6e41d58)) -- **Queue support**: This release incorporates Laravel's illuminate/queue package, which allows offloading long-running tasks (such as email sending or regular cleanup jobs) onto a dedicated worker process. These changes are mostly under the hood, the next release(s) will start using the queue system for sending emails. By default, Flarum will use the "sync" queue driver, which executes queued tasks immediately. This is far from ideal and mostly guarantees a hassle-free setups. Production-grade Flarum installs are expected to upgrade to a more full-featured queue adapter. -- The `Flarum\Extend\LanguagePack` now accepts an optional path in its constructor. That way, language packs can store their locales in a different directory if they want to. -- The `formatContent()` method of `Flarum\Post\CommentPost` can now be called without an HTTP request instance, e.g. when rendering a post in an email template. - -## Deprecations - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- Laravel's global string and array helpers (e.g. `str_contains()` and `array_only()`) are deprecated in favor of their class based alternatives (`Illuminate\Support\Str::contains()` and `Illuminate\Support\Arr::only()`). See the [announcement](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers) and [pull request](https://github.com/laravel/framework/pull/26898) for more information. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b12.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b12.md deleted file mode 100644 index 6fae49b97..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b12.md +++ /dev/null @@ -1,34 +0,0 @@ -# Beta 12 için Güncelleme - -Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Deprecations / Upcoming breaking changes - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- PHP 7.1 support will be dropped in beta.13. -- Using library classes from the `Zend` namespace is now deprecated and will be removed in beta.13. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been deprecated. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been deprecated. We finally have a [proper replacement](middleware.md) - see "New Features" below. Therefore, it will be removed in beta.13. -- If you implement the `Flarum\Mail\DriverInterface`: - - Returning a plain array of field names from the `availableSettings()` method is deprecated, but still supported. It must now return an array of field names mapping to their type. See [the inline documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L25-L32) for more details. - - Implement the `validate()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L34-L48). - - Implement the `canSend()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L50-L54). - -## New Features - -- New **PHP extenders**: - - `Flarum\Extend\Middleware` offers methods for adding, removing or replacing middleware in our three middleware stacks (api, forum, admin). We also added [documentation](middleware.md) for this feature. - - `Flarum\Extend\ErrorHandling` lets you configure status codes and other aspects of our error handling stack depending on error types or exception classes. -- **JavaScript**: - - The `flarum/components/Select` component now supports a `disabled` prop. See [PR #1978](https://github.com/flarum/core/pull/1978). - -## Other changes / Recommendations - -- The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b13.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b13.md deleted file mode 100644 index 19d0c18d8..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b13.md +++ /dev/null @@ -1,40 +0,0 @@ -# Beta 13 için Güncelleme - -Beta 13 ships with several new extenders to simplify building and maintaining extensions. We do our best to create backward compatibility changes. We recommend changing to new Extenders as soon as they are available. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- Dropped support for PHP 7.1. -- Classes from the `Zend` namespace are now removed. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been removed including the class. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been removed. Use the [proper replacement](middleware.md). -- Several events used in Event Listeners have been removed, use their [replacement extender](start.md#extenders) instead. -- The LanguagePack extender only loads keys from extensions that are enabled. The translations loaded are based on the yaml files matching the [i18n namespace](i18n.md#appendix-a-standard-key-format). -- All notifications are now sent through the queue; without a queue driver they will run as usual. -- The implementation of avatar upload changed, we're [no longer storing files temporarily on disk](https://github.com/flarum/core/pull/2117). -- The SES mail driver [has been removed](https://github.com/flarum/core/pull/2011). -- Mail driver backward compatibility from beta 12 has been removed, use the new Mail extender or implement the [modified interface](https://github.com/flarum/core/blob/master/src/Mail/DriverInterface.php). - -## Recommendations - -- Beta 14 will ship with a rewrite in the frontend (javascript). If you're building for that release, make sure to follow our [progress](https://github.com/flarum/core/pull/2126). - -## New Features - -- A ton of new extenders: - - [Middleware extender](https://github.com/flarum/core/pull/2017) - - [Console extender](https://github.com/flarum/core/pull/2057) - - [CSRF extender](https://github.com/flarum/core/pull/2095) - - [Event extender](https://github.com/flarum/core/pull/2097) - - [Mail extender](https://github.com/flarum/core/pull/2012) - - [Model extender](https://github.com/flarum/core/pull/2100) - -## Deprecations - -- Several events [have been marked deprecated](https://github.com/flarum/core/commit/4efdd2a4f2458c8703aae654f95c6958e3f7b60b) to be removed in beta 14. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b14.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b14.md deleted file mode 100644 index bee912ac2..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b14.md +++ /dev/null @@ -1,757 +0,0 @@ -# Beta 14 için Güncelleme - -This release brings a large chunk of breaking changes - hopefully the last chunk of this size before our stable release. In order to prepare the codebase for the upcoming stable release, we decided it was time to modernize / upgrade / exchange some of the underlying JavaScript libraries that are used in the frontend. Due to the nature and size of these upgrades, we have to pass on some of the breaking changes to you, our extension developers. - -On the bright side, this overdue upgrade brings us closer to the conventions of best practices of [Mithril.js](https://mithril.js.org/), the mini-framework used for Flarum's UI. Mithril's 2.0 release sports a more consistent component interface, which should be a solid foundation for years to come. Where possible, we replicated old APIs, to ease the upgrade and give you time to do the full transition. Quite a few breaking changes remain, though - read more below. - -:::tip - -If you need help with the upgrade, our friendly community will gladly help you out either [on the forum](https://discuss.flarum.org/t/extensibility) or [in chat](https://flarum.org/chat/). - -::: - -To ease the process, we've clearly separated the changes to the [frontend (JS)](#frontend-javascript) from those in the [backend (PHP)](#backend-php) below. If your extension does not change the UI, consider yourself lucky. :-) - -A [summary of the frontend changes](#required-frontend-changes-recap) is available towards the end of this guide. - -## Frontend (JavaScript) - -### Mithril 2.0: Concepts - -Most breaking changes required by beta 14 are prompted by changes in Mithril 2. [Mithril's upgrade guide](https://mithril.js.org/migration-v02x.html) is an extremely useful resource, and should be consulted for more detailed information. A few key changes are explained below: - -#### props -> attrs; initProps -> initAttrs - -Props passed into component are now referred to as `attrs`, and can be accessed via `this.attrs` where you would prior use `this.props`. This was done to be closer to Mithril's preferred terminology. We have provided a temporary backwards compatibility layer for `this.props`, but recommend using `this.attrs`. - -Accordingly, `initProps` has been replaced with `initAttrs`, with a similar BC layer. - -#### m.prop -> `flarum/utils/Stream` - -Mithril streams, which were available via `m.prop` in Mithril 0.2, are now available via `flarum/utils/Stream`. `m.prop` will still work for now due to a temporary BC layer. - -#### m.withAttr -> withAttr - -The `m.withAttr` util has been removed from Mithril. We have provided `flarum/utils/withAttr`, which does the same thing. A temporary BC layer has been added for `m.withAttr`. - -#### Lifecycle Hooks - -In mithril 0.2, we had 2 "lifecycle hooks": - -`init`, an unofficial hook which ran when the component instance was initialized. - -`config`, which ran when components were created, and on every redraw. - - -Mithril 2 has the following hooks; each of which take `vnode` as an argument: - -- `oninit` -- `oncreate` -- `onbeforeupdate` -- `onupdate` -- `onbeforeremove` -- `onremove` - -Please note that if your component is extending Flarum's helper `Component` class, you must call `super.METHOD(vnode)` if using `oninit`, `oncreate`, and `onbeforeupdate`. - -More information about what each of these do can be found [in Mithril's documentation](https://mithril.js.org/lifecycle-methods.html). - -A trivial example of how the old methods map to the new is: - -```js -class OldMithrilComponent extends Component { - init() { - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - config(element, isInitialized) { - console.log('Code to run on every redraw AND when the element is first attached'); - - if (isInitialized) return; - - console.log('Code to execute only once when components are first created and attached to the DOM'); - - context.onunload = () => { - console.log('Code to run when the component is removed from the DOM'); - } - } - - view() { - // In mithril 0, you could skip redrawing a component (or part of a component) by returning a subtree retain directive. - // See https://mithril.js.org/archive/v0.2.5/mithril.render.html#subtree-directives - // dontRedraw is a substitute for logic; usually, this is used together with SubtreeRetainer. - if (dontRedraw()) return { subtree: 'retain' }; - - return

Hello World!

; - } -} - -class NewMithrilComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - oncreate(vnode) { - super.oncreate(vnode); - - console.log('Code to run when components are first created and attached to the DOM'); - } - - onbeforeupdate(vnode, oldVnode) { - super.onbeforeupdate(vnode); - - console.log('Code to run BEFORE diffing / redrawing components on every redraw'); - - // In mithril 2, if we want to skip diffing / redrawing a component, we return "false" in its onbeforeupdate lifecycle hook. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeupdate - // This is also typically used with SubtreeRetainer. - if (dontRedraw()) return false; - } - - onupdate(vnode) { - // Unlike config, this does NOT run when components are first attached. - // Some code might need to be replicated between oncreate and onupdate. - console.log('Code to run on every redraw AFTER the DOM is updated.'); - } - - onbeforeremove(vnode) { - // This is run before components are removed from the DOM. - // If a promise is returned, the DOM element will only be removed when the - // promise completes. It is only called on the top-level component that has - // been removed. It has no equivalent in Mithril 0.2. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeremove - return Promise.resolve(); - } - - onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); - } -} -``` - -#### Children vs Text Nodes - -In Mithril 0.2, every child of a vnode is another vnode, stored in `vnode.children`. For Mithril 2, as a performance optimization, vnodes with a single text child now store that text directly in `vnode.text`. For developers, that means that `vnode.children` might not always contain the results needed. Luckily, text being stored in `vnode.text` vs `vnode.children` will be the same each time for a given component, but developers should be aware that at times, they might need to use `vnode.text` and not `vnode.children`. - -Please see [the mithril documentation](https://mithril.js.org/vnodes.html#structure) for more information on vnode structure. - -#### Routing API - -Mithril 2 introduces a few changes in the routing API. Most of these are quite simple: - -- `m.route()` to get the current route has been replaced by `m.route.get()` -- `m.route(NEW_ROUTE)` to set a new route has been replaced by `m.route.set(NEW_ROUTE)` -- When registering new routes, a component class should be provided, not a component instance. - -For example: - -```js -// Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } - -// Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } -``` - -Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. - -```js -// Mithril 0.2 -
Link Content - -// Mithril 2 -import Link from 'flarum/components/Link'; - -Link Content -``` - -You can also use `Link` to define external links, which will just render as plain `Children` html links. - -For a full list of routing-related changes, please see [the mithril documentation](https://mithril.js.org/migration-v02x.html). - -#### Redraw API - -Mithril 2 introduces a few changes in the redraw API. Most of these are quite simple: - -- Instead of `m.redraw(true)` for synchronous redraws, use `m.redraw.sync()` -- Instead of `m.lazyRedraw()`, use `m.redraw()` - -Remember that Mithril automatically triggers a redraw after DOM event handlers. The API for preventing a redraw has also changed: - -```js -// Mithril 0.2 - - -// Mithril 2 - -``` - -#### AJAX - -The `data` parameter of `m.request({...})` has been split up into `body` and `params`. - -For examples and other AJAX changes, see [the mithril documentation](https://mithril.js.org/migration-v02x.html#mrequest). - -#### Promises - -`m.deferred` has been removed, native promises should be used instead. For instance: - -```js -// Mithril 0.2 -const deferred = m.deferred(); - -app.store.find('posts').then(result => deferred.resolve(result)); - -return deferred.promise; - -// Mithril 2 -return app.store.find('posts'); -``` - -#### Component instances should not be stored - -Due to optimizations in Mithril's redrawing algorithms, [component instances should not be stored](https://mithril.js.org/components.html#define-components-statically,-call-them-dynamically). - -So whereas before, you might have done something like: - -```js -class ChildComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return

{this.counter}

; - } -} -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.child = new ChildComponent(); - } - - view() { - return ( -
- - {this.child.render()} -
- ) - } -} -``` - -That will no longer work. In fact; the Component class no longer has a render method. - -Instead, any data needed by a child component that is modified by a parent component should be passed in as an attr. For instance: - -```js -class ChildComponent extends Component { - view() { - return

{this.attrs.counter}

; - } -} - -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return ( -
- - -
- ) - } -} -``` - -For more complex components, this might require some reorganization of code. For instance, let's say you have data that can be modified by several unrelated components. In this case, it might be preferable to create a POJO "state instance' for this data. These states are similar to "service" singletons used in Angular and Ember. For instance: - -```js -class Counter { - constructor() { - this._counter = 0; - } - - increaseCounter() { - this._counter += 1; - } - - getCount() { - return this._counter; - } -} - -app.counter = new Counter(); - -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', -
-

Counter: {app.counter.getCount()}

-
- ); -}) - -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', -
- -
- ); -}) -``` - -This "state pattern" can be found throughout core. Some non-trivial examples are: - -- PageState -- SearchState and GlobalSearchState -- NotificationListState -- DiscussionListState - -### Changes in Core - -#### Modals - -Previously, modals could be opened by providing a `Modal` component instance: - -```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); -``` - -Since we don't store component instances anymore, we pass in the component class and any attrs separately. - -```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); -``` - -The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. Any modifications by extensions should accordingly be done to `ModalManagerState`. - -#### Alerts - -Previously, alerts could be opened by providing an `Alert` component instance: - -```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); -``` - -Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: - -```js -app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); -``` - -Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. This replaces the old method of passing the alert instance itself to `dismiss`. - -The `show`, `dismiss`, and `clear` methods are still available through `app.alerts`, but `app.alerts` now points to an instance of `AlertManagerState`, not of the `AlertManager` component. Any modifications by extensions should accordingly be done to `AlertManagerState`. - -#### Composer - -Since we don't store a component instances anymore, a number of util methods from `Composer`, `ComposerBody` (and it's subclasses), and `TextEditor` have been moved onto `ComposerState`. - -For `forum/components/Composer`, `isFullScreen`, `load`, `clear`, `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen` have been moved to `forum/states/ComposerState`. They all remain accessible via `app.composer.METHOD` - -A `bodyMatches` method has been added to `forum/states/ComposerState`, letting you check whether a certain subclass of `ComposerBody` is currently open. - -Various input fields are now stored as [Mithril Streams](https://mithril.js.org/stream.html) in `app.composer.fields`. For instance, to get the current composer content, you could use `app.composer.fields.content()`. Previously, it was available on `app.composer.component.content()`. **This is a convention that `ComposerBody` subclasses that add inputs should follow.** - -`app.composer.component` is no longer available. - -- Instead of `app.composer.component instanceof X`, use `app.composer.bodyMatches(X)`. -- Instead of `app.composer.component.props`, use `app.composer.body.attrs`. -- Instead of `app.composer.component.editor`, use `app.composer.editor`. - -For `forum/components/TextEditor`, the `setValue`, `moveCursorTo`, `getSelectionRange`, `insertAtCursor`, `insertAt`, `insertBetween`, `replaceBeforeCursor`, `insertBetween` methods have been moved to `forum/components/SuperTextarea`. - -Also for `forum/components/TextEditor`, `this.disabled` is no longer used; `disabled` is passed in as an attr instead. It may be accessed externally via `app.composer.body.attrs.disabled`. - -Similarly to Modals and Alerts, `app.composer.load` no longer accepts a component instance. Instead, pass in the body class and any attrs. For instance, - -```js -// Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); - -// Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) -``` - -Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. - -#### Widget and DashboardWidget - -The redundant `admin/components/Widget` component has been removed. `admin/components/DashboardWidget` should be used instead. - -#### NotificationList - -For `forum/components/NotificationList`, the `clear`, `load`, `loadMore`, `parseResults`, and `markAllAsRead` methods have been moved to `forum/states/NotificationListState`. - -Methods for `isLoading` and `hasMoreResults` have been added to `forum/states/NotificationListState`. - -`app.cache.notifications` is no longer available; `app.notifications` (which points to an instance of `NotificationListState`) should be used instead. - -#### Checkbox - -Loading state in the `common/components/Checkbox` component is no longer managed through `this.loading`; it is now passed in as a prop (`this.attrs.loading`). - -#### Preference Saver - -The `preferenceSaver` method of `forum/components/SettingsPage` has been removed without replacement. This is done to avoid saving component instances. Instead, preferences should be directly saved. For instance: - -```js -// Old way -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value, component) => { - this.user.pushAttributes({ lastSeenAt: null }); - this.preferenceSaver('discloseOnline')(value, component); - }, -}) - -// Without preferenceSaver -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value) => { - this.discloseOnlineLoading = true; - - this.user.savePreferences({ discloseOnline: value }).then(() => { - this.discloseOnlineLoading = false; - m.redraw(); - }); - }, - loading: this.discloseOnlineLoading, -}) -``` - -A replacement will eventually be introduced. - -#### DiscussionListState - -For `forum/components/DiscussionList`, the `requestParams`, `sortMap`, `refresh`, `loadResults`, `loadMore`, `parseResults`, `removeDiscussion`, and `addDiscussion` methods have been moved to `forum/states/DiscussionListState`. - -Methods for `hasDiscussions`, `isLoading`, `isSearchResults`, and `empty` have been added to `forum/states/DiscussionListState`. - -`app.cache.discussions` is no longer available; `app.discussions` (which points to an instance of `DiscussionListState`) should be used instead. - -#### PageState - -`app.current` and `app.previous` no longer represent component instances, they are now instances of the `common/states/PageState` class. This means that: - -- Instead of `app.current instanceof X`, use `app.current.matches(X)` -- Instead of `app.current.PROPERTY`, use `app.current.get('PROPERTY')`. Please note that all properties must be exposed EXPLICITLY via `app.current.set('PROPERTY', VALUE)`. - -#### PostStream - -Logic from `forum/components/PostStreamScrubber`'s `update` method has been moved to `forum/components/PostStream`'s `updateScrubber` method. - -For `forum/components/PostStream`, the `update`, `goToFirst`, `goToLast`, `goToNumber`, `goToIndex`, `loadNearNumber`, `loadNearIndex`, `loadNext`, `loadPrevious`, `loadPage`, `loadRange`, `show`, `posts`, `reset`, `count`, and `sanitizeIndex` methods have been moved to `forum/states/PostStreamState`. - -Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStreamState`. - -#### SearchState and GlobalSearchState - -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. - -At the minimum, `SearchState` contains the following methods: - -- getValue -- setValue -- clear -- cache (adds a searched value to cache, meaning that we don't need to search for its results again) -- isCached (checks if a value has been searched for before) - -All of these methods have been moved from `Search` to `SearchState`. Additionally, Search's `stickyParams`, `params`, `changeSort`, `getInitialSearch`, and `clearInitialSearch` methods have been moved to `forum/states/GlobalSearchState`, which is now available via `app.search`. - -To use a custom search, you'll want to: - -1. Possibly create a custom subclass of `SearchState` -2. Create a custom subclass of `Search`, which overrides the `selectResult` method to handle selecting results as needed by your use case, and modify the `sourceItems` methods to contain the search sources you need. - -#### moment -> dayjs - -The `moment` library has been removed, and replaced by the `dayjs` library. The global `moment` can still be used for now, but is deprecated. `moment` and `dayjs` have very similar APIs, so very few changes will be needed. Please see the dayjs documentation [for more information](https://day.js.org/en/) on how to use it. - -#### Subtree Retainer - -`SubtreeRetainer` is a util class that makes it easier to avoid unnecessary redraws by keeping track of some pieces of data. When called, it checks if any of the data has changed; if not, it indicates that a redraw is not necessary. - -In mithril 0.2, its `retain` method returned a [subtree retain directive](https://mithril.js.org/archive/v0.1.25/mithril.render.html#subtree-directives) if no redraw was necessary. - -In mithril 2, we use its `needsRebuild` method in combination with `onbeforeupdate`. For instance: - -```js -class CustomComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - this.showContent = false; - - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) - } - - onbeforeupdate() { - // If needsRebuild returns true, mithril will diff and redraw the vnode as usual. Otherwise, it will skip this redraw cycle. - // In this example, this means that this component and its children will only be redrawn when extra content is toggled. - return this.subtree.needsRebuild(); - } - - view(vnode) { - return
- -

Hello World!{this.showContent ? ' Extra Content!' : ''}

-
; - } -} -``` - -#### attrs() method - -Previously, some components would have an attrs() method, which provided an extensible way to provide attrs to the top-level child vnode returned by `view()`. For instance, - -```js -class CustomComponent extends Component { - view() { - return

Hello World!

; - } - - attrs() { - return { - className: 'SomeClass', - onclick: () => console.log('click'), - }; - } -} -``` - -Since `this.attrs` is now used for attrs passed in from parent components, `attrs` methods have been renamed to `elementAttrs`. - -#### Children and .component - -Previously, an element could be created with child elements by passing those in as the `children` prop: - -```js -Button.component({ - className: 'Button Button--primary', - children: 'Button Text' -}); -``` - -This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: - -```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); -``` - -Children can still be passed in through JSX: - -```js - -``` - -#### Tag attr - -Because mithril uses 'tag' to indicate the actual html tag (or component class) used for a vnode, you can no longer pass `tag` as an attr to components extending Flarum's `Component` helper class. The best workaround here is to just use another name for this attr. - -#### affixSidebar - -The `affixSidebar` util has been removed. Instead, if you want to affix a sidebar, wrap the sidebar code in an `AffixedSidebar` component. For instance, - -```js -class OldWay extends Component { - view() { - return
-
-
- -
Actual Page Content
-
-
-
; - } -} - -class NewWay extends Component { - view() { - return
-
-
- - - -
Actual Page Content
-
-
-
; - } -} -``` - -#### Fragment - -**Warning: For Advanced Use Only** - -In some rare cases, we want to have extremely fine grained control over the rendering and display of some significant chunks of the DOM. These are attached with `m.render`, and do not experience automated redraws. Current use cases in core and bundled extensions are: - -- The "Reply" button that shows up when selecting text in a post -- The mentions autocomplete menu that shows up when typing -- The emoji autocomplete menu that shows up when typing - -For this purpose, we provide a helper class (`common/Fragment`), of which you can create an instance, call methods, and render via `m.render(DOM_ROOT, fragmentInstance.render())`. The main benefit of using the helper class is that it allows you to use lifecycle methods, and to access the underlying DOM via `this.$()`, like you would be able to do with a component. - -This should only be used when absolutely necessary. If you are unsure, you probably don't need it. If the goal is to not store component instances, the "state pattern" as described above is preferable. - -### Required Frontend Changes Recap - -Each of these changes has been explained above, this is just a recap of major changes for your convenience. - -- Component Methods: - - `view()` -> `view(vnode)` - - Lifecycle - - `init()` -> `oninit(vnode)` - - `config()` -> Lifecycle hooks `oncreate(vnode)` / `onupdate(vnode)` - - `context.onunload()` -> `onremove()` - - `SubtreeRetainer` -> `onbeforeupdate()` - - if present, `attrs()` method needs to be renamed -> convention `elementAttrs()` - - building component with `MyComponent.component()` -> `children` is now second parameter instead of a named prop/attr (first argument) -> JSX preferred -- Routing - - `m.route()` -> `m.route.get()` - - `m.route(name)` -> `m.route.set(name)` - - register routes with page class, not instance - - special case when passing props - - `` -> `` -- AJAX - - `m.request({...})` -> `data:` key split up into `body:` and `params:` - - `m.deferred` -> native `Promise` -- Redrawing - - `m.redraw(true)` -> `m.redraw.sync()` - - `m.redraw.strategy('none')` -> `e.redraw = false` in event handler - - `m.lazyRedraw()` -> `m.redraw()` - -#### Deprecated changes - -For the following changes, we currently provide a backwards-compatibility layer. This will be removed in time for the stable release. The idea is to let you release a new version that's compatible with Beta 14 to your users as quickly as possible. When you have taken care of the changes above, you should be good to go. For the following changes, we have bought you time until the stable release. Considering you have to make changes anyway, why not do them now? - -- `this.props` -> `this.attrs` -- static `initProps()` -> static `initAttrs()` -- `m.prop` -> `flarum/utils/Stream` -- `m.withAttr` -> `flarum/utils/withAttr` -- `moment` -> `dayjs` - -## Backend (PHP) - -### New Features - -#### Extension Dependencies - -Some extensions are based on, or add features to, other extensions. Prior to this release, there was no way to ensure that those dependencies were enabled before the extension that builds on them. Now, you cannot enable an extension unless all of its dependencies are enabled, and you cannot disable an extension if there are other enabled extensions depending on it. - -So, how do we specify dependencies for an extension? Well, all you need to do is add them as composer dependencies to your extension's `composer.json`! For instance, if we have an extension that depends on Tags and Mentions, our `composer.json` will look like this: - -```json -{ - "name": "my/extension", - "description": "Cool New Extension", - "type": "flarum-extension", - "license": "MIT", - "require": { - "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency - } - // other config -} -``` - -#### View Extender - -Previously, when extensions needed to register Laravel Blade views, they could inject a view factory in `extend.php` and call it's `addNamespace` method. For instance, - -```php -// extend.php -use Illuminate\Contracts\View\Factory; - -return [ - function (Factory $view) { - $view->addNamespace(NAME, RELATIVE PATH); - } -] -``` - -This should NOT be used, as it will break views for all extensions that boot after yours. Instead, the `View` extender should be used: - -```php -// extend.php -use Flarum\Extend\View; - -return [ - (new View)->namespace(NAME, RELATIVE PATH); -] -``` - -#### Application and Container - -Although Flarum uses multiple components of the Laravel framework, it is not a pure Laravel system. In beta 14, the `Flarum\Foundation\Application` class no longer implements `Illuminate\Contracts\Foundation\Application`, and no longer inherits `Illuminate\Container\Container`. Several things to note: - -- The `app` helper now points to an instance of `Illuminate\Container\Container`, not `Flarum\Foundation\Application`. You might need to resolve things through the container before using them: for instance, `app()->url()` will no longer work; you'll need to resolve or inject an instance of `Flarum\Foundation\Config` and use that. -- Injected or resolved instances of `Flarum\Foundation\Application` can no longer resolve things through container methods. `Illuminate\Container\Container` should be used instead. -- Not all public members of `Illuminate\Contracts\Foundation\Application` are available through `Flarum\Foundation\Application`. Please refer to our [API docs on `Flarum\Foundation\Application`](https://api.docs.flarum.org/php/master/flarum/foundation/application) for more information. - -#### Other Changes - -- We are now using Laravel 6. Please see [Laravel's upgrade guide](https://laravel.com/docs/6.x/upgrade) for more information. Please note that we do not use all of Laravel. -- Optional params in url generator now work. For instance, the url generator can now properly generate links to posts in discussions. -- A User Extender has been added, which replaces the deprecated `PrepareUserGroups` and `GetDisplayName` events. -- Error handler middleware can now be manipulated by the middleware extender through the `add`, `remove`, `replace`, etc methods, just like any other middleware. -- `Flarum/Foundation/Config` and `Flarum/Foundation/Paths` can now be injected where needed; previously their data was accessible through `Flarum/Foundation/Application`. - -### Deprecations - -- `url` provided in `config.php` is now an array, accessible via `$config->url()`, for an instance of `Config` - [PR](https://github.com/flarum/core/pull/2271#discussion_r475930358) -- AssertPermissionTrait has been deprecated - [Issue](https://github.com/flarum/core/issues/1320) -- Global path helpers and path methods of `Application` have been deprecated, the injectable `Paths` class should be used instead - [PR](https://github.com/flarum/core/pull/2155) -- `Flarum\User\Event\GetDisplayName` has been deprecated, the `displayNameDriver` method of the `User` extender should be used instead - [PR](https://github.com/flarum/core/pull/2174) - -### Removals - -- Do NOT use the old closure notation for configuring view namespaces. This will break all extensions that boot after your extension. The `View` extender MUST be used instead. -- app()->url() will no longer work: [`Flarum\Http\UrlGenerator`](routes.md) should be injected and used instead. An instance of `Flarum\Http\UrlGenerator` is available in `blade.php` templates via `$url`. -- As a part of the Laravel 6 upgrade, the [`array_` and `str_` helpers](https://laravel.com/docs/6.x/upgrade#helpers) have been removed. -- The Laravel translator interface has been removed; the Symfony translator interface should be used instead: `Symfony\Component\Translation\TranslatorInterface` -- The Mandrill mail driver is no longer provided in Laravel 6, and has been removed. -- The following events deprecated in Beta 13 [have been removed](https://github.com/flarum/core/commit/7d1ef9d89161363d1c8dea19cf8aebb30136e9e3#diff-238957b67e42d4e977398cd048c51c73): - - `AbstractConfigureRoutes` - - `ConfigureApiRoutes` - Use the `Routes` extender instead - - `ConfigureForumRoutes` - Use the `Frontend` or `Routes` extenders instead - - `ConfigureLocales` - Use the `LanguagePack` extender instead - - `ConfigureModelDates` - Use the `Model` extender instead - - `ConfigureModelDefaultAttributes` - Use the `Model` extender instead - - `GetModelRelationship` - Use the `Model` extender instead - - `Console\Event\Configuring` - Use the `Console` extender instead - - `BioChanged` - User bio has not been a core feature for several releases diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b15.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b15.md deleted file mode 100644 index 3e78cd2bb..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b15.md +++ /dev/null @@ -1,60 +0,0 @@ -# Beta 15 için Güncelleme - -Beta 15 features multiple new extenders, a total redesign of the admin dashboard, and several other interesting new features for extensions. As before, we have done our best to provide backwards compatibility layers, and we recommend switching away from deprecated systems as soon as possible to make your extensions more stable. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## New Features / Deprecations - -### Extenders - -- `Flarum\Api\Event\WillGetData` and `Flarum\Api\Event\WillSerializeData` have been deprecated, the `ApiController` extender should be used instead -- `Flarum\Api\Event\Serializing` and `Flarum\Event\GetApiRelationship` have been deprecated, the `ApiSerializer` extender should be used instead -- `Flarum\Formatter\Event\Parsing` has been deprecated, the `parse` method of the `Formatter` extender should be used instead -- `Flarum\Formatter\Event\Rendering` has been deprecated, the `render` method of the `Formatter` extender should be used instead -- `Flarum\Notification\Event\Sending` has been deprecated, the `driver` method of the `Notification` extender should be used instead - - Please note that the new notification driver system is not an exact analogue of the old `Sending` event, as it can only add new drivers, not change the functionality of the default notification bell alert driver. If your extension needs to modify **how** or **to whom** notifications are sent, you may need to replace `Flarum\Notification\NotificationSyncer` on the service provider level -- `Flarum\Event\ConfigureNotificationTypes` has been deprecated, the `type` method of the `Notification` extender should be used instead -- `Flarum\Event\ConfigurePostTypes` has been deprecated, the `type` method of the `Post` extender should be used instead -- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. -- `Flarum\Event\ConfigureUserPreferences` has been deprecated, the `registerPreference` method of the `User` extender should be used instead -- `Flarum\Foundation\Event\Validating` has been deprecated, the `configure` method of the `Validator` extender should be used instead - -- The Policy system has been reworked a bit to be more intuitive. Previously, policies contained both actual policies, which determine whether a user can perform some ability, and model visibility scopers, which allowed efficient restriction of queries to only items that users have access to. See the [authorization documentation](authorization.md) for more information on how to use the new systems. Now: - - `Flarum\Event\ScopeModelVisibility` has been deprecated. New scopers can be registered via the `ModelVisibility` extender, and any `Eloquent\Builder` query can be scoped by calling the `whereVisibleTo` method on it, with the ability in question as an optional 2nd argument (defaults to `view`). - - `Flarum\Event\GetPermission` has been deprecated. Policies can be registered via the `Policy` extender. `Flarum\User\User::can` has not changed. Please note that the new policies must return one of `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, not a boolean. - -- A `ModelUrl` extender has been added, allowing new slug drivers to be registered. This accompanies Flarum's new slug driving system, which allows for extensions to define custom slugging strategies for sluggable models. The extender supports sluggable models outside of Flarum core. Please see our [model slugging](slugging.md) documentation for more information. -- A `Settings` extender has been added, whose `serializeToForum` method makes it easy to serialize a setting to the forum. -- A `ServiceProvider` extender has been added. This should be used with extreme caution for advanced use cases only, where there is no alternative. Please note that the service provider layer is not considered public API, and is liable to change at any time, without notice. - -### Admin UX Redesign - -The admin dashboard has been completely redesigned, with a focus on providing navbar pages for each extension. The API for extensions to register settings, permissions, and custom pages has also been greatly simplified. You can also now update your extension's `composer.json` to provide links for funding, support, website, etc that will show up on your extension's admin page. Please see [our Admin JS documentation](admin.md) for more information on how to use the new system. - -### Other New Features - -- On the backend, the route name is now available via `$request->getAttribute('routeName')` for controllers, and for middleware that run after `Flarum\Http\Middleware\ResolveRoute.php`. -- `Flarum\Api\Controller\UploadImageController.php` can now be used as a base class for controllers that upload images (like for the logo and favicon). -- Automatic browser scroll restoration can now be disabled for individual pages [see our frontend page documentation for more info](frontend-pages.md). - -## Breaking Changes - -- The following deprecated frontend BC layers were removed: - - `momentjs` no longer works as an alias for `dayjs` - - `this.props` and `this.initProps` no longer alias `this.attrs` and `this.initAttrs` for the `Component` base class - - `m.withAttr` and `m.stream` no longer alias `flarum/utils/withAttr` and `flarum/utils/Stream` - - `app.cache.discussionList` has been removed - - `this.content` and `this.editor` have been removed from `ComposerBody` - - `this.component`, `this.content`, and `this.value` have been removed from `ComposerState` -- The following deprecated backend BC layers were removed: - - The `publicPath`, `storagePath`, and `vendorPath` methods of `Flarum\Foundation\Application` have been removed - - The `base_path`, `public_path`, and `storage_path` global helpers have been removed - - The `getEmailSubject` method of `Flarum\Notification\MailableInterface` MUST now take a translator instance as an argument - - `Flarum\User\AssertPermissionTrait` has been removed, the analogous methods on `Flarum\User\User` should be used instead - - The `Flarum\Event\PrepareUserGroups` event has been removed, use the `User` extender instead - - The `Flarum\User\Event\GetDisplayName` event has been removed, use the display name driver feature of the `User` extender instead diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b16.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b16.md deleted file mode 100644 index dbbc0cc5d..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b16.md +++ /dev/null @@ -1,138 +0,0 @@ -# Updating For Beta 16 - -Beta 16 finalizes the PHP extender API, introduces a testing library and JS typings, switches to using namespaces for JS imports, increases extension dependency robustness, and allows overriding routes, among other features. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Frontend - -- A new editor driver abstraction has been introduced, which allows extensions to override the default textarea-based editor with more advanced solutions. -- The `TextEditor` and `TextEditorButton` components, as well as the `BasicEditorDriver` util (which replaces `SuperTextarea`) have been moved from `forum` to `common`. -- The `forum`, `admin`, and `common` namespaces should be used when importing. So instead of `import Component from 'flarum/Component'`, use `import Component from 'flarum/common/Component`. Support for the old import styles will be deprecated through the stable release, and removed with Flarum 2.0. -- A typing library has been released to support editor autocomplete for frontend development, and can be installed in your dev environment via `npm install --save-dev flarum@0.1.0-beta.16`. -- Extension categories have been simplified down to `feature`, `theme`, and `language`. - -## Backend - -### Extenders - -- All extenders that support callbacks/closures now support global functions like `'boolval'` and array-type functions like `[ClassName::class, 'methodName']`. -- The `Settings` extender's `serializeToFrontend` method now supports a default value as the 4th argument. -- The `Event` extender now supports registering subscribers for multiple events at once via a `subscribe` method. -- The `Notification` extender now has a `beforeSending` method, which allows you to adjust the list of recipients before a notification is sent. -- The `mutate` method of `ApiSerializer` has been deprecated, and renamed to `attributes`. -- `remove` methods on the `Route` and `Frontend` extenders can be used to remove (and then replace) routes. -- A `ModelPrivate` extender replaces the `GetModelIsPrivate` event, which has been deprecated. -- Methods on the `Auth` extender replace the `CheckingPassword` event, which has been deprecated. -- All search-related events are now deprecated in favor of the `SimpleFlarumSearch` and `Filter` extenders; this is explained in more detail below. - -### Laravel and Symfony - -Beta 16 upgrades from v6.x to v8.x of Laravel components and v4 to v5 of Symfony components. Please see the respective upgrade guides of each for changes you might need to make to your extensions. The most applicable change is the deprecation of `Symfony\Component\Translation\TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface`. The former will be removed in beta 17. - -### Helper Functions - -The remaining `app` and `event` global helper functions have been deprecated. `app` has been replaced with `resolve`, which takes the name of a container binding and resolves it through the container. - -Since some Flarum extensions use Laravel libraries that assume some global helpers exist, we've recreated some commonly used helpers in the [flarum/laravel-helpers](https://github.com/flarum/laravel-helpers) package. These helpers should NOT be used directly in Flarum extension code; they are available so that Laravel-based libraries that expect them to exist don't malfunction. - -### Search Changes - -As part of our ongoing efforts to make Flarum's search system more flexible, we've made several refactors in beta 16. Most notably, filtering and searching are now treated as different mechanisms, and have separate pipelines and extenders. Essentially, if a query has a `filter[q]` query param, it will be treated as a search, and all other filter params will be ignored. Otherwise, it will be handled by the filtering system. This will eventually allow searches to be handled by alternative drivers (provided by extensions), such as ElasticSearch, without impacting filtering (e.g. loading recent discussions). Classes common to both systems have been moved to a `Query` namespace. - -Core's filtering and default search (named SimpleFlarumSearch) implementations are quite similar, as both are powered by the database. `List` API controllers call the `search` / `filter` methods on a resource-specific subclass of `Flarum\Search\AbstractSearcher` or `Flarum\Filter\AbstractFilterer`. Arguments are an instance of `Flarum\Query\QueryCriteria`, as well as sort, offset, and limit information. Both systems return an instance of `Flarum\Query\QueryResults`, which is effectively a wrapper around a collection of Eloquent models. - -The default systems are also somewhat similar in their implementation. `Filterer`s apply Filters (implementing `Flarum\Filter\FilterInterface`) based on query params in the form `filter[FILTER_KEY] = FILTER_VALUE` (or `filter[-FILTER_KEY] = FILTER_VALUE` for negated filters). SimpleFlarumSearch's `Searcher`s split the `filter[q]` param by spaces into "terms", apply Gambits (implementing `Flarum\Search\GambitInterface`) that match the terms, and then apply a "Fulltext Gambit" to search based on any "terms" that don't match an auxiliary gambit. Both systems then apply sorting, an offset, and a result count limit, and allow extensions to modify the query result via `searchMutators` or `filterMutators`. - -Extensions add gambits and search mutators and set fulltext gambits for `Searcher` classes via the `SimpleFlarumSearch` extender. They can add filters and filter mutators to `Filterer` classes via the `Filter` extender. - -With regards to upgrading, please note the following: - -- Search mutations registered by listening to the `Searching` events for discussions and users will be applied as to searches during the search mutation step via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Search gambits registered by listening to the `ConfigureUserGambits` and `ConfigureDiscussionGambits` events will be applied to searcher via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Post filters registered by listening to the `ConfigurePostsQuery` events will be applied to post filters via a temporary BC layer. That event has been deprecated. - -### Testing Library - -The `flarum/testing` package provides utils for PHPUnit-powered automated backend tests. See the [testing documentation](testing.md) for more info. - -### Optional Dependencies - -Beta 15 introduced "extension dependencies", which require any extensions listed in your extension's `composer.json`'s `require` section to be enabled before your extension can be enabled. - -With beta 16, you can specify "optional dependencies" by listing their composer package names as an array in your extension's `extra.flarum-extension.optional-dependencies`. Any enabled optional dependencies will be booted before your extension, but aren't required for your extension to be enabled. - -### Access Token and Authentication Changes - -#### Extension API changes - -The signature to various method related to authentication have been changed to take `$token` as parameter instead of `$userId`. Other changes are the result of the move from `$lifetime` to `$type` - -- `Flarum\Http\AccessToken::generate($userId)` no longer accepts `$lifetime` as a second parameter. Parameter has been kept for backward compatibility but has no effect. It will be removed in beta 17. -- `Flarum\Http\RememberAccessToken::generate($userId)` should be used to create remember access tokens. -- `Flarum\Http\DeveloperAccessToken::generate($userId)` should be used to create developer access tokens (don't expire). -- `Flarum\Http\SessionAccessToken::generate()` can be used as an alias to `Flarum\Http\AccessToken::generate()`. We might deprecate `AccessToken::generate()` in the future. -- `Flarum\Http\Rememberer::remember(ResponseInterface $response, AccessToken $token)`: passing an `AccessToken` has been deprecated. Pass an instance of `RememberAccessToken` instead. As a temporary compatibility layer, passing any other type of token will convert it into a remember token. In beta 17 the method signature will change to accept only `RememberAccessToken`. -- `Flarum\Http\Rememberer::rememberUser()` has been deprecated. Instead you should create/retrieve a token manually with `RememberAccessToken::generate()` and pass it to `Rememberer::remember()` -- `Flarum\Http\SessionAuthenticator::logIn(Session $session, $userId)` second parameter has been deprecated and is replaced with `$token`. Backward compatibility is kept. In beta 17, the second parameter method signature will change to `AccessToken $token`. -- `AccessToken::generate()` now saves the model to the database before returning it. -- `AccessToken::find($id)` or `::findOrFail($id)` can no longer be used to find a token, because the primary key was changed from `token` to `id`. Instead you can use `AccessToken::findValid($tokenString)` -- It's recommended to use `AccessToken::findValid($tokenString): AccessToken` or `AccessToken::whereValid(): Illuminate\Database\Eloquent\Builder` to find a token. This will automatically scope the request to only return valid tokens. On forums with low activity this increases the security since the automatic deletion of outdated tokens only happens every 50 requests on average. - -#### Symfony session changes - -If you are directly accessing or manipulating the Symfony session object, the following changes have been made: - -- `user_id` attribute is no longer used. `access_token` has been added as a replacement. It's a string that maps to the `token` column of the `access_tokens` database table. - -To retrieve the current user from inside a Flarum extension, the ideal solution which was already present in Flarum is to use `$request->getAttribute('actor')` which returns a `User` instance (which might be `Guest`) - -To retrieve the token instance from Flarum, you can use `Flarum\Http\AccessToken::findValid($tokenString)` - -To retrieve the user data from a non-Flarum application, you'll need to make an additional database request to retrieve the token. The user ID is present as `user_id` on the `access_tokens` table. - -#### Token creation changes - -The `lifetime` property of access tokens has been removed. Tokens are now either `session` tokens with 1h lifetime after last activity, or `session_remember` tokens with 5 years lifetime after last activity. - -The `remember` parameter that was previously available on the `POST /login` endpoint has been made available on `POST /api/token`. It doesn't return the remember cookie itself, but the token returned can be used as a remember cookie. - -The `lifetime` parameter of `POST /api/token` has been deprecated and will be removed in Flarum beta 17. Partial backward compatibility has been provided where a `lifetime` value longer than 3600 seconds is interpreted like `remember=1`. Values lower than 3600 seconds result in a normal non-remember token. - -New `developer` tokens that don't expire have been introduced, however they cannot be currently created through the REST API. Developers can create developer tokens from an extension using `Flarum\Http\DeveloperAccessToken::generate($userId)`. - -If you manually created tokens in the database from outside Flarum, the `type` column is now required and must contain `session`, `session_remember` or `developer`. Tokens of unrecognized type cannot be used to authenticate, but won't be deleted by the garbage collector either. In a future version extensions will be able to register custom access token types. - -#### Token usage changes - -A [security issue in Flarum](https://github.com/flarum/core/issues/2075) previously caused all tokens to never expire. This had limited security impact due to tokens being long unique characters. However custom integrations that saved a token in an external database for later use might find the tokens no longer working if they were not used recently. - -If you use short-lived access tokens for any purpose, take note of the expiration time of 1h. The expiration is based on the time of last usage, so it will remain valid as long as it continues to be used. - -Due to the large amount of expired tokens accumulated in the database and the fact most tokens weren't ever used more than once during the login process, we have made the choice to delete all access tokens a lifetime of 3600 seconds as part of the migration, All remaining tokens have been converted to `session_remember` tokens. - -#### Remember cookie - -The remember cookie still works like before, but a few changes have been made that could break unusual implementations. - -Now only access tokens created with `remember` option can be used as remember cookie. Any other type of token will be ignored. This means if you create a token with `POST /api/token` and then place it in the cookie manually, make sure you set `remember=1` when creating the token. - -#### Web session expiration - -In previous versions of Flarum, a session could be kept alive forever until the Symfony session files were deleted from disk. - -Now sessions are linked to access tokens. A token being deleted or expiring will automatically end the linked web session. - -A token linked to a web session will now be automatically deleted from the database when the user clicks logout. This prevents any stolen token from being re-used, but it could break custom integration that previously used a single access token in both a web session and something else. - -### Miscellaneous - -- The IP address is now available in requests via `$request->getAttribute('ipAddress')` -- Policies can now return `true` and `false` as aliases for `$this->allow()` and `$this->deny()`, respectively. -- The `user.edit` permission has been split into `user.editGroups`, `user.editCredentials` (for email, username, and password), and `user.edit` (for other attributes). -- There are now permissions (`bypassTagCounts`) that allow users to bypass tag count requirements. -- Flarum now supports PHP 7.3 - PHP 8.0, with support for PHP 7.2 officially dropped. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b8.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b8.md deleted file mode 100644 index 184115842..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/update-b8.md +++ /dev/null @@ -1,114 +0,0 @@ -# Beta 8 için Güncelleme - -All extensions will need to be refactored in order to work with beta 8. Here are the main things you will need to do in order to make your extension compatible. - -:::caution - -This guide is not comprehensive. You may encounter some changes we haven't documented. If you need help, start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## PHP Namespaces - -Beta 8 comes with large changes to the overall structure of the PHP backend. You will need to look through [this list](https://discuss.flarum.org/d/6572-help-us-namespace-changes) of namespace changes and make changes to your extension accordingly. - -[This script](https://gist.github.com/tobyzerner/55e7c05c95404e5efab3a9e43799d375) can help you to automate most of the namespace changes. Of course, you should still test your extension after running the script as it may miss something. - -## Database Naming - -Many database columns and JSON:API attributes have been renamed to conform to a [convention](/contributing.md#database). You will need to update any instances where your extension interacts with core data. You can see the changes in [#1344](https://github.com/flarum/core/pull/1344/files). - -## Extenders - -Beta 8 introduces a new concept called **extenders** that replace the most common event listeners. You can learn more about how they work in the [updated extension docs](start.md#extenders). - -`bootstrap.php` has been renamed to `extend.php` and returns an array of extender instances and functions: - -```php -use Flarum\Extend; - -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] -``` - -If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. - -| Event | Extender | -| ------------------------------------- | --------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | - -_\* class no longer exists_ - -## JavaScript Tooling - -Previously Flarum and its extensions used a custom Gulp workflow to compile ES6 source code into something that browsers could understand. Beta 8 switches to a more conventional approach with Webpack. - -You will need to tweak the structure of your extension's `js` directory. Currently, your JS file hierarchy looks something like the following: - -``` -js -├── admin -│ ├── src -│ │ └── main.js -│ ├── dist -│ │ └── extension.js -│ ├── Gulpfile.js -│ └── package.json -└── forum - ├── src - │ └── main.js - ├── dist - │ └── extension.js - ├── Gulpfile.js - └── package.json -``` - -You'll need to make the following changes: - -1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.md#transpilation). - -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. - -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. - -4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. - -If everything went right, your folder structure should look something like this: - -``` -js -├── src -│ ├── admin -│ │ └── index.js -│ └── forum -│ └── index.js -├── dist -│ ├── admin.js -│ ├── admin.js.map -│ ├── forum.js -│ └── forum.js.map -├── admin.js -├── forum.js -├── package.json -└── webpack.config.js -``` - -Take a look at the [bundled extensions](https://github.com/flarum) for more examples. - -## Font Awesome Icons - -Beta 8 upgrades to Font Awesome 5, in which icon class names have changed. The `flarum/helpers/icon` helper now requires the **full Font Awesome icon class names** to be passed, eg. `fas fa-bolt`. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extend/views.md b/i18n/tr/docusaurus-plugin-content-docs/current/extend/views.md deleted file mode 100644 index fc4a75a86..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extend/views.md +++ /dev/null @@ -1,63 +0,0 @@ -# Views and Blade - -Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. - -[Blade](https://laravel.com/docs/8.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). [Views](https://laravel.com/docs/8.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. - -For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). - -## Adding Views - -You will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->namespace('acme.hello-world', __DIR__.'/views'), -]; -``` - - -## Blade Templates - -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/8.x/blade). - -Once you've set up your views, you can render them to strings: - -```php -// Here, $view is of type `Illuminate\Contracts\View\Factory` -$renderedString = $view->make('acme.hello-world::greeting')->render(); - -// You can also pass variables to the view: -$renderedString = $view->make('acme.hello-world::greeting', ['varName' => true])->render(); -``` - -You can obtain the view factory instance through dependency injection. - -The format is `"VIEW_NAMESPACE::VIEW_NAME"`. If the view folder is organized as subdirectories, replace `/` with `.` in the pack. So if you have a file at `"forum/error.blade.php"` in a namespace called `"custom-views"`, you would use `"custom-views::forum.error"`. - -Note that all Blade templates rendered this way automatically have access to the following variables: - -- `$url`: a [URL generator](routes#generating-urls) instance. -- `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. -- `$slugManager`: a [SlugManager](slugging) instance. - -Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Serializer/ForumSerializer.php#L19). - -## Overriding Views - -If you want to override templates added by core or extensions, set up a view folder structure matching the one you are trying to override, containing just the files you are trying to override. Then use the `View` extender's `extendNamespace` method: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->extendNamespace('acme.hello-world', __DIR__.'/override_views'); -]; -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extenders.md b/i18n/tr/docusaurus-plugin-content-docs/current/extenders.md deleted file mode 100644 index 0731aa756..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extenders.md +++ /dev/null @@ -1,23 +0,0 @@ -# Yerel Genişleticiler - -If there are customizations you want to make to your site without distributing an entire extension, you can do so by using **local extenders**. Each Flarum installation comes with an `extend.php` file where you can add extender instances, just like in a full extension. - -See our [extension documentation](extend/start.md) for more information about extenders (and even an [example of a local extender](extend/start.md#hello-world)). - -If you need to create new files (when adding a custom class to be imported for extenders), you'll need to adjust your composer.json a bit. Add the following: - -```json -"autoload": { - "psr-4": { - "App\\": "app/" - } -}, -``` - -Now you can create new PHP files in an `app` subdirectory using the `App\...` namespace. - -:::tip Local Extenders vs Extensions - -Local extenders can be good for small tweaks, but if you need large customizations, an extension might be a better choice: a separate codebase, cleaner handling of many files, developer tooling, and the ability to easily open source are big benefits. - -::: diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/extensions.md b/i18n/tr/docusaurus-plugin-content-docs/current/extensions.md deleted file mode 100644 index 9e6adb27c..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/extensions.md +++ /dev/null @@ -1,118 +0,0 @@ -# Uzantılar - -Flarum minimalisttir, ancak aynı zamanda oldukça genişletilebilir. Aslında, Flarum ile birlikte gelen özelliklerin çoğu aslında uzantılardır! - -Bu yaklaşım Flarum'u son derece özelleştirilebilir kılar: İhtiyaç duymadığınız tüm özellikleri devre dışı bırakabilir ve forumunuzu topluluğunuz için mükemmel hale getirmek için diğer uzantıları yükleyebilirsiniz. - -Flarum'un temelde hangi özellikleri dahil ettiğimiz konusundaki felsefesi hakkında daha fazla bilgi için veya kendi uzantınızı oluşturmak istiyorsanız, lütfen [uzantı belgelerimize](extend/README.md) bakın. Bu makale, bir forum yöneticisinin bakış açısından uzantıları yönetmeye odaklanacaktır. - -## Uzantı Yöneticisi - -Uzantı yöneticisi, bir arşiv aracılığıyla yüklendiğinde Flarum ile birlikte gelen bir uzantıdır. Hem uzantıları hem de Flarum'u yüklemek ve güncellemek için grafiksel bir arayüz sağlar. - -Eğer eklenti yöneticiniz kurulu değilse ve onu kurmak istiyorsanız Flarum dizininizde aşağıdaki komutu çalıştırarak bunu yapabilirsiniz: - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -Uzantı yöneticisi, yönetici kullanıcının herhangi bir besteci paketini yüklemesine olanak tanır. Uzantı yöneticisini yalnızca bu tür izinlere sahip tüm forum yöneticilerinize güveniyorsanız yükleyin. - -::: - -![uzantı yöneticisi yönetici sayfası](https://github.com/flarum/docs/assets/20267363/d0e1f7a5-e194-4acd-af63-7b8ddd95c26b) - - -## Uzantıları Bulmak - -Flarum, çoğu açık kaynaklı ve ücretsiz olan geniş bir uzantı ekosistemine sahiptir. Yeni ve harika uzantılar bulmak için, Flarum'un topluluk forumundaki [Extensions](https://discuss.flarum.org/t/extensions) etiketini ziyaret edin. Resmi olmayan [Extiverse](https://extiverse.com/) de harika bir kaynaktır. - -## Uzantıları Yükleme - -### Arayüz aracılığıyla - -Uzantı yöneticisi uzantısını kullanarak uzantıları doğrudan yönetici kontrol panelinden yükleyebilirsiniz. Yukarıdaki bağlantılardan mevcut uzantıların listesine göz attığınızda ve yüklemek istediğiniz uzantıyı bulduğunuzda, uzantı yöneticisinin kurulum girişine uzantının besteci paketi adını girerek yükleyebilirsiniz. - -![Installing an extension](/en/img/install-extension.png) - -### Komut satırı aracılığıyla - -Flarum gibi, uzantılar da SSH kullanılarak [Composer](https://getcomposer.org) aracılığıyla yüklenir. Tipik bir uzantı yüklemek için: - -1. `cd` to your Flarum directory. Bu dizin `composer.json`, `flarum` dosyalarını ve bir `storage` dizini (diğerlerinin yanı sıra) içermelidir. Dizin içeriğini `ls -la` aracılığıyla kontrol edebilirsiniz. -2. Çalıştırın `composer require COMPOSER_UZANTI_ADI:*`. Bu, uzantının belgelerinde sağlanmalıdır. - -## Uzantıları Yönetme - -### Arayüz aracılığıyla - -Uzantı yöneticisi uzantısını kullanarak uzantıları doğrudan yönetici kontrol panelinden güncelleyebilirsiniz. Uzantı yöneticisindeki "Güncellemeleri kontrol et" düğmesini tıklayarak güncellemeleri kontrol edebilirsiniz. Güncellemeler mevcutsa, "Global güncelleme" butonuna tıklayarak tüm uzantıları güncelleyebilirsiniz. Veya güncellemek istediğiniz uzantının yanındaki "Güncelle" butonuna tıklayarak uzantıları tek tek güncelleyebilirsiniz. - -![Updating an extension](/en/img/update-extension.png) - -### Komut satırı aracılığıyla - -Uzantı geliştiricileri tarafından sağlanan talimatları izleyin. Uzantılar için sürüm dizesi olarak `*` kullanıyorsanız ([önerildiği gibi](composer.md)), [Flarum yükseltme kılavuzunda](update.md) listelenen komutları çalıştırmak güncellenecektir tüm uzantılarınız. - -## Uzantıları Kaldırma - -### Arayüz aracılığıyla - -Uzantı yöneticisi uzantısını kullanarak uzantıları doğrudan yönetici kontrol panelinden yükleyebilirsiniz. Uzantının sayfasında, kaldırmak istediğiniz uzantının yanındaki "Kaldır" düğmesini tıklayarak bir uzantıyı kaldırabilirsiniz. - -![Uninstalling an extension](/en/img/uninstall-extension.png) - -### Komut satırı aracılığıyla - -Kuruluma benzer şekilde bir uzantıyı kaldırmak için: - -0. Uzantı tarafından oluşturulan tüm veritabanı tablolarını kaldırmak istiyorsanız yönetici kontrol panelindeki "Temizle" düğmesini tıklayın. Daha fazla bilgi için [aşağıya](#managing-extensions) bakın. -1. `cd` to your Flarum directory. -2. Çalıştırın `composer require COMPOSER_UZANTI_ADI:*`. Bu, uzantının belgelerinde sağlanmalıdır. - -## Uzantıları Yönetme - -Yönetici kontrol panelindeki her bir uzantı sayfası, uzantıyı yönetmek için kullanışlı bir yol sağla. Yapabilecekleriniz: - -- Uzantıyı etkinleştirin veya devre dışı bırakın. -- Uzantının sağladığı ayarlara bakın ve bunları değiştirin. -- Bir uzantının yaptığı tüm veritabanı değişikliklerini kaldırmak için, uzantının geçişlerini geri alın (bu, Temizle düğmesiyle yapılabilir). Bu, uzantı ile ilişkili TÜM verileri kaldırır ve geri alınamaz. Bu yalnızca bir uzantıyı kaldırırken yapılmalıdır ve tekrar yüklemeyi planlamayın. Aynı zamanda tamamen isteğe bağlıdır. -- Varsa, uzantının README dosyasına bakın. -- Uzantının sürümüne bakın. -- Uzantı yöneticisi yüklüyse uzantıyı kaldırın. - -## Configuring additional extension repository sources - -The extension manager uses `composer` under the hood, and as such, it looks for extension packages in the same places as `composer`. By default, this is [Packagist](https://packagist.org/). However, you can configure additional sources for the extension manager to look for extensions in. This is useful if you want to install an extension that is not available on Packagist. - -In the admin page of the extension manager, clicking the **Add Repository** button will open a modal where you can enter the name and URL of the repository you want to add. The name is just a label for the repository, and can be anything you want. The URL should be the URL of the repository which depends on the type of repository you want to add. - -### Adding a repository from a VCS - -If you want to add a repository from a VCS (e.g. GitHub, GitLab, BitBucket, etc), the URL should be the URL of the repository's VCS. For example, if you had a private GitHub repository at `https://github.com/acme/flarum-extension`, you would enter that URL into the URL field. If it is a private source, you will need to enter an authentication method through the **New authentication method** button. The token can be generated from your VCS provider's website, and the host should be the domain of the VCS provider (e.g. `github.com`). - -### Adding a composer repository - -Extiverse provides access to premium extensions. It is a good example of a composer repository. You would specify the URL as `https://flarum.org/composer/` and the name as `premium`. You would also need to enter an authentication method through the **New authentication method** button. The token can be generated from your Flarum account's [subscriptions](https://flarum.org/dashboard/subscriptions) page with the Instructions button. - -* Type: `HTTP Bearer` -* Host: `flarum.org` - -![Configure repositories](/en/img/config-repositories.png) - -:::bilgi - -The configured repositories and auth methods will be active for both the command line and the admin dashboard. If you configure them from the command line however, you must not include the flag `--global`. - -::: - -## Installing Non-stable extensions - -If for whatever reason you want to install a non-stable extension (e.g. a beta, alpha or RC version) you must first update the **Minimum stability** setting to the wanted stability. - -* If you set it to Alpha, you will be able to install alpha, beta, RC (Release Candidate) and stable versions. -* If you set it to Beta, you will be able to install beta, RC and stable versions. -* If you set it to RC, you will be able to install RC and stable versions. -* If you set it to Stable, you will only be able to install stable versions. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/faq.md b/i18n/tr/docusaurus-plugin-content-docs/current/faq.md deleted file mode 100644 index ceceb4948..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/faq.md +++ /dev/null @@ -1,35 +0,0 @@ -# SSS - -### Flarum ne zaman kararlı olacak? - -Yes! After 6 years of development, Flarum 1.0.0 is finally here. - -### Beta'dan sonraki sürümlere geçiş yapabilecek miyim? - -We're still working on a formal roadmap. We have a lot of plans and ideas, and look forward to sharing a more thorough milestone with the community. - -### Geliştirmeyi hızlandırmak için para bağışlayabilir miyim? - -Tüm bağışlar minnetle alındı. [Github Sponsors](https://github.com/sponsors/flarum) veya [OpenCollective](https://opencollective.com/flarum) üzerinden verebilirsiniz. - -Ancak bağışlar, Flarum'daki geliştirme hızını doğrudan etkilemeyecek. Ayrıca, kullanıcıları [katkıda bulunan kod](contributing.md), [uzantıları oluşturma](/extend/), belge yazma, Flarum'u diğer dillere çevirme, [topluluk forumlarında](https://discuss.flarum.org/) yardım ve destek sağlama gibi başka şekillerde katkıda bulunmaya teşvik ediyoruz. ...ve sadece topluluk etrafında genel bir pozitif enerji olmak! - -### Flarum'da [özelliği buraya ekleyin] olacak mı? Ne zaman? Neden olmasın? - -Flarum için sayısız özellik ve uzantı oluşturmayı çok isteriz, ancak her şeyden önce: Odak noktamız temeller ve kararlılıktır. - -### Why haven’t you fixed [insert issue here] yet? - -Burada yine cevap “ilk önce şeyler”dir. Henüz bir sorunu çözmediysek (veya ona bir kilometre taşı atamadıysak), bunun nedeni aynı derecede önemli olan başka bir şey üzerinde çalıştığımızdır. Lütfen sabırlı olun; yayınlanmadan önce halletmeye çalışacağız. Veya aceleniz varsa, bunu kendiniz düzeltmekten çekinmeyin ve [projeye katkıda bulunun](Contributing.md)! - -### Forumumu Flarum'a taşıyabilecek miyim? - -We don't currently provide official migrators, but there are many community solutions out there. Flarum'un üretimde kullanılmaya hazır olduğundan emin olduktan sonra, esoTalk, FluxBB, phpBB, Discourse ve diğerleri gibi diğer forum yazılımlarından verileri içeri aktarmak için araçlar oluşturmaya başlayacağız. - -### Neden henüz [sorunu buraya ekleyin] sorunu çözmediniz? - -> "Mistik ritüeller, yaşamı tehdit eden tehlikeler ve birçoğunun gittiği ve çok azının geri döndüğü uzak diyarlara maceralar içeren gizemli ve zorlu bir çileden geçerek." ~ jordanjay29 - -Gerçek cevap, genel olarak topluluğumuza iyi personel olacak öne çıkan üyeler için göz kulak olmamızdır. Açıkçası, mevcut çalışanlarımızın çoğu için, personel olmadan önce yaptıkları, şu anda yaptıklarından çok da farklı değildi. - -Bir tutku bulun ve en iyi olduğunu düşündüğünüz şekilde katkıda bulunun. O zaman kendi yoluna gitmesine izin verin. Burada saygı duymak için bir rozete sahip olmanız gerekmiyor. \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/install.md b/i18n/tr/docusaurus-plugin-content-docs/current/install.md deleted file mode 100644 index 45e893dc4..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/install.md +++ /dev/null @@ -1,198 +0,0 @@ -# Kurulum - -:::ipucu Hızlı test sürüşü mü? - -Flarum'u [gösteri forumlarımızdan](https://discuss.flarum.org/d/21101) birinde denemekten çekinmeyin. Veya Flarum ekibine bağlı olmayan ücretsiz bir topluluk hizmeti olan [Free Flarum](https://www.freeflarum.com)'da kendi forumunuzu birkaç saniye içinde kurun. - -::: - -## Sunucu Gereksinimleri - -Flarum'u kurmadan önce, sunucunuzun gereksinimleri karşılayıp karşılamadığını kontrol etmeniz önemlidir. Flarum'u çalıştırmak için şunlara ihtiyacınız olacak: - -* **Apache** (mod_rewrite etkin) veya **Nginx** -* **PHP 7.3+** şu uzantılara sahip: curl, dom, fileinfo, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+/8.0.23+** veya **MariaDB10.0.5+** Composer'ı çalıştırmak için **SSH (komut satırı) erişimi** -* **SSH (command-line) access** to run potentially necessary software maintenance commands, and Composer if you intend on using the command-line to install and manage Flarum extensions. - -## Yükleme - -### Installing by unpacking an archive - -If you don't have SSH access to your server or you prefer not to use the command line, you can install Flarum by unpacking an archive. Below is a list of the available archives, make sure you choose the one that matches your PHP version and public path or lack thereof preference. - -| Flarum Version | PHP Version | Public Path | Type | Archive | -| -------------- | ----------------- | ----------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1.x | 8.3 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.zip) | -| 1.x | 8.3 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | Yes | ZIP | [flarum-v1.x-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.zip) | -| 1.x | 8.2 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.zip) | -| 1.x | 8.2 (recommended) | Yes | ZIP | [flarum-v1.x-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.zip) | -| 1.x | 8.1 | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.tar.gz) | -| 1.x | 8.1 | Yes | TAR.GZ | [flarum-v1.x-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.tar.gz) | -| 1.x | 8.1 | No | ZIP | [flarum-v1.x-no-public-dir-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.zip) | -| 1.x | 8.1 | Yes | ZIP | [flarum-v1.x-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.zip) | -| 1.x | 8.0 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.zip) | -| 1.x | 8.0 (end of life) | Yes | ZIP | [flarum-v1.x-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.zip) | -| 1.x | 7.4 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.zip) | -| 1.x | 7.4 (end of life) | Yes | ZIP | [flarum-v1.x-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.zip) | -| 1.x | 7.3 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.zip) | -| 1.x | 7.3 (end of life) | Yes | ZIP | [flarum-v1.x-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.zip) | - -### Installing using the Command Line Interface - -Flarum, bağımlılıklarını ve uzantılarını yönetmek için [Composer](https://getcomposer.org) kullanır. Flarum'u kurmadan önce, makinenize [Composer'ı kurmanız](https://getcomposer.org) gerekir. Daha sonra, bu komutu Flarum'un yüklenmesini istediğiniz boş bir konumda çalıştırın: - -```bash -composer create-project flarum/flarum:^1.8.0 . -``` - -Bu komut çalışırken web sunucunuzu yapılandırabilirsiniz. Root klasörünüzü `/path/to/your/forum/public` olarak ayarlandığından emin olmanız ve aşağıdaki talimatlara göre \[URL Yeniden Yazma\] (# url-yeniden yazma) ayarlamanız gerekir. - -Her şey hazır olduğunda, bir web tarayıcısında forumunuza gidin ve kurulumu tamamlamak için talimatları izleyin. - -If you wish to install and update extensions from the admin dashboard, you need to also install the [Extension Manager](extensions.md) extension. - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -Uzantı yöneticisi, yönetici kullanıcının herhangi bir besteci paketini yüklemesine olanak tanır. Uzantı yöneticisini yalnızca bu tür izinlere sahip tüm forum yöneticilerinize güveniyorsanız yükleyin. - -::: - -## URL Yönlendirme - -### Apache - -Flarum, `public` dizininde bir `.htaccess` dosyası içerir - doğru şekilde yüklendiğinden emin olun. **`mod_rewrite` etkin değilse veya `.htaccess` e izin verilmiyorsa Flarum düzgün çalışmayacaktır.** Bu özelliklerin etkin olup olmadığını barındırma sağlayıcınıza danışın. Kendi sunucunuzu yönetiyorsanız, `.htaccess` dosyalarını etkinleştirmek için site yapılandırmanıza aşağıdakileri eklemeniz gerekebilir: - -``` - - AllowOverride All - -``` - -Bu, htaccess geçersiz kılmalarına izin verilmesini sağlar, böylece Flarum URL'leri düzgün şekilde yeniden yazabilir. - -`mod_rewrite` ı etkinleştirme yöntemleri işletim sisteminize bağlı olarak değişir. Ubuntu'da `sudo a2enmod rewrite` çalıştırarak etkinleştirebilirsiniz. CentOS'ta `mod_rewrite` varsayılan olarak etkindir. Değişiklikler yaptıktan sonra Apache'yi yeniden başlatmayı unutmayın! - -### Nginx - -Flarum bir `.nginx.conf` dosyası içerir - doğru şekilde yüklendiğinden emin olun. Ardından, Nginx içinde kurulmuş bir PHP siteniz olduğunu varsayarak, sunucunuzun yapılandırma bloğuna aşağıdakileri ekleyin: - -```nginx -include /path/to/flarum/.nginx.conf; -``` - -### Caddy - -Caddy, Flarum'un düzgün çalışması için çok basit bir konfigürasyon gerektirir. URL'yi kendi URL'niz ile ve dizinide de kendi `public` klasörünüzün dizini ile değiştirmeniz gerektiğini unutmayın. PHP'nin farklı bir sürümünü kullanıyorsanız, doğru PHP yükleme soketinize veya URL'nize işaret etmek için `fastcgi` dizinini de değiştirmeniz gerekecektir. - -``` -www.example.com { - root * /var/www/flarum/public - php_fastcgi unix//var/run/php/php7.4-fpm.sock - header /assets/* { - +Cache-Control "public, must-revalidate, proxy-revalidate" - +Cache-Control "max-age=25000" - Pragma "public" - } - file_server -} -``` -## Klasör Sahipliği - -Kurulum sırasında Flarum, belirli dizinleri yazılabilir hale getirmenizi isteyebilir. Modern işletim sistemleri genellikle çok kullanıcılıdır, yani oturum açtığınız kullanıcı ile Flarum'un çalıştığı kullanıcı aynı değildir. Flarum'un çalıştığı kullanıcı, aşağıdakiler için okuma + yazma erişimine sahip olmalıdır: - -- Flarum'un `config.php` dosyasını düzenleyebilmesi için kök kurulum dizini. -- `storage` alt dizini, böylece Flarum günlükleri düzenleyebilir ve önbelleğe alınmış verileri saklayabilir. -- Logoların ve avatarların dosya sistemine yüklenebilmesi için `assets` alt dizini. - -Uzantılar başka dizinler gerektirebilir, bu nedenle Flarum kök kurulum dizininin tamamına tekrar tekrar yazma erişimi vermek isteyebilirsiniz. - -Dosya izinlerini ayarlamak için çalıştırmanız gereken birkaç komut vardır. Yüklemeniz bunlardan yalnızca bazılarını yürüttükten sonra uyarı göstermiyorsa geri kalanını çalıştırmanıza gerek olmadığını lütfen unutmayın. - -Öncelikle, dizine yazma erişimine izin vermeniz gerekir. Linux'ta: - -```bash -chmod 775 -R /path/to/directory -``` - -Bu yeterli değilse, dosyalarınızın doğru grup ve kullanıcıya ait olup olmadığını kontrol etmeniz gerekebilir. Varsayılan olarak, çoğu Linux dağıtımında `www-data` hem PHP'nin hem de web sunucusunun altında çalıştığı grup ve kullanıcıdır. Emin olmak için dağıtım ve web sunucusu kurulumunuzun özelliklerini incelemeniz gerekir. Çoğu Linux işletim sisteminde klasör sahipliğini aşağıdakileri çalıştırarak değiştirebilirsiniz: - -```bash -chown -R www-data:www-data /path/to/directory -``` - -Web sunucunuz için farklı bir kullanıcı/grup kullanılıyorsa, `www-data` başka bir şeye değiştirildi. - -Ek olarak, uzantıları kurabilmeniz ve CLI aracılığıyla Flarum kurulumunu yönetebilmeniz için CLI kullanıcınızın (terminalde oturum açtığınız kişi) sahip olduğundan emin olmanız gerekir. Bunu yapmak için mevcut kullanıcınızı (`whoami`) `usermod -a -G www-data YOUR_USERNAME` aracılığıyla web sunucusu grubuna (genellikle `www-data`) ekleyin. Bu değişikliğin etkili olması için muhtemelen oturumu kapatıp tekrar açmanız gerekecek. - -Son olarak, bu işe yaramazsa, web sunucusunun dizine yazmasına izin vermek için [SELinux](https://www.redhat.com/en/topics/linux/what-is-selinux)'u yapılandırmanız gerekebilir. Bunu yapmak için şunu çalıştırın: - -```bash -chcon -R -t httpd_sys_rw_content_t /path/to/directory -``` - -Bu komutların yanı sıra Linux'ta dosya izinleri ve sahiplik hakkında daha fazla bilgi edinmek için [bu öğreticiyi](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/) okuyun. Flarum'u Windows'ta kuruyorsanız, [bu Süper Kullanıcı sorusunun](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) yanıtlarını faydalı bulabilirsiniz. - -:::caution Ortamlar değişebilir - -Ortamınız sağlanan belgelerden farklı olabilir, lütfen PHP ve web sunucusunun altında çalıştığı uygun kullanıcı ve grup için web sunucusu yapılandırmanıza veya web barındırma sağlayıcınıza danışın. - -::: - -:::danger 777 iznini asla kullanmayın - -Herhangi bir klasör veya dosyayı asla `777` izin düzeyine ayarlamamalısınız. Çünkü bu izin düzeyi, kullanıcı veya gruptan bağımsız olarak herkesin klasör ve dosyanın içeriğine erişmesine izin verir. - -::: - -## Dizinleri Özelleştirme - -Varsayılan olarak Flarum'un dizin yapısı, yalnızca herkesin erişebileceği dosyaları içeren bir `public` dizini içerir. Bu, tüm hassas kaynak kodu dosyalarına web kökünden tamamen erişilemez olmasını sağlayan en iyi güvenlik uygulamasıdır. - -Ancak, Flarum'u bir alt dizinde (`domain.tld/forum` gibi) barındırmak istiyorsanız veya barındırıcınız size web kökünüz üzerinde kontrol sağlamıyorsa (gibi bir şeye takılıp kalırsınız) `public_html` veya `htdocs`, Flarum'u `public` dizini olmadan kurabilirsiniz. - -If you intend to install Flarum using one of the archives, you can simply use the `no-public-dir` (Public Path = No) [archives](#installing-by-unpacking-an-archive) and skip the rest of this section. If you're installing via Composer, you'll need to follow the instructions below. - -`public` dizini içindeki tüm dosyaları (`.htaccess` dahil) Flarum'a hizmet vermek istediğiniz dizine taşımanız yeterlidir. Ardından, hassas kaynakları korumak için `.htaccess` dosyasını düzenleyin ve 9-15 satırlarındaki açıklamaları kaldırın. Nginx için, `.nginx.conf`'un 8-11. satırlarındaki yorumları kaldırın. - -Ayrıca `index.php` dosyasını düzenlemeniz ve aşağıdaki satırı değiştirmeniz gerekecektir: - -```php -$site = require './site.php'; -``` - - `site.php` dosyasını düzenleyin ve aşağıdaki satırlardaki yolları yeni dizin yapınızı yansıtacak şekilde güncelleyin: - -```php -'base' => __DIR__, -'public' => __DIR__, -'storage' => __DIR__.'/storage', -``` - -Son olarak, `config.php`'yi kontrol edin ve `url` değerinin doğru olduğundan emin olun. - -## Verileri İçe Aktarma - -Mevcut bir topluluğunuz varsa ve sıfırdan başlamak istemiyorsanız, mevcut verilerinizi Flarum'a aktarabilirsiniz. Henüz resmi bir ithalatçı olmasa da, topluluk birkaç resmi olmayan ithalatçı yaptı: - -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) - -Bunlar, önce phpBB'ye, ardından Flarum'a geçirilerek diğer forum yazılımları için de kullanılabilir. Bunların çalışacağını garanti edemeyeceğimizi ve onlar için destek sağlayamayacağımızı unutmayın. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/internal/README.md b/i18n/tr/docusaurus-plugin-content-docs/current/internal/README.md deleted file mode 100644 index ce923579d..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/internal/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -slug: '/internal' ---- - -# Internal Team Docs - -Bu, Flarum ekibi tarafından dahili olarak kullanılan bazı belgeleri yayınlayacağımız yeni bir belgeleme bölümüdür. We are starting this section to provide our community with transparency as to how Flarum is run, and to help those hoping to contribute to Flarum. \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md b/i18n/tr/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md deleted file mode 100644 index 555e7977c..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bundled Extensions Policy - -This document is to assist in deciding what core features should be bundled or maintained by the Flarum project team. - -Understand that Flarum aims to have a lean and efficient team. To guarantee a transparent workload, we intentionally have a "this could be an extension" mentality. The acronym D.O.R.C. spells out our decision-making process. - -- **Density**: prevent bloating Flarum so that it becomes a burden to install on shared hosting plans with limited space. -- **Opinionatedness**: no extensions should be bundled that is only useful by only a limited amount of communities or on specific hosting environments. -- **Responsibility**: extensions that could easily be maintained by others should be maintained by others. -- **Complexity**: extensions that are complex in terms of design, frontend or backend code should not be a responsibility of the Flarum project team. - -### Density - -To prevent the installation size of Flarum from continuously increasing we need to protect it from extensions that bloat it. We should ship extensions with Flarum that, for instance, have kilobytes in media files. - -### Opinionatedness - -Our goal is to allow installation of Flarum, in its vanilla form, by any community on any hosting environment. This includes shared hosting environment as well. - -Releasing Flarum with extensions that add functionality specific to cloud based (AWS) installations or for corporate support communities, as such, is unwanted. - -### Responsibility - -Protecting the time of the project team is key. To do so we should empower the ecosystem in building extensions that it needs. Therefor we distance ourselves from the responsibility of building every and all extensions. The responsibility of extension development is held primarily by our community. - -### Complexity - -Complex extensions require a vast amount of time, not just for development, but also documentation and support. To protect the lean and efficient principles of the team, we will not take ownership of extensions that add this complexity. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/internal/extension-manager.md b/i18n/tr/docusaurus-plugin-content-docs/current/internal/extension-manager.md deleted file mode 100644 index e448a6601..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/internal/extension-manager.md +++ /dev/null @@ -1,87 +0,0 @@ -# Uzantı Yöneticisi -This contains an explanation of how the extension manager works and what it has to offer. - -slightly outdated: see [the extensions guide for more](/extensions.md). - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the extension manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the extension manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Extension Manager Queue Table Preview](/en/img/extension-manager-queue.png) - -## TODO -- Try on shared hosting. -- Better explanation on the UI about background tasks. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/internal/merging-policy.md b/i18n/tr/docusaurus-plugin-content-docs/current/internal/merging-policy.md deleted file mode 100644 index 067e2809f..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/internal/merging-policy.md +++ /dev/null @@ -1,38 +0,0 @@ -# PR Merging Policy - -Technical contributions to the Flarum source code go through a review process. Over the years we have tuned this process based on our experiences, our targeted development speed and availability. - -## What makes a great Pull Request? - -Great pull requests: - -- Have the [Pull Request template](https://github.com/flarum/.github/blob/main/PULL_REQUEST_TEMPLATE.md) filled out completely when opening a pull request. -- Do not combine different changes. Although tempting, don't change formatting of unrelated code. Stick to the one feature or change you wish to contribute. -- Have a related issue where the technical implementation has been agreed upon by the core team, or has been approved on by the core team through discussion on the official forums or other channels like Discord. -- Clearly explain the need for the change and list the areas where the pull request requires discussion. - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. We usually find several commits from bots like StyleCI in these prefabricated commit messages, their commit messages should be removed. - -- After merging: - - Assign the related issue (if none exists, the pull request itself, but never both) to the appropriate milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/internal/merging.md b/i18n/tr/docusaurus-plugin-content-docs/current/internal/merging.md deleted file mode 100644 index 0408b1bee..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/internal/merging.md +++ /dev/null @@ -1,29 +0,0 @@ -# PR Merging Workflow - - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all of the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. - -- After merging: - - Make sure the *issue* (if none exists, the PR - but not both) belongs to the appropriate milestone and project board. - - PRs in extensions cannot be assigned to core milestones, so create a core issue that references it and add it to the milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/internal/package-manager.md b/i18n/tr/docusaurus-plugin-content-docs/current/internal/package-manager.md deleted file mode 100644 index 823599db5..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/internal/package-manager.md +++ /dev/null @@ -1,89 +0,0 @@ -# Package Manager -This contains an explanation of how the package manager works and what it has to offer. - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the package manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the package manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Package Manager Queue Table Preview](/en/img/package-manager-queue.png) - -## TODO -- Try on shared hosting. -- Composer command job must not overlap. -- Code TODOs. -- Better explanation on the UI about background tasks. -- Take into consideration a scenario where we're updating an extension that isn't a root required dependency, like bundles. -- Run one background task at a time, prevent user from triggering multiple tasks. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/languages.md b/i18n/tr/docusaurus-plugin-content-docs/current/languages.md deleted file mode 100644 index d1e32af2a..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/languages.md +++ /dev/null @@ -1,29 +0,0 @@ -# Diller - -Temel Flarum kurulumunuza yeni bir dil eklemek kolaydır. Seçtiğiniz dil paketini indirmek ve kurmak için aşağıdaki talimatları uygulamanız yeterlidir. - -Bir dil paketi ekledikten sonra, forumunuz için [varsayılan dil olarak ayarlayabilirsiniz](#varsayılan-dili-ayarlama). Ve yüklü dil paketlerinizden birine ihtiyacınız olmadığını anlarsanız, her zaman \[devre dışı bırakabilirsiniz\] (#dil-paketini-devre-dışı-bırakma). Herhangi bir üçüncü taraf uzantısı kullanıyorsanız, başlamadan önce [bunu okuduğunuzdan](#topluluk-uzantıları) emin olun. - -## Dil Paketi Kurulumu - -Başlamak için, Flarum Community sitesinde [Extensions > Languages](https://discuss.flarum.org/t/languages) etiketini ziyaret edin ve yüklemek istediğiniz bir dil paketi bulun. - -Dil paketleri, [uzantılar](extensions.md) ile aynı şekilde yüklenir. Dil, yönetici arayüzünün **Uzantılar** sayfasında görünecektir ve orada etkinleştirebilirsiniz. - -Hepsi bu kadar! Artık forumunuzun görünümünü yeni dile geçirmek için sitenizin başlığındaki dil seçiciyi kullanabilmeniz gerekir. - -## Varsayılan Dili Ayarlama - -Bir dil paketi yükledikten ve çalıştığından emin olduktan sonra, onu yeni kullanıcılar ve misafirler için varsayılan dil olarak ayarlamak isteyebilirsiniz. Bunu yönetici arayüzünün **Temel Bilgiler** sayfasında yapabilirsiniz. - -## Dil Paketini Devre Dışı Bırakma - -Belirli bir dili desteklemenize gerek olmadığına karar verirseniz, sonuçta onu kapatabilirsiniz. Yönetici arayüzünün **Uzantılar** sayfasında dil paketini bulun ve devre dışı bırakın. - -Tek dilli bir site çalıştırıyorsanız ve dil seçicinin site başlığında görünmesini istemiyorsanız, bir dili devre dışı bırakmak yararlı olabilir. Dil seçici, yalnızca bir dil etkinleştirildiğinde gizlenir. - -## Topluluk Uzantıları - -Flarum Topluluğu sitesinden indirilen dil paketleri genellikle Flarum ile birlikte gelen tüm uzantıların çevirilerini içerecek olsa da, kural olarak yüklemiş olabileceğiniz tüm topluluk uzantılarını kapsamazlar. Uzantılarının çevirilerini sağlamak ve sürdürmek geliştiricilere bağlıdır. - -Bu nedenle, bir topluluk uzantısı yüklemeden önce, yüklediğiniz her dil paketi için çeviriler içerdiğinden emin olmalısınız. Bir uzantının ihtiyacınız olan bir dili desteklemediğini fark ederseniz, lütfen doğrudan geliştiriciyle iletişime geçin ve gerekli çevirilerin eklenmesini sağlayın. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/mail.md b/i18n/tr/docusaurus-plugin-content-docs/current/mail.md deleted file mode 100644 index e32384ac3..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/mail.md +++ /dev/null @@ -1,29 +0,0 @@ -# E-posta Yapılandırması - -Herhangi bir topluluğun, e-posta doğrulaması, şifre sıfırlama, bildirim ve kullanıcılara yönelik diğer iletişimlere izin vermek için e-posta göndermesi gerekir. Forumunuzu e-posta gönderecek şekilde yapılandırmak, yönetici olarak ilk adımlarınızdan biri olmalıdır: Yanlış bir yapılandırma, kullanıcılar kaydolmaya çalışırken hatalara neden olur. - -## Kullanılabilir Sürücüler - -Flarum varsayılan olarak birkaç sürücü sağlar, bunlar aşağıda listelenir ve açıklanır. Geliştiriciler ayrıca [uzantılar aracılığıyla özel posta sürücüleri](ext/mail.md) ekleyebilirler. - -### SMTP - -Bu muhtemelen en yaygın kullanılan e-posta sürücüsüdür ve harici bir SMTP hizmeti için bir ana bilgisayar, bağlantı noktası/şifreleme, kullanıcı adı ve şifre yapılandırmanıza izin verir. Lütfen şifreleme alanının `ssl` veya `tls` olmasını beklediğini unutmayın. - -### Posta - -`mail` sürücüsü, birçok barındırma sunucusunda bulunan sendmail/postfix e-posta sistemini kullanmaya çalışacaktır. Bunun çalışması için sendmail'i sunucunuza düzgün bir şekilde kurmanız ve yapılandırmanız gerekir. - -### Mailgun - -Bu sürücü, e-posta göndermek için [Mailgun](https://www.mailgun.com/) hesabınızı kullanır. Mailgun yapılandırmanızdaki etki alanı ve bölgenin yanı sıra gizli bir anahtara ihtiyacınız olacak. - -To use the mailgun driver, you'll need to install the Guzzle composer package (a PHP HTTP client). You can do this by running `composer require guzzlehttp/guzzle:^6.0|^7.0` in your Flarum install's root directory. - -### Günlük - -Günlük posta sürücüsü POSTA GÖNDERMEZ ve öncelikle geliştiriciler tarafından kullanılır. Herhangi bir e-postanın içeriğini `FLARUM_ROOT_DIRECTORY/storage/logs` içindeki günlük dosyasına yazar. - -## Test E-postası - -Bir e-posta yapılandırmasını kaydettikten sonra, yapılandırmanızın çalıştığından emin olmak için yönetici panosunun Posta sayfasındaki "Test Postası Gönder" düğmesini tıklayabilirsiniz. Bir hata görürseniz veya bir e-posta almazsanız, yapılandırmayı ayarlayın ve tekrar deneyin. Herhangi bir hata yoksa, ancak gelen kutunuzda hiçbir şey görünmüyorsa istenmeyen postanızı kontrol ettiğinizden emin olun. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/releases.md b/i18n/tr/docusaurus-plugin-content-docs/current/releases.md deleted file mode 100644 index 2c9b883aa..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/releases.md +++ /dev/null @@ -1,15 +0,0 @@ -# Sürüm Notları - - - - -Sürüm notları [Flarum Topluluğu](https://discuss.flarum.org/t/blog?sort=newest)'nda bulunabilir. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/rest-api.md b/i18n/tr/docusaurus-plugin-content-docs/current/rest-api.md deleted file mode 100644 index 10b1df14e..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/rest-api.md +++ /dev/null @@ -1,375 +0,0 @@ -# Consuming the REST API - -Flarum exposes a REST API which is used by the single page application but also available for external scripts. - -The API follows the best practices defined by the [JSON:API](https://jsonapi.org/) specification. - -:::bilgi - -To extend the REST API with new endpoints, see [API and Data Flow](extend/api.md) in the developer documentation. - -::: - -## Authentication - -The single page app uses session cookies to authenticate against the API. External scripts can use stateless authentication using [API Keys](#api-keys) or [Access Tokens](#access-tokens). - -`GET` endpoints can be used without authentication. Only content visible to guests will be returned. Other endpoints generally cannot be used without authentication because of the [CSRF protection](#csrf-protection). - -### API keys - -API Keys are the primary way for scripts, tools and integrations to interact with Flarum. - -#### Creation - -There is currently no UI to manage API Keys, but they can be created manually in the `api_keys` table of the database. - -The following attributes can be filled: - -- `key`: Generate a long unique token (recommended: alpha-numerical, 40 characters) and set it here, this will be the token used in the `Authorization` header. -- `user_id`: Optional. If set, the key can only be used to act as the given user. - -The remaining attributes are either automatically filled or currently not used: - -- `id`: Will be filled by MySQL auto-increment. -- `allowed_ips`: Not implemented. -- `scopes`: Not implemented. -- `created_at`: Can be set to any date, but is meant for the date of creation of the key. -- `last_activity_at`: Will be updated automatically when the token is used. - -#### Usage - -Attach your key value to each API request using the `Authorization` header. Then provide the user ID you want to interact as at the end of the header: - - Authorization: Token YOUR_API_KEY_VALUE; userId=1 - -If a `user_id` value has been set for the key in the database, `userId=` will be ignored. Otherwise, it can be set to any valid user ID that exists in the database. - -### Access Tokens - -Access Tokens are short-lived tokens that belong to a specific user. - -Those tokens are used behind the scenes for cookie sessions. Their use in stateless API requests has the same effect as a regular session. The user last activity will be updated each time the token is used. - -#### Creation - -All users are allowed to create access tokens. To create a token, use the `/api/token` endpoint with the credentials of your user: - -``` -POST /api/token HTTP/1.1 - -{ - "identification": "Toby", - "password": "pass7word" -} - -HTTP/1.1 200 OK - -{ - "token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX", - "userId": "1" -} -``` - -At the moment, 3 token types exist, although only 2 types can be created via the REST API. - -- `session` tokens expire after 1h of inactivity. This is the default token type. -- `session_remember` tokens expire after 5 years of inactivity. They can be obtained by specifying `remember=1` in the request attributes. -- `developer` tokens never expire. They can only be created manually in the database at the moment. - -**All access tokens are deleted when the user logs out** (this includes `developer` tokens, although it is planned to change it). - -#### Usage - -Attach the returned `token` value to each API request using the `Authorization` header: - - Authorization: Token YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX - -### CSRF Protection - -Most of the `POST`/`PUT`/`DELETE` API endpoints are protected against [Cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery). This means stateless requests are not possible without authentication. - -When using an API Key or Access Token, CSRF protection is bypassed. - -## Endpoints - -This part of the documentation is still in progress. We are researching options to provide an automated documentation of the endpoints. - -Every extension adds new endpoints and attributes so it's difficult to provide a complete documentation of all endpoints. A good way to discover endpoints is to use the browser development tools to inspect requests made by the single page application. - -Below are a few examples of commonly used endpoints. JSON has been truncated to make reading easier. - -### List discussions - - GET /api/discussions - -```json -{ - "links": { - "first": "https://flarum.tld/api/discussions", - "next": "https://flarum.tld/api/discussions?page%5Boffset%5D=20" - }, - "data": [ - { - "type": "discussions", - "id": "234", - "attributes": { - "title": "Lorem Ipsum", - "slug": "234-lorem-ipsum", - "commentCount": 10, - "participantCount": 3, - "createdAt": "2022-01-01T10:20:30+00:00", - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "lastPostNumber": 10, - "canReply": true, - "canRename": true, - "canDelete": true, - "canHide": true, - "isHidden": true, - "hiddenAt": "2022-01-06T10:20:30+00:00", - "lastReadAt": "2022-01-02T10:20:30+00:00", - "lastReadPostNumber": 2, - "isApproved": true, - "canTag": true, - "isLocked": false, - "canLock": true, - "isSticky": false, - "canSticky": true, - "canMerge": true, - "subscription": null - }, - "relationships": { - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - "lastPostedUser": { - "data": { - "type": "users", - "id": "64" - } - }, - "tags": { - "data": [ - { - "type": "tags", - "id": "3" - } - ] - }, - "firstPost": { - "data": { - "type": "posts", - "id": "668" - } - } - } - }, - { - "type": "discussions", - "id": "234", - "attributes": { - // [...] - }, - "relationships": { - // [...] - } - }, - // [...] more discussions - ], - "included": [ - { - "type": "users", - "id": "1", - "attributes": { - "username": "Admin", - "displayName": "Admin", - "avatarUrl": null, - "slug": "1" - } - }, - { - "type": "users", - "id": "64", - "attributes": { - "username": "Flarum", - "displayName": "Flarum", - "avatarUrl": "https://flarum.tld/assets/avatars/Z4hEncw0ndVqZ8be.png", - "slug": "64" - } - }, - { - "type": "tags", - "id": "3", - "attributes": { - "name": "Welcome", - "description": "Post interesting things here", - "slug": "welcome", - "color": "#888", - "backgroundUrl": null, - "backgroundMode": null, - "icon": "fas fa-bullhorn", - "discussionCount": 30, - "position": 1, - "defaultSort": null, - "isChild": false, - "isHidden": false, - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "canStartDiscussion": true, - "canAddToDiscussion": true, - "isRestricted": false - } - }, - { - "type": "posts", - "id": "668", - "attributes": { - "number": 1, - "createdAt": "2022-01-01T10:20:30+00:00", - "contentType": "comment", - "contentHtml": "

Hello World

" - } - }, - // [...] more includes for the other discussions - ] -} -``` - -### Create discussion - - POST /api/discussions - -```json -{ - "data":{ - "type": "discussions", - "attributes": { - "title": "Lorem Ipsum", - "content": "Hello World" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "1" - } - ] - } - } - } -} -``` - -The response includes the ID of the new discussion: - -```json -{ - "data": { - "type": "discussions", - "id": "42", - "attributes": { - "title": "Lorem Ipsum", - "slug": "42-lorem-ipsum", - "commentCount": 1 - // [...] other attributes - }, - "relationships": { - "posts": { - "data": [ - { - "type": "posts", - "id": "58" - } - ] - }, - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - // [...] other relationships - } - }, - "included":[ - { - "type": "posts", - "id": "38", - "attributes": { - "number": 1, - "contentType": "comment", - "contentHtml": "\u003Cp\u003EHello World\u003C\/p\u003E" - // [...] other attributes - } - } - // [...] other includes - ] -} -``` - -### Create user - - POST /api/users - -```json -{ - "data": { - "attributes": { - "username": "Flarum", - "email": "flarum@example.com", - "password": "correcthorsebatterystaple" - } - } -} -``` - -## Errors - -Flarum uses various HTTP status code and includes error descriptions that follow the [JSON:API error spec](https://jsonapi.org/format/#errors). - -Below are a few common errors you might encounter when using the REST API: - -### CSRF Token Mismatch - -If you receive a 400 HTTP error with `csrf_token_mismatch` message, it means the `Authorization` header is absent or invalid and Flarum attempted to authenticate through the session cookie. - -```json -{ - "errors": [ - { - "status": "400", - "code": "csrf_token_mismatch" - } - ] -} -``` - -### Validation errors - -Validation errors are returned with 422 HTTP status code. The name of the invalid field is returned as the `pointer` value. There can be multiple errors for a single field at the same time. - -```json -{ - "errors": [ - { - "status": "422", - "code": "validation_error", - "detail": "The username has already been taken.", - "source":{ - "pointer":"\/data\/attributes\/username" - } - }, - { - "status": "422", - "code": "validation_error", - "detail": "The email has already been taken.", - "source": { - "pointer":"\/data\/attributes\/email" - } - } - ] -} -``` diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/scheduler.md b/i18n/tr/docusaurus-plugin-content-docs/current/scheduler.md deleted file mode 100644 index 6123ce7c3..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/scheduler.md +++ /dev/null @@ -1,55 +0,0 @@ -# Scheduler - -The Flarum scheduler allows extensions to automate certain tasks effortlessly. In this guide we will see how to set it up. We won't go into the details of cron itself, but if you want to read more about it, I suggest you take a look at [this Wikipedia article](https://en.wikipedia.org/wiki/Cron) on cron. - -## Why should I care? - -Quite simply, a growing list of extensions now support handling certain functions automatically for you, completely behind the scenes. Wondering why `fof/drafts` 'scheduled drafts' are not posting, or `fof/best-answer` 'remind users to set a best answer after X days' does not fire? That'll be because they will setup themselves with the scheduler service, but without a one-liner cron job, nothing will happen! - -## What extensions currently use the scheduler? - -Some of the most popular examples are the following: - -- [FoF Best Answer](https://github.com/FriendsOfFlarum/best-answer) -- [FoF Drafts](https://github.com/FriendsOfFlarum/drafts) -- [FoF Sitemap](https://github.com/FriendsOfFlarum/sitemap) -- [FoF Open Collective](https://github.com/FriendsOfFlarum/open-collective) -- [FoF Github Sponsors](https://github.com/FriendsOfFlarum/github-sponsors) - -## Ok, let's get this setup! - -Most (if not all) Linux distros either come with, or can have, cron installed. For example, on Debian and Ubuntu based systems, you can install `cron` like this: - -``` -sudo apt-get update -sudo apt-get install cron -``` - -In case you are using a RHEL based Linux distribution (CentOS, AlmaLinux, Rocky Linux...), install cron like this: - -``` -sudo dnf update -sudo dnf install crontabs -``` - -Once you have cron installed, let's create the one and only entry you need for Flarum: - -``` -crontab -e -``` - -This will open the cron editor. You may or may not have other entries there. Add this line, and remember to leave an empty line at the bottom. - -``` -* * * * * cd /path-to-your-project && php flarum schedule:run >> /dev/null 2>&1 -``` - -`* * * * *` tells cron to run your command every minute. - -In case you want to use a different value and don't know exactly how cron expressions work, you can use a [cron expression generator](https://crontab.guru) to easily get the desired string. - -`cd /path-to-your-project && php flarum schedule:run` executes Flarum's scheduler to trigger any tasks currently waiting to be run. If PHP isn't in your system's path, you may need to experiment with setting the full path to PHP. - -Lastly `>> /dev/null 2>&1` suppresses any output from the command. - -Voila! Now any extension that registers a task to run, anything from every minute to daily, monthly, yearly - whatever - will now run on your server. diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/themes.md b/i18n/tr/docusaurus-plugin-content-docs/current/themes.md deleted file mode 100644 index 97e8e6730..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/themes.md +++ /dev/null @@ -1,29 +0,0 @@ -# Tema - -Flarum'u olabildiğince güzel hale getirmek için çok çalışmış olsak da, her topluluk muhtemelen arzu ettikleri stile uyacak bazı ince ayarlar/değişiklikler yapmak isteyecektir. - -## Yönetici Gösterge Paneli - -[Yönetici gösterge tablosu](admin.md)'nun Görünüm sayfası, forumunuzu özelleştirmeye başlamak için harika bir ilk yerdir. Burada yapabilirsin: - -- Tema renklerini seçin -- Karanlık modu ve renkli üstbilgi değiştir -- Bir logo ve favicon yükleyin (tarayıcı sekmelerinde gösterilen simge) -- Özel üstbilgiler ve altbilgiler için HTML ekleyin -- Öğelerin görüntülenme şeklini değiştirmek için [özel LESS/CSS](#css-theming) ekleyin - -## CSS Tema Oluşturma - -CSS, tarayıcılara bir web sayfasının öğelerinin nasıl görüntüleneceğini söyleyen bir stil sayfası dilidir. Renklerden yazı tiplerine, eleman boyutuna ve konumlandırmadan animasyonlara kadar her şeyi değiştirmemizi sağlar. Özel CSS eklemek, Flarum kurulumunuzu bir temayla eşleşecek şekilde değiştirmenin harika bir yolu olabilir. - -Bir CSS eğitimi bu belgesinin kapsamı dışındadır, ancak CSS'nin temellerini öğrenmek için birçok harika çevrimiçi kaynak vardır. - -:::tip - -Flarum aslında LESS kullanır, bu da değişkenlere, koşullara ve işlevlere izin vererek CSS yazmayı kolaylaştırır. - -::: - -## Uzantılar - -Flarum'un esnek [uzantı sistemi](extensions.md), Flarum'un herhangi bir parçasını pratik olarak eklemenize, çıkarmanıza veya değiştirmenize olanak tanır. Renkleri/boyutları/stilleri değiştirmenin ötesinde önemli tema değişiklikleri yapmak istiyorsanız, kesinlikle gitmenin yolu özel bir uzantıdır. Bir uzantının nasıl oluşturulacağını öğrenmek için [uzantı belgelerimize](extend/README.md) göz atın! diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/troubleshoot.md b/i18n/tr/docusaurus-plugin-content-docs/current/troubleshoot.md deleted file mode 100644 index 312c3e286..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/troubleshoot.md +++ /dev/null @@ -1,56 +0,0 @@ -# Sorun Giderme - -Flarum beklendiği gibi yüklenmiyorsa veya çalışmıyorsa, yapmanız gereken ilk şey ortamınızın [sistem gereksinimlerini](install.md#sunucu-gereksinimleri) karşılayıp karşılamadığını *tekrar kontrol etmektir.* Flarum'un çalıştırması gereken bir şeyi kaçırıyorsanız, onu düzeltmeniz gerekir. If you're missing something that Flarum needs to run, you'll need to remedy that first. - -Ayrıca, [Destek forumunu](https://discuss.flarum.org/t/support) ve [sorun izleyiciyi](https://github.com/flarum/core/issues) aramak için birkaç dakikanızı ayırmalısınız. Birisi sorunu zaten bildirmiş olabilir ve bir düzeltme mevcut veya yolda. İyice araştırdıysanız ve sorunla ilgili herhangi bir bilgi bulamıyorsanız, sorun gidermeye başlamanın zamanı geldi. - -## Step 0: Activate debug mode - -:::danger Skip on Production - -These debugging tools are very useful, but can expose information that shouldn't be public. These are fine if you're on a staging or development environment, but if you don't know what you're doing, skip this step when on a production environment. - -::: - -Devam etmeden önce, Flarum'un hata ayıklama araçlarını etkinleştirmelisiniz. Basitçe bir metin düzenleyiciyle **config.php** açın, `debug` değerini `true` olarak değiştirin ve dosyayı kaydedin. Bu, Flarum'un ayrıntılı hata mesajları göstermesine neden olarak size neyin yanlış gittiğine dair bir fikir verecektir. - -Boş sayfalar görüyorsanız ve yukarıdaki değişiklik yardımcı olmuyorsa, **php.ini** yapılandırma dosyanızda `display_errors` ı `On` olarak ayarlamayı deneyin. - -## 1. Adım: Yaygın düzeltmeler - -A lot of issues can be fixed with the following: - -* Tarayıcınızın önbelleğini temizleyin -* Arka uç önbelleğini [`php flarum cache:clear`](console.md) ile temizleyin. -* Veritabanınızın [`php flarum migrate`](console.md) ile güncellendiğinden emin olun. -* Yönetici panonuzdaki [e-posta yapılandırmasının](mail.md) doğru olduğundan emin olun: geçersiz e-posta yapılandırması kayıt olurken, parolayı sıfırlarken, e-postaları değiştirirken ve bildirim gönderirken hatalara neden olur. -* `config.php` dosyanızın doğru olup olmadığını kontrol edin. Örneğin, doğru `url` nin kullanıldığından emin olun. -* One potential culprit could be a custom header, custom footer, or custom LESS. If your issue is in the frontend, try temporarily removing those via the Appearance page of the admin dashboard. - -Ayrıca önemli hiçbir şeyin yerinde olmadığından emin olmak için [`php flarum info`](console.md) çıktısına da göz atmak isteyeceksiniz. - -## 2. Adım: Sorunu yeniden oluşturun - -Sorunun yeniden oluşmasını sağlamaya çalışın. Gerçekleştiğinde ne yaptığınıza dikkat edin. Her seferinde mi yoksa sadece ara sıra mı oluyor? Sorunu etkileyebileceğini düşündüğünüz bir ayarı veya bir şeyleri yaptığınız sırayı değiştirmeyi deneyin. Bazı koşullarda olurken diğerleri olmuyor mu? - -Yakın zamanda bir uzantı eklediyseniz veya güncellediyseniz, sorunun çözülüp çözülmediğini görmek için geçici olarak devre dışı bırakmalısınız. Tüm uzantılarınızın, çalıştırdığınız Flarum sürümüyle kullanılmak üzere tasarlandığından emin olun. Eski uzantılar, çeşitli sorunlara neden olabilir. - -Yol boyunca bir yerlerde sorununuza neyin sebep olduğu hakkında bir fikir edinebilir ve bunu düzeltmenin bir yolunu bulabilirsiniz. Ancak bu olmasa bile, hata raporunuzu doldurduktan sonra, neler olup bittiğini anlamamıza yardımcı olacak birkaç değerli ipucuyla karşılaşacaksınız. - -## 3. Adım: Bilgi toplayın - -Sorunu çözmek için yardıma ihtiyacınız olacak gibi görünüyorsa, veri toplama konusunda ciddi olmanın zamanı geldi. Aşağıdaki yerlerde hata mesajlarını veya sorunla ilgili diğer bilgileri arayın: - -* Asıl sayfada görüntülenir -* Tarayıcı konsolunda görüntülenir (Chrome: Diğer araçlar -> Geliştirici Araçları -> Konsol) -* `/var/log/nginx/error.log`) -* PHP-FPM'nin hata günlüğüne kaydedilir (ör. `/var/log/php7.x-fpm.log`) -* Flarum tarafından kaydedildi (`storage/logs/flarum.log`) - -Herhangi bir mesajı bir metin dosyasına kopyalayın ve hatanın *ne zaman* oluştuğu, o sırada *ne yaptığınız* vb. Hakkında birkaç not alın. Sorunun meydana geldiği ve oluşmadığı koşullar hakkında derlemiş olabileceğiniz tüm bilgileri eklediğinizden emin olun. Sunucu ortamınız hakkında olabildiğince fazla bilgi ekleyin: İşletim sistemi sürümü, web sunucusu sürümü, PHP sürümü ve işleyici, vb. - -## 4. Adım: Bir rapor hazırlayın - -Sorunla ilgili tüm bilgileri topladıktan sonra bir hata raporu vermeye hazırsınız. Lütfen [Hataları Bildirme](bugs.md) ile ilgili talimatları uygulayın. - -Raporunuzu doldurduktan sonra sorunla ilgili yeni bir şey keşfederseniz, lütfen bu bilgiyi orijinal yayınınızın altına ekleyin. Sorunu kendi başınıza çözmüş olsanız bile rapor vermek iyi bir fikirdir, çünkü diğer kullanıcılar da çözümünüzden faydalanabilir. Sorun için geçici bir çözüm bulduysanız, bundan da bahsettiğinizden emin olun. \ No newline at end of file diff --git a/i18n/tr/docusaurus-plugin-content-docs/current/update.md b/i18n/tr/docusaurus-plugin-content-docs/current/update.md deleted file mode 100644 index 74eb08c71..000000000 --- a/i18n/tr/docusaurus-plugin-content-docs/current/update.md +++ /dev/null @@ -1,110 +0,0 @@ -# Güncelleme - -## From the Admin Dashboard - -:::bilgi - -If you have the extension manager extension installed you can simply run the update from its interface and skip this page entirely. - -::: - ---- - -Flarum'u güncellemek için [Composer](https://getcomposer.org) kullanmanız gerekir. Eğer aşina değilseniz (Flarum'u kurmak için buna ihtiyacınız vardır), ne olduğu ve nasıl kurulacağı hakkında bilgi için [kılavuzumuzu](composer.md) okuyun. - -Ana sürümler arasında güncelleme yapıyorsanız (ör. <=0.1.0 - 1.x.x, 1.x.x - 2.x.x, ...), genel yükseltme adımlarını çalıştırmadan önce uygun "ana sürüm güncelleme kılavuzunu" okuduğunuzdan emin olun. - -## Genel Adımlar - -**1. Adım:** Tüm uzantılarınızın, yüklemeye çalıştığınız Flarum sürümüyle uyumlu sürümleri olduğundan emin olun. Bu yalnızca ana sürümler için gereklidir (örneğin, uzantılarınızın önerilen sürümü izlediğini varsayarsak, v1.0.0'dan v1.1.0'a yükseltme yapıyorsanız muhtemelen bunu kontrol etmeniz gerekmez). Bunu, uzantının [Tartışma konusuna](https://discuss.flarum.org/t/extensions) bakarak, [Packagist](http://packagist.org/)'te arayarak veya [Extiverse](https://extiverse.com) gibi veritabanlarını kontrol ederek bilgi alabilirsiniz. Güncellemeden önce uyumsuz uzantıları kaldırmanız (yalnızca devre dışı bırakmanız değil) gerekir. Lütfen uzantı geliştiricilerine karşı sabırlı olun! - -**2. Adım:** `composer.json` dosyanıza bir göz atın. Uzantıların veya kitaplıkların belirli sürümlerini gerektirecek bir nedeniniz yoksa, `flarum/core` dışındaki her şeyin sürüm dizesini `*` olarak ayarlamalısınız ((`flarum/tags dahil) `, `flarum/bahsetmeler` ve diğer paket uzantılar.) `flarum/core` öğesinin `*` olarak AYARLANMADIĞINDAN emin olun. Belirli bir Flarum sürümünü hedefliyorsanız, `flarum/core` öğesini buna ayarlayın (ör. `"flarum/core": "v0.1.0-beta.16`). Yalnızca en son sürümü istiyorsanız, `"flarum/core": "^1.0"` kullanın. - -**3. Adım:** Yerel kurulumunuz [yerel genişleticiler](extenders.md) kullanıyorsa, bunların Flarum'daki değişikliklerle güncel olduğundan emin olun. - -**4. Adım:** Güncellemeden önce yönetici kontrol panelinde üçüncü taraf uzantıları devre dışı bırakmanızı öneririz. Bu kesinlikle gerekli değildir, ancak sorunlarla karşılaşırsanız hata ayıklamayı kolaylaştıracaktır. - -**Adım 5:** PHP sürümünüzün yükseltmeye çalıştığınız Flarum sürümü tarafından desteklendiğinden ve Composer 2'yi (`composer --version)` kullandığınızdan emin olun. - -**6. Adım:** Son olarak, güncellemek için şunu çalıştırın: - -``` -composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -php flarum migrate -php flarum cache:clear -``` - -**Adım 7:** Varsa, PHP işleminizi ve opcache'nizi yeniden başlatın. - -## Ana Sürüm Güncelleme Kılavuzları - -### Beta'dan (<=0.1.0) Kararlı v1'e (^1.0.0) güncelleme - -1. Yukarıdaki 1-5 adımlarını uygulayın. -2. `Composer.json`'da tüm paketlenmiş uzantıların (`flarum/tags`, `flarum/bahsetme`, `flarum/likes` vb.) sürüm dizelerini değiştirin. `^0.1.0` ile `*` arasında değişti. -3. `composer.json` içindeki `flarum/core` sürüm dizesini `^0.1.0`'den `^1.0`'e değiştirin. -4. `composer.json` dosyanızdan `"minimum-stability": "beta",` satırını kaldırın -5. Yukarıdaki 6. ve 7. adımları uygulayın. - -## Sorun Giderme - -Flarum'u güncellerken hatalarla karşılaşabileceğiniz 2 ana yer vardır: Güncelleme komutunu çalıştırırken veya güncellemeden sonra foruma erişirken. - -### Güncelleme Sırasında Oluşan Hatalar - -Burada, Flarum'u güncellemeye çalışırken sık karşılaşılan birkaç sorun türünü inceleyeceğiz. - ---- - -Çıktı kısaysa ve şunları içeriyorsa: - -``` -Nothing to modify in lock file -``` - -Veya `flarum/core`'u güncellenmiş bir paket olarak listelemiyor ve en son flarum sürümünü kullanmıyorsunuz: - -- Yukarıdaki 2. adımı tekrar gözden geçirin, tüm üçüncü taraf uzantılarının sürüm dizelerinde bir yıldız işaretine sahip olduğundan emin olun. -- Make sure your `flarum/core` version requirement isn't locked to a specific minor version (e.g. `v0.1.0-beta.16` is locked, `^1.0.0` isn't). If you're trying to update across major versions of Flarum, follow the related major version update guide above. - ---- - -For other errors, try running `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO` - -If the output looks something like this: - -``` -flarum/flarum - requires flarum/core (v0.1.0-beta.15) -fof/moderator-notes 0.4.4 requires flarum/core (>=0.1.0-beta.15 <0.1.0-beta.16) -jordanjay29/flarum-ext-summaries 0.3.2 requires flarum/core (>=0.1.0-beta.14 <0.1.0-beta.16) -flarum/core v0.1.0-beta.16 requires dflydev/fig-cookies (^3.0.0) -flarum/flarum - does not require dflydev/fig-cookies (but v2.0.3 is installed) -flarum/core v0.1.0-beta.16 requires franzl/whoops-middleware (^2.0.0) -flarum/flarum - does not require franzl/whoops-middleware (but 0.4.1 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/bus (^8.0) -flarum/flarum - does not require illuminate/bus (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/cache (^8.0) -flarum/flarum - does not require illuminate/cache (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/config (^8.0) -flarum/flarum - does not require illuminate/config (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/container (^8.0) -flarum/flarum - does not require illuminate/container (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/contracts (^8.0) -flarum/flarum - does not require illuminate/contracts (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/database (^8.0) -flarum/flarum - does not require illuminate/database (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/events (^8.0) -flarum/flarum - does not require illuminate/events (but v6.20.19 is installed) -... (this'll go on for a bit) -``` - -It is very likely that some of your extensions have not yet been updated. - -- Revisit step 1 again, make sure all your extensions have versions compatible with the core version you want to upgrade to. Remove any that don't. -- Make sure you're running `composer update` with all the flags specified in the update step. - -If none of this fixes your issue, feel free to reach out on our [Support forum](https://discuss.flarum.org/t/support). Make sure to include the output of `php flarum info` and `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO`. - -### Errors After Updating - -If you are unable to access your forum after updating, follow our [troubleshooting instructions](troubleshoot.md). diff --git a/i18n/tr/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md b/i18n/tr/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md index bcb9cf997..7878afe92 100644 --- a/i18n/tr/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md +++ b/i18n/tr/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md @@ -305,7 +305,7 @@ export default class NewPostNotification extends Notification { } ``` -In the example, the icon is a star, the link will go to the new post, and the content will say that "{user} posted". +In the example, the icon is a star, the link will go to the new post, and the content will say that "`{user}` posted". Next, we need to tell Flarum that the notification you send in the backend corresponds to the frontend notification we just created. diff --git a/i18n/tr/docusaurus-plugin-content-docs/version-1.x/update.md b/i18n/tr/docusaurus-plugin-content-docs/version-1.x/update.md index 74eb08c71..26e0edbf8 100644 --- a/i18n/tr/docusaurus-plugin-content-docs/version-1.x/update.md +++ b/i18n/tr/docusaurus-plugin-content-docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd Flarum'u güncellemek için [Composer](https://getcomposer.org) kullanmanız gerekir. Eğer aşina değilseniz (Flarum'u kurmak için buna ihtiyacınız vardır), ne olduğu ve nasıl kurulacağı hakkında bilgi için [kılavuzumuzu](composer.md) okuyun. -Ana sürümler arasında güncelleme yapıyorsanız (ör. <=0.1.0 - 1.x.x, 1.x.x - 2.x.x, ...), genel yükseltme adımlarını çalıştırmadan önce uygun "ana sürüm güncelleme kılavuzunu" okuduğunuzdan emin olun. +Ana sürümler arasında güncelleme yapıyorsanız (ör. `<=0.1.0` - 1.x.x, 1.x.x - 2.x.x, ...), genel yükseltme adımlarını çalıştırmadan önce uygun "ana sürüm güncelleme kılavuzunu" okuduğunuzdan emin olun. ## Genel Adımlar @@ -38,7 +38,7 @@ php flarum cache:clear ## Ana Sürüm Güncelleme Kılavuzları -### Beta'dan (<=0.1.0) Kararlı v1'e (^1.0.0) güncelleme +### Beta'dan (`<=0.1.0`) Kararlı v1'e (^1.0.0) güncelleme 1. Yukarıdaki 1-5 adımlarını uygulayın. 2. `Composer.json`'da tüm paketlenmiş uzantıların (`flarum/tags`, `flarum/bahsetme`, `flarum/likes` vb.) sürüm dizelerini değiştirin. `^0.1.0` ile `*` arasında değişti. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/README.md b/i18n/vi/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index 62d814c21..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,45 +0,0 @@ -- - - -slug: / -- - - - -# Về Flarum - -Flarum là một nền tảng thảo luận đơn giản thú vị cho trang web của bạn. Nó nhanh chóng, miễn phí và dễ sử dụng, với tất cả các tính năng bạn cần để điều hành một cộng đồng thành công. Nó cũng cực kỳ có thể mở rộng, cho phép khả năng tùy chỉnh cao nhất. - -![Ảnh chụp màn hình Trang chủ Flarum](/en/img/home_screenshot.png) - -## Mục tiêu - -Flarum là sự kế thừa kết hợp của [esoTalk](https://github.com/esotalk/esoTalk) và [FluxBB](https://fluxbb.org). Nó được thiết kế để: - -* **Nhanh chóng và đơn giản.** Không lộn xộn, không cồng kềnh, không phụ thuộc phức tạp. Flarum được xây dựng bằng PHP để triển khai nhanh chóng và dễ dàng. Giao diện được cung cấp bởi [Mithril](https://mithril.js.org), một khung JavaScript hiệu quả với một dấu ấn nhỏ. - -* **Đẹp và nhanh nhạy.** Đây là phần mềm diễn đàn dành cho con người. Flarum được thiết kế cẩn thận để nhất quán và trực quan trên các nền tảng, ngay từ đầu. - -* **Mạnh mẽ và có thể mở rộng.** Tùy chỉnh, mở rộng và tích hợp Flarum cho phù hợp với cộng đồng của bạn. Kiến trúc của Flarum rất linh hoạt, với [API tiện ích mở rộng mạnh mẽ](/extend/README.md). - -* **Miễn phí và mở.** Flarum được phát hành theo [giấy phép MIT](https://github.com/flarum/flarum/blob/master/LICENSE). - -Bạn có thể đọc thêm về [triết lý và giá trị của chúng tôi đối với Flarum tại đây](https://discuss.flarum.org/d/28869-flarum-philosophy-and-values). - -## Trợ giúp dự án Flarum - -Flarum là phần mềm [miễn phí, mã nguồn mở](https://github.com/flarum/core), được duy trì và quản lý bởi các tình nguyện viên. Chúng tôi dựa vào sự đóng góp của cộng đồng để giúp chúng tôi cải thiện và mở rộng Flarum. - -🧑‍💻 Nếu bạn là nhà phát triển, hãy xem xét [đóng góp vào các tiện ích mở rộng cốt lõi hoặc đi kèm của Flarum](contributing.md). Đây là **cách** hiệu quả nhất để trợ giúp Flarum và công việc của bạn có thể có nhiều tác động: có hàng nghìn trang web Flarum trên mạng, với tổng số hàng triệu người dùng cuối. - -🧩 Nếu thiếu tính năng bạn đang tìm kiếm hoặc ý tưởng chủ đề bạn có, [viết một phần mở rộng tùy chỉnh](extend/README.md) sẽ làm cho Flarum tốt hơn nhiều cho bạn và những người khác. - -✒️ Nếu bạn có kinh nghiệm viết kỹ thuật, hãy đóng góp cho [tài liệu của chúng tôi](https://github.com/flarum/docs/issues) có thể giúp người dùng, quản trị viên và nhà phát triển trong tương lai tận dụng tối đa Flarum. - -🌐 Nếu bạn thông thạo được nhiều ngôn ngữ, bạn có thể [đóng góp bản dịch](extend/language-packs.md) để giúp Flarum tiếp cận đến được nhiều người trên thế giới hơn. - -💸 Flarum Foundation không kiếm tiền từ Flarum, nhưng có hóa đơn thanh toán. Các khoản đóng góp qua [Nhà tài trợ GitHub](https://github.com/sponsors/flarum) hoặc [OpenCollective](https://opencollective.com/flarum) luôn luôn đã nhận một cách biết ơn. Trước đây, chúng tôi cũng đã có thể hỗ trợ tài chính cho một số nhà phát triển cốt lõi của mình, để họ có thể làm việc bán thời gian trên Flarum. Điều này sẽ không thể thực hiện được nếu không có sự hỗ trợ tài chính của bạn. - -🧑‍🤝‍🧑 Tham gia [cộng đồng của chúng tôi](https://discuss.flarum.org) để nói về sự phát triển của Flarum, nhận trợ giúp về phiên bản của bạn hoặc gặp gỡ những người thú vị! Nếu bạn có kinh nghiệm với Flarum, bạn cũng có thể giúp đỡ những người mới bắt đầu! - -🐛 Nếu có một lỗi nào đó đang làm phiền bạn hoặc bạn nảy ra ý tưởng về tính năng, chúng tôi không thể biết về nó trừ khi bạn cho chúng tôi biết! Chúng tôi theo dõi các lỗi, đề xuất và kế hoạch phát triển trong tương lai [thông qua các vấn đề GitHub](https://github.com/flarum/core/issues). Nếu đã có một vấn đề đang mở, việc thêm lượt thích và thông tin bổ sung (mang tính xây dựng) có thể rất hữu ích! - -📣 Và nếu bạn thích Flarum, hãy cân nhắc viết blog/tweet/nói về nó! Nhiều người biết đến Flarum hơn dẫn đến nhiều người tương tác với Flarum hơn, và do đó có nhiều hoạt động hơn, tiện ích mở rộng tốt hơn và phát triển nhanh hơn. - -Flarum sẽ không thể thực hiện được nếu không có cộng đồng hiện tượng của chúng tôi. Nếu bạn muốn đóng góp, hãy xem tài liệu [đóng góp của nhà phát triển](contributing.md) và [đóng góp khác](contributing-docs-translations.md) của chúng tôi để biết thêm thông tin. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/admin.md b/i18n/vi/docusaurus-plugin-content-docs/current/admin.md deleted file mode 100644 index b3fae602f..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/admin.md +++ /dev/null @@ -1,13 +0,0 @@ -# Trang tổng quan quản trị - -Bảng điều khiển quản trị Flarum là một giao diện thân thiện với người dùng để quản lý diễn đàn của bạn. Nó chỉ khả dụng cho người dùng trong nhóm "Quản trị viên". Để truy cập trang Quản trị, nhấn vào **Tên** của bạn ở trên cùng bên phải của màn hình và chọn **Trang quản trị**. - -Bảng điều khiển dành cho quản trị viên gồm các phần sau: -- **Trang tổng quan** - Hiển thị Trang tổng quan quản trị chính, chứa số liệu thống kê và thông tin có liên quan khác. -- **Cơ bản** - Hiển thị các tùy chọn để đặt các chi tiết cơ bản của diễn đàn như Tên, Mô tả và Biểu ngữ chào mừng. -- **Email** - Cho phép bạn định cấu hình cài đặt E-Mail của mình. Tham khảo [tại đây](https://docs.flarum.org/mail) để biết thêm thông tin. -- **Quyền** - Hiển thị các quyền cho từng nhóm người dùng và cho phép bạn định cấu hình phạm vi toàn cầu và phạm vi cụ thể. -- **Giao diện** - Cho phép bạn tùy chỉnh màu sắc, thương hiệu của diễn đàn và thêm CSS bổ sung để tùy chỉnh. -- **Người dùng** - Cung cấp cho bạn danh sách được phân trang gồm tất cả người dùng trong diễn đàn và cấp cho bạn khả năng chỉnh sửa người dùng hoặc thực hiện các hành động quản trị. - -Ngoài các phần được đề cập ở trên, Trang tổng quan quản trị cũng cho phép bạn quản lý các Tiện ích mở rộng của mình (bao gồm các tiện ích mở rộng cốt lõi như Thẻ) trong phần _Tính năng_. Các tiện ích mở rộng sửa đổi chủ đề diễn đàn hoặc cho phép bạn sử dụng nhiều ngôn ngữ được phân loại trong phần _Chủ đề_ và _Ngôn ngữ_ tương ứng. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/bugs.md b/i18n/vi/docusaurus-plugin-content-docs/current/bugs.md deleted file mode 100644 index 4736c745c..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/bugs.md +++ /dev/null @@ -1,28 +0,0 @@ -# Báo cáo lỗi - -:::danger Lỗ hổng bảo mật - -Nếu bạn phát hiện ra lỗ hổng bảo mật trong Flarum, vui lòng tuân theo[chính sách bảo mật](https://github.com/flarum/core/security/policy) của chúng tôi để chúng tôi có thể giải quyết kịp thời. - -::: - -Cảm ơn bạn đã giúp chúng tôi kiểm tra Flarum. Chúng tôi rất vui khi có bạn trong nhóm! Chúng tôi cần những người có thể *kiên nhẫn khắc phục sự cố* và *thông báo rõ ràng*. Như bạn có thể biết, báo cáo lỗi tốt cần một chút thời gian và nỗ lực. Nếu bạn ổn với điều đó, thì hãy bắt đầu! - -## Trùng lặp - -Đã tìm thấy một lỗi? Tuyệt vời! Chúng tôi rất muốn nghe về nó — nhưng trước tiên, bạn nên kiểm tra xung quanh để đảm bảo rằng bạn không lãng phí thời gian vào một vấn đề đã biết: - -- Tìm kiếm trong [Diễn đàn hỗ trợ](https://discuss.flarum.org/t/support) của chúng tôi để xem liệu nó đã được báo cáo chưa. -- Chúng tôi có thể đang tìm cách khắc phục, vì vậy hãy tìm kiếm trong [trình theo dõi sự cố](https://github.com/flarum/core/issues) của chúng tôi. - -Nếu bạn đã tìm kiếm *ỹ lưỡng* và ra về tay không, chúng tôi sẽ hoan nghênh báo cáo của bạn. Nếu đó chỉ là một vấn đề đơn giản (ví dụ: một từ sai chính tả hoặc trục trặc đồ họa), hãy chuyển sang đoạn tiếp theo. Nhưng nếu bạn thấy lỗi hoặc một cái gì đó rõ ràng bị hỏng, chúng tôi sẽ cần bạn thu thập một số thông tin trước. Vui lòng xem hướng dẫn [Gỡ rối](troubleshoot.md) của chúng tôi và làm theo hướng dẫn tại đó. Thu thập càng nhiều thông tin càng tốt! - -## Báo cáo - -Chúng tôi theo dõi các vấn đề trên GitHub. Đảm bảo rằng bạn mở sự cố của mình trong [kho lưu trữ chính xác](https://github.com/flarum) và điền vào tất cả thông tin trong mẫu Báo cáo lỗi. - -Nếu bạn có thể, hãy kiểm tra xem sự cố có thể tái tạo được bằng phiên bản Flarum mới nhất hay không. Nếu bạn đang sử dụng phiên bản phát hành trước hoặc phiên bản phát triển, vui lòng cho biết phiên bản cụ thể mà bạn đang sử dụng. - -Hãy nhớ rằng: mục tiêu của báo cáo lỗi là giúp chúng tôi dễ dàng sao chép lỗi và sửa chữa nó. Bạn có thể muốn đọc [bài viết này](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html) để biết một số mẹo hữu ích về cách viết báo cáo lỗi hiệu quả. Nó **bắt buộc** bạn phải mô tả rõ ràng các bước cần thiết để tái tạo sự cố mà bạn đang gặp phải. Các vấn đề không có bước tái tạo rõ ràng sẽ không được xử lý. Nếu một vấn đề có nhãn "cần xác minh" không nhận được thêm thông tin nào từ tác giả của vấn đề trong hơn 5 ngày, nó sẽ bị đóng. - -Khi bạn đã đăng báo cáo của mình, chúng tôi đề nghị bạn *theo dõi cuộc thảo luận* và kiên nhẫn chờ đợi. Chúng tôi có thể cần hỏi thêm chi tiết hoặc làm rõ; nhưng chúng tôi luôn có nhiều việc phải làm và có thể mất một thời gian trước khi chúng tôi có thể cung cấp cho báo cáo của bạn thời gian xứng đáng. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/code-of-conduct.md b/i18n/vi/docusaurus-plugin-content-docs/current/code-of-conduct.md deleted file mode 100644 index e13083f28..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/code-of-conduct.md +++ /dev/null @@ -1,51 +0,0 @@ -# Quy tắc ứng xử - -### _Chào bạn đến với Cộng đồng Flarum!_ - -... Và cảm ơn vì đã tham gia cùng chúng tôi! Chúng tôi rất hào hứng với Flarum và luôn vui mừng gặp gỡ những người có cùng cảm nhận. Chúng tôi muốn *mọi người* tận dụng tối đa Flarum và cộng đồng Flarum, vì vậy chúng tôi yêu cầu bạn đọc và làm theo các nguyên tắc này. Những điều này áp dụng cho dù bạn đang sử dụng diễn đàn của chúng tôi, trò chuyện Discord, giao tiếp trên GitHub hoặc bất kỳ hình thức giao tiếp nào khác mà không có cộng đồng Flarum. - -### Trên tất cả, hãy trở nên tuyệt vời! - -Tất cả chúng ta ở đây để nói về Flarum và cùng nhau làm việc để biến nó trở thành một ứng dụng tốt hơn nữa. Phê bình các ý kiến ​​(tất nhiên bằng các lập luận hợp lý) là một phần quan trọng của điều đó. Nhưng đừng để bị cuốn trôi và lao vào các cuộc tấn công cá nhân, bởi vì sự tiêu cực chỉ cản đường. Chúng tôi yêu cầu bạn tránh những điều sau: - -- Ngôn ngữ xúc phạm hoặc lăng mạ, cũng như bất kỳ loại ngôn từ kích động thù địch nào -- Các bài đăng nhằm quấy rối, mạo danh hoặc bôi nhọ người khác -- Xóa nội dung đã đăng không cần thiết -- Cố gắng lạm dụng hoặc tiết lộ thông tin cá nhân của người khác -- Nội dung khiêu dâm hoặc khiêu dâm -- Thư rác, bài đăng lừa đảo và bất kỳ hành động nào nhằm làm xấu mặt trang web này -- Thảo luận về vi phạm bản quyền phần mềm và các chủ đề tương tự - -*Tất cả những điều trên là cơ sở để người kiểm duyệt hành động.* Nếu bạn gặp vấn đề với một thành viên khác, chúng tôi yêu cầu bạn không tự mình đối mặt với họ. Nếu là trên diễn đàn, vui lòng sử dụng lệnh *Báo cáo* trên bài đăng được đề cập, sau đó giao cho nhân viên xử lý tình huống. Otherwise, report the violation using our [contact page](https://flarum.org/foundation/contact), option Legal. - -Người kiểm duyệt của chúng tôi có thể chỉnh sửa hoặc xóa bất kỳ nội dung nào gây khó chịu hoặc làm gián đoạn luồng giao tiếp. Các hành vi vi phạm nghiêm trọng hoặc nhiều lần có thể dẫn đến việc tạm ngưng tài khoản của người dùng vi phạm. Vì vậy, bạn biết đấy, *hãy thật tuyệt*. 😎 - -### Hãy tự nghe - -Bạn muốn bắt đầu một cuộc thảo luận mới? Trước tiên, hãy nhớ đọc [Câu hỏi thường gặp của chúng tôi](faq.md) và nhấp vào các liên kết để đảm bảo bạn được thông báo đầy đủ về dự án. Sau đó, dành thời gian duyệt qua diễn đàn, tự làm quen với [hệ thống thẻ](https://discuss.flarum.org/tags) và thực hiện một vài tìm kiếm cho các từ khóa liên quan đến chủ đề của bạn: *có thể ai đó đã bắt đầu thảo luận về nó!* - -Khi bạn chắc chắn rằng mình đã sẵn sàng để bắt đầu một cuộc thảo luận, hãy ghi nhớ những điểm sau: - -- Đặt cho nó một tiêu đề tốt! Bạn sẽ nhận được kết quả tốt nhất nếu tiêu đề của bạn thể hiện rõ điều bạn muốn nói. -- Chọn (các) thẻ phù hợp. Điều này sẽ làm tăng khả năng bài viết của bạn sẽ được đọc và trả lời kịp thời. -- *Đừng* đăng nhiều lần về cùng một chủ đề, vì làm như vậy sẽ có tác dụng ngược lại. -- If not using a tag set aside for multilingual use, *post in English only.* We can't help you if we don't understand your posts. -- Hãy nhớ rằng, bạn không cần phải ký vào các bài viết của mình. Chúng tôi có hồ sơ của bạn để cho chúng tôi biết bạn là ai. - -Hãy cố gắng giúp chúng tôi giữ mọi thứ ngăn nắp. Thời gian dành cho việc thu dọn là thời gian mà chúng tôi không thể dành để tìm hiểu bạn, thảo luận các vấn đề của bạn và nói về Flarum. Và đó, sau tất cả, là những gì tất cả chúng ta ở đây để làm! - -### Thực hiện đếm câu trả lời của bạn - -Bạn đang dành thời gian để tham gia vào một cuộc thảo luận, với hy vọng rằng những người khác sẽ đọc ý tưởng của bạn và xem xét chúng. Vì vậy, tại sao không nỗ lực để làm cho câu trả lời của bạn đáng đọc? - -- Đừng trả lời một tiêu đề. Hãy dành chút thời gian để *đọc* OP và ít nhất *quét* phần còn lại của cuộc trò chuyện trước. -- Hãy tự hỏi bản thân xem câu trả lời của bạn có bổ sung vào cuộc thảo luận hay không. Nếu không, hãy suy nghĩ kỹ hơn trước khi đăng. -- Tránh đưa ra những bài viết dài một từ chỉ để đồng ý với ai đó; bạn có thể sử dụng nút "Thích" cho việc đó. -- Tránh tạo nhiều bài viết liên tiếp khi một bài đã đủ. Đây là một diễn đàn, không phải một phòng trò chuyện. -- Nếu câu trả lời của bạn có khả năng làm chuyển hướng tiến trình của cuộc thảo luận, thay vào đó, hãy cân nhắc bắt đầu một cuộc thảo luận mới. -- Thay vào đó, nếu bạn chỉ muốn đăng một chút vô nghĩa như một bài kiểm tra, vui lòng thực hiện việc đó trong thẻ [Test Posting](https://discuss.flarum.org/t/sandbox). -- Đảm bảo rằng câu trả lời của bạn cung cấp phản hồi và hỗ trợ mang tính xây dựng để tạo ra một cộng đồng hòa nhập. - -Sẽ không ai phàn nàn về những trò đùa không thường xuyên hoặc nhận xét thông minh. Chúng tôi muốn giữ cho tâm trạng nhẹ nhàng! Nhưng để giữ cho mọi thứ hiệu quả, chúng tôi yêu cầu bạn cố gắng tránh hoàn toàn việc thảo luận bị lệch. - -> Cảm ơn Dominion vì sự giúp đỡ của anh ấy trong việc đưa các nguyên tắc này lại với nhau. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/composer.md b/i18n/vi/docusaurus-plugin-content-docs/current/composer.md deleted file mode 100644 index c92ac175a..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/composer.md +++ /dev/null @@ -1,152 +0,0 @@ - -# Composer - -Flarum sử dụng một chương trình có tên là [Composer](https://getcomposer.org) để quản lý các phần phụ thuộc và tiện ích mở rộng của nó. Bạn sẽ cần sử dụng trình soạn nhạc nếu bạn muốn: - -- Install or update Flarum through the command line -- Install, update, or remove Flarum extensions through the command line - -Hướng dẫn này được cung cấp dưới dạng giải thích ngắn gọn về Composer. Chúng tôi thực sự khuyên bạn nên tham khảo [tài liệu chính thức](https://getcomposer.org/doc/00-intro.md) để biết thêm thông tin. - -:::tip Shared Hosting - -On shared hosting it is recommended to use the Extension Manager extension instead of Composer. It is a graphical interface for Composer that allows you to install, update and remove extensions without the need for SSH access. You can directly install Flarum using an archive file, without the need for Composer. With the extension manager pre-installed, check the [installation guide](install.md#installing-by-unpacking-an-archive) for more information. - -::: - -## Composer là gì? - -> Composer là một công cụ để quản lý sự phụ thuộc trong PHP. Nó cho phép bạn khai báo các thư viện mà dự án của bạn phụ thuộc vào và nó sẽ quản lý (cài đặt/cập nhật) chúng cho bạn. - [Giới thiệu Composer](https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) - -Mỗi cài đặt Flarum chủ yếu bao gồm lõi Flarum và một tập hợp các [tiện ích mở rộng](extensions.md). Mỗi cái trong số này có các phụ thuộc và bản phát hành riêng của nó. - -Trước đây, các khuôn khổ diễn đàn sẽ quản lý các tiện ích mở rộng bằng cách yêu cầu người dùng tải lên các tệp zip có mã tiện ích mở rộng. Điều đó có vẻ đơn giản, nhưng các vấn đề nhanh chóng trở nên rõ ràng: - -- Tải lên các tệp zip ngẫu nhiên từ internet có xu hướng là một ý tưởng tồi. Việc yêu cầu các tiện ích mở rộng được tải xuống từ một nguồn trung tâm như [ Packagist ](https://packagist.org/) khiến việc spam mã độc trở nên tẻ nhạt hơn và đảm bảo rằng mã nguồn có sẵn trên GitHub cho phần mở rộng miễn phí/công khai. -- Giả sử Tiện ích mở rộng A yêu cầu v4 của một số thư viện và Tiện ích mở rộng B yêu cầu v5 của cùng thư viện đó. Với giải pháp dựa trên zip, một trong hai phần phụ thuộc có thể ghi đè lên phần còn lại, gây ra tất cả các loại vấn đề không nhất quán. Hoặc cả hai sẽ cố gắng chạy cùng một lúc, điều này sẽ khiến PHP gặp sự cố (bạn không thể khai báo cùng một lớp hai lần). -- Các tệp zip có thể gây ra rất nhiều đau đầu nếu cố gắng tự động hóa việc triển khai, chạy các bài kiểm tra tự động hoặc mở rộng quy mô đến nhiều nút máy chủ. -- Không có cách nào tốt để đảm bảo rằng các phiên bản tiện ích mở rộng xung đột không thể được cài đặt hoặc phiên bản PHP hệ thống và các yêu cầu về tiện ích mở rộng được đáp ứng. -- Chắc chắn, chúng tôi có thể nâng cấp các tiện ích mở rộng bằng cách thay thế tệp zip. Nhưng nâng cấp lõi Flarum thì sao? Và làm thế nào chúng tôi có thể đảm bảo rằng các tiện ích mở rộng có thể khai báo phiên bản lõi nào mà chúng tương thích với? - -Composer xử lý tất cả những vấn đề này và hơn thế nữa! - -## Flarum và Composer - -Khi bạn vào [cài đặt Flarum](install.md#installing), bạn thực sự đang làm 2 điều: - -1. Tải xuống "bộ khung" bản soạn sẵn cho Flarum. Điều này bao gồm tệp `index.php` xử lý các yêu cầu web, tệp `flarum` cung cấp CLI và một loạt cấu hình máy chủ web và thiết lập thư mục. Điều này được lấy từ [`flarum/flarum` kho lưu trữ github](https://github.com/flarum/flarum) và không thực sự chứa bất kỳ mã nào cần thiết để Flarum chạy. -2. Cài đặt các gói `composer` cần thiết cho Flarum, cụ thể là lõi Flarum và một số phần mở rộng đi kèm. Chúng được gọi bởi các tệp `index.php` và `flarum` từ bước 1 và là phần triển khai của Flarum. Chúng được chỉ định trong tệp `composer.json` có trong khung. - -Khi bạn muốn cập nhật Flarum hoặc thêm/cập nhật/xóa phần mở rộng, bạn sẽ thực hiện việc này bằng cách chạy các lệnh `composer`. Mỗi lệnh là khác nhau, nhưng tất cả các lệnh đều tuân theo cùng một quy trình chung: - -1. Cập nhật tệp `composer.json` để thêm/xóa/cập nhật gói. -2. Thực hiện một loạt phép toán để có được phiên bản tương thích mới nhất của mọi thứ nếu có thể, hoặc tìm ra lý do tại sao việc sắp xếp được yêu cầu là không thể. -3. Nếu mọi thứ hoạt động, hãy tải xuống phiên bản mới của mọi thứ cần được cập nhật. Nếu không, hãy hoàn nguyên các thay đổi của `composer.json` - -Khi chạy các lệnh `composer.json`, hãy đảm bảo chú ý đến kết quả đầu ra. Nếu có lỗi, nó có thể sẽ cho bạn biết liệu đó có phải là do sự không tương thích của tiện ích mở rộng, phiên bản PHP không được hỗ trợ, thiếu các tiện ích mở rộng PHP hay do nguyên nhân khác. - -### Tệp `composer.json` - -Như đã đề cập ở trên, toàn bộ cấu hình trình soạn nhạc cho trang web Flarum của bạn được chứa bên trong tệp `composer.json`. Bạn có thể tham khảo [tài liệu về composer](https://getcomposer.org/doc/04-schema.md) để biết một giản đồ cụ thể, nhưng bây giờ, hãy xem qua một trình soạn nhạc `composer.json` từ `flarum/flarum`: - -```json -{ - // Phần sau đây chủ yếu chỉ là siêu dữ liệu về gói. - // Đối với quản trị viên diễn đàn, điều này không thực sự quan trọng. - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // End of metadata - - // This next section is the one we care about the most. - // Đó là danh sách các gói chúng tôi muốn và các phiên bản cho mỗi gói. - // Chúng ta sẽ thảo luận về vấn đề này ngay sau đây. - "require": { - "flarum/core": "^1.0", - "flarum/approval": "*", - "flarum/bbcode": "*", - "flarum/emoji": "*", - "flarum/lang-english": "*", - "flarum/flags": "*", - "flarum/likes": "*", - "flarum/lock": "*", - "flarum/markdown": "*", - "flarum/mentions": "*", - "flarum/nicknames": "*", - "flarum/pusher": "*", - "flarum/statistics": "*", - "flarum/sticky": "*", - "flarum/subscriptions": "*", - "flarum/suspend": "*", - "flarum/tags": "*" - }, - - // Nhiều cấu hình composer khác nhau. Những cái ở đây là mặc định hợp lý. - // Xem https://getcomposer.org/doc/06-config.md để biết danh sách các tùy chọn. - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // Nếu nhà soạn nhạc có thể tìm thấy phiên bản ổn định (không phải dev, alpha hoặc beta) - // của một gói, nó sẽ sử dụng cái đó. Nói chung, sản xuất - // các trang web không nên chạy phần mềm beta trừ khi bạn biết mình đang làm gì. - "prefer-stable": true -} -``` - -Hãy tập trung vào phần `request` đó. Mỗi mục nhập là tên của một gói composer và một chuỗi phiên bản. Để đọc thêm về chuỗi phiên bản, hãy xem [tài liệu về composer](https://semver.org/) có liên quan. - -Đối với các dự án Flarum, có một số loại mục nhập bạn sẽ thấy trong phần `require` của `flarum /core` cài đặt gốc của bạn: - -- Bạn PHẢI có mục nhập `flarum/core`. Điều này phải có một chuỗi phiên bản rõ ràng tương ứng với bản phát hành chính mà bạn muốn cài đặt. Đối với các phiên bản Flarum 1.x, đây sẽ là `^1.0`. -- Bạn sẽ có một mục nhập cho mỗi tiện ích mở rộng mà bạn đã cài đặt. Một số tiện ích mở rộng đi kèm được bao gồm theo mặc định (ví dụ: `flarum/tags`, `flarum/pause`, v.v.), [những tiện ích khác mà bạn sẽ thêm qua lệnh của composer](extensions.md). Trừ khi bạn có lý do để làm khác (ví dụ: bạn đang thử nghiệm phiên bản beta của một gói), chúng tôi khuyên bạn nên sử dụng dấu hoa thị làm chuỗi phiên bản cho các tiện ích mở rộng (`*`). Điều này có nghĩa là "cài đặt phiên bản mới nhất tương thích với flarum/core của tôi". -- Một số tiện ích mở rộng / tính năng có thể yêu cầu các gói PHP không phải là tiện ích mở rộng Flarum. Ví dụ: bạn cần thư viện guzzle để sử dụng [trình điều khiển thư Mailgun](mail.md). Trong những trường hợp này, hướng dẫn cho tiện ích mở rộng/tính năng được đề cập phải giải thích chuỗi phiên bản nào được sử dụng. - -## Làm thế nào để cài đặt Composer? - -Như với bất kỳ phần mềm nào khác, Composer trước tiên phải được [cài đặt](https://getcomposer.org/download/) trên máy chủ nơi Flarum đang chạy. Có một số tùy chọn tùy thuộc vào loại lưu trữ web bạn có. - -### Máy chủ web chuyên dụng - -Trong trường hợp này, bạn có thể cài đặt composer theo khuyến nghị trong [hướng dẫn](https://getcomposer.org/doc/00-intro.md#system-requirements) Composer. - -### Managed / Shared hosting - -Nếu Composer chưa được cài đặt sẵn (bạn có thể kiểm tra điều này bằng cách chạy `composer --version`), bạn có thể sử dụng [hướng dẫn sử dụng cài đặt](https://getcomposer.org/composer-stable.phar). Chỉ cần tải composer.phar lên thư mục của bạn và chạy `/path/to/your/php7 composer.phar COMMAND` cho bất kỳ lệnh nào được ghi dưới dạng `composer COMMAND`. - -:::danger - -Một số bài báo trên internet sẽ đề cập rằng bạn có thể sử dụng các công cụ như PHP shell. Nếu bạn không chắc mình đang làm gì hoặc họ đang nói về điều gì - hãy cẩn thận! Trình bao web không được bảo vệ là **cực kỳ** nguy hiểm. - -::: - -## Cách sử dụng Composer? - -Bạn sẽ cần sử dụng Composer trên **C**ommand-**l**ine **i**nterface (CLI). Đảm bảo bạn có thể truy cập máy chủ của mình qua **S**ecure**Sh**ell (SSH). - -Sau khi bạn đã cài đặt Composer, bạn sẽ có thể chạy các lệnh Composer trong thiết bị đầu cuối SSH của mình thông qua `composer COMMAND`. - -:::info Tối ưu hoá - -Sau hầu hết các lệnh, bạn sẽ muốn chạy `composer dump-autoload -a`. Về cơ bản, điều này lưu trữ các tệp PHP để chúng chạy nhanh hơn. - -::: diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/config.md b/i18n/vi/docusaurus-plugin-content-docs/current/config.md deleted file mode 100644 index 42526a750..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/config.md +++ /dev/null @@ -1,35 +0,0 @@ -# Tệp cấu hình - -Chỉ có một số nơi không thể cấu hình thông qua bảng điều khiển quản trị Flarum (không bao gồm database), đó chính là tệp `config.php` nằm trong thư mục càid dặt Flarum của bạn. - -Tệp này mặc dù rất nhẹ, nhưng nó chứa các thông tin quan trọng để Flarum của bạn hoạt động. - -Nếu tệp tồn tại, điều đó cho biết rằng Flarum đã được cài đặt. Nó cũng cung cấp cho Flarum với thông tin database và nhiều hơn nữa. - -Dưới đây là tổng quan nhanh về những thứ có trong tệp cấu hình: - -```php - false, // bật tắt chế độ gỡ lỗi, sử dụng để khắc phục sự cố - 'offline' => false, // bật tắt chế độ bảo trì. Quản trị viên và người dùng sẽ không thể truy cập vào trang web. - 'database' => - array ( - 'driver' => 'mysql', // trình điều khiển cơ sở dữ liệu. Vd: MySQL, MariaDB... - 'host' => 'localhost', // máy chủ kết nối, localhost trong hầu hết các trường hợp trừ khi sử dụng dịch vụ bên ngoài - 'database' => 'flarum', // tên cơ sở dữ liệu - 'username' => 'root', // tên người dùng cơ sở dữ liệu - 'password' => '', // mật khẩu cơ sở dữ liệu - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', // tiền tố cho các bảng, hữu ích nếu bạn đang chia sẻ cùng một cơ sở dữ liệu với một dịch vụ khác - 'port' => '3306', // cổng kết nối, mặc định là 3306 với MySQL - 'strict' => false, - ), - 'url' => 'https://flarum.localhost', // URL trang web, bạn sẽ muốn thay đổi điều này nếu bạn thay đổi tên miền - 'paths' => - array ( - 'api' => 'api', // /api chuyển đến API - 'admin' => 'admin', // /admin chuyển tới quản trị viên - ), -); -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/console.md b/i18n/vi/docusaurus-plugin-content-docs/current/console.md deleted file mode 100644 index e1f38674d..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# Console - -Ngoài bảng điều khiển quản trị, Flarum cung cấp một số lệnh console để giúp quản lý diễn đàn của bạn qua thiết bị đầu cuối - -Using the console: - -1. `ssh` vào máy chủ nơi lưu trữ cài đặt flarum của bạn -2. `cd` to the folder that contains the file `flarum` -3. Chạy lệnh `php flarum [command]` - -## Lệnh mặc định - -### list - -Liệt kê tất cả các lệnh quản lý có sẵn, cũng như hướng dẫn sử dụng các lệnh quản lý - -### help - -`php flarum help [tên_câu_lệnh]` - -Hiển thị kết quả trợ giúp cho một lệnh nhất định. - -Bạn cũng có thể xuất ra trợ giúp ở các định dạng khác bằng cách sử dụng tùy chọn `--format`: - -`php flarum help --format=xml list` - -Để hiển thị danh sách các lệnh có sẵn, vui lòng sử dụng lệnh danh sách. - -### info - -`php flarum info` - -Get information about Flarum's core and installed extensions. Điều này rất hữu ích cho các sự cố gỡ lỗi và nên được chia sẻ khi yêu cầu hỗ trợ. - -### cache:clear - -`php flarum cache:clear` - -Xóa bộ đệm ẩn phụ trợ, bao gồm js/css đã tạo, bộ đệm định dạng văn bản và các bản dịch đã lưu trong bộ đệm. Thao tác này sẽ được chạy sau khi cài đặt hoặc gỡ bỏ các tiện ích mở rộng và việc chạy này phải là bước đầu tiên khi sự cố xảy ra. - -### assets:publish - -`php flarum assets:publish` - -Xuất bản nội dung từ lõi và tiện ích mở rộng (ví dụ: JS/CSS đã biên dịch, biểu tượng bootstrap, biểu trưng, ​​v.v.). Điều này hữu ích nếu nội dung của bạn bị hỏng hoặc nếu bạn đã chuyển đổi [trình điều khiển hệ thống tệp](extend/filesystem.md) cho đĩa `flarum-asset`. - -### migrate - -`php flarum migrate` - -Chạy tất cả các lần di chuyển chưa thực hiện. Điều này sẽ được sử dụng khi một tiện ích mở rộng sửa đổi cơ sở dữ liệu được thêm vào hoặc cập nhật. - -### migrate:reset - -`php flarum migrate:reset --extension [extension_id]` - -Đặt lại tất cả các lần di chuyển cho một tiện ích mở rộng. Điều này hầu hết được sử dụng bởi các nhà phát triển tiện ích mở rộng, nhưng đôi khi, bạn có thể cần phải chạy điều này nếu bạn đang xóa một tiện ích mở rộng và muốn xóa tất cả dữ liệu của nó khỏi cơ sở dữ liệu. Xin lưu ý rằng tiện ích mở rộng được đề cập hiện phải được cài đặt (nhưng không nhất thiết phải được bật) để tiện ích này hoạt động. - -### schedule:run - -`php flarum schedule:run` - -Nhiều tiện ích mở rộng sử dụng các công việc đã lên lịch để chạy các tác vụ theo chu kỳ. Điều này có thể bao gồm dọn dẹp cơ sở dữ liệu, đăng bản nháp đã lên lịch, tạo sơ đồ trang, v.v. Nếu bất kỳ tiện ích mở rộng nào của bạn sử dụng công việc đã lên lịch, bạn nên thêm một [công việc cron](https://ostechnix.com/a-beginners-guide-to-cron-jobs/) để chạy lệnh này trên một khoảng thời gian đều đặn: - -``` -* * * * * cd /path-to-your-flarum-install && php flarum schedule:run >> /dev/null 2>&1 -``` - -Nói chung không nên chạy lệnh này theo cách thủ công. - -Lưu ý rằng một số máy chủ không cho phép bạn chỉnh sửa cấu hình cron trực tiếp. Trong trường hợp này, bạn nên tham khảo ý kiến ​​chủ nhà của mình để biết thêm thông tin về cách lên lịch công việc cho cron. - -### schedule:list - -`php flarum schedule:list` - -Lệnh này trả về danh sách các lệnh được lập lịch (xem `schedule:run` để biết thêm thông tin). Điều này hữu ích để xác nhận rằng các lệnh do tiện ích mở rộng của bạn cung cấp đã được đăng ký đúng cách. **Điều này không thể** kiểm tra xem các công việc cron đã được lên lịch thành công hay đang được chạy. \ No newline at end of file diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/contributing-docs-translations.md b/i18n/vi/docusaurus-plugin-content-docs/current/contributing-docs-translations.md deleted file mode 100644 index 3c17433f0..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/contributing-docs-translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# Tài liệu và Bản dịch - -## Thêm tài liệu - -Thêm tài liệu có thể giúp vô số người dùng Flarum trong tương lai. Một vài ý tưởng về những việc cần làm: - -- Hướng dẫn sử dụng để giúp người dùng Flarum với một số tính năng nâng cao của Flarum. -- [Đặt câu hỏi](faq.md). -- Các bước [khắc phục sự cố](troubleshoot.md) mở rộng. -- Hướng dẫn từng bước để phát triển hoặc cài đặt Flarum. -- [Hướng dẫn tham khảo kỹ thuật](extend/README.md) dành cho lập trình viên tiện ích mở rộng. -- Cải thiện theo nghĩa đen bất kỳ thứ gì khác mà bạn nghĩ chúng tôi nên giải thích kỹ hơn hoặc giải thích rõ hơn. - -Một cách tốt để tìm chủ đề để viết là tìm các câu hỏi phổ biến trong [thẻ hỗ trợ](https://discuss.flarum.org/t/support) của cộng đồng chúng tôi. - -## Dịch Flarum - -Chúng tôi muốn Flarum có thể truy cập được cho tất cả mọi người, bất kể ngôn ngữ! Bằng cách đóng góp các bản dịch, bạn có thể giúp nhiều người khác thưởng thức Flarum. Hơn hết, chúng tôi sử dụng GUI thân thiện với người dùng cho các bản dịch, vì vậy không cần kỹ năng kỹ thuật nào để trợ giúp! - -Bản dịch cho cốt lõi Flarum, tiện ích mở rộng đi kèm và tiện ích mở rộng cộng đồng được quản lý thông qua [Weblate](https://weblate.rob006.net/projects/flarum/). - -Các bản dịch cho tài liệu này được quản lý thông qua [Crowdin](https://crowdin.com/project/flarum-docs). - -Flarum Foundation đã thành lập tổ chức "flarum-lang" để hỗ trợ các biên dịch viên và đảm bảo tính khả dụng liên tục của các gói ngôn ngữ. Bạn có thể tìm hiểu thêm về điều này bằng cách [truy cập kho lưu trữ GitHub](https://github.com/flarum-lang/about). - -Nếu bạn muốn hỗ trợ gói ngôn ngữ hiện có, bắt đầu bản dịch mới hoặc bạn gặp sự cố khi sử dụng weblate hoặc crowdin, tốt nhất hãy [liên hệ với nhóm flarum-lang](https://discuss.flarum.org/d/27519-the-flarum-language-project). diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/contributing.md b/i18n/vi/docusaurus-plugin-content-docs/current/contributing.md deleted file mode 100644 index 461308b11..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/contributing.md +++ /dev/null @@ -1,170 +0,0 @@ -# Giúp xây dựng Flarum - -Bạn quan tâm đến việc đóng góp vào sự phát triển của Flarum? Thật tuyệt! Từ [mở báo cáo lỗi](bugs.md) đến tạo yêu cầu kéo: mọi yêu cầu đơn lẻ đều được đánh giá cao và hoan nghênh. Flarum sẽ không thể thực hiện được nếu không có sự đóng góp của cộng đồng. - -Trước khi đóng góp, vui lòng đọc [quy tắc ứng xử](code-of-conduct.md). - -Tài liệu này là hướng dẫn cho các nhà phát triển muốn đóng góp mã cho Flarum. Nếu bạn mới bắt đầu, chúng tôi khuyên bạn nên đọc tài liệu [Bắt đầu](/extend/start.md) trong tài liệu Tiện ích mở rộng để hiểu thêm một chút về cách hoạt động của Flarum. - -## Tại sao lại đóng góp Flarum? - -⚡ **Có tác động thực sự.** Có hàng nghìn phiên bản Flarum, với hàng triệu người dùng cuối tổng hợp. Bằng cách đóng góp cho Flarum, mã của bạn sẽ có tác động tích cực đến tất cả chúng. - -🔮 **Định hình tương lai của Flarum.** Chúng tôi có một công việc tồn đọng dài và thời gian có hạn. Nếu bạn sẵn sàng ủng hộ một tính năng hoặc thay đổi, thì điều đó có nhiều khả năng xảy ra hơn và bạn sẽ có thể đưa ra tầm nhìn của mình cho nó. Ngoài ra, lộ trình và các mốc quan trọng của chúng tôi do [nhóm phát triển cốt lõi](https://flarum.org/team) của chúng tôi đặt ra và tất cả chúng tôi đều bắt đầu với tư cách là cộng tác viên. Con đường tốt nhất để tạo ảnh hưởng là đóng góp. - -🧑‍💻 **Trở thành Kỹ sư giỏi hơn.** Cơ sở mã của chúng tôi hiện đại và chúng tôi đánh giá cao kỹ thuật tốt và mã sạch. Ngoài ra còn có rất nhiều vấn đề thú vị, đầy thách thức cần giải quyết liên quan đến thiết kế, cơ sở hạ tầng, hiệu suất và khả năng mở rộng. Đặc biệt nếu bạn là sinh viên hoặc mới bắt đầu sự nghiệp, làm việc trên Flarum là một cơ hội tuyệt vời để xây dựng các kỹ năng phát triển. - -🎠 **Thật thú vị!** Chúng tôi thực sự thích làm việc trên Flarum: có rất nhiều thử thách thú vị và các tính năng thú vị để xây dựng. Chúng tôi cũng có một cộng đồng tích cực trên [diễn đàn của chúng tôi](https://discuss.flarum.org) và [máy chủ Discord](https://flarum.org/chat). - -## Những gì cần làm - -Hãy xem [Các mốc quan trọng](https://github.com/flarum/core/milestones) sắp tới của chúng tôi để biết tổng quan về những việc cần phải làm. Xem nhãn [Vấn đề đầu tiên tốt nhất](https://github.com/flarum/core/labels/Good%20first%20issue) để biết danh sách các vấn đề tương đối dễ bắt đầu. Nếu có bất cứ điều gì bạn không chắc chắn, đừng ngần ngại hỏi! Tất cả chúng tôi chỉ mới bắt đầu một lần. - -Nếu bạn đang lên kế hoạch tiếp tục làm việc gì đó, vui lòng nhận xét về vấn đề có liên quan hoặc tạo một vấn đề mới trước. Bằng cách này, chúng tôi có thể đảm bảo rằng công việc quý giá của bạn không trở nên vô ích. - -Vì Flarum hướng đến tiện ích mở rộng, chúng tôi thực sự khuyên bạn nên sử dụng [tài liệu về tiện ích mở rộng của chúng tôi](extend/README.md) để làm tài liệu tham khảo khi làm việc trên lõi, cũng như đối với các tiện ích mở rộng đi kèm. Bạn nên bắt đầu với [phần giới thiệu](extend/README.md) để hiểu rõ hơn về triết lý mở rộng của chúng tôi. - -## Thiết lập môi trường - -### Thiết lập Codebase cục bộ - -[flarum/flarum](https://github.com/flarum/flarum) là một ứng dụng "skeleton" sử dụng Composer để tải xuống gói cốt lõi và một loạt các phần mở rộng. Mã nguồn cho Flarum cốt lõi, phần mở rộng và tất cả các gói được sử dụng bởi phần nói trên nằm trong Flarum monorepo [flarum/framework](https://github.com/flarum/framework). Để đóng góp vào những điều này, bạn sẽ cần phải phân nhánh và sao chép cục bộ kho lưu trữ monorepo, sau đó thêm nó vào môi trường phát triển của bạn dưới dạng [đường dẫn kho lưu trữ Composer](https://getcomposer.org/doc/05-repositories.md#path): - -```bash -git clone https://github.com/flarum/flarum.git -cd flarum - -# Or, when you want to clone directly into the current directory -git clone https://github.com/flarum/flarum.git . -# Note, the directory must be empty - -# Set up a Composer path repository for Flarum monorepo packages -composer config repositories.0 path "PATH_TO_MONOREPO/*/*" -git clone https://github.com//framework.git PATH_TO_MONOREPO -``` - -Tiếp theo, hãy đảm bảo rằng Composer chấp nhận các bản phát hành không ổn định từ các bản sao cục bộ của bạn bằng cách đặt khóa `minimum-stability` thành `dev` trong `composer.json`. - -Cuối cùng, chạy `composer install` để hoàn tất cài đặt từ kho đường dẫn. - -Sau khi cài đặt cục bộ của bạn được thiết lập, hãy đảm bảo rằng bạn đã bật chế độ `debug` trong **config.php** và đặt `display_errors` thành `On` trong cấu hình php của bạn. Điều này sẽ cho phép bạn xem chi tiết lỗi cho cả Flarum và PHP. Chế độ gỡ lỗi cũng buộc biên dịch lại các tệp nội dung của Flarum theo từng yêu cầu, loại bỏ nhu cầu gọi `php flarum cache: clear` sau mỗi lần thay đổi đối với JavaScript hoặc CSS của tiện ích mở rộng. - -Mã front-end của Flarum được viết bằng ES6 và được chuyển sang JavaScript. Trong quá trình phát triển, bạn sẽ cần phải biên dịch lại JavaScript bằng cách sử dụng [Node.js](https://nodejs.org/) và [`yarn`](https://yarnpkg.com/). **Vui lòng không gửi các tệp `dist` khi gửi PR**; điều này sẽ tự động được xử lý khi các thay đổi được hợp nhất vào nhánh `main`. - -Để đóng góp cho giao diện người dùng, trước tiên hãy cài đặt các phụ thuộc JavaScript. Monorepo sử dụng [không gian làm việc của yarn](https://classic.yarnpkg.com/lang/en/docs/workspaces/) để dễ dàng cài đặt các phần phụ thuộc JS trên tất cả các gói bên trong. - -```bash -cd packages/framework -yarn install -``` - -Sau đó, bạn có thể xem các tệp JavaScript để biết các thay đổi trong quá trình phát triển: - -```bash -cd framework/core/js -yarn dev -``` - -Quá trình này cũng giống như các phần mở rộng. - -```bash -cd extensions/tags/js -yarn dev -``` - -### Công cụ phát triển - -Sau khi bạn đã tách và nhân bản các kho lưu trữ mà bạn sẽ làm việc, bạn sẽ cần thiết lập lưu trữ cục bộ để có thể kiểm tra các thay đổi của mình. Flarum hiện không đi kèm với máy chủ phát triển, vì vậy bạn sẽ cần thiết lập Apache/NGINX/Caddy/etc để chạy cài đặt Flarum cục bộ này. - -Ngoài ra, bạn có thể sử dụng các công cụ như, [Laravel Valet](https://laravel.com/docs/master/valet) (Mac), [XAMPP](https://www.apachefriends.org/index.html) (Windows), hoặc [Docker-Flarum](https://github.com/mondediefr/docker-flarum) (Linux) để làm máy chủ diễn đàn cục bộ. - -Hầu hết những người đóng góp cho Flarum đều phát triển với [PHPStorm](https://www.jetbrains.com/phpstorm/download/) hoặc [Visual Studio Code](https://code.visualstudio.com/). - -## Quy trình phát triển - -Quy trình đóng góp điển hình trông giống như sau: - -0. 🧭 **Lập kế hoạch** đóng góp của bạn - * Tìm ra [vấn đề bạn muốn giải quyết](#what-to-work-on) - * Thiết lập một [môi trường phát triển](#setting-up-a-local-codebase) - -1. 🌳 **Branch** tách branch thích hợp thành một branch tính năng mới. - * *Bug fixes* nên được gửi đến branch ổn định mới nhất. - * *Minor* các tính năng hoàn toàn tương thích ngược với bản phát hành Flarum hiện tại có thể được gửi đến nhánh ổn định mới nhất. - * *Major* các tính năng phải luôn được gửi đến nhánh `main`, chứa bản phát hành Flarum sắp tới. - * Nội bộ chúng tôi sử dụng lược đồ đặt tên `/` (ví dụ: `tz/refactor-frontend`). - -2. 🔨 **Viết** code. - * Xem bên dưới về [Kiểu coding](#coding-style). - -3. 🚦 **Thử nghiệm** code của bạn. - * Thêm các bài kiểm tra đơn vị khi cần thiết khi sửa lỗi hoặc thêm tính năng. - * Chạy bộ thử nghiệm với `vendor/bin/phpunit` trong thư mục gói có liên quan. - * Xem [ở đây](extend/testing.md) để biết thêm thông tin về thử nghiệm trong Flarum. - -4. 💾 **Commit** code của bạn với một thông điệp mô tả. - * Nếu thay đổi của bạn giải quyết được sự cố hiện có (thông thường, nó phải) bao gồm "Bản sửa lỗi số 123" trên một dòng mới, trong đó 123 là số sự cố. - * Thực hiện theo đặc tả của [Commits thông thường](https://www.conventionalcommits.org/en/v1.0.0/#summary). - * *Fix* cam kết phải mô tả vấn đề đã được khắc phục chứ không phải cách nó được khắc phục. - -5. 🎁 **Gửi** một Pull Request trên GitHub. - * Điền vào mẫu pull request. - * Nếu thay đổi của bạn là trực quan, hãy bao gồm ảnh chụp màn hình hoặc GIF thể hiện thay đổi. - * KHÔNG đăng ký các tệp JavaScript `dist`. Chúng sẽ được biên dịch tự động khi hợp nhất. - -6. 🤝 **Đính hôn** với nhóm Flarum để được chấp thuận. - * Các thành viên trong nhóm sẽ xem xét mã của bạn. Chúng tôi có thể đề xuất một số thay đổi hoặc cải tiến hoặc lựa chọn thay thế, nhưng đối với những thay đổi nhỏ, yêu cầu kéo của bạn sẽ nhanh chóng được chấp nhận. - * Khi giải quyết phản hồi, hãy đẩy các commit bổ sung thay vì ghi đè hoặc cắt bỏ (chúng tôi sẽ xóa khi hợp nhất). - -7. 🕺 **Nhảy** giống như bạn vừa đóng góp cho Flarum. - -## Kiểu coding - -Để giữ cho cơ sở mã Flarum sạch sẽ và nhất quán, chúng tôi có một số nguyên tắc về kiểu mã hóa mà chúng tôi tuân theo. Khi nghi ngờ, hãy đọc mã nguồn. - -Đừng lo lắng nếu kiểu mã của bạn không hoàn hảo! StyleCI và Prettier sẽ tự động kiểm tra định dạng cho mọi yêu cầu kéo. Điều này cho phép chúng tôi tập trung vào nội dung của đóng góp, không phải kiểu mã. - -### PHP - -Flarum tuân theo [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) tiêu chuẩn mã hóa và tiêu chuẩn tự động tải [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md). Trên hết, chúng tôi tuân thủ một số [các quy tắc kiểu khác](https://github.com/flarum/framework/blob/main/.styleci.yml). Chúng tôi sử dụng gợi ý loại PHP 7 và khai báo loại trả về nếu có thể và [PHPDoc](https://docs.phpdoc.org/) để cung cấp tài liệu nội tuyến. Hãy thử và bắt chước kiểu được sử dụng bởi phần còn lại của cơ sở mã trong các đóng góp của bạn. - -* Namespaces phải là số ít (ví dụ: `Flarum\Discussion`, không phải `Flarum\Discussions`) -* Interfaces phải được gắn với `Interface` (ví dụ: `MailableInterface`) -* Class Abstract phải được bắt đầu bằng `Abstract` (ví dụ: `AbstractModel`) -* Traits phải được gắn với `Trait` (ví dụ: `ScopeVisibilityTrait`) - -### JavaScript - -JavaScript của Flarum chủ yếu tuân theo [Hướng dẫn tạo kiểu Airbnb](https://github.com/airbnb/javascript). Chúng tôi sử dụng [ESDoc](https://esdoc.org/manual/tags.html) để cung cấp tài liệu nội tuyến. - -### Cơ sở dữ liệu - -**Cột** nên được đặt tên theo kiểu dữ liệu: -* DATETIME hoặc TIMESTAMP: `{verbed}_at` (ví dụ: created_at, read_at) hoặc `{verbed}_until` (ví dụ: suspended_until) -* INT là một số: `{noun}_count` (ví dụ: comment_count, word_count) -* Khoá ngoại: `{verbed}_{entity}_id` (ví dụ: hidden_user_id) - * Có thể bỏ qua động từ cho quan hệ chính (ví dụ: người đăng bài viết là `user_id`) -* BOOL: `is_{adjective}` (ví dụ: is_locked) - -**Bảng** phải được đặt tên như sau: -* Sử dụng dạng số nhiều (`discussions`) -* Phân tách nhiều từ bằng dấu gạch dưới (`access_tokens`) -* Đối với bảng mối quan hệ, hãy nối hai tên bảng ở dạng số ít với dấu gạch dưới theo thứ tự bảng chữ cái (ví dụ: `discussion_user`) - -### CSS - -Các lớp CSS của Flarum gần như tuân theo [THÍCH hợp quy ước đặt tên CSS](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) bằng cách sử dụng định dạng `.ComponentName-subsentName-modifierName`. - -### Bản dịch - -Chúng tôi sử dụng [định dạng khóa chuẩn](/extend/i18n.md#append-a-standard-key-format) để đặt tên các khóa dịch một cách mô tả và nhất quán. - -## Thỏa thuận cấp phép cộng tác viên - -Bằng cách đóng góp mã của bạn cho Flarum, bạn cấp cho Flarum Foundation (Stichting Flarum) một giấy phép không độc quyền, không thể thu hồi, trên toàn thế giới, miễn phí bản quyền, có thể cấp phép lại, có thể chuyển nhượng theo tất cả các quyền sở hữu trí tuệ liên quan của bạn (bao gồm bản quyền, bằng sáng chế và bất kỳ quyền nào khác), để sử dụng, sao chép, chuẩn bị các sản phẩm phái sinh của, phân phối và trình diễn công khai và hiển thị các Đóng góp theo bất kỳ điều khoản cấp phép nào, bao gồm nhưng không giới hạn: (a) giấy phép nguồn mở như giấy phép MIT; và (b) giấy phép nhị phân, độc quyền hoặc thương mại. Ngoại trừ các giấy phép được cấp ở đây, Bạn bảo lưu mọi quyền, quyền sở hữu và lợi ích đối với và đối với Khoản đóng góp. - -Bạn xác nhận rằng bạn có thể cấp cho chúng tôi những quyền này. Bạn tuyên bố rằng Bạn có quyền hợp pháp để cấp giấy phép trên. Nếu chủ lao động của Bạn có quyền đối với tài sản trí tuệ mà Bạn tạo ra, Bạn tuyên bố rằng Bạn đã nhận được sự cho phép để thực hiện các Đóng góp thay mặt cho chủ lao động đó, hoặc chủ nhân của Bạn đã từ bỏ các quyền đó đối với các Đóng góp đó. - -Bạn tuyên bố rằng các Đóng góp là tác phẩm gốc của bạn về quyền tác giả và theo hiểu biết của Bạn, không có người nào khác yêu cầu hoặc có quyền yêu cầu, bất kỳ quyền nào trong bất kỳ phát minh hoặc bằng sáng chế nào liên quan đến các Đóng góp. Bạn cũng tuyên bố rằng Bạn không có nghĩa vụ pháp lý, cho dù bằng cách ký kết thỏa thuận hay bằng cách khác, theo bất kỳ cách nào xung đột với các điều khoản của giấy phép này. - -Tổ chức Flarum thừa nhận rằng, ngoại trừ được mô tả rõ ràng trong Thỏa thuận này, bất kỳ Đóng góp nào mà bạn cung cấp đều dựa trên CƠ SỞ "NGUYÊN TRẠNG", KHÔNG CÓ ĐẢM BẢO HOẶC ĐIỀU KIỆN NÀO, BẤT KỲ LOẠI NÀO, RÕ RÀNG HOẶC NGỤ Ý, BAO GỒM, KHÔNG GIỚI HẠN, BẤT KỲ BẢO ĐẢM HOẶC ĐIỀU KIỆN NÀO TIÊU ĐỀ, KHÔNG VI PHẠM, KHẢ NĂNG LẠNH, HOẶC PHÙ HỢP VỚI MỤC ĐÍCH CỤ THỂ. \ No newline at end of file diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/README.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/README.md deleted file mode 100644 index 6b1c0c486..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/README.md +++ /dev/null @@ -1,40 +0,0 @@ -- - - -slug: '/extend' -- - - - -# Mở rộng Flarum - -Flarum là tối giản, nhưng nó cũng có khả năng mở rộng cao. Trên thực tế, hầu hết các tính năng đi kèm với Flarum thực sự là phần mở rộng! - -Cách tiếp cận này làm cho Flarum có thể tùy biến cực kỳ tốt. Người dùng có thể tắt bất kỳ tính năng nào mà họ không sử dụng trên diễn đàn và cài đặt các tiện ích mở rộng khác để tạo diễn đàn hoàn hảo cho cộng đồng của họ. - -Để đạt được khả năng mở rộng này, Flarum đã được xây dựng với các API và điểm mở rộng phong phú. Với một số kiến thức lập trình, bạn có thể tận dụng các API này để thêm bất kỳ tính năng nào bạn muốn. Phần này của tài liệu nhằm mục đích hướng dẫn bạn cách hoạt động của Flarum và cách sử dụng các API để bạn có thể tạo các tiện ích mở rộng của riêng mình. - -## Lõi với Tiện ích mở rộng - -Chúng ta vẽ ranh giới giữa Flarum cốt lõi và các phần mở rộng của nó ở đâu? Tại sao một số tính năng được bao gồm trong lõi, còn những tính năng khác thì không? Điều quan trọng là phải hiểu sự khác biệt này để chúng tôi có thể duy trì tính nhất quán và chất lượng trong hệ sinh thái của Flarum. - -**Flarum cốt lõi** không nhằm mục đích có đầy đủ các tính năng. Thay vào đó, nó là một giàn giáo, hoặc một khuôn khổ, cung cấp một nền tảng đáng tin cậy để các tiện ích mở rộng có thể xây dựng. Nó chỉ chứa chức năng cơ bản, chưa được tích hợp, cần thiết cho một diễn đàn: thảo luận, bài đăng, người dùng, nhóm và thông báo. - -**Tiện ích mở rộng đi kèm** là các tính năng được đóng gói cùng với Flarum và được bật theo mặc định. Chúng là các tiện ích mở rộng giống như bất kỳ tiện ích mở rộng nào khác và có thể bị vô hiệu hóa và gỡ cài đặt. Mặc dù phạm vi của chúng không nhằm giải quyết tất cả các trường hợp sử dụng, nhưng ý tưởng là làm cho chúng trở nên chung chung và đủ cấu hình để chúng có thể đáp ứng số đông. - -**Tiện ích mở rộng của bên thứ ba** là các tính năng do những người khác tạo ra và không được nhóm Flarum hỗ trợ chính thức. Chúng có thể được xây dựng và sử dụng để giải quyết các trường hợp sử dụng cụ thể hơn. - -Nếu bạn đang muốn giải quyết một lỗi hoặc thiếu sót của lõi hoặc của tiện ích mở rộng đi kèm hiện có, thì việc *đóng góp cho dự án tương ứng* có thể phù hợp hơn là phân tán nỗ lực vào tiện ích mở rộng mới của bên thứ ba. Bạn nên bắt đầu một cuộc thảo luận trên [Cộng đồng Flarum](https://discuss.flarum.org/) để có được góc nhìn của các nhà phát triển Flarum. - -## Tài nguyên hữu ích - -- [Tài liệu](start.md) -- [Mẹo dành cho nhà phát triển mới bắt đầu](https://discuss.flarum.org/d/5512-extension-development-tips) -- [Flarum CLI](https://github.com/flarum/cli) -- [Các lập trình viên giải thích về quá trình phát triển tiện ích mở rộng](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) -- [Mẹo namespace tiện ích mở rộng](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) -- [Tài liệu Mithril js](https://mithril.js.org/) -- [Tài liệu API Laravel](https://laravel.com/api/8.x/) -- [Tài liệu API Flarum](https://api.flarum.org) -- [ES6 cheatsheet](https://github.com/DrkSephy/es6-cheatsheet) - -### Tìm sự giúp đỡ - -- [Cộng đồng Dev Flarum](https://discuss.flarum.org/t/dev) -- [Tham gia #extend trên discord](https://flarum.org/discord/) diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/admin.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/admin.md deleted file mode 100644 index 00f5984b7..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/admin.md +++ /dev/null @@ -1,214 +0,0 @@ -# Trang quản trị - -Beta 15 với trang quản trị và API giao diện người dùng được thiết kế mới. Bây giờ có thể dễ dàng thêm thiết lập hoặc quyền vào tiện ích mở rộng của bạn. - -Trước beta 15, thiết lập tiện ích mở rộng đã được thêm vào `SettingModal` hoặc họ đã thêm vào một trang mới để phức tạp việc thiết lập hơn. Bây giờ toàn bộ tiện ích mở rộng đã có trang chứa thông tin, thiết lập và quyền của tiện ích mở rộng cho riêng mình. - -Bạn có thể chỉ cần đăng ký cài đặt, mở rộng [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) cơ sở hoặc cung cấp trang hoàn toàn tùy chỉnh của riêng bạn. - -## API dữ liệu tiện ích mở rộng - -Đây là API mới cho phép bạn thêm settings vào tiện ích mở rộng chỉ với vài dòng mã. - -### Nói với API về tiện ích mở rộng của bạn - -Trước khi đăng ký setting nào đó, bạn cần cho `ExtensionData` hiểu rằng nó lấy dữ liệu cho tiện ích mở rộng nào. - -Chỉ cần thêm hàm `for` vào sau `app.extensionData` và truyền id tiện ích mở rộng của bạn vào. Để tìm id tiện ích mở rộng, hãy lấy tên composer và thay thế dấu gạch chéo thành dấu gạch ngang (ví dụ: 'fof/merge-discussions' thành 'fof-merge-discussions'). Tiện ích mở rộng có `flarum-` và `flarum-ext-` sẽ bị xoá các phần đó khỏi tên (ví dụ: 'webbinaro/flarum-calendar' thành 'webbinaro-calendar'). - -Đối với ví dụ sau, chúng tôi sẽ sử dụng tiện ích mở rộng có id là 'acme/interstellar': - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') -}); -``` - -Như vậy là xong, bây giờ bạn có thể thêm settings và permissions vào. - -:::tip Lưu ý - -Tất cả hàm đăng ký trong `ExtensionData` đều có thể sử dụng được, có nghĩa là bạn có thể thêm từng cái vào mà không cần thêm `for` nữa. - -::: - -### Đăng ký Settings - -Thêm các trường settings theo cách này được khuyến khích cho các mục đơn giản. Theo nguyên tắc chung, nếu bạn chỉ cần lưu trữ những thứ trong bảng cài đặt, điều này là đủ cho bạn. - -Để thêm một trường, gọi hàm `registerSetting` sau đó là `for` sau đó là `app.extensionData` và truyền 'object setting' vào dưới dạng tham số thứ nhất. Phía sau `ExtensionData` đã chuyển settings của bạn thành [`ItemList`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist), bạn có thể truyền một số ưu tiên làm đối số thứ hai. - -Đây là ví dụ với trường switch (boolean): - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting( - { - setting: 'acme-interstellar.coordinates', // Đây là key mà settings sẽ được lưu trong bảng settings trong cơ sở dữ liệu. - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // Label được hiển thị cho phép quản trị viên biết cài đặt này hoạt động như thế nào. - help: app.translator.trans('acme-interstellar.admin.coordinates_help'), // Văn bản trợ giúp tùy chọn có thể giải thích dài hơn về cài đặt. - type: 'boolean', // Đây là kiểu setting, các tùy chọn hợp lệ là: boolean, text (hoặc bất kỳ kiểu của ), và select. - }, - 30 // Không bắt buộc: Ưu tiên - ) -}); -``` - -Nếu bạn sử dụng `type: 'select'` đối tượng setting trông hơi khác một chút: - -```js -{ - setting: 'acme-interstellar.fuel_type', - label: app.translator.trans('acme-interstellar.admin.fuel_type_label'), - type: 'select', - options: { - 'LOH': 'Liquid Fuel', // Key trong đối tượng này là setting sẽ được lưu trữ trong cơ sở dữ liệu, giá trị là nhãn mà quản trị viên sẽ nhìn thấy (hãy nhớ sử dụng bản dịch nếu chúng có ý nghĩa trong ngữ cảnh của bạn). - 'RDX': 'Solid Fuel', - }, - default: 'LOH', -} -``` - -Ngoài ra, hãy lưu ý rằng các mục bổ sung trong đối tượng setting sẽ được sử dụng làm phần đính kèm component. Điều này có thể được sử dụng cho trình giữ chỗ, hạn chế tối thiểu / tối đa, v.v.: - -```js -{ - setting: 'acme-interstellar.crew_count', - label: app.translator.trans('acme-interstellar.admin.crew_count_label'), - type: 'number', - min: 1, - max: 10 -} -``` - -Nếu bạn muốn thêm thứ gì đó vào cài đặt như một số văn bản bổ sung hoặc đầu vào phức tạp hơn, bạn cũng có thể chuyển một lệnh gọi lại làm đối số đầu tiên trả về JSX. Lệnh gọi lại này sẽ được thực thi trong ngữ cảnh của [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) và các giá trị cài đặt sẽ không được tự động tuần tự hóa. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( -
-

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

- -
- ); - } - }) -}); -``` - -### Registering Permissions - -Tính năng mới trong bản beta 15, hiện có thể tìm thấy quyền ở 2 nơi. Giờ đây, bạn có thể xem các quyền riêng lẻ của từng tiện ích mở rộng trên trang của chúng. Tất cả các quyền vẫn có thể được tìm thấy trên trang quyền. - -Để điều đó xảy ra, các quyền phải được đăng ký với `ExtensionData`. Điều này được thực hiện theo cách tương tự như cài đặt, hãy gọi `registerPermission`. - -Arguments: - * Đối tượng quyền - * Loại quyền nào - xem các chức năng của[`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid) để biết các loại (xóa các mục khỏi tên) - * Mức độ ưu tiên của `ItemList` - -Quay lại phần mở rộng tên lửa yêu thích của chúng tôi: - -```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Font-Awesome Icon - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Permission Label - permission: 'discussion.rocket_fly', // Actual permission name stored in database (and used when checking permission). - tagScoped: true, // Whether it be possible to apply this permission on tags, not just globally. Giải thích trong đoạn tiếp theo. - }, - 'start', // Category permission will be added to on the grid - 95 // Optional: Priority - ); -}); -``` - -Nếu tiện ích của bạn tương tác với [phần mở rộng thẻ](https://github.com/flarum/tags) (điều này khá phổ biến), bạn có thể muốn một quyền để thẻ có thể mở rộng phạm vi (nghĩa là được áp dụng ở cấp thẻ, không chỉ trên toàn bộ). Bạn có thể thực hiện việc này bằng cách thêm thuộc tính `tagScoped`, như đã thấy ở trên. Các quyền bắt đầu bằng `discussion.` sẽ tự động được gắn thẻ trong phạm vi trừ khi `tagScoped: false` được chỉ định. - -Để tìm hiểu thêm về các quyền của Flarum, hãy xem [tài liệu liên quan](permissions.md). - -### Chaining Reminder - -Hãy nhớ rằng tất cả các hàm này có thể được xâu chuỗi như: - -```js -app.extensionData - .for('acme-interstellar') - .registerSetting(...) - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); -``` - -### Mở rộng/Ghi đè trang mặc định - -Đôi khi bạn có những cài đặt phức tạp hơn gây rối cho các mối quan hệ hoặc chỉ muốn trang trông hoàn toàn khác. Trong trường hợp này, bạn cần cho `ExtensionData` biết rằng bạn muốn cung cấp trang của riêng mình. Lưu ý rằng `buildSettingComponent`, công dụng được sử dụng để đăng ký cài đặt bằng cách cung cấp đối tượng mô tả, có sẵn dưới dạng một phương thức trên `ExtensionPage` (mở rộng từ `AdminPage`, là cơ sở chung cho tất cả các trang quản trị với một số phương pháp sử dụng). - -Tạo một lớp mới mở rộng thành phần `Page` hoặc `ExtensionPage`: - -```js -import ExtensionPage from 'flarum/admin/components/ExtensionPage'; - -export default class StarPage extends ExtensionPage { - content() { - return ( -

Hello from the settings section!

- ) - } -} - -``` - -Sau đó, chỉ cần chạy`registerPage`: - -```js - -import StarPage from './components/StarPage'; - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); -}); -``` - -Trang này sẽ được hiển thị thay vì mặc định. - -Bạn có thể mở rộng [ `ExtensionPage` ](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) hoặc `Page` cơ sở và tự thiết kế! - -## Composer.json Metadata - -Trong phiên bản beta 15, các trang tiện ích mở rộng dành chỗ cho thông tin bổ sung được lấy từ composer.json của tiện ích mở rộng. - -Để biết thêm thông tin, hãy xem [composer.json schema](https://getcomposer.org/doc/04-schema.md). - -| Mô tả | Bên trong composer.json | -| ---------------------------------- | ------------------------------------------------------------------ | -| discuss.flarum.org discussion link | khóa "forum" bên trong "support" | -| Tài liệu | khóa "docs" bên trong "support" | -| Hỗ trợ (email) | khóa "email" bên trong "support" | -| Trang web | khóa "homepage" | -| Quyên góp | khối khóa "funding" (Lưu ý: Chỉ liên kết đầu tiên sẽ được sử dụng) | -| Nguồn | khóa "source" bên trong "support" | diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/api-throttling.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/api-throttling.md deleted file mode 100644 index 56ed30aa6..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/api-throttling.md +++ /dev/null @@ -1,58 +0,0 @@ -# Điều chỉnh API - -Flarum comes with a builtin `Flarum\Api\Middleware\ThrottleApi` [middleware](middleware.md) for throttling requests to the API. This runs on every API route, and extensions can add their own custom logic to throttle requests. - -:::caution Forum Routes - -Some forum routes (login, register, forgot password, etc) work by calling an API route under the surface. The `ThrottleApi` middleware does not currently run for these requests, but that is planned for the future. - -::: - -## Custom Throttlers - -The format for a custom throttler is extremely simple: all you need is a closure or invokable class that takes the current request as an argument, and returns one of: - -- `false`: This explicitly bypasses throttling for this request, overriding all other throttlers -- `true`: This marks the request as to be throttled. -- `null`: This means that this throttler doesn't apply. Any other outputs will be ignored, with the same effect as `null`. - -Throttlers will be run on EVERY request, and are responsible for figuring out whether or not they apply. For example, consider Flarum's post throttler: - -```php -use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; -``` - -Throttlers can be added or removed via the `ThrottleApi` middleware in `extend.php`. For example: - -```php -set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders -]; -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/api.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/api.md deleted file mode 100644 index c2810f98a..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/api.md +++ /dev/null @@ -1,353 +0,0 @@ -# API và Luồng dữ liệu - -Trong [bài viết trước](models.md), chúng ta đã tìm hiểu cách Flarum sử dụng các mô hình để tương tác với dữ liệu. Ở đây, chúng ta sẽ tìm hiểu cách lấy dữ liệu đó từ cơ sở dữ liệu đến JSON-API đến giao diện người dùng và quay lại tất cả các cách. - -:::info - -Để sử dụng REST API tích hợp sẵn như một phần của tích hợp, hãy xem [Sử dụng REST API](../rest-api.md). - -::: - -## Vòng đời API Request - -Trước khi chúng ta đi vào chi tiết về cách mở rộng API dữ liệu của Flarum, chúng ta nên suy nghĩ về vòng đời của một yêu cầu API điển hình: - -![Flarum API Flowchart](/en/img/api_flowchart.png) - -1. An HTTP request is sent to Flarum's API. Typically, this will come from the Flarum frontend, but external programs can also interact with the API. Flarum's API mostly follows the [JSON:API](https://jsonapi.org/) specification, so accordingly, requests should follow [said specification](https://jsonapi.org/format/#fetching). -2. The request is run through [middleware](middleware.md), and routed to the proper controller. You can learn more about controllers as a whole on our [routes and content documentation](routes.md). Assuming the request is to the API (which is the case for this section), the controller that handles the request will be a subclass of `Flarum\Api\AbstractSerializeController`. -3. Any modifications done by extensions to the controller via the [`ApiController` extender](#extending-api-controllers) are applied. This could entail changing sort, adding includes, changing the serializer, etc. -4. The `$this->data()` method of the controller is called, yielding some raw data that should be returned to the client. Typically, this data will take the form of a Laravel Eloquent model collection or instance, which has been retrieved from the database. That being said, the data could be anything as long as the controller's serializer can process it. Each controller is responsible for implementing its own `data` method. Note that for `PATCH`, `POST`, and `DELETE` requests, `data` will perform the operation in question, and return the modified model instance. -5. That data is run through any pre-serialization callbacks that extensions register via the [`ApiController` extender](#extending-api-controllers). -6. The data is passed through a [serializer](#serializers), which converts it from the backend, database-friendly format to the JSON:API format expected by the frontend. It also attaches any related objects, which are run through their own serializers. As we'll explain below, extensions can [add / override relationships and attributes](#attributes-and-relationships) at the serialization level. -7. The serialized data is returned as a JSON response to the frontend. -8. If the request originated via the Flarum frontend's `Store`, the returned data (including any related objects) will be stored as [frontend models](#frontend-models) in the frontend store. - -## API Endpoints - -We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. - -As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: - -- Listing instances of a model (possibly including searching/filtering) -- Getting a single model instance -- Creating a model instance -- Updating a model instance -- Deleting a single model instance - -We'll go over each type of controller shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -:::caution - -Paths to API endpoints are not arbitrary! To support interactions with frontend models: - -- The path should either be `/prefix/{id}` for get/update/delete, or `/prefix` for list/create. -- the prefix (`tags` in the example above) must correspond to the JSON:API model type. You'll also use this model type in your serializer's `$type` attribute, and when registering the frontend model (`app.store.models.TYPE = MODEL_CLASS`). -- The methods must match the example above. - -Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! - -::: - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your endpoint controllers: -```bash -$ flarum-cli make backend api-controller -``` - -::: - -### Listing Resources - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -#### Pagination - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // The number of records included by default. - public $limit = 20; - - // The maximum number of records that can be requested. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. - -#### Sorting - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // The default sort field and order to use. - public $sort = ['name' => 'asc']; - - // The fields that are available to be sorted by. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -use Illuminate\Support\Str; - -// ... - -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(Str::snake($field), $order); -} - -return $query->get(); -``` - -#### Tìm kiếm và Lọc - -Read our [searching and filtering](search.md) guide for more information! - -### Showing a Resource - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creating a Resource - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Updating a Resource - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Deleting a Resource - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Including Relationships - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Extending API Controllers - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -The `ApiController` extender can also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Serializers - -Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your serializer: -```bash -$ flarum-cli make backend api-serializer -``` - -::: - -### Attributes and Relationships - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -### Extending Serializers - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -### Non-Model Serializers and `ForumSerializer` - -Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/assets.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/assets.md deleted file mode 100644 index 8e262066e..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/assets.md +++ /dev/null @@ -1,7 +0,0 @@ -# Assets Tiện ích mở rộng - -Một số tiện ích mở rộng có thể muốn bao gồm các nội dung như hình ảnh hoặc tệp JSON trong mã nguồn của chúng (lưu ý rằng điều này không giống với tệp tải lên, có thể sẽ yêu cầu [đĩa filesystem](filesystem.md)). - -This is actually very easy to do. Just create an `assets` folder at the root of your extension, and place any asset files there. Flarum will then automatically copy those files to its own `assets` directory (or other storage location if [one is offered by extensions](filesystem.md)) every time the extension is enabled or [`php flarum assets:publish`](../console.md) is executed. - -If using the default storage driver, assets will be available at `https://FORUM_URL/assets/extensions/EXTENSION_ID/file.path`. However, since other extensions might use remote filesystems, we recommend serializing the url to assets you need in the backend. See [Flarum's serialization of the logo and favicon URLs](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Serializer/ForumSerializer.php#L85-L86) for an example. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/authorization.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/authorization.md deleted file mode 100644 index 25f882d4e..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/authorization.md +++ /dev/null @@ -1,206 +0,0 @@ -# Ủy quyền - -As with any framework, Flarum allows certain actions and content to be restricted to certain users. There are 2 parallel systems for this: - -- The authorization process dictates whether a user can take a certain action. -- Visibility scoping can be applied to a database query to efficiently restrict the records that users can access. This is documented in our [model visibility](model-visibility.md) article. - -## Quy trình ủy quyền - -Quá trình ủy quyền được sử dụng để kiểm tra xem một người có được phép thực hiện các hành động nhất định hay không. Ví dụ: chúng tôi muốn kiểm tra xem người dùng có được ủy quyền hay không trước khi họ: - -- Access the admin dashboard -- Bắt đầu một cuộc thảo luận -- Chỉnh sửa bài viết -- Cập nhật hồ sơ của người dùng khác - -Each of these is determined by unique criteria: in some cases a flag is sufficient; otherwise, we might need custom logic. - -## Cách nó hoạt động - -Truy vấn ủy quyền được thực hiện với 3 tham số, với logic có trong [`Flarum\User\Gate`](https://api.docs.flarum.org/php/master/flarum/user/access/gate): - -1. Tác nhân: người dùng cố gắng thực hiện hành động -2. Khả năng: một chuỗi đại diện cho hành động mà tác nhân đang cố gắng -3. The arguments: usually an instance of a database model which is the subject of the attempted ability, but could be anything. - -First, we run the entire request (all three parameters) through all [policies](#policies) registered by extensions and core. Policies are blocks of logic provided by core and extensions that determine whether the actor can perform the ability on the arguments. Policies can return one of the following: - -- `Flarum\User\Access\AbstractPolicy::ALLOW` (via `$this->allow()`) -- `Flarum\User\Access\AbstractPolicy::DENY` (via `$this->deny()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (via `$this->forceAllow()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (via `$this->forceDeny()`) - -Policy results are considered in the priority `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. For example, if a single policy returns `FORCE_DENY`, all other policies will be ignored. If one policy returns `DENY` and 10 policies return `ALLOW`, the request will be denied. This allows decisions to be made regardless of the order in which extensions are booted. Note that policies are extremely powerful: if access is denied at the policy stage, that will override group permissions and even admin privileges. - -Secondly, if all policies return null (or don't return anything), we check if the user is in a group that has a permission equal to the ability (note that both permissions and abilities are represented as strings). If so, we authorize the action. See our [Groups and Permissions documentation](permissions.md) for more information on permissions. - -Then, if the user is in the admin group, we will authorize the action. - -Finally, as we have exhausted all checks, we will assume that the user is unauthorized and deny the request. - -## How To Use Authorization - -Flarum's authorization system is accessible through public methods of the `Flarum\User\User` class. The most important ones are listed below; others are documented in our [PHP API documentation](https://api.docs.flarum.org/php/master/flarum/user/user). - - -In this example, we will use `$actor` as an instance of `Flarum\User\User`, `'viewForum'` and `'reply'` as examples of abilities, and `$discussion` (instance of `Flarum\Discussion\Discussion`) as an example argument. - -```php -// Check whether a user can perform an action. -$canDoSomething = $actor->can('viewForum'); - -// Check whether a user can perform an action on a subject. -$canDoSomething = $actor->can('reply', $discussion); - -// Raise a PermissionDeniedException if a user cannot perform an action. -$actor->assertCan('viewForum'); -$actor->assertCan('reply', $discussion); - -// Raise a NotAuthenticatedException if the user is not logged in. -$actor->assertRegistered(); - -// Raise a PermissionDeniedException if the user is not an admin. -$actor->assertAdmin(); - -// Check whether one of the user's groups have a permission. -// WARNING: this should be used with caution, as it doesn't actually -// run through the authorization process, so it doesn't account for policies. -// It is, however, useful in implementing custom policies. -$actorHasPermission = $actor->hasPermission(`viewForum`); -``` - -## Custom Policies - -Policies allow us to use custom logic beyond simple groups and permissions when evaluating authorization for an ability with a subject. For instance: - -- We want to allow users to edit posts even if they aren't moderators, but only their own posts. -- Depending on settings, we might allow users to rename their own discussions indefinitely, for a short period of time after posting, or not at all. - -As described [above](#how-it-works), on any authorization check, we query all policies registered for the target's model, or any parent classes of the target's model. If no target is provided, any policies registered as `global` will be applied. - -So, how does a policy get "checked"? - -First, we check if the policy class has a method with the same name as the ability being evaluated. If so, we run it with the actor and subject as parameters. Nếu phương thức đó trả về giá trị khác rỗng, chúng tôi trả về kết quả đó. Otherwise, we continue to the next step (not necessarily the next policy). - -Then, we check if the policy class has a method called `can`. If so, we run it with the actor, ability, and subject, and return the result. - -If `can` doesn't exist or returns null, we are done with this policy, and we proceed to the next one. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate policies: -```bash -$ flarum-cli make backend policy -``` - -::: - -### Example Policies - -Let's take a look at an example policy from [Flarum Tags](https://github.com/flarum/tags/blob/master/src/Access): - -```php -is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); - } -} -``` - -We can also have global policies, which are run when `$user->can()` is called without a target model instance. Again from Tags: - -```php -settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewForum', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } - } -} -``` - -### Registering Policies - -Both model-based and global policies can be registered with the `Policy` extender in your `extend.php` file: - -```php -use Flarum\Extend; -use Flarum\Tags\Tag; -use YourNamespace\Access; - -return [ - // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), - // Other extenders -]; -``` - -## Frontend Authorization - -Commonly, you'll want to use authorization results in frontend logic. For example, if a user doesn't have permission to see search users, we shouldn't send requests to that endpoint. And if a user doesn't have permission to edit users, we shouldn't show menu items for that. - -Because we can't do authorization checks in the frontend, we have to perform them in the backend, and attach them to serialization of data we're sending. Global permissions (`viewForum`, `viewUserList`) can be included on the `ForumSerializer`, but for object-specific authorization, we may want to include those with the subject object. For instance, when we return lists of discussions, we check whether the user can reply, rename, edit, and delete them, and store that data on the frontend discussion model. It's then accessible via `discussion.canReply()` or `discussion.canEdit()`, but there's nothing magic there: it's just another attribute sent by the serializer. - -For an example of how to attach data to a serializer, see a [similar case for transmitting settings](settings.md#accessing-settings). diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/backend-events.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/backend-events.md deleted file mode 100644 index f36fc4041..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/backend-events.md +++ /dev/null @@ -1,172 +0,0 @@ -# Sự kiện Backend - -Often, an extension will want to react to some events occuring elsewhere in Flarum. For instance, we might want to increment a counter when a new discussion is posted, send a welcome email when a user logs in for the first time, or add tags to a discussion before saving it to the database. These events are known as **domain events**, and are broadcasted across the framework through [Laravel's event system](https://laravel.com/docs/8.x/events). - -For a full list of backend events, see our [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). Domain events classes are organized by namespace, usually `Flarum\TYPE\Event`. - - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate event listeners: -```bash -$ flarum-cli make backend event-listener -``` - -::: - -## Listening to Events - -You can attach a listener to an event using the [`Event`](https://api.docs.flarum.org/php/master/flarum/extend/event) [extender](start.md#extenders): - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) -]; -``` -```php -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -As shown above, a listener class can be used instead of a callback. This allows you to [inject dependencies](https://laravel.com/docs/8.x/container) into your listener class via constructor parameters. In this example we resolve a translator instance, but we can inject anything we want/need. - -You can also listen to multiple events at once via an event subscriber. This is useful for grouping common functionality; for instance, if you want to update some metadata on changes to posts: - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Flarum\Post\Event\Saving; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; -``` -```php -class PostEventSubscriber -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function subscribe($events) - { - $events->listen(Deleted::class, [$this, 'handleDeleted']); - $events->listen(Saving::class, [$this, 'handleSaving']); - } - - public function handleDeleted(Deleted $event) - { - // Your logic here - } - - public function handleSaving(Saving $event) - { - // Your logic here - } -} -``` - -## Dispatching Events - -Dispatching events is very simple. All you need to do is inject `Illuminate\Contracts\Events\Dispatcher` into your class, and then call its `dispatch` method. For instance: - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` - -## Custom Events - -As an extension developer you can define your own events to allow yourself (or other extensions) to react to events in your extension. Các sự kiện nói chung là các thể hiện của các lớp đơn giản (không cần mở rộng bất cứ điều gì). When defining a new event, you'll typically want to use public properties, and maybe some methods for convenience of users. For example, if we take a look at `Flarum\Post\Event\Deleted`, it's just a wrapping around some data: - -```php -post = $post; - $this->actor = $actor; - } -} -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/cli.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/cli.md deleted file mode 100644 index 973329601..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# Flarum CLI - -Hệ sinh thái phát triển Flarum được định hướng xung quanh nhiều mô-đun nhỏ, phần mở rộng tương tác. Đây là một mô hình rất mạnh mẽ và linh hoạt, nhưng nó cũng mang lại chi phí bảo trì cho việc tạo và duy trì tất cả các phần mở rộng này. - -Chúng tôi đã tạo Flarum CLI (giao diện dòng lệnh) như một công cụ để trợ giúp các nhà phát triển bằng cách tự động hóa một số tác vụ lặp đi lặp lại và thường xuyên, đồng thời cho phép họ tham gia vào công việc thực tế mà không gặp nhiều rắc rối. - -Các cập nhật chính về Flarum CLI sẽ được công bố [trong cuộc thảo luận này](https://discuss.flarum.org/d/28427-flarum-cli-v10). - -Xem [readme của gói](https://github.com/flarum/cli#readme) để biết thông tin về: - -- Cài đặt -- Sử dụng -- Nâng cấp -- Các lệnh có sẵn -- Một số chi tiết triển khai, nếu bạn quan tâm diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/console.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/console.md deleted file mode 100644 index 471d19681..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/console.md +++ /dev/null @@ -1,70 +0,0 @@ -# Console - -Flarum allows extension developers to add custom console commands in addition to the [default ones](../console.md) provided by flarum core. - -All console command development is done in the backend using PHP. To create a custom console command, you'll need to create a class that extends `\Flarum\Console\AbstractCommand`. - -```php -use Flarum\Console\AbstractCommand; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -class YourCommand extends AbstractCommand { - protected function configure() - { - $this - ->setName('YOUR COMMAND NAME') - ->setDescription('YOUR COMMAND DESCRIPTION'); - } - protected function fire() - { - // Your logic here! - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate and register a console command: -```bash -$ flarum-cli make backend command -``` - -::: - -## Registering Console Commands - -To register console commands, use the `Flarum\Extend\Console` extender in your extension's `extend.php` file: - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Other extenders - (new Extend\Console())->command(CustomCommand::class) - // Other extenders -]; -``` - -## Scheduled Commands - -The `Flarum\Extend\Console`'s `schedule` method allows extension developers to create scheduled commands that run on an interval: - - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; -use Illuminate\Console\Scheduling\Event; - -return [ - // Other extenders - (new Extend\Console())->schedule('cache:clear', function (Event $event) { - $event->everyMinute(); - }, ['Arg1', '--option1', '--option2']), - // Other extenders -]; -``` - -In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/8.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands) for more information. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/distribution.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/distribution.md deleted file mode 100644 index 894391d5a..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/distribution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Phân bổ - -You've written a great extension — and now you want the whole world to be able to use it. This document will take you through the process of distribution, from setting up a Git repository for your extension, to publishing it on Packagist. - -## Cài đặt Git - -The first thing you'll need to do is set up a version control system (VCS). The most popular VCS is [Git](https://git-scm.com/). In this guide we'll be using Git, so make sure you have it [installed](https://git-scm.com/downloads) before continuing. If you don't have much Git knowledge, you may want to check out [these learning resources](https://try.github.io/). - -After you have installed Git, you'll need to initialize your repository. You can use `git init` on the command line if you're comfortable, or use a GUI tool like [SourceTree](https://www.sourcetreeapp.com/) or [GitKraken](https://www.gitkraken.com/). - -Then, you'll need an account in a Git hosting server, the most popular being [GitHub](https://github.com) and [GitLab](https://gitlab.com). These will instruct you on how to hook up your local repository with the online "remote" repository. - -## Gắn thẻ bản phát hành - -As you are going to be publishing this extension, you'll want to make sure that the information is up to date. Take a minute to revisit `composer.json` and make sure package name, description, and Flarum extension information are all correct. It is recommended to have a `README.md` file in your repository to explain what the extension is, so create one if you haven't already. - -When you're ready to release, commit your extension's files to the repo and tag your first version: - -```bash -git tag v0.1.0 -git push && git push --tags -``` - -## Phát hành trên Packagist - -Composer packages are published to a Composer repository, usually [Packagist](https://packagist.org/). You will need an account to proceed. - -If this is the first release you are publishing of your extension, you will need to [submit your package](https://packagist.org/packages/submit) using its public repository URL. If your extension is located on GitHub, this URL will look something like `https://github.com/AUTHOR/NAME.git`. - -### Bản phát hành tương lai - -You can set up Packagist to [auto-update packages](https://packagist.org/about#how-to-update-packages). Then for future releases, all you will need to do with Git is commit, tag, and push it to the remote server. - -## Quảng cáo tiện ích mở rộng - -You will most likely want to create a discussion on the Flarum Community in the [Extensions tag](https://discuss.flarum.org/t/extensions). Other people can install your extension using the following command: - -```bash -composer require vendor/package -``` \ No newline at end of file diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/extending-extensions.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/extending-extensions.md deleted file mode 100644 index 9ab654f18..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/extending-extensions.md +++ /dev/null @@ -1,122 +0,0 @@ -# Extending Extensions - -Flarum extensions aren't just for adding features to core: extensions can extend other extensions! - -:::tip - -To learn how to make your extension extensible, see the [relevant documentation](extensibility.md) - -::: - -## Dependencies - -If your extension relies on another extension, you'll want to ensure that: - -- The other extension is installed and enabled before yours can be. -- The other extension can't be disabled while yours is enabled. -- The other extension is booted before your extension. - -Flarum makes this very easy: just add the other extension to your extension's `composer.json`'s `require` section. - -Ví dụ: nếu bạn đang tạo chủ đề mới cho tiện ích mở rộng thẻ Flarum, thì `composer.json` của bạn sẽ trông giống như sau: - -```json -{ - // ... - "require": { - "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. - "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. - }, - // ... -} -``` - -## Optional Dependencies - -Sometimes, extension A might want to extend extension B only if extension B is enabled. In this case, we call B an "Optional Dependency" of A. For instance, a drafts extension might want to add support for saving private discussion drafts, but only if the private discussion extension is enabled. - -The first step here is detecting whether extension B is enabled. In the frontend, this is easy: if extension B does anything in the frontend, its extension ID will appear as a key in the `flarum.extensions` global object. For instance: - -```js -if ('some-extension-id' in flarum.extensions) { - // do something -} -``` - -In the backend, you'll need to inject an instance of `Flarum\Extension\ExtensionManager`, and use its `isEnabled()` method. For instance: - -```php -extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // do something. - } - } -} -``` - -Generally, if your extension has optional dependencies, you'll want it to be booted after said optional dependencies. You can also do this by specifying composer package names (NOT flarum extension IDs) in an array for the `extra.flarum-extension.optional-dependencies` key of your composer.json. - -For instance: - -```json -{ - // ... - "extra": { - "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] - } - }, - // ... -} -``` - -## Importing from Extensions - -In the backend, you can import the classes you need via regular PHP `use` statements: - -```php - { - // Your Extension Code Here -}) - -export { - // Put all the stuff you want to export here. -} -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/filesystem.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/filesystem.md deleted file mode 100644 index 5329793b8..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/filesystem.md +++ /dev/null @@ -1,129 +0,0 @@ -# Tập tin hệ thống - -Lõi Flarum tích hợp với hệ thống tệp để lưu trữ và phân phát nội dung (như JS / CSS đã biên dịch hoặc tải lên logos/favicons) và avatars. - -Các tiện ích mở rộng có thể sử dụng các hữu ích được cung cấp của Flarum cho nhu cầu lưu trữ tệp và tương tác với hệ thống tệp của riêng chúng. Hệ thống này dựa trên [các công cụ hệ thống tệp của Laravel](https://laravel.com/docs/8.x/filesystem), lần lượt dựa trên [thư viện Flysystem](https://github.com/thephpleague/flysystem). - -## Ổ đĩa - -Hệ thống tập tin **ổ đĩa** đại diện cho các vị trí lưu trữ và được hỗ trợ bởi các trình điều khiển lưu trữ mà chúng ta sẽ đề cập sau. Flarum cốt lõi có 2 đĩa: `flarum-assets` và `flarum-avatars`. - -### Sử dụng các ổ đĩa hiện có - -Để truy cập ổ đĩa, bạn cần truy xuất nó từ [Filesystem Factory](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Factory.html). Để làm như vậy, bạn nên đưa factory contract vào lớp của mình và truy cập vào các đĩa bạn cần. - -Hãy xem xét [`DeleteLogoController`](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Controller/DeleteLogoController.php#L19-L58) của lõi để làm ví dụ: - -```php -settings = $settings; - $this->uploadDir = $filesystemFactory->disk('flarum-assets'); - } - - /** - * {@inheritdoc} - */ - protected function delete(ServerRequestInterface $request) - { - RequestUtil::getActor($request)->assertAdmin(); - - $path = $this->settings->get('logo_path'); - - $this->settings->set('logo_path', null); - - if ($this->uploadDir->exists($path)) { - $this->uploadDir->delete($path); - } - - return new EmptyResponse(204); - } -} -``` - -The object returned by `$filesystemFactory->disk(DISK_NAME)` implements the [Illuminate\Contracts\Filesystem\Cloud](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Cloud.html) interface, and can be used to create/get/move/delete files, and to get the URL to a resource. - -### Declaring new disks - -Some extensions will want to group their resources / uploads onto a custom disk as opposed to using `flarum-assets` or `flarum-avatars`. - -This can be done via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->disk('flarum-uploads', function (Paths $paths, UrlGenerator $url) { - return [ - 'root' => "$paths->public/assets/uploads", - 'url' => $url->to('forum')->path('assets/uploads') - ]; - }); -``` - -Since all disks use the local filesystem by default, you'll need to provide a base path and base URL for the local filesystem. - -The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/8.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. - -## Storage drivers - -Flarum selects the active driver for each disk by checking the `disk_driver.DISK_NAME` key in the [settings repository](settings.md) and [config.php file](../config.md). If no driver is configured, or the configured driver is unavailable, Flarum will default to the `local` driver. - -You can define new storage drivers by implementing the [`Flarum\Filesystem\DriverInterface` interface](https://github.com/flarum/framework/blob/main/framework/core/src/Filesystem/DriverInterface.php#L16), and registering it via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->driver('aws-with-cdn', AwsWithCdnDriver::class); -``` - -Filesystem storage drivers are a very powerful tool that allows you to completely customize file storage locations, attach arbitrary CDNs, and otherwise extend the filesystem / cloud storage integration layer. - -:::danger - -Some drivers might try to index their filesystem every time the driver is instantiated, even if only the `url` method is needed. This can have serious performance implications. In most cases, you'll want to ensure that your driver's `url` method does not ping the remote filesystem. Similarly, the remote filesystem should usually not be accessed until operations are actually executed. - -::: - -## GUI and Admin Configuration - -Flarum does not currently provide a GUI for selecting drivers for disks, or for entering settings for drivers. This might be added in the future. For now, extensions are responsible for providing a GUI for their disks and drivers. - -As noted [above](#storage-drivers), if your extension provides a GUI for selecting drivers for a disk, it should modify the `disk_driver.DISK_NAME` key in settings. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/formatting.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/formatting.md deleted file mode 100644 index 241dd18a6..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/formatting.md +++ /dev/null @@ -1,42 +0,0 @@ -# Định dạng - -Flarum uses the powerful [s9e TextFormatter](https://github.com/s9e/TextFormatter) library to format posts from plain markup into HTML. You should become familiar with [how TextFormatter works](https://s9etextformatter.readthedocs.io/Getting_started/How_it_works/) before you attempt to extend it. - -In Flarum, post content is formatted with a minimal TextFormatter configuration by default. The bundled **Markdown** and **BBCode** extensions simply enable the respective plugins on this TextFormatter configuration. - -## Configuration - -You can configure the TextFormatter `Configurator` instance, as well as run custom logic during parsing and rendering, using the `Formatter` extender: - -```php -use Flarum\Extend; -use Psr\Http\Message\ServerRequestInterface as Request; -use s9e\TextFormatter\Configurator; -use s9e\TextFormatter\Parser; -use s9e\TextFormatter\Renderer; - -return [ - (new Extend\Formatter) - // Add custom text formatter configuration - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modify raw text before it is parsed. - // This callback should return the modified text. - ->parse(function (Parser $parser, $context, $text) { - // custom logic here - return $newText; - }) - // Modify the XML to be rendered before rendering. - // This callback should return the new XML. - // For example, in the mentions extension, this is used to - // provide the username and display name of the user being mentioned. - // Make sure that the last $request argument is nullable (or omitted entirely). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // custom logic here - return $newXml; - }) -]; -``` - -With a good understanding of TextFormatter, this will allow you to achieve anything from simple BBCode tag additions to more complex formatting tasks like Flarum's **Mentions** extension. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/forms.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/forms.md deleted file mode 100644 index af8d74fb6..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/forms.md +++ /dev/null @@ -1,108 +0,0 @@ -# Forms and Requests - -In this article, we'll go over some frontend tools that are available to us for building and managing forms, as well how to send HTTP requests via Flarum. - -## Form Components - -As with any interactive site, you will likely want to include forms in some pages and modals. Flarum provides some components to make building (and styling!) these forms easier. Please see the linked API documentation for each of these to learn more about its accepted attrs. - -- The [`flarum/common/components/FieldSet` component](https://api.docs.flarum.org/js/master/class/src/common/components/fieldset.js~fieldset) wraps its children in a HTML fieldset tag, with a legend. -- The [`flarum/common/components/Select` component](https://api.docs.flarum.org/js/master/class/src/common/components/select.js~select) is a stylized select input. -- The [`flarum/common/components/Switch`](https://api.docs.flarum.org/js/master/class/src/common/components/switch.js~switch) and [`flarum/common/components/Checkbox` components](https://api.docs.flarum.org/js/master/class/src/common/components/checkbox.js~checkbox) are stylized checkbox input components. Their `loading` attr can be set to `true` to show a loading indicator. -- The [`flarum/common/components/Button` component](https://api.docs.flarum.org/js/master/class/src/common/components/button.js~button) is a stylized button, and is used frequently throughout Flarum. - -You'll typically want to assign logic for reacting to input changes via Mithril's `on*` attrs, not external listeners (as is common with jQuery or plain JS). For example: - -```jsx -import Component from 'flarum/common/Component'; -import FieldSet from 'flarum/common/components/FieldSet'; -import Button from 'flarum/common/components/Button'; -import Switch from 'flarum/common/components/Switch'; - - -class FormComponent extends Component { - oninit(vnode) { - this.textInput = ""; - this.booleanInput = false; - } - - view() { - return ( -
-
- this.textInput = e.target.value}> - - this.booleanInput = val}> - -
- -
- ) - } - - onsubmit() { - // Some form handling logic here - } -} -``` - -Don't forget to use [translations](i18n.md)! - - -## Streams, bidi, and withAttr - -Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/common/util/Stream`. This is a very powerful reactive data structure, but is most commonly used in Flarum as a wrapper for form data. Its basic usage is: - -```js -import Stream from 'flarum/common/utils/Stream'; - - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true -``` - -In Flarum forms, streams are frequently used together with the bidi attr. Bidi stands for bidirectional binding, and is a common pattern in frontend frameworks. Flarum patches Mithril with the [`m.attrs.bidi` library](https://github.com/tobyzerner/m.attrs. This abstracts away input processing in Mithril. For instance: - -```jsx -import Stream from 'flarum/common/utils/Stream'; - -const value = Stream(); - -// Without bidi - value(e.target.value)}> - -// With bidi - -``` - -You can also use the `flarum/common/utils/withAttr` util for simplified form processing. `withAttr` calls a callable, providing as an argument some attr of the DOM element tied to the component in question: - -```jsx -import Stream from 'flarum/common/utils/Stream'; -import withAttr from 'flarum/common/utils/withAttr'; - -const value = Stream(); - -// With a stream - - -// With any callable - { - // Some custom logic here -})}> -``` - -## Making Requests - -In our [models](models.md) documentation, you learned how to work with models, and save model creation, changes, and deletion to the database via the Store util, which is just a wrapper around Flarum's request system, which itself is just a wrapper around [Mithril's request system](https://mithril.js.org/request.html). - -Flarum's request system is available globally via `app.request(options)`, and has the following differences from Mithril's `m.request(options)`: - -- It will automatically attach `X-CSRF-Token` headers. -- It will convert `PATCH` and `DELETE` requests into `POST` requests, and attach a `X-HTTP-Method-Override` header. -- If the request errors, it will show an alert which, if in debug mode, can be clicked to show a full error modal. -- You can supply a `background: false` option, which will run the request synchronously. However, this should almost never be done. - -Otherwise, the API for using `app.request` is the same as that for `m.request`. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend-pages.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend-pages.md deleted file mode 100644 index 1d39746a3..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend-pages.md +++ /dev/null @@ -1,218 +0,0 @@ -# Trang Frontend và Trình phân giải - -As explained in the [Routes and Content](routes.md#frontend-routes) documentation, we can use Mithril's routing system to show different [components](frontend.md#components) for different routes. Mithril allows you to use any component you like, even a Modal or Alert, but we recommend sticking to component classes that inherit the `Page` component. - -## Component Trang - -We provide `flarum/common/components/Page` as a base class for pages in both the `admin` and `forum` frontends. It has a few benefits: - -- Automatically updates [`app.current` and `app.previous` PageState](#pagestate) when switching from one route to another. -- Automatically closes the modal and drawer when switching from one route to another. -- Applies `this.bodyClass` (if defined) to the '#app' HTML element when the page renders. -- It's also good for consistency's sake to use a common base class for all pages. -- If the page's `scrollTopOnCreate` attribute is set to `false` in `oninit`, the page won't be scrolled to the top when changed. -- If the page's `useBrowserScrollRestoration` is set to `false` in `oninit`, the browser's automatic scroll restoration won't be used on that page. - -Page components work just like any other inherited component. For a (very simple) example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - view() { - return

Hello!

- } -} -``` - -### Đặt Trang làm Trang chủ - -Flarum uses a setting to determine which page should be the homepage: this gives admins flexibility to customize their communities. To add your custom page to the homepage options in Admin, you'll need to extend the `BasicsPage.homePageItems` method with your page's path. - -An example from the [Tags extension](https://github.com/flarum/tags/blob/master/js/src/admin/addTagsHomePageOption.js): - -```js -import { extend } from 'flarum/common/extend'; -import BasicsPage from 'flarum/common/components/BasicsPage'; - -export default function() { - extend(BasicsPage.prototype, 'homePageItems', items => { - items.add('tags', { - path: '/tags', - label: app.translator.trans('flarum-tags.admin.basics.tags_label') - }); - }); -} -``` - -To learn how to set up a path/route for your custom page, see the [relevant documentation](routes.md). - -### Tiêu đề trang - -Often, you'll want some custom text to appear in the browser tab's title for your page. For instance, a tags page might want to show "Tags - FORUM NAME", or a discussion page might want to show the title of the discussion. - -To do this, your page should include calls to `app.setTitle()` and `app.setTitleCount()` in its `oncreate` [lifecycle hook](frontend.md) (or when data is loaded, if it pulls in data from the API). - -For example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - oncreate(vnode) { - super.oncreate(vnode); - - app.setTitle("Cool Page"); - app.setTitleCount(0); - } - - view() { - // ... - } -} - -export default class CustomPageLoadsData extends Page { - oninit(vnode) { - super.oninit(vnode); - - app.store.find("users", 1).then(user => { - app.setTitle(user.displayName()); - app.setTitleCount(0); - }) - } - - view() { - // ... - } -} -``` - -Please note that if your page is [set as the homepage](#setting-page-as-homepage), `app.setTitle()` will clear the title for simplicity. It should still be called though, to prevent titles from previous pages from carrying over. - -## PageState - -Sometimes, we want to get information about the page we're currently on, or the page we've just come from. To allow this, Flarum creates (and stores) instances of [`PageState`](https://api.docs.flarum.org/js/master/class/src/common/states/pagestate.js~pagestate) as `app.current` and `app.previous`. These store: - -- The component class being used for the page -- A collection of data that each page sets about itself. The current route name is always included. - -Data can be set to, and retrieved from, Page State using: - -```js -app.current.set(KEY, DATA); -app.current.get(KEY); -``` - -For example, this is how the Discussion Page makes its [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) instance globally available. - -You can also check the type and data of a page using `PostStreamState`'s `matches` method. For instance, if we want to know if we are currently on a discussion page: - -```jsx -import IndexPage from 'flarum/forum/components/DiscussionPage'; -import DiscussionPage from 'flarum/forum/components/DiscussionPage'; - -// To just check page type -app.current.matches(DiscussionPage); - -// To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -## Admin Pages - -See the [Admin Dashboard documentation](admin.md) for more information on tools specifically available to admin pages (and how to override the admin page for your extension). - -## Route Resolvers (Advanced) - -[Advanced use cases](https://mithril.js.org/route.html#advanced-component-resolution) can take advantage of Mithril's [route resolver system](https://mithril.js.org/route.html#routeresolver). Flarum actually already wraps all its components in the `flarum/common/resolvers/DefaultResolver` resolver. This has the following benefits: - -- It passes a `routeName` attr to the current page, which then provides it to `PageState` -- It assigns a [key](https://mithril.js.org/keys.html#single-child-keyed-fragments) to the top level page component. When the route changes, if the top level component's key has changed, it will be completely rerendered (by default, Mithril does not rerender components when switching from one page to another if both are handled by the same component). - -### Using Route Resolvers - -There are actually 3 ways to set the component / route resolver when registering a route: - -- the `resolver` key can be used to provide an **instance** of a route resolver. This instance should define which component should be used, and hardcode the route name to be passed into it. This instance will be used without any modifications by Flarum. -- The `resolverClass` key AND `component` key can be used to provide a **class** that will be used to instantiate a route resolver, to be used instead of Flarum's default one, as well as the component to use. Its constructor should take 2 arguments: `(component, routeName)`. -- The `component` key can be used alone to provide a component. This will result in the default behavior. - -For example: - -```js -// See above for a custom page example -import CustomPage from './components/CustomPage'; -// See below for a custom resolver example -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Use a route resolver instance -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Use a custom route resolver class -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Use the default resolver class (`flarum/common/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -### Custom Resolvers - -We strongly encourage custom route resolvers to extend `flarum/common/resolvers/DefaultResolver`. For example, Flarum's `flarum/forum/resolvers/DiscussionPageResolver` assigns the same key to all links to the same discussion (regardless of the current post), and triggers scrolling when using `m.route.set` to go from one post to another on the same discussion page: - -```js -import DefaultResolver from '../../common/resolvers/DefaultResolver'; - -/** - * This isn't exported as it is a temporary measure. - * A more robust system will be implemented alongside UTF-8 support in beta 15. - */ -function getDiscussionIdFromSlug(slug: string | undefined) { - if (!slug) return; - return slug.split('-')[0]; -} - -/** - * A custom route resolver for DiscussionPage that generates the same key to all posts - * on the same discussion. It triggers a scroll when going from one post to another - * in the same discussion. - */ -export default class DiscussionPageResolver extends DefaultResolver { - static scrollToPostNumber: number | null = null; - - makeKey() { - const params = { ...m.route.param() }; - if ('near' in params) { - delete params.near; - } - params.id = getDiscussionIdFromSlug(params.id); - return this.routeName.replace('.near', '') + JSON.stringify(params); - } - - onmatch(args, requestedPath, route) { - if (route.includes('/d/:id') && getDiscussionIdFromSlug(args.id) === getDiscussionIdFromSlug(m.route.param('id'))) { - DiscussionPageResolver.scrollToPostNumber = parseInt(args.near); - } - - return super.onmatch(args, requestedPath, route); - } - - render(vnode) { - if (DiscussionPageResolver.scrollToPostNumber !== null) { - const number = DiscussionPageResolver.scrollToPostNumber; - // Scroll after a timeout to avoid clashes with the render. - setTimeout(() => app.current.get('stream').goToNumber(number)); - DiscussionPageResolver.scrollToPostNumber = null; - } - - return super.render(vnode); - } -} -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend.md deleted file mode 100644 index 7146b83c1..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/frontend.md +++ /dev/null @@ -1,422 +0,0 @@ -# Phát triển Frontend - -This page describes how to make changes to Flarum's user interface. How to add buttons, marquees, and blinking text. 🤩 - -[Remember](/extend/start.md#architecture), Flarum's frontend is a **single-page JavaScript application**. There's no Twig, Blade, or any other kind of PHP template to speak of. The few templates that are present in the backend are only used to render search-engine-optimized content. All changes to the UI need to be made via JavaScript. - -Flarum has two separate frontend applications: - -* `forum`, the public side of your forum where users create discussions and posts. -* `admin`, the private side of your forum where, as an administrator of your forum, you configure your Flarum installation. - -They share the same foundational code, so once you know how to extend one, you know how to extend both. - -:::tip Typings! - -Along with new TypeScript support, we have a [`tsconfig` package](https://www.npmjs.com/package/flarum-tsconfig) available, which you should install as a dev dependency to gain access to our typings. Make sure you follow the instructions in the [package's README](https://github.com/flarum/flarum-tsconfig#readme) to configure typings support. - -::: - -## Biên dịch và cấu trúc tập tin - -This portion of the guide will explain the necessary file setup for extensions. Once again, we highly recommend using the [Flarum CLI](https://github.com/flarum/cli) to set up the file structure for you. That being said, you should still read this to understand what's going on beneath the surface. - -Before we can write any JavaScript, we need to set up a **transpiler**. This allows us to use [TypeScript](https://www.typescriptlang.org/) and its magic in Flarum core and extensions. - -In order to do this transpilation, you need to be working in a capable environment. No, not the home/office kind of environment – you can work in the bathroom for all I care! I'm talking about the tools that are installed on your system. You'll need: - -* Node.js and npm ([Download](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) - -This can be tricky because everyone's system is different. From the OS you're using, to the program versions you have installed, to the user access permissions – I get chills just thinking about it! If you run into trouble, ~~tell him I said hi~~ use [Google](https://google.com) to see if someone has encountered the same error as you and found a solution. If not, ask for help from the [Flarum Community](https://discuss.flarum.org) or on the [Discord chat](https://flarum.org/discord/). - -It's time to set up our little JavaScript transpilation project. Create a new folder in your extension called `js`, then pop in a couple of new files. A typical extension will have the following frontend structure: - -``` -js -├── dist (compiled js is placed here) -├── src -│ ├── admin -│ └── forum -├── admin.js -├── forum.js -├── package.json -├── tsconfig.json -└── webpack.config.js -``` - -### package.json - -```json -{ - "private": true, - "name": "@acme/flarum-hello-world", - "dependencies": { - "flarum-webpack-config": "^1.0.0", - "webpack": "^4.0.0", - "webpack-cli": "^4.0.0" - }, - "devDependencies": { - "flarum-tsconfig": "^1.0.0" - }, - "scripts": { - "dev": "webpack --mode development --watch", - "build": "webpack --mode production" - } -} -``` - -This is a standard JS [package-description file](https://docs.npmjs.com/files/package.json), used by npm and Yarn (Javascript package managers). You can use it to add commands, js dependencies, and package metadata. We're not actually publishing a npm package: this is simply used to collect dependencies. - -Please note that we do not need to include `flarum/core` or any flarum extensions as dependencies: they will be automatically packaged when Flarum compiles the frontends for all extensions. - -### webpack.config.js - -```js -const config = require('flarum-webpack-config'); - -module.exports = config(); -``` - -[Webpack](https://webpack.js.org/concepts/) is the system that actually compiles and bundles all the javascript (and its dependencies) for our extension. To work properly, our extensions should use the [official flarum webpack config](https://github.com/flarum/flarum-webpack-config) (shown in the above example). - -### tsconfig.json - -```json -{ - // Use Flarum's tsconfig as a starting point - "extends": "flarum-tsconfig", - // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder - // and also tells your Typescript server to read core's global typings for - // access to `dayjs` and `$` in the global namespace. - "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"], - "compilerOptions": { - // This will output typings to `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] - } - } -} -``` - -This is a standard configuration file to enable support for Typescript with the options that Flarum needs. - -Always ensure you're using the latest version of this file: https://github.com/flarum/flarum-tsconfig#readme. - -Even if you choose not to use TypeScript in your extension, which is supported natively by our Webpack config, it's still recommended to install the `flarum-tsconfig` package and to include this configuration file so that your IDE can infer types for our core JS. - -To get the typings working, you'll need to run `composer update` in your extension's folder to download the latest copy of Flarum's core into a new `vendor` folder. Remember not to commit this folder if you're using a version control system such as Git. - -You may also need to restart your IDE's TypeScript server. In Visual Studio Code, you can press F1, then type "Restart TypeScript Server" and hit ENTER. This might take a minute to complete. - -### admin.js và forum.js - -These files contain the root of our actual frontend JS. You could put your entire extension here, but that would not be well organized. For this reason, we recommend putting the actual source code in `src`, and having these files just export the contents of `src`. For instance: - -```js -// admin.js -export * from './src/admin'; - -// forum.js -export * from './src/forum'; -``` - -### src - -If following the recommendations for `admin.js` and `forum.js`, we'll want to have 2 subfolders here: one for `admin` frontend code, and one for `forum` frontend code. If you have components, models, utils, or other code that is shared across both frontends, you may want to create a `common` subfolder and place it there. - -Structure for `admin` and `forum` is identical, so we'll just show it for `forum` here: - -``` -src/forum/ -├── components/ -|-- models/ -├── utils/ -└── index.js -``` - -`components`, `models`, and `utils` are directories that contain files where you can define custom [components](#components), [models](models.md#frontend-models), and reusable util helper functions. Please note that this is all simply a recommendation: there's nothing forcing you to use this particular file structure (or any other file structure). - -The most important file here is `index.js`: everything else is just extracting classes and functions into their own files. Let's go over a typical `index.js` file structure: - -```js -import { extend, override } from 'flarum/common/extend'; - -// We provide our extension code in the form of an "initializer". -// This is a callback that will run after the core has booted. -app.initializers.add('acme-flarum-hello-world', function(app) { - // Your Extension Code Here - console.log("EXTENSION NAME is working!"); -}); -``` - -We'll go over tools available for extensions below. - -### Nhập - -You should familiarize yourself with proper syntax for [importing js modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), as most extensions larger than a few lines will split their js into multiple files. - -Pretty much every Flarum extension will need to import *something* from Flarum Core. Like most extensions, core's JS source code is split up into `admin`, `common`, and `forum` folders. You can import the file by prefixing its path in the Flarum core source code with `flarum`. So `admin/components/AdminLinkButton` is available as `flarum/admin/components/AdminLinkButton`, `common/Component` is available as `flarum/common/Component`, and `forum/states/PostStreamState` is available as `flarum/forum/states/PostStreamState`. - -In some cases, an extension may want to extend code from another flarum extension. This is only possible for extensions which explicitly export their contents. - -* `flarum/tags` and `flarum/flags` are currently the only bundled extensions that allow extending their JS. You can import their contents from `flarum/{EXT_NAME}/PATH` (e.g. `flarum/tags/components/TagHero`). -* The process for extending each community extension is different; you should consult documentation for each individual extension. - -### Biên dịch - -OK, time to fire up the transpiler. Run the following commands in the `js` directory: - -```bash -npm install -npm run dev -``` - -This will compile your browser-ready JavaScript code into the `js/dist/forum.js` file, and keep watching for changes to the source files. Nifty! - -When you've finished developing your extension (or before a new release), you'll want to run `npm run build` instead of `npm run dev`: this builds the extension in production mode, which makes the source code smaller and faster. - -## Đăng ký asset - -### JavaScript - -In order for your extension's JavaScript to be loaded into the frontend, we need to tell Flarum where to find it. We can do this using the `Frontend` extender's `js` method. Add it to your extension's `extend.php` file: - -```php -js(__DIR__.'/js/dist/forum.js') -]; -``` - -Flarum will make anything you `export` from `forum.js` available in the global `flarum.extensions['acme-hello-world']` object. Thus, you may choose to expose your own public API for other extensions to interact with. - -:::tip External Libraries - -Only one main JavaScript file per extension is permitted. If you need to include any external JavaScript libraries, either install them with NPM and `import` them so they are compiled into your JavaScript file, or see [Routes and Content](/extend/routes.md) to learn how to add extra `'; - }) -]; -``` - -You can also add content onto your frontend route registrations: - -```php -return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) -]; -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/search.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/search.md deleted file mode 100644 index e22b5f116..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/search.md +++ /dev/null @@ -1,202 +0,0 @@ -# Tìm kiếm và Lọc - -Flarum treats searching and filtering as parallel but distinct processes. Which process is used to handle a request to a [`List` API endpoint](/extend/api.md#api-endpoints) depends on the query parameters: - -- Filtering is applied when the `filter[q]` query param is omitted. Filters represent **structured** queries: for instance, you might want to only retrieve discussions in a certain category, or users who registered before a certain date. Filtering computes results based entirely on `filter[KEY] = VALUE` query parameters. -- Searching is applied when the `filter[q]` query param is included. Searches represent **unstructured** queries: the user submits an arbitrary string, and data records that "match" it are returned. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Searching computes results based solely on parsing the `filter[q]` query param: all other `filter[KEY] = VALUE` params are ignored when searching. It's important to note that searches aren't entirely unstructured: the dataset being searched can be constrained by gambits (which are very similar to filters, and will be explained later). - -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. - -Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. - -One key advantage of this split is that it allows searching to be implemented via an external service, such as ElasticSearch. For larger communities, this can be significantly more performant and accurate. There isn't a dedicated extender for this yet, so for now, replacing the default Flarum search driver requires overriding the container bindings of `Searcher` classes. This is a highly advanced use case; if you're interested in doing this, please reach out on our [community forums](https://discuss.flarum.org/). - -Remember that the [JSON:API schema](https://jsonapi.org/format) is used for all API requests. - -:::tip Reuse Code - -Often, you might want to use the same class as both a `Filter` and a `Gambit` (both explained below). Your classes can implement both interface; see Flarum core's [`UnreadFilterGambit`](https://github.com/flarum/framework/blob/main/framework/core/src/Discussion/Query/UnreadFilterGambit.php) for an example. - -::: - -:::tip Query Builder vs Eloquent Builder - -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps - -::: - -## Filtering - -Filtering constrains queries based on `Filters` (highlighted in code to avoid confusion with the process of filtering), which are classes that implement `Flarum\Filter\FilterInterface` and run depending on query parameters. After filtering is complete, a set of callbacks called "filter mutators" run for every filter request. - -When the `filter` method on a `Filterer` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Filter/AbstractFilterer.php#L50-L93)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Filterer` class's `getQuery()` method. -2. We loop through all `filter[KEY] = VALUE` query params. For each of these, any `Filter`s registered to the model whose `getFilterKey()` method matches the query param `KEY` is applied. `Filter`s can be negated by providing the query param as `filter[-KEY] = VALUE`. Whether or not a `Filter` is negated is passed to it as an argument: implementing negation is up to the `Filter`s. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "filter mutators" are applied. These are callbacks that receive the filter state (a wrapper around the query builder and current user) and filter criteria, and perform some arbitrary changes. All "filter mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Filtering for an Existing Model - -Let's say you've added a `country` column to the User model, and would like to filter users by country. We'll need to define a custom `Filter`: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -Note that `FilterState` is a wrapper around the Eloquent builder's underlying Query builder and the current user. - -Also, let's pretend that for some reason, we want to omit any users that have a different country from the current user on ANY filter. We can use a "filter mutator" for this: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -Now, all we need to do is register these via the Filter extender: - -```php - // Other extenders - (new Extend\Filter(UserFilterer::class)) - ->addFilter(CountryFilter::class) - ->addFilterMutator(OnlySameCountryFilterMutator::class), - // Other extenders -``` - -### Add Filtering to a New Model - -To filter a model that doesn't support filtering, you'll need to create a subclass of `Flarum/Filter/AbstractFilterer` for that model. For an example, see core's [UserFilterer](https://github.com/flarum/framework/blob/main/framework/core/src/User/Filter/UserFilterer.php). - -Then, you'll need to use that filterer in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -## Searching - -Searching constrains queries by applying `Gambit`s, which are classes that implement `Flarum\Search\GambitInterface`, based on the `filter[q]` query param. After searching is complete, a set of callbacks called "search mutators" run for every search request. - -When the `search` method on a `Searcher` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Search/AbstractSearcher.php#L55-L79)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Searcher` class's `getQuery()` method. -2. The `filter[q]` param is split by spaces into "tokens". Each token is matched against the model's registered `Gambit`s (each gambit has a `match` method). For any tokens that match a gambit, that gambit is applied, and the token is removed from the query string. Once all regular `Gambit`s have ran, all remaining unmatched tokens are passed to the model's `FullTextGambit`, which implements the actual searching logic. For example if searching discussions, in the `filter[q]` string `'author:1 hello is:hidden' world`, `author:1` and `is:hidden` would get matched by core's Author and Hidden gambits, and `'hello world'` (the remaining tokens) would be passed to the `DiscussionFulltextGambit`. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "search mutators" are applied. These are callbacks that receive the search state (a wrapper around the query builder and current user) and criteria, and perform some arbitrary changes. All "search mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Searching for an Existing Model - -Let's reuse the "country" examples we used above, and see how we'd implement the same things for searching: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -:::warning No Spaces in Gambit Patterns! - -Flarum splits the `filter[q]` string into tokens by splitting it at spaces. This means that your custom gambits can NOT use spaces as part of their pattern. - -::: - -:::tip AbstractRegexGambit - -All a gambit needs to do is implement `Flarum\Search\GambitInterface`, which receives the search state and a token. It should return if this gambit applies for the given token, and if so, make whatever mutations are necessary to the query builder accessible as `$searchState->getQuery()`. - -However, for most gambits, the `AbstractRegexGambit` abstract class (used above) should be used as a base class. This makes it a lot simpler to match and apply gambits. - -::: - -Similarly, the search mutator we need is almost identical to the filter mutator from before: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -We can register these via the `SimpleFlarumSearch` extender (in the future, the `Search` extender will be used for registering custom search drivers): - -```php - // Other extenders - (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(CountryGambit::class) - ->addSearchMutator(OnlySameCountrySearchMutator::class), - // Other extenders -``` - -### Add Searching to a New Model - -To support searching for a model, you'll need to create a subclass of `Flarum/Search/AbstractSearcher` for that model. For an example, see core's [UserSearcher](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/UserSearcher.php). - -Then, you'll need to use that searcher in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -Every searcher **must** have a fulltext gambit (the logic that actually does the searching). Otherwise, it won't be booted by Flarum, and you'll get an error. See core's [FulltextGambit for users](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/Gambit/FulltextGambit.php) for an example. You can set (or override) the full text gambit for a searcher via the `SimpleFlarumSearch` extender's `setFullTextGambit()` method. - -### Search Drivers - -Coming soon! - -## Frontend Tools - -Coming soon! diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/service-provider.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/service-provider.md deleted file mode 100644 index 07e3e4d91..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/service-provider.md +++ /dev/null @@ -1,65 +0,0 @@ -# Service Provider - -As noted throughout this documentation, Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection. [Service Providers](https://laravel.com/docs/8.x/providers) allow low-level configuration and modification of the Flarum backend. The most common use case for service providers is to create, modify, or replace container bindings. That being said, service providers allow you full access to run whatever logic you need during application boot with access to the container. - -:::caution Advanced Use Only!!! - -Unlike with other extenders, the Service Provider layer is NOT use-case driven, and is NOT considered public API. It is subject to change at any time, without notice or deprecation. This should only be used if you know what you're doing, and the other extenders don't satisfy your use case. - -::: - -## Flarum Boot Process - -To understand service providers, you must first understand the order in which Flarum boots. Most of this happens in [Flarum\Foundation\InstalledSite](https://github.com/flarum/framework/blob/main/framework/core/src/Foundation/InstalledSite.php) - -1. The container and application are initialized, and essential bindings (config, environment, logger) are registered -2. The `register` methods of all core service providers are run. -3. The `extend` methods of all extenders used by all enabled extensions are run. -4. The `extend` methods of all extenders used in the Flarum site's local `extend.php` are run. -5. The `boot` methods of all core service providers are run. - -## Custom Service Providers - -A custom service provider should extend `Flarum\Foundation\AbstractServiceProvider`, and can have a `boot` and a `register` method. For example: - -```php -container->resolving(SomeClass::class, function ($container) { - return new SomeClass($container->make('some.binding')); - }); - } - - public function boot(Container $container) - { - // custom logic here - } -} -``` - -The `register` method will run during step (3) above, and the `boot` method will run during step (5) above. In the `register` method, the container is available via `$this->container`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. - -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane) for more information. - -To actually register your custom service provider, you can use the `ServiceProvider` extender in `extend.php`: - -```php -register(CustomServiceProvider::class), - // Other extenders -]; -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/settings.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/settings.md deleted file mode 100644 index ffefdcde5..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/settings.md +++ /dev/null @@ -1,90 +0,0 @@ -# Settings - -At some point while making an extension, you might want to read some of the forum's settings or store certain settings specific to your extension. Thankfully, Flarum makes this very easy. - -## The Settings Repository - -Reading or changing settings can be done using an implementation of the `SettingsRepositoryInterface`. Because Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection, you don't need to worry about where to obtain such a repository, or how to instantiate one. Instead, you can rely on the container to instantiate your class and inject the correct dependencies. - -```php -settings = $settings; - } -} -``` - -Great! Now the `SettingsRepositoryInterface` is available through `$this->settings` to our class. - -### Reading Settings - -To read settings, all we have to do is use the repository's `get()` function: - -`$this->settings->get('forum_title')` - -The `get()` function accepts two arguments: - -1. The name of the setting you are trying to read. -2. (Optional) A default value if no value has been stored for such a setting. By default, this will be `null`. - -### Storing Settings - -Storing settings ist just as easy, use the `set()` function: - -`$this->settings->set('forum_title', 'Super Awesome Forum')` - -The `set` function also accepts two arguments: - -1. The name of the setting you are trying to change. -2. The value you want to store for this setting. - -### Other Functions - -The `all()` function returns an array of all known settings. - -The `delete($name)` function lets you remove a named setting. - -## Settings in the Frontend - -### Editing Settings - -To learn more about adding settings through the admin dashboard, see the [relevant documentation](admin.md). -### Accessing Settings - -All settings are available in the `admin` frontend via the `app.data.settings` global. However, this is not done in the `forum` frontend, as anyone can access it, and you wouldn't want to leak all your settings! (Seriously, that could be a very problematic data breach). - -Instead, if we want to use settings in the `forum` frontend, we'll need to serialize them and send them alongside the initial forum data payload. - -This can be done via the `Settings` extender. For example: - -**extend.php** - -```php -use Flarum\Extend; - -return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }, "default value!"), -] -``` - -Now, the `my.cool.setting.key` setting will be accessible in the frontend as `app.forum.attribute("myCoolSetting")`, and our modified value will be accessible via `app.forum.attribute("myCoolSettingModified")`. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/slugging.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/slugging.md deleted file mode 100644 index 3dc39416b..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/slugging.md +++ /dev/null @@ -1 +0,0 @@ -# Model Slugging diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/start.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/start.md deleted file mode 100644 index 88fa6ed95..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/start.md +++ /dev/null @@ -1,153 +0,0 @@ -# Bắt đầu - -Want to build a Flarum extension? You've come to the right place! This document will take you through some essential concepts, after which you'll build your first Flarum extension from scratch. - -## Cấu tạo - -Để hiểu cách mở rộng Flarum, trước tiên chúng ta cần hiểu một chút về cách Flarum được xây dựng. - -Be aware that Flarum uses some _modern_ languages and tools. If you've only ever built WordPress plugins before, you might feel a bit out of your depth! That's OK — this is a great time to learn cool new things and extend your skillset. However, we would advise that you become somewhat familiar with the technologies described below before proceeding. - -Flarum được tạo thành từ ba lớp: - -* First, there is the **backend**. This is written in [object-oriented PHP](https://laracasts.com/series/object-oriented-bootcamp-in-php), and makes use of a wide array of [Laravel](https://laravel.com/) components and other packages via [Composer](https://getcomposer.org/). You'll also want to familiarize yourself with the concept of [Dependency Injection](https://laravel.com/docs/8.x/container), which is used throughout our backend. - -* Second, the backend exposes a **public API** which allows frontend clients to interface with your forum's data. This is built according to the [JSON:API specification](https://jsonapi.org/). - -* Finally, there is the default web interface which we call the **frontend**. This is a [single-page application](https://en.wikipedia.org/wiki/Single-page_application) which consumes the API. It's built with a simple React-like framework called [Mithril.js](https://mithril.js.org). - -Extensions will often need to interact with all three of these layers to make things happen. For example, if you wanted to build an extension that adds custom fields to user profiles, you would need to add the appropriate database structures in the **backend**, expose that data in the **public API**, and then display it and allow users to edit it on the **frontend**. - -So... how do we extend these layers? - -## Bộ mở rộng - -In order to extend Flarum, we will be using a concept called **extenders**. Extenders are *declarative* objects that describe in plain terms the goals you are trying to achieve (such as adding a new route to your forum, or executing some code when a new discussion was created). - -Every extender is different. However, they will always look somewhat similar to this: - -```php -// Đăng ký JavaScript và tệp CSS để được gửi bằng frontend của diễn đàn -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') -``` - -You first create an instance of the extender, and then call methods on it for further configuration. All of these methods return the extender itself, so that you can achieve your entire configuration just by chaining method calls. - -To keep things consistent, we use this concept of extenders in both the backend (in PHP land) and the frontend (in JavaScript land). _Everything_ you do in your extension should be done via extenders, because they are a **guarantee** we are giving to you that a future minor release of Flarum won't break your extension. - -All of the extenders currently available to you from Flarum's core can be found in the [`Extend` namespace](https://github.com/flarum/framework/blob/main/framework/core/src/Extend) [(PHP API documentation)](https://api.docs.flarum.org/php/master/flarum/extend) Extensions may also offer their [own extenders](extensibility.md#custom-extenders). - -## Hello World - -Want to see an extender in action? The `extend.php` file in the root of your Flarum installation is the easiest way to register extenders just for your site. It should return an array of extender objects. Pop it open and add the following: - -```php -content(function (Document $document) { - $document->head[] = ''; - }) -]; -``` - -Now pay your forum a visit for a pleasant (albeit extremely obtrusive) greeting. 👋 - -For simple site-specific customizations – like adding a bit of custom CSS/JavaScript, or integrating with your site's authentication system – the `extend.php` file in your forum's root is great. But at some point, your customization might outgrow it. Or maybe you have wanted to build an extension to share with the community from the get-go. Time to build an extension! - -## Gói Tiện ích mở rộng - -[Composer](https://getcomposer.org) is a dependency manager for PHP. It allows applications to easily pull in external code libraries and makes it easy to keep them up-to-date so that security and bug fixes are propagated rapidly. - -As it turns out, every Flarum extension is also a Composer package. That means someone's Flarum installation can "require" a certain extension and Composer will pull it in and keep it up-to-date. Nice! - -During development, you can work on your extensions locally and set up a [Composer path repository](https://getcomposer.org/doc/05-repositories.md#path) to install your local copy. Create a new `packages` folder in the root of your Flarum installation, and then run this command to tell Composer that it can find packages in here: - -```bash -composer config repositories.0 path "packages/*" -``` - -Now let's start building our first extension. Make a new folder inside `packages` for your extension called `hello-world`. We'll put two files in it: `extend.php` and `composer.json`. These files serve as the heart and soul of the extension. - -### extend.php - -The `extend.php` file is just like the one in the root of your site. It will return an array of extender objects that tell Flarum what you want to do. For now, just move over the `Frontend` extender that you had earlier. - -### composer.json - -Chúng tôi cần cho Composer biết một chút về gói của chúng tôi và chúng tôi có thể làm điều này bằng cách tạo tệp `composer.json`: - -```json -{ - "name": "acme/flarum-hello-world", - "description": "Say hello to the world!", - "type": "flarum-extension", - "require": { - "flarum/core": "^1.0.0" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } - } -} -``` - -* **name** là tên của gói Composer ở định dạng `vendor/package`. - * You should choose a vendor name that’s unique to you — your GitHub username, for example. For the purposes of this tutorial, we’ll assume you’re using `acme` as your vendor name. - * Bạn nên đặt tiền tố phần `package` bằng `flarum-`để cho biết rằng đó là một gói được thiết kế đặc biệt để sử dụng với Flarum. - -* **description** là một mô tả ngắn một câu về chức năng của tiện ích. - -* **type** MUST be set to `flarum-extension`. This ensures that when someone "requires" your extension, it will be identified as such. - -* **require** chứa danh sách các phần phụ thuộc của tiện ích mở rộng của bạn. - * Bạn sẽ muốn chỉ định phiên bản Flarum mà tiện ích mở rộng của bạn tương thích tại đây. - * Đây cũng là nơi liệt kê các thư viện Composer khác mà mã của bạn cần để hoạt động. - -* **autoload** tells Composer where to find your extension's classes. The namespace in here should reflect your extensions' vendor and package name in CamelCase. - -* **extra.flarum-extension** chứa một số thông tin cụ thể về Flarum, như tên hiển thị của tiện ích mở rộng của bạn và biểu tượng của nó trông như thế nào. - * **title** là tên hiển thị của tiện ích mở rộng của bạn. - * **icon** is an object which defines your extension's icon. The **name** property is a [Font Awesome icon class name](https://fontawesome.com/icons). All other properties are used as the `style` attribute for your extension's icon. - -Xem tài liệu [lược đồ composer.json](https://getcomposer.org/doc/04-schema.md) để biết thông tin về các thuộc tính khác mà bạn có thể thêm vào `composer.json`. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -Sử dụng CLI để tự động tạo giàn giáo cho tiện ích mở rộng của bạn: -```bash -$ flarum-cli init -``` - -::: - -### Cài đặt Tiện ích mở rộng của bạn - -The final thing we need to do to get up and running is to install your extension. Navigate to the root directory of your Flarum install and run the following command: - -```bash -composer require acme/flarum-hello-world *@dev -``` - -Sau khi hoàn tất, hãy tiếp tục và kích hoạt trên trang Quản trị của diễn đàn, sau đó điều hướng trở lại diễn đàn của bạn. - -*tiếng vù vù, vù vù, tiếng kêu kim loại* - -Woop! Hello to you too, extension! - -We're making good progress. We've learned how to set up our extension and use extenders, which opens up a lot of doors. Read on to learn how to extend Flarum's frontend. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md deleted file mode 100644 index 28e6c4aa7..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md +++ /dev/null @@ -1,86 +0,0 @@ -# Static Code Analysis - -Static code analysis is the process of analyzing the source code against a set of rules to find bugs, code smells, and security vulnerabilities. This is a great way to improve the quality of your code and to find potential issues before they are deployed to production. An example is validating the typings of a function to ensure that the function is called with the correct arguments. - -Flarum provides a static code analysis package based on [PHPStan](https://phpstan.org/) that can be added to your extension. In this guide, we will show you how to add the package to your extension and how to run the analysis. - -## Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update the infrastructure for phpstan to your code: - -```bash -$ flarum-cli infra phpstan -``` - -::: - -First you need to require the `flarum/phpstan` package in your extension. You can do this by running the following command in the root of our extension: - -```bash -composer require --dev flarum/phpstan:^1.0 -``` - -Next, you need to create a `phpstan.neon` file in the root of your extension. This file contains [the configuration for PHPStan](https://phpstan.org/config-reference). You can copy the following configuration into the file: - -```neon -includes: - - vendor/flarum/phpstan/extension.neon - -parameters: - # The level will be increased in Flarum 2.0 - level: 5 - paths: - - src - - extend.php - excludePaths: - - *.blade.php - checkMissingIterableValueType: false - databaseMigrationsPath: ['migrations'] -``` - -Finally, you need to add the following script to your `composer.json` file: - -```json -{ - "scripts": { - "analyse:phpstan": "phpstan analyse", - "clear-cache:phpstan": "phpstan clear-result-cache" - }, - "scripts-descriptions": { - "analyse:phpstan": "Run static analysis" - } -} -``` - -## Running the analysis - -To run the analysis, you can run the following command in the root of your extension: - -```bash -composer analyse:phpstan -``` - -If you want to clear the cache before running the analysis, you can run the following command: - -```bash -composer clear-cache:phpstan && composer analyse:phpstan -``` - -## GitHub Actions - -You can also run the analysis using GitHub Actions. Checkout the page on [GitHub Actions](github-actions.md) for more information. - -## Tips - -### Extended model attribute types - -PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. - -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. - -```php -(new Extend\Model(User::class)) - ->cast('is_cool', 'bool'), -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/testing.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/testing.md deleted file mode 100644 index f9d866094..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/testing.md +++ /dev/null @@ -1,565 +0,0 @@ -# Testing - -Automated testing ensures that your extension performs as you expect it to, helps avoid introducing new bugs or regressions, and saves time on manual testing. Flarum currently provides tooling for automated backend unit and integration tests, and we plan to release support for frontend unit testing and E2E testing in the future. - -## Backend Tests - -The `flarum/testing` library is used by core and some bundled extensions for automated unit and integration tests. It is essentially a collection of utils that allow testing Flarum core and extensions with PHPUnit. - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update backend testing infrastructure to your code: - -```bash -$ flarum-cli infra backendTesting -``` - -::: - -```bash -composer require --dev flarum/testing:^1.0 -``` - -Then, you will need to set up a file structure for tests, and add PHPUnit configuration: - -``` -tests -├── fixtures (put any files needed by your tests here (blade templates, images, etc)) -├── integration -│ ├── setup.php (code below) -│ └── PUT INTEGRATION TESTS HERE (organizing into folder is generally a good idea) -├── unit -│ ├── PUT UNIT TESTS HERE -├── phpunit.integration.xml (code below) -└── phpunit.unit.xml (code below) -``` - -#### phpunit.integration.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for integration tests. You can tweak this as needed, but keep `backupGlobals`, `backupStaticAttributes`, and `processIsolation` unchanged. - -```xml - - - - - - - ./integration - - - -``` - -#### phpunit.unit.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for unit tests. You can tweak this as needed. - -```xml - - - - - - - ./unit - - - - - - -``` - -#### setup.php - -This script will be run to set up a testing database / file structure. - -```php -run(); -``` - -#### composer.json Modifications - -We will also want to add scripts to our `composer.json`, so that we can run our test suite via `composer test`. Add some variant of the following to your `composer.json`: - -```json -"scripts": { - "test": [ - "@test:unit", - "@test:integration" - ], - "test:unit": "phpunit -c tests/phpunit.unit.xml", - "test:integration": "phpunit -c tests/phpunit.integration.xml", - "test:setup": "@php tests/integration/setup.php" -}, -"scripts-descriptions": { - "test": "Runs all tests.", - "test:unit": "Runs all unit tests.", - "test:integration": "Runs all integration tests.", - "test:setup": "Sets up a database for use with integration tests. Execute this only once." -} -``` - -#### Github Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - ---- - -Now that we have everything in place, we need to set up our testing site for integration tests. For this, we will need a MySQL or MariaDb instance, and a place to store testing files. - -Testing database information is configured via the `DB_HOST` (defaults to `localhost`), `DB_PORT` (defaults to `3306`), `DB_DATABASE` (defaults to `flarum_test`), `DB_USERNAME` (defaults to `root`), `DB_PASSWORD` (defaults to `root`), and `DB_PREFIX` (defaults to `''`) environmental variables. The testing tmp directory path is configured via the `FLARUM_TEST_TMP_DIR_LOCAL` or `FLARUM_TEST_TMP_DIR` environmental variables, with the former taking precedence over the latter. If neither are provided, a `tmp` directory will be created in the `vendor` folder of your extension's local install. - -Now that we've provided the needed information, all we need to do is run `composer test:setup` in our extension's root directory, and we have our testing environment ready to go! - -Since [(almost)](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/tests/integration/api/discussions/ListWithFulltextSearchTest.php#L29-L45) all database operations in integration tests are run in transactions, developers working on multiple extensions will generally find it more convenient to use one shared database and tmp directory for testing all their extensions. To do this, set the database config and `FLARUM_TEST_TMP_DIR` environmental variables in your `.bashrc` or `.bash_profile` to the path you want to use, and run the setup script for any one extension (you'll still want to include the setup file in every repo for CI testing via GitHub Actions). You should then be good to go for any Flarum extension (or core). - -### Using Integration Tests - -Flarum's integration test utils are contained in the `Flarum\Testing\integration\TestCase` class. It: - -- Boots (and makes available) an instance of the Flarum application. -- Allows pre-populating the database, enabling extensions, and adding extenders. -- Runs all database changes in transactions, so your test database retains the default post-installation state. -- Allows sending requests through the middleware stack to test HTTP endpoints. - -Your testcase classes should extend this class. - -#### Test Case Setup - -There are several important utilities available for your test cases: - -- The `setting($key, $value)` method allows you to override settings before the app has booted. This is useful if your boot process has logic depending on settings (e.g. which driver to use for some system). -- Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. -- The `extension($extensionId)` method will take Flarum IDs of extensions to enable as arguments. Your extension should always call this with your extension's ID at the start of test cases, unless the goal of the test case in question is to confirm some behavior present without your extension, and compare that to behavior when your extension is enabled. If your extension is dependent on other extensions, make sure they are included in the composer.json `require` field (or `require-dev` for [optional dependencies](extending-extensions.md)), and also list their composer package names when calling `extension()`. Note that you must list them in a valid order. -- The `extend($extender)` method takes instances of extenders as arguments, and is useful for testing extenders introduced by your extension for other extensions to use. -- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/8.x/queries#insert-statements). - -If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. - -:::warning - -The `TestCase` class will boot a Flarum instance the first time its `app()` method is called. Any uses of `prepareDatabase`, `extend`, or `extension` after this happens will have no effect. Make sure you have done all the setup you need in your test case before calling `app()`, or `database()`, `server()`, or `send()`, which call `app()` implicitly. If you need to make database modifications after the app has booted, you can use the regular Eloquent save method, or the `Illuminate\Database\ConnectionInterface` instance obtained via calling the `database()` method. - -::: - -Of course, since this is all based on PHPUnit, you can use the `setUp()` methods of your test classes for common setup tasks. - -For example: - -```php -setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. - ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] - ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '

something

'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - - // ... -} -``` - -#### Sending Requests - -A common application of automated testing is pinging various HTTP endpoints with various data, authenticated as different users. You can use this to ensure that: - -- Users can't access content they're not supported to access. -- Permission-based create/edit/delete operations perform as expected. -- The type and schema of data returned is correct. -- Some desired side effect is applied when pinging an API. -- The basic API operations needed by your extension aren't erroring, and don't break when you make changes. - -`TestCase` provides several utilities: - -- The `request()` method constructs a `Psr\Http\Message\ServerRequestInterface` implementing object from a path, a method, and some options, which can be used for authentication, attaching cookies, or configuring the JSON request body. See the [method docblock](https://github.com/flarum/testing/blob/main/src/integration/TestCase.php) for more information on available options. -- Once you've created a request instance, you can send it (and get a response object back) via the `send()` method. - -For example: - -```php -send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - // ... -} -``` - -:::caution - -If you want to send query parameters in a GET request, you can't include them in the path; you'll need to add them afterwards with the `withQueryParams` method. - -::: - -:::caution - -This is an extreme edge case, but note that MySQL does not update the fulltext index in transactions, so the standard approach won't work if you're trying to test a modified fulltext query. See [core's approach](https://github.com/flarum/framework/blob/main/framework/core/tests/integration/extenders/SimpleFlarumSearchTest.php) for an example of a workaround. - -::: - -#### Console Tests - -If you want to test custom console commands, you can extend `Flarum\Testing\integration\ConsoleTestCase` (which itself extends the regular `Flarum\Testing\integration\TestCase`). It provides 2 useful methods: - -- `$this->console()` returns an instance of `Symfony\Component\Console\Application` -- `$this->runCommand()` takes an array that will be wrapped in `Symfony\Component\Console\Input\ArrayInput`, and run. See the [Symfony code docblock](https://github.com/symfony/console/blob/5.x/Input/ArrayInput.php#L22) for more information. - -For example: - -```php - 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } -} -``` - -### Using Unit Tests - -Unit testing in Flarum uses [PHPUnit](https://phpunit.de/getting-started/phpunit-9.html) and so unit testing in flarum is much like any other PHP application. You can find [general tutorials on testing](https://www.youtube.com/watch?v=9-X_b_fxmRM) if you're also new to php. - -When writing unit tests in Flarum, here are some helpful tips. - -#### Mocking Flarum Services - -Unlike the running app, or even integration tests, there is no app/container/etc to inject service instances into our classes. Now all the useful settings, or helpers your extension use require a _mock_ . We want to limit mocking to just the key services, supporting only the minimum interactions needed to test the contract of our individual functions. - -```php - public function setUp(): void - { - parent::setUp(); - // example - if our setting needs settings, we can mock the settings repository - $settingsRepo = m::mock(SettingsRepositoryInterface::class); - // and then control specific return values for each setting key - $settingsRepo->shouldReceive('get')->with('some-plugin-key')->andReturn('some-value-useful-for-testing'); - // construct your class under test, passing mocked services as needed - $this->serializer = new YourClassUnderTest($settingsRepo); - } -``` - -Some aspects require more mocks. If you're validating authorization interactions for instance you might need to mock your users `User::class` and the request's method that provides them as well! - -``` - $this->actor = m::mock(User::class); - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('getAttribute->getActor')->andReturn($this->actor); - $this->actor->shouldReceive('SOME PERMISSION')->andReturn(true/false); -``` - -NOTE: If you find your extension needs _lots and lots_ of mocks, or mocks that feel unrelated, it might be an opportunity to simplify your code, perhaps moving key logic into their own smaller functions (that dont require mocks). - -## Frontend Tests - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update frontend testing infrastructure to your code: - -```bash -$ flarum-cli infra frontendTesting -``` - -::: - -First, you need to install the Jest config dev dependency: - -```bash -$ yarn add --dev @flarum/jest-config -``` - -Then, add the following to your `package.json`: - -```json -{ - "type": "module", - "scripts": { - ..., - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" - } -} -``` - -Rename `webpack.config.js` to `webpack.config.cjs`. This is necessary because Jest doesn't support ESM yet. - -Create a `jest.config.cjs` file in the root of your extension: - -```js -module.exports = require('@flarum/jest-config')(); -``` - -If you are using TypeScript, create tsconfig.test.json with the following content: - -```json -{ - "extends": "./tsconfig.json", - "include": ["tests/**/*"], - "files": ["../../../node_modules/@flarum/jest-config/shims.d.ts"] -} -``` - -Then, you will need to set up a file structure for tests: - -``` -js -├── dist -├── src -├── tests -│ ├── unit -│ │ └── functionTest.test.js -│ ├── integration -│ │ └── componentTest.test.js -├── package.json -├── tsconfig.json -├── tsconfig.test.json -├── jest.config.cjs -└── webpack.config.cjs -``` - -#### Github Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - -### Using Unit Tests - -Like any other JS project, you can use Jest to write unit tests for your frontend code. Checkout the [Jest docs](https://jestjs.io/docs/using-matchers) for more information on how to write tests. - -Here's a simple example of a unit test fo core's `abbreviateNumber` function: - -```ts -import abbreviateNumber from '../../../../src/common/utils/abbreviateNumber'; - -test('does not change small numbers', () => { - expect(abbreviateNumber(1)).toBe('1'); -}); - -test('abbreviates large numbers', () => { - expect(abbreviateNumber(1000000)).toBe('1M'); - expect(abbreviateNumber(100500)).toBe('100.5K'); -}); - -test('abbreviates large numbers with decimal places', () => { - expect(abbreviateNumber(100500)).toBe('100.5K'); - expect(abbreviateNumber(13234)).toBe('13.2K'); -}); -``` - -### Using Integration Tests - -Integration tests are used to test the components of your frontend code and the interaction between different components. For example, you might test that a page component renders the correct content based on certain parameters. - -Here's a simple example of an integration test for core's `Alert` component: - -```ts -import Alert from '../../../../src/common/components/Alert'; -import m from 'mithril'; -import mq from 'mithril-query'; -import { jest } from '@jest/globals'; - -describe('Alert displays as expected', () => { - it('should display alert messages with an icon', () => { - const alert = mq(m(Alert, { type: 'error' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toHaveElement('i.icon'); - }); - - it('should display alert messages with a custom icon when using a title', () => { - const alert = mq(Alert, { type: 'error', icon: 'fas fa-users', title: 'Woops..' }); - expect(alert).toContainRaw('Woops..'); - expect(alert).toHaveElement('i.fas.fa-users'); - }); - - it('should display alert messages with a title', () => { - const alert = mq(m(Alert, { type: 'error', title: 'Error Title' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toContainRaw('Error Title'); - expect(alert).toHaveElement('.Alert-title'); - }); - - it('should display alert messages with custom controls', () => { - const alert = mq(Alert, { type: 'error', controls: [m('button', { className: 'Button--test' }, 'Click me!')] }); - expect(alert).toHaveElement('button.Button--test'); - }); -}); - -describe('Alert is dismissible', () => { - it('should show dismiss button', function () { - const alert = mq(m(Alert, { dismissible: true }, 'Shoot!')); - expect(alert).toHaveElement('button.Alert-dismiss'); - }); - - it('should call ondismiss when dismiss button is clicked', function () { - const ondismiss = jest.fn(); - const alert = mq(Alert, { dismissible: true, ondismiss }); - alert.click('.Alert-dismiss'); - expect(ondismiss).toHaveBeenCalled(); - }); - - it('should not be dismissible if not chosen', function () { - const alert = mq(Alert, { type: 'error', dismissible: false }); - expect(alert).not.toHaveElement('button.Alert-dismiss'); - }); -}); -``` - -#### Methods - -These are the custom methods that are available for mithril component tests: -* **`toHaveElement(selector)`** - Checks if the component has an element that matches the given selector. -* **`toContainRaw(content)`** - Checks if the component HTML contains the given content. - -To negate any of these methods, simply prefix them with `not.`. For example, `expect(alert).not.toHaveElement('button.Alert-dismiss');`. For more information, check out the [Jest docs](https://jestjs.io/docs/using-matchers). For example you may need to check how to [mock functions](https://jestjs.io/docs/mock-functions), or how to use `beforeEach` and `afterEach` to set up and tear down tests. - - - -## E2E Tests - -Coming Soon! diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/theme.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/theme.md deleted file mode 100644 index 2d9d846e4..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/theme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Chủ đề - -Flarum "themes" chỉ là phần mở rộng. Thông thường, bạn sẽ muốn sử dụng bộ mở rộng `Frontend` để đăng ký [Less](https://lesscss.org/#overview) và JS tùy chỉnh. Tất nhiên, bạn cũng có thể sử dụng các bộ mở rộng khác: ví dụ: bạn có thể muốn hỗ trợ cài đặt để cho phép định cấu hình chủ đề của mình. - -Bạn có thể chỉ ra rằng tiện ích của bạn là một chủ đề bằng cách đặt khóa "extra.flarum-extension.category" thành "theme". For example: - -```json -{ - // other fields - "extra": { - "flarum-extension": { - "category": "theme" - } - } - // other fields -} -``` - -Tất cả điều này sẽ làm là hiển thị tiện ích mở rộng của bạn trong phần "theme" trong danh sách tiện ích mở rộng bảng điều khiển dành cho quản trị viên. - -## Tùy biến giá trị Less - -Bạn có thể xác định các biến Less mới trong các tệp Less của tiện ích mở rộng của mình. Hiện tại không có bộ mở rộng để sửa đổi các giá trị Ít biến hơn trong lớp PHP, nhưng điều này được lên kế hoạch cho các bản phát hành trong tương lai. - -## Chuyển đổi giữa các chủ đề - -Flarum hiện không có một hệ thống toàn diện hỗ trợ chuyển đổi giữa các chủ đề. Điều này được lên kế hoạch cho các bản phát hành trong tương lai. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_0.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_0.md deleted file mode 100644 index 2131181a0..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_0.md +++ /dev/null @@ -1,257 +0,0 @@ -# Cập nhật cho 1.0 - -Flarum version 1.0 is the long-awaited stable release! This release brings a number of refactors, cleanup, and small improvements that should make your Flarum experience just a bit better! - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Full Stack - -### Translations and transChoice - -#### Background - -Historically, Flarum has used Symfony for backend translations, and a port for frontend translations to keep format consistent. There are a few limitations to this approach though: - -- Developers need to decide between using `trans` or `transChoice` for pluralization -- The pluralization format is proprietary to Symfony -- We have to maintain the JS port ourselves -- Keys for values provided to backend translations need to be wrapped in curly braces. (e.g. `$this->translator->trans('some.translation', ['{username}' => 'Some Username!'])`). -- There's no support for complex applications (nested pluralization, non-number-based selection) -- As a result of the previous point, genderization is impossible. And that's kinda important for a lot of languages. - -### New System - -In v5, Symfony dropped their proprietary `transChoice` system in favor of the more-or-less standard [ICU MessageFormat](https://symfony.com/doc/5.2/translation/message_format.html). This solves pretty much every single one of the aforementioned issues. In this release, Flarum will be fully switching to ICU MessageFormat as well. What does this mean for extensions? - -- `transChoice` should not be used at all; instead, the variable passed for pluralization should be included in the data. -- Keys for backend translations no longer need to be surrounded by curly braces. -- Translations can now use the [`select` and `plural`](https://symfony.com/doc/5.2/translation/message_format.html) formatter syntaxes. For the `plural` formatter, the `offset` parameter and `#` magic variables are supported. -- These `select` and `plural` syntaxes can be nested to arbitrary depth. This is often a bad idea though (beyond, say, 2 levels), as things can get unnecessarily complex. - -No change to translation file naming is necessary (Symfony docs say that an `+intl-icu` suffix is necessary, but Flarum will now interpret all translation files as internationalized). - -#### Future Changes - -In the future, this will serve as a basis for additional features: - -- Translator preprocessors will allow extensions to modify arguments passed to translations. This will enable genderization (extensions could automatically extract a gender field from any objects of type "user" passed in). -- We could support internationalized "magic variables" for numbers: currently, `one` is supported, but others (`few`, `many`, etc) currently aren't. -- We could support ordinal formatting in additional to just plural formatting. - -#### Changes Needed in Extensions - -The `transChoice` methods in the frontend and backend have been removed. The `trans` method should always be used for translating, regardless of pluralization. If a translation requires pluralization, make sure you pass in the controlling variable as one of the arguments. - -In the frontend, code that looked like this: - -```js -app.translator.transChoice('some-translation', guestCount, {host: hostName}); -``` - -should be changed to: - -```js -// This uses ES6 key-property shorthand notation. {guestCount: guestCount} is equivalent to {guestCount} -app.translator.trans('some-translation', {host: hostName, guestCount }); -``` - -Similarly, in the backend, - -```php -$translator->transChoice('some-translation', $guestCount, ['{host}' => $hostName]); -``` - -should be changed to: - -```php -$translator->trans('some-translation', ['host' => $hostName, 'guestCount' => $guestCount]); -``` - -Note that in the backend, translation keys were previously wrapped in curly braces. This is no longer needed. - -#### Changes Needed in Translations - -Translations that aren't using pluralization don't need any changes. - -Pluralized translations should be changed as follows: - -`For {count} minute|For {count} minutes` - -to - -`{count, plural, one {For # minute} other {For # minutes}}` - -Note that in this example, `count` is the variable that controls pluralization. If a different variable were used (such as guestCount in the example above), this would look like: - -`{guestCount, plural, one {For # minute} other {For # minutes}}` - -See [our i18n docs](i18n.md) for more information. - -### Permissions Changes - -For a long time, the `viewDiscussions` and `viewUserList` permissions have been confusing. Despite their names: - -- `viewDiscussions` controls viewing both discussions and users. -- `viewUserList` controls searching users, not viewing user profiles. - -To clear this up, in v1.0, these permissions have been renamed to `viewForum` and `searchUsers` respectively. A migration in core will automatically adjust all permissions in the database to use the new naming. However, any extension code using the old name must switch to the new ones immediately to avoid security issues. To help the transfer, a warning will be thrown if the old permissions are referenced. - -We have also slightly improved tag scoping for permissions. Currently, permissions can be applied to tags if: - -- The permission is `viewForum` -- The permission is `startDiscussion` -- The permission starts with `discussion.` - -However, this doesn't work for namespaced permissions (`flarum-acme.discussion.bookmark`), or permissions that don't really have anything to do with discussions, but should still be scoped (e.g. `viewTag`). To counter this, a `tagScoped` attribute can be used on the object passed to [`registerPermission`](admin.md) to explicitly indicate whether the permission should be tag scopable. If this attribute is not provided, the current rules will be used to determine whether the permission should be tag scopable. - -## Frontend - -### Tooltip Changes - -The `flarum/common/components/Tooltip` component has been introduced as a simpler and less framework-dependent way to add tooltips. If your code is creating tooltips directly (e.g. via `$.tooltip()` in `oncreate` methods), you should wrap your components in the `Tooltip` component instead. For example: - -```tsx - - - -``` - -See [the source code](https://github.com/flarum/core/blob/master/js/src/common/components/Tooltip.tsx) for more examples and instructions. - -See [the PR](https://github.com/flarum/core/pull/2843/files) for examples of how to change existing code to use tooltips. - -### PaginatedListState - -The `flarum/common/states/PaginatedListState` state class has been introduced to abstract away most of the logic of `DiscussionListState` and `NotificationListState`. It provides support for loading and displaying paginated lists of JSON:API resources (usually models). In future releases, we will also provide an `PaginatedList` (or `InfiniteScroll`) component that can be used as a base class for these paginated lists. - -Please see [the source code](https://github.com/flarum/core/blob/master/js/src/common/states/PaginatedListState.ts) for a list of methods. - -Note that `flarum/forum/states/DiscussionListState`'s `empty` and `hasDiscussions` methods have been removed, and replaced with `isEmpty` and `hasItems` respectively. This is a breaking change. - -### New Loading Spinner - -The old `spin.js` based loading indicator has been replaced with a CSS-based solution. For the most part, no changes should be needed in extensions, but in some cases, you might need to update your spinner. This change also makes it easier to customize the spinner. - -See [this discussion](https://discuss.flarum.org/d/26994-beta16-using-the-new-loading-spinner) for more information. - -### classList util - -Ever wrote messy code trying to put together a list of classes for some component? Well, no longer! The [clsx library](https://www.npmjs.com/package/clsx) is now available as the `flarum/common/utils/classList` util. - -### User List - -An extensible user list has been added to the admin dashboard. In future releases, we hope to extract a generic model table component that can be used to list any model in the admin dashboard. - -See [the source code](https://github.com/flarum/core/blob/master/js/src/admin/components/UserListPage.tsx#L41) for a list of methods to extend, and examples of how columns should look like (can be added by extending the `columns` method and adding items to the [ItemList](frontend.md)). - -### Miscellaneous - -- Components should now call `super` for ALL Mithril lifecycle methods they define. Before, this was only needed for `oninit`, `onbeforeupdate`, and `oncreate`. Now, it is also needed in `onupdate`, `onbeforeremove`, and `onremove`. See [this GitHub issue](https://github.com/flarum/core/issues/2446) for information on why this change was made. -- The `flarum/common/utils/insertText` and `flarum/common/utils/styleSelectedText` utils have been moved to core from `flarum/markdown`. See `flarum/markdown` for an example of usage. -- The `extend` and `override` utils can now modify several methods at once by passing in an array of method names instead of a single method name string as the second argument. This is useful for extending the `oncreate` and `onupdate` methods at once. -- The `EditUserModal` component is no longer available through the `flarum/forum` namespace, it has been moved to `flarum/common`. Imports should be adjusted. -- The `Model` and `Route` JS extenders have been removed for now. There aren't currently used in any extensions that we know of. We will be reintroducing JS extenders during v1.x releases. -- The `Search` component can now be used with the `SearchState` state class. Previously, `SearchState` was missing the `getInitialSearch` method expected by the `Search` component. - -## Backend - -### Filesystem Extenders - -In this release, we refactored our use of the filesystem to more consistently use [Laravel's filesystem API](https://laravel.com/docs/8.x/filesystem). Extensions can now declare new disks, more easily use core's `flarum-assets` and `flarum-avatars` disks, and create their own storage drivers, enabling CDN and cloud storage support. - -### Compat and Closure Extenders - -In early Flarum versions, the `extend.php` file allowed arbitrary functions that allowed execution of arbitrary code one extension boot. For example: - -```php -return [ - // other extenders - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - } -]; -``` - -This approach was difficult to maintain and provide a well-tested public API for, frequently resolved classes early (breaking all sorts of things), and was not very descriptive. With the extender API completed in beta 16, this approach is no longer necessary. Support for these closures has been removed in this stable version. - -One type of functionality for which the extender replacement isn't obvious is container bindings ([e.g. flarum/pusher](https://github.com/flarum/pusher/blob/v0.1.0-beta.14/extend.php#L33-L49)). This can be done with via the service provider extender (e.g. [a newer version of flarum/pusher](https://github.com/flarum/pusher/blob/master/extend.php#L40-L41)). - -If you are unsure about which extenders should be used to replace your use of callbacks in `extend.php`, or are not sure that such an extender exists, please comment so below or reach out! We're in the final stages of finishing up the extender API, so now is the time to comment. - -### Scheduled Commands - -The [fof/console](https://github.com/FriendsOfFlarum/console) library has been a popular way to schedule commands (e.g. for publishing scheduled posts, running DB-heavy operations, etc) for several release. In Flarum 1.0, this functionality has been brought into core's `Console` extender. See our [console extension documentation](console.md) for more information on how to create schedule commands, and our [console user documentation](../console.md) for more information on how to run scheduled commands. - -### Eager Loading Extender - -As part of solving [N+1 Query issues](https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/) in some [Flarum API endpoints](https://github.com/flarum/core/issues/2637), we have introduced a `load` method on the `ApiController` extender that allows you to indicate relations that should be eager loaded. - -This should be done if you know a relation will always be included, or will always be referenced by controller / permission logic. For example, we will always need the tags of a discussion to check what permissions a user has on that discussion, so we should eager load the discussion's `tags` relationship. For example: - -```php -return [ - // other extenders - (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) - ->addInclude(['tags', 'tags.state', 'tags.parent']) - ->load('tags'), -]; -``` - -### RequestUtil - -The `Flarum\Http\RequestUtil`'s `getActor` and `withActor` should be used for getting/setting the actor (user) on requests. `$request->getAttribute('actor')` and `$request->withAttribute('actor')` are deprecated, and will be removed in v2.0. - -### Miscellaneous - -- The `Formatter` extender now has an `unparse` method that allows modifying XML before unparsing content. -- All route names must now be unique. In beta 16, uniqueness was enforced per-method; now, it is mandatory for all routes. -- API requests sent through `Flarum\Api\Client` now run through middleware, including `ThrottleApi`. This means that it is now possible to throttle login/registration calls. -- In beta 16, registering custom [searchers](search.md) was broken. It has been fixed in stable. -- The `post_likes` table in the [flarum/likes](https://github.com/flarum/likes) extension now logs the timestamp when likes were created. This isn't used in the extension, but could be used in other extensions for analytics. -- The `help` attribute of [admin settings](admin.md) no longer disappears on click. -- The `generate:migration` console command has been removed. The [Flarum CLI](https://discuss.flarum.org/d/26525-rfc-flarum-cli-alpha) should be used instead. -- The `GambitManager` util class is now considered internal API, and should not be used directly by extensions. -- The `session` attribute is no longer available on the `User` class. This caused issues with queue drivers, and was not conceptually correct (a user can have multiple sessions). The current session is still available via the `$request` instance. -- The `app`, `base_path`, `public_path`, `storage_path`, and `event` global helpers have been restored, but deprecated perpetually. These exist in case Laravel packages need them; they **should not** be used directly by Flarum extension code. The `flarum/laravel-helpers` package has been abandoned. -- The following deprecated features from beta 16 have been removed: - - The `TextEditor`, `TextEditorButton`, and `SuperTextarea` components are no longer exported through the `flarum/forum` namespace, but through `flarum/common` (with the exception of `SuperTextarea`, which has been replaced with `flarum/common/utils/BasicEditorDriver`). - - Support for `Symfony\Component\Translation\TranslatorInterface` has been removed, `Symfony\Contracts\Translation\TranslatorInterface` should be used instead. - - All backwards compatibility layers for the [beta 16 access token refactors](update-b16.md#access-token-and-authentication-changes) have been removed - - The `GetModelIsPrivate` event has been removed. The `ModelPrivate` extender should be used instead. - - The `Searching` (for both `User` and `Discussion` models), `ConfigureAbstractGambits`, `ConfigureDiscussionGambits`, and `ConfigureUserGambits` events have been removed. The `SimpleFlarumSearch` extender should be used instead. - - The `ConfigurePostsQuery` event has been removed. The `Filter` extender should be used instead. - - The `ApiSerializer` extender's `mutate` method has been removed. The same class's `attributes` method should be used instead. - - The `SearchCriteria` and `SearchResults` util classes have been removed. `Flarum\Query\QueryCriteria` and `Flarum\Query\QueryResults` should be used instead. - - The `pattern` property of `AbstractRegexGambit` has been removed; the `getGambitPattern` method is now a required abstract method. - - The `AbstractSearch` util class has been removed. `Flarum\Search\SearchState` and `Flarum\Filter\FilterState` should be used instead. - - The `CheckingPassword` event has been removed, the `Auth` extender should be used instead. - -## Tags Extension Changes - -As mentioned above, [tag scopable permissions](#permissions-changes) can now be explicitly declared. - -We've also made several big refactors to significantly improve tags performance. - -Firstly, the [Tag](https://github.com/flarum/tags/blob/d093ca777ba81f826157522c96680717d3a90e24/src/Tag.php#L38-L38) model's static `getIdsWhereCan` and `getIdsWhereCannot` methods have been removed. These methods scaled horribly on forums with many tags, sometimes adding several seconds to response time. - -These methods have been replaced with a `whereHasPermission` [Eloquent dynamic scope](https://laravel.com/docs/8.x/eloquent#dynamic-scopes) that returns a query. For example: - -`Tag::whereHasPermission($actor, 'viewDiscussions)`. - -That query can then be used in other DB queries, or further constricted to retrieve individual tags. - -Secondly, we no longer load in all tags as part of the initial payload. The initial payload contains all top-level primary tags, and the top 3 secondary tags. Other tags are loaded in as needed. Future releases will paginate secondary tags. This should enable forums to have thousands of secondary tags without significant performance impacts. These changes mean that extensions should not assume that all tags are available in the model store. - -## Testing Library Changes - -- Bundled extensions will not be automatically enabled; all enabled extensions must be specified in that test case. -- `setting` and `config` methods have been added that allow configuring settings and config.php values before the tested application boots. See [the testing docs](testing.md) for more information. -- The `php flarum test:setup` command will now drop the existing test DB tables before creating the database. This means that you can run `php flarum test:setup` to ensure a clean database without needing to go into the database and drop tables manually. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_x.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_x.md deleted file mode 100644 index cd81ab68d..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-1_x.md +++ /dev/null @@ -1,139 +0,0 @@ -# Cập nhật 1.x - -:::tip - -Nếu bạn cần sự trợ giúp về những thay đổi mới này, vui lòng tạo cuộc thảo luận trên [cộng đồng Flarum](https://discuss.flarum.org/t/extensibility) hoặc [Discord](https://flarum.org/discord/). - -::: - -## 1.7 - -### Frontend - -- Frontend extenders similar to the backend have been added, we highly recommend using them instead of the old method (https://docs.flarum.org/extend/models#adding-new-models-1), (https://docs.flarum.org/extend/routes#frontend-routes). -- There is a new tag selection component (https://github.com/flarum/framework/blob/360a2ba1d886df3fc6d326be932c5431ee9df8cf/extensions/tags/js/src/common/components/TagSelectionModal.tsx). - -### Backend - -- Support for php 8.2, deprecations are still thrown by some packages, the testing workflow has been updated to ignore deprecations on 8.2 -- The `/api` endpoint now contains the actor as an included relationship. -- The `Model::dateAttribute($attribute)` extender is deprecated, use `Model::cast($attribute, 'datetime')` instead. - -### Tooling - -- New `phpstan` package to run static code analysis on your extensions for code safety (https://docs.flarum.org/extend/static-code-analysis). -- New `jest-config` package to run frontend unit and component tests (https://docs.flarum.org/extend/testing). - -## 1.6 Changes - -### Backend - -- Added customizable session drivers through the `Session` extender. - -## 1.5 Changes - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Modals can be used in stacks, allowing for multiple modals to be open at once. This is useful for modals that open other modals: `app.modal.show(ModalComponent, { attrs }, true)`. - -### Backend - -- There is a new `createTableIfNotExists` migration helper, which can be used to create tables only if they don't already exist. - -## 1.4 Changes - -No developer-facing changes were made in Flarum v1.4. - -## 1.3 Changes - -Flarum v1.3 included mostly QoL improvements. Below are listed note worthy changes for extension developers: - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Frontend errors will no longer cause the forum to crash into a NoJs page. The extension will fail to execute its frontend code (initializer) and display an error to the admin through an alert, and to all users through the console. The frontend will continue to execute without the extension's frontend changes. -- The markdown toolbar can now be used on the admin side. - -### Backend - -- Calculation of the `number` attribute on `posts` has changed and no longer relies on the discussion model's `post_number_index` attribute which is now deprecated and will be removed in 2.0 -- Extension event listeners are now added after core even listeners, this should generally cause no changes in behavior. - -### Tooling - -- The backend tests workflow now automatically fails tests if there are any PHP warnings and notices. - -## 1.2 Changes - -Flarum v1.2 included quite a few bugfixes, internal refactors, and new features. The following recaps the most important changes for extension developers: - -### Frontend - -- Flarum core now passes TypeScript type checking (on the portion written in TypeScript). Additionally, major portions of the frontend (models, the application instance, and others) are now written in TypeScript. These changes should make it much easier and more fruitful to write extensions in TypeScript. -- Instead of directly using Less variables in CSS code, core now uses CSS variables. For the most part, we've just created CSS variables and set their values to the Less variables. This should make theming and customizing CSS a lot easier. https://github.com/flarum/core/pull/3146. -- Dropdowns can now be lazy-drawn to improve performance. You can do this by setting the lazy draw attr to "true". https://github.com/flarum/core/pull/2925. -- [Textarea-type settings](https://github.com/flarum/core/pull/3141) are now supported through the `app.extensionData.registerSetting` util. -- You can now use Webpack 5 to bundle your extension's code. This will offer minor bundle size improvements. -- A new `flarum/common/components/ColorPreviewInput` component [has been added](https://github.com/flarum/core/pull/3140). It can be used directly, or through the `color-preview` type when registered via `app.extensionData.registerSetting`. -- Extensions can now [modify the minimum search length](https://github.com/flarum/core/pull/3130) of the `Search` component. -- The following components are now extensible: - - The "colors" part of the Appearance page in the admin dashboard: https://github.com/flarum/core/pull/3186 - - The `StatusWidget` dropdown in the admin dashboard: https://github.com/flarum/core/pull/3189 - - `primaryControls` in the notification list: https://github.com/flarum/core/pull/3204 -- Extensions now have finer control over positioning when adding elements to the DiscussionPage sidebar items: https://github.com/flarum/core/pull/3165 -- - -### Backend - -- An [extender for settings defaults](https://github.com/flarum/core/pull/3127) has been added. This should be used instead of the `addSettings` migration helper, which has been deprecated. -- You can now [generate Less variables from setting values](https://github.com/flarum/core/pull/3011) via the `Settings` extender. -- Extensions can now [override/supplement blade template namespaces](https://github.com/flarum/core/pull/3167) through the `View` extender, meaning custom blade templates can be used instead of the default ones added by core or extensions. -- You can now define [custom Less functions through PHP](https://github.com/flarum/core/pull/3190), allowing you to use some backend logic in your Less theming. -- Extensions can now create [custom page title drivers](https://github.com/flarum/core/pull/3109/files) for titles in server-returned HTML. -- Custom logic can now be used when [deciding which relations to eager-load](https://github.com/flarum/core/pull/3116). -- Events [are now dispatched](https://github.com/flarum/core/pull/3203) for the `Notification\Read` and `Notification\ReadAll` events. -- An `ImageManager` instance is now [bound into the container](https://github.com/flarum/core/pull/3195), and can be configured to use either the `gd` or `imagick` backing drivers via the `"intervention.driver"` key in `config.php`. -- User IP addresses are now passed to the [API Client](https://github.com/flarum/core/pull/3124). -- A custom revision versioner implentation [can be set via container bindings](https://github.com/flarum/core/pull/3183) to customize how asset versions are named. -- A SlugManager instance [is now available](https://github.com/flarum/core/pull/3194) in blade templates via the `slugManager` variable. - -### Misc - -- Translations now support the `zero`, `one`, `two`, `few`, and `many` localized plural rules for `plural` ICU MessageFormat translations. This was done through the [`Intl.PluralRules` helper](https://github.com/flarum/core/issues/3072). -- Translations are now used for page titles, so that the format can be customized via language packs or [Linguist](https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease): https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228 -- API endpoints for retrieving single groups, as well as support for filtering groups on the plural get endpoint, [have been added](https://github.com/flarum/core/pull/3084). - - -### Tooling - - -- The `flarum-cli infra` command can now be used to update or enable various infrastructure features. You can now add the following to your extension in just one command: - - TypeScript - - Prettier for JS/TS formatting - - Backend testing with PHPUnit - - Code formatting with StyleCI - - EditorConfig support - - GitHub actions for automating testing, linting, type checking, and building. -- You can also exclude any files from these updates by adding their relative path to the "extra.flarum-cli" key's array in your extension's `composer.json` file. For example, if you wanted to exclude your tsconfig file from any updates by the infra system, the "extra.flarum-cli" key's value should be `["js/tsconfig.json"]`. -- The `flarum-cli audit infra` can be used to check that all infra modules your extension uses are up to date. The `--fix` flag can be used to automatically fix any issues, which has essentially the same effect as running `flarum-cli infra` for each outdated module. -- All `flarum-cli` commands can now be run with a `--no-interaction` flag to prevent prompts. Defaults will be used when possible, and errors will be thrown if a prompt is needed and there is no default. -- Frontend GH actions now support type-checking, as well as type coverage reports. - -## 1.1 Changes - -Flarum version 1.1 mostly focuses on bugfixes and quality-of-life improvements following our stable release earlier this year. These are mainly user-facing and internal infrastructure changes, so extensions are not significantly affected. - -### Frontend - -- Flarum now has an organization-wide prettier config package under [`@flarum/prettier-config`](https://github.com/flarum/prettier-config). -- Most custom (setting or data based) coloring in core is now done via [CSS custom properties](https://github.com/flarum/core/pull/3001). -- Typehinting for Flarum's globals are now [supported in extensions](https://github.com/flarum/core/pull/2992). -- You can now pass extra attrs to the `Select` component, and they will be [passed through to the DOM](https://github.com/flarum/core/pull/2959). -- The `DiscussionPage` component is now organized [as an item list](https://github.com/flarum/core/pull/3004), so it's easier for extensions to change its content. -- Extensions [can now edit](https://github.com/flarum/core/pull/2935) the `page` parameter of `PaginatedListState`. - -### Backend - -- Flarum now comes with a [Preload extender](https://github.com/flarum/core/pull/3057) for preloading any custom frontend assets. -- A new [Theme](https://github.com/flarum/core/pull/3008) extender now allows overriding Less files and internal imports. This allows themes to more easily completely replace Less modules. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b10.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b10.md deleted file mode 100644 index 8266e4559..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b10.md +++ /dev/null @@ -1,53 +0,0 @@ -# Cập nhật cho Beta 10 - -Beta 10 further solidifies the core architecture, offering new extenders as a stable, use-case-driven API for extending Flarum's core. A few small changes may necessitate updates to your extensions to make them compatible with Beta 10. These are detailed below. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- The `Flarum\Event\GetDisplayName` class has been moved to `Flarum\User\Event\GetDisplayName`. -- The `Flarum\Http\Exception\ForbiddenException` has been removed. Use `Flarum\User\Exception\PermissionDeniedException` instead. -- The `assertGuest()` method of the `Flarum\User\AssertPermissionTrait` has been removed without replacement. -- Old error handling middleware and exception handler classes were removed (see "New Features" for more details): - - `Flarum\Api\Middleware\HandleErrors` - - `Flarum\Http\Middleware\HandleErrorsWithView` - - `Flarum\Http\Middleware\HandleErrorsWithWhoops` - - `Flarum\Api\ErrorHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FloodingExceptionHandler` - - `Flarum\Api\ExceptionHandler\IlluminateValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidAccessTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidConfirmationTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\MethodNotAllowedExceptionHandler` - - `Flarum\Api\ExceptionHandler\ModelNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\PermissionDeniedExceptionHandler` - - `Flarum\Api\ExceptionHandler\RouteNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\TokenMismatchExceptionHandler` - - `Flarum\Api\ExceptionHandler\ValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - -## Recommendations - -- We tweaked the [recommended flarum/core version constraints for extensions](start.md#composer-json). We now recommend you mark your extension as compatible with the current and the upcoming beta release. (For beta.10, that would be any beta.10.x and beta.11.x version.) The core team will strive to make this work well by deprecating features before removing them. More details on this change in [this pull request](https://github.com/flarum/docs/pull/75). - -## New Features - -- New, extensible **error handling** stack in the `Flarum\Foundation\ErrorHandling` namespace: The `Registry` maps exceptions to "types" and HTTP status codes, `HttpFormatter` instances turn them into HTTP responses. Finally, `Reporter` instances are notified about unknown exceptions. - - You can build custom exception classes that will abort the current request (or console command). If they have semantic meaning to your application, they should implement the `Flarum\Foundation\KnownError` interface, which exposes a "type" that is used to render pretty error pages or dedicated error messages. - - More consistent use of HTTP 401 and 403 status codes. HTTP 401 should be used when logging in (i.e. authenticating) could make a difference; HTTP 403 is reserved for requests that fail because the already authenticated user is lacking permissions to do something. - - The `assertRegistered()` and `assertPermission()` methods of the `Flarum\User\AssertPermissionTrait` trait have been changed to match above semantics. See [this pull request](https://github.com/flarum/core/pull/1854) for more details. - - Error views are now determined based on error "type", not on status code (see [bdac88b](https://github.com/flarum/core/commit/bdac88b5733643b9c5dabae9e09a64d9f6e41d58)) -- **Queue support**: This release incorporates Laravel's illuminate/queue package, which allows offloading long-running tasks (such as email sending or regular cleanup jobs) onto a dedicated worker process. These changes are mostly under the hood, the next release(s) will start using the queue system for sending emails. By default, Flarum will use the "sync" queue driver, which executes queued tasks immediately. This is far from ideal and mostly guarantees a hassle-free setups. Production-grade Flarum installs are expected to upgrade to a more full-featured queue adapter. -- The `Flarum\Extend\LanguagePack` now accepts an optional path in its constructor. That way, language packs can store their locales in a different directory if they want to. -- The `formatContent()` method of `Flarum\Post\CommentPost` can now be called without an HTTP request instance, e.g. when rendering a post in an email template. - -## Deprecations - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- Laravel's global string and array helpers (e.g. `str_contains()` and `array_only()`) are deprecated in favor of their class based alternatives (`Illuminate\Support\Str::contains()` and `Illuminate\Support\Arr::only()`). See the [announcement](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers) and [pull request](https://github.com/laravel/framework/pull/26898) for more information. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b12.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b12.md deleted file mode 100644 index 6655a213c..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b12.md +++ /dev/null @@ -1,34 +0,0 @@ -# Cập nhật cho Beta 12 - -Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Deprecations / Upcoming breaking changes - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- PHP 7.1 support will be dropped in beta.13. -- Using library classes from the `Zend` namespace is now deprecated and will be removed in beta.13. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been deprecated. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been deprecated. We finally have a [proper replacement](middleware.md) - see "New Features" below. Therefore, it will be removed in beta.13. -- If you implement the `Flarum\Mail\DriverInterface`: - - Returning a plain array of field names from the `availableSettings()` method is deprecated, but still supported. It must now return an array of field names mapping to their type. See [the inline documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L25-L32) for more details. - - Implement the `validate()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L34-L48). - - Implement the `canSend()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L50-L54). - -## New Features - -- New **PHP extenders**: - - `Flarum\Extend\Middleware` offers methods for adding, removing or replacing middleware in our three middleware stacks (api, forum, admin). We also added [documentation](middleware.md) for this feature. - - `Flarum\Extend\ErrorHandling` lets you configure status codes and other aspects of our error handling stack depending on error types or exception classes. -- **JavaScript**: - - The `flarum/components/Select` component now supports a `disabled` prop. See [PR #1978](https://github.com/flarum/core/pull/1978). - -## Other changes / Recommendations - -- The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b13.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b13.md deleted file mode 100644 index 82e2744ff..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b13.md +++ /dev/null @@ -1,40 +0,0 @@ -# Cập nhật cho Beta 13 - -Beta 13 ships with several new extenders to simplify building and maintaining extensions. We do our best to create backward compatibility changes. We recommend changing to new Extenders as soon as they are available. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- Dropped support for PHP 7.1. -- Classes from the `Zend` namespace are now removed. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been removed including the class. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been removed. Use the [proper replacement](middleware.md). -- Several events used in Event Listeners have been removed, use their [replacement extender](start.md#extenders) instead. -- The LanguagePack extender only loads keys from extensions that are enabled. The translations loaded are based on the yaml files matching the [i18n namespace](i18n.md#appendix-a-standard-key-format). -- All notifications are now sent through the queue; without a queue driver they will run as usual. -- The implementation of avatar upload changed, we're [no longer storing files temporarily on disk](https://github.com/flarum/core/pull/2117). -- The SES mail driver [has been removed](https://github.com/flarum/core/pull/2011). -- Mail driver backward compatibility from beta 12 has been removed, use the new Mail extender or implement the [modified interface](https://github.com/flarum/core/blob/master/src/Mail/DriverInterface.php). - -## Recommendations - -- Beta 14 will ship with a rewrite in the frontend (javascript). If you're building for that release, make sure to follow our [progress](https://github.com/flarum/core/pull/2126). - -## New Features - -- A ton of new extenders: - - [Middleware extender](https://github.com/flarum/core/pull/2017) - - [Console extender](https://github.com/flarum/core/pull/2057) - - [CSRF extender](https://github.com/flarum/core/pull/2095) - - [Event extender](https://github.com/flarum/core/pull/2097) - - [Mail extender](https://github.com/flarum/core/pull/2012) - - [Model extender](https://github.com/flarum/core/pull/2100) - -## Deprecations - -- Several events [have been marked deprecated](https://github.com/flarum/core/commit/4efdd2a4f2458c8703aae654f95c6958e3f7b60b) to be removed in beta 14. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b14.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b14.md deleted file mode 100644 index 7144ade80..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b14.md +++ /dev/null @@ -1,757 +0,0 @@ -# Cập nhật cho Beta 14 - -This release brings a large chunk of breaking changes - hopefully the last chunk of this size before our stable release. In order to prepare the codebase for the upcoming stable release, we decided it was time to modernize / upgrade / exchange some of the underlying JavaScript libraries that are used in the frontend. Due to the nature and size of these upgrades, we have to pass on some of the breaking changes to you, our extension developers. - -On the bright side, this overdue upgrade brings us closer to the conventions of best practices of [Mithril.js](https://mithril.js.org/), the mini-framework used for Flarum's UI. Mithril's 2.0 release sports a more consistent component interface, which should be a solid foundation for years to come. Where possible, we replicated old APIs, to ease the upgrade and give you time to do the full transition. Quite a few breaking changes remain, though - read more below. - -:::tip - -If you need help with the upgrade, our friendly community will gladly help you out either [on the forum](https://discuss.flarum.org/t/extensibility) or [in chat](https://flarum.org/chat/). - -::: - -To ease the process, we've clearly separated the changes to the [frontend (JS)](#frontend-javascript) from those in the [backend (PHP)](#backend-php) below. If your extension does not change the UI, consider yourself lucky. :-) - -A [summary of the frontend changes](#required-frontend-changes-recap) is available towards the end of this guide. - -## Frontend (JavaScript) - -### Mithril 2.0: Concepts - -Most breaking changes required by beta 14 are prompted by changes in Mithril 2. [Mithril's upgrade guide](https://mithril.js.org/migration-v02x.html) is an extremely useful resource, and should be consulted for more detailed information. A few key changes are explained below: - -#### props -> attrs; initProps -> initAttrs - -Props passed into component are now referred to as `attrs`, and can be accessed via `this.attrs` where you would prior use `this.props`. This was done to be closer to Mithril's preferred terminology. We have provided a temporary backwards compatibility layer for `this.props`, but recommend using `this.attrs`. - -Accordingly, `initProps` has been replaced with `initAttrs`, with a similar BC layer. - -#### m.prop -> `flarum/utils/Stream` - -Mithril streams, which were available via `m.prop` in Mithril 0.2, are now available via `flarum/utils/Stream`. `m.prop` will still work for now due to a temporary BC layer. - -#### m.withAttr -> withAttr - -The `m.withAttr` util has been removed from Mithril. We have provided `flarum/utils/withAttr`, which does the same thing. A temporary BC layer has been added for `m.withAttr`. - -#### Lifecycle Hooks - -In mithril 0.2, we had 2 "lifecycle hooks": - -`init`, an unofficial hook which ran when the component instance was initialized. - -`config`, which ran when components were created, and on every redraw. - - -Mithril 2 has the following hooks; each of which take `vnode` as an argument: - -- `oninit` -- `oncreate` -- `onbeforeupdate` -- `onupdate` -- `onbeforeremove` -- `onremove` - -Please note that if your component is extending Flarum's helper `Component` class, you must call `super.METHOD(vnode)` if using `oninit`, `oncreate`, and `onbeforeupdate`. - -More information about what each of these do can be found [in Mithril's documentation](https://mithril.js.org/lifecycle-methods.html). - -A trivial example of how the old methods map to the new is: - -```js -class OldMithrilComponent extends Component { - init() { - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - config(element, isInitialized) { - console.log('Code to run on every redraw AND when the element is first attached'); - - if (isInitialized) return; - - console.log('Code to execute only once when components are first created and attached to the DOM'); - - context.onunload = () => { - console.log('Code to run when the component is removed from the DOM'); - } - } - - view() { - // In mithril 0, you could skip redrawing a component (or part of a component) by returning a subtree retain directive. - // See https://mithril.js.org/archive/v0.2.5/mithril.render.html#subtree-directives - // dontRedraw is a substitute for logic; usually, this is used together with SubtreeRetainer. - if (dontRedraw()) return { subtree: 'retain' }; - - return

Hello World!

; - } -} - -class NewMithrilComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - oncreate(vnode) { - super.oncreate(vnode); - - console.log('Code to run when components are first created and attached to the DOM'); - } - - onbeforeupdate(vnode, oldVnode) { - super.onbeforeupdate(vnode); - - console.log('Code to run BEFORE diffing / redrawing components on every redraw'); - - // In mithril 2, if we want to skip diffing / redrawing a component, we return "false" in its onbeforeupdate lifecycle hook. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeupdate - // This is also typically used with SubtreeRetainer. - if (dontRedraw()) return false; - } - - onupdate(vnode) { - // Unlike config, this does NOT run when components are first attached. - // Some code might need to be replicated between oncreate and onupdate. - console.log('Code to run on every redraw AFTER the DOM is updated.'); - } - - onbeforeremove(vnode) { - // This is run before components are removed from the DOM. - // If a promise is returned, the DOM element will only be removed when the - // promise completes. It is only called on the top-level component that has - // been removed. It has no equivalent in Mithril 0.2. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeremove - return Promise.resolve(); - } - - onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); - } -} -``` - -#### Children vs Text Nodes - -In Mithril 0.2, every child of a vnode is another vnode, stored in `vnode.children`. For Mithril 2, as a performance optimization, vnodes with a single text child now store that text directly in `vnode.text`. For developers, that means that `vnode.children` might not always contain the results needed. Luckily, text being stored in `vnode.text` vs `vnode.children` will be the same each time for a given component, but developers should be aware that at times, they might need to use `vnode.text` and not `vnode.children`. - -Please see [the mithril documentation](https://mithril.js.org/vnodes.html#structure) for more information on vnode structure. - -#### Routing API - -Mithril 2 introduces a few changes in the routing API. Most of these are quite simple: - -- `m.route()` to get the current route has been replaced by `m.route.get()` -- `m.route(NEW_ROUTE)` to set a new route has been replaced by `m.route.set(NEW_ROUTE)` -- When registering new routes, a component class should be provided, not a component instance. - -For example: - -```js -// Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } - -// Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } -``` - -Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. - -```js -// Mithril 0.2 -
Link Content - -// Mithril 2 -import Link from 'flarum/components/Link'; - -Link Content -``` - -You can also use `Link` to define external links, which will just render as plain `Children` html links. - -For a full list of routing-related changes, please see [the mithril documentation](https://mithril.js.org/migration-v02x.html). - -#### Redraw API - -Mithril 2 introduces a few changes in the redraw API. Most of these are quite simple: - -- Instead of `m.redraw(true)` for synchronous redraws, use `m.redraw.sync()` -- Instead of `m.lazyRedraw()`, use `m.redraw()` - -Remember that Mithril automatically triggers a redraw after DOM event handlers. The API for preventing a redraw has also changed: - -```js -// Mithril 0.2 - - -// Mithril 2 - -``` - -#### AJAX - -The `data` parameter of `m.request({...})` has been split up into `body` and `params`. - -For examples and other AJAX changes, see [the mithril documentation](https://mithril.js.org/migration-v02x.html#mrequest). - -#### Promises - -`m.deferred` has been removed, native promises should be used instead. For instance: - -```js -// Mithril 0.2 -const deferred = m.deferred(); - -app.store.find('posts').then(result => deferred.resolve(result)); - -return deferred.promise; - -// Mithril 2 -return app.store.find('posts'); -``` - -#### Component instances should not be stored - -Due to optimizations in Mithril's redrawing algorithms, [component instances should not be stored](https://mithril.js.org/components.html#define-components-statically,-call-them-dynamically). - -So whereas before, you might have done something like: - -```js -class ChildComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return

{this.counter}

; - } -} -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.child = new ChildComponent(); - } - - view() { - return ( -
- - {this.child.render()} -
- ) - } -} -``` - -That will no longer work. In fact; the Component class no longer has a render method. - -Instead, any data needed by a child component that is modified by a parent component should be passed in as an attr. For instance: - -```js -class ChildComponent extends Component { - view() { - return

{this.attrs.counter}

; - } -} - -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return ( -
- - -
- ) - } -} -``` - -For more complex components, this might require some reorganization of code. For instance, let's say you have data that can be modified by several unrelated components. In this case, it might be preferable to create a POJO "state instance' for this data. These states are similar to "service" singletons used in Angular and Ember. For instance: - -```js -class Counter { - constructor() { - this._counter = 0; - } - - increaseCounter() { - this._counter += 1; - } - - getCount() { - return this._counter; - } -} - -app.counter = new Counter(); - -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', -
-

Counter: {app.counter.getCount()}

-
- ); -}) - -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', -
- -
- ); -}) -``` - -This "state pattern" can be found throughout core. Some non-trivial examples are: - -- PageState -- SearchState and GlobalSearchState -- NotificationListState -- DiscussionListState - -### Changes in Core - -#### Modals - -Previously, modals could be opened by providing a `Modal` component instance: - -```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); -``` - -Since we don't store component instances anymore, we pass in the component class and any attrs separately. - -```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); -``` - -The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. Any modifications by extensions should accordingly be done to `ModalManagerState`. - -#### Alerts - -Previously, alerts could be opened by providing an `Alert` component instance: - -```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); -``` - -Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: - -```js -app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); -``` - -Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. This replaces the old method of passing the alert instance itself to `dismiss`. - -The `show`, `dismiss`, and `clear` methods are still available through `app.alerts`, but `app.alerts` now points to an instance of `AlertManagerState`, not of the `AlertManager` component. Any modifications by extensions should accordingly be done to `AlertManagerState`. - -#### Composer - -Since we don't store a component instances anymore, a number of util methods from `Composer`, `ComposerBody` (and it's subclasses), and `TextEditor` have been moved onto `ComposerState`. - -For `forum/components/Composer`, `isFullScreen`, `load`, `clear`, `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen` have been moved to `forum/states/ComposerState`. They all remain accessible via `app.composer.METHOD` - -A `bodyMatches` method has been added to `forum/states/ComposerState`, letting you check whether a certain subclass of `ComposerBody` is currently open. - -Various input fields are now stored as [Mithril Streams](https://mithril.js.org/stream.html) in `app.composer.fields`. For instance, to get the current composer content, you could use `app.composer.fields.content()`. Previously, it was available on `app.composer.component.content()`. **This is a convention that `ComposerBody` subclasses that add inputs should follow.** - -`app.composer.component` is no longer available. - -- Instead of `app.composer.component instanceof X`, use `app.composer.bodyMatches(X)`. -- Instead of `app.composer.component.props`, use `app.composer.body.attrs`. -- Instead of `app.composer.component.editor`, use `app.composer.editor`. - -For `forum/components/TextEditor`, the `setValue`, `moveCursorTo`, `getSelectionRange`, `insertAtCursor`, `insertAt`, `insertBetween`, `replaceBeforeCursor`, `insertBetween` methods have been moved to `forum/components/SuperTextarea`. - -Also for `forum/components/TextEditor`, `this.disabled` is no longer used; `disabled` is passed in as an attr instead. It may be accessed externally via `app.composer.body.attrs.disabled`. - -Similarly to Modals and Alerts, `app.composer.load` no longer accepts a component instance. Instead, pass in the body class and any attrs. For instance, - -```js -// Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); - -// Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) -``` - -Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. - -#### Widget and DashboardWidget - -The redundant `admin/components/Widget` component has been removed. `admin/components/DashboardWidget` should be used instead. - -#### NotificationList - -For `forum/components/NotificationList`, the `clear`, `load`, `loadMore`, `parseResults`, and `markAllAsRead` methods have been moved to `forum/states/NotificationListState`. - -Methods for `isLoading` and `hasMoreResults` have been added to `forum/states/NotificationListState`. - -`app.cache.notifications` is no longer available; `app.notifications` (which points to an instance of `NotificationListState`) should be used instead. - -#### Checkbox - -Loading state in the `common/components/Checkbox` component is no longer managed through `this.loading`; it is now passed in as a prop (`this.attrs.loading`). - -#### Preference Saver - -The `preferenceSaver` method of `forum/components/SettingsPage` has been removed without replacement. This is done to avoid saving component instances. Instead, preferences should be directly saved. For instance: - -```js -// Old way -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value, component) => { - this.user.pushAttributes({ lastSeenAt: null }); - this.preferenceSaver('discloseOnline')(value, component); - }, -}) - -// Without preferenceSaver -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value) => { - this.discloseOnlineLoading = true; - - this.user.savePreferences({ discloseOnline: value }).then(() => { - this.discloseOnlineLoading = false; - m.redraw(); - }); - }, - loading: this.discloseOnlineLoading, -}) -``` - -A replacement will eventually be introduced. - -#### DiscussionListState - -For `forum/components/DiscussionList`, the `requestParams`, `sortMap`, `refresh`, `loadResults`, `loadMore`, `parseResults`, `removeDiscussion`, and `addDiscussion` methods have been moved to `forum/states/DiscussionListState`. - -Methods for `hasDiscussions`, `isLoading`, `isSearchResults`, and `empty` have been added to `forum/states/DiscussionListState`. - -`app.cache.discussions` is no longer available; `app.discussions` (which points to an instance of `DiscussionListState`) should be used instead. - -#### PageState - -`app.current` and `app.previous` no longer represent component instances, they are now instances of the `common/states/PageState` class. This means that: - -- Instead of `app.current instanceof X`, use `app.current.matches(X)` -- Instead of `app.current.PROPERTY`, use `app.current.get('PROPERTY')`. Please note that all properties must be exposed EXPLICITLY via `app.current.set('PROPERTY', VALUE)`. - -#### PostStream - -Logic from `forum/components/PostStreamScrubber`'s `update` method has been moved to `forum/components/PostStream`'s `updateScrubber` method. - -For `forum/components/PostStream`, the `update`, `goToFirst`, `goToLast`, `goToNumber`, `goToIndex`, `loadNearNumber`, `loadNearIndex`, `loadNext`, `loadPrevious`, `loadPage`, `loadRange`, `show`, `posts`, `reset`, `count`, and `sanitizeIndex` methods have been moved to `forum/states/PostStreamState`. - -Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStreamState`. - -#### SearchState and GlobalSearchState - -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. - -At the minimum, `SearchState` contains the following methods: - -- getValue -- setValue -- clear -- cache (adds a searched value to cache, meaning that we don't need to search for its results again) -- isCached (checks if a value has been searched for before) - -All of these methods have been moved from `Search` to `SearchState`. Additionally, Search's `stickyParams`, `params`, `changeSort`, `getInitialSearch`, and `clearInitialSearch` methods have been moved to `forum/states/GlobalSearchState`, which is now available via `app.search`. - -To use a custom search, you'll want to: - -1. Possibly create a custom subclass of `SearchState` -2. Create a custom subclass of `Search`, which overrides the `selectResult` method to handle selecting results as needed by your use case, and modify the `sourceItems` methods to contain the search sources you need. - -#### moment -> dayjs - -The `moment` library has been removed, and replaced by the `dayjs` library. The global `moment` can still be used for now, but is deprecated. `moment` and `dayjs` have very similar APIs, so very few changes will be needed. Please see the dayjs documentation [for more information](https://day.js.org/en/) on how to use it. - -#### Subtree Retainer - -`SubtreeRetainer` is a util class that makes it easier to avoid unnecessary redraws by keeping track of some pieces of data. When called, it checks if any of the data has changed; if not, it indicates that a redraw is not necessary. - -In mithril 0.2, its `retain` method returned a [subtree retain directive](https://mithril.js.org/archive/v0.1.25/mithril.render.html#subtree-directives) if no redraw was necessary. - -In mithril 2, we use its `needsRebuild` method in combination with `onbeforeupdate`. For instance: - -```js -class CustomComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - this.showContent = false; - - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) - } - - onbeforeupdate() { - // If needsRebuild returns true, mithril will diff and redraw the vnode as usual. Otherwise, it will skip this redraw cycle. - // In this example, this means that this component and its children will only be redrawn when extra content is toggled. - return this.subtree.needsRebuild(); - } - - view(vnode) { - return
- -

Hello World!{this.showContent ? ' Extra Content!' : ''}

-
; - } -} -``` - -#### attrs() method - -Previously, some components would have an attrs() method, which provided an extensible way to provide attrs to the top-level child vnode returned by `view()`. For instance, - -```js -class CustomComponent extends Component { - view() { - return

Hello World!

; - } - - attrs() { - return { - className: 'SomeClass', - onclick: () => console.log('click'), - }; - } -} -``` - -Since `this.attrs` is now used for attrs passed in from parent components, `attrs` methods have been renamed to `elementAttrs`. - -#### Children and .component - -Previously, an element could be created with child elements by passing those in as the `children` prop: - -```js -Button.component({ - className: 'Button Button--primary', - children: 'Button Text' -}); -``` - -This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: - -```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); -``` - -Children can still be passed in through JSX: - -```js - -``` - -#### Tag attr - -Because mithril uses 'tag' to indicate the actual html tag (or component class) used for a vnode, you can no longer pass `tag` as an attr to components extending Flarum's `Component` helper class. The best workaround here is to just use another name for this attr. - -#### affixSidebar - -The `affixSidebar` util has been removed. Instead, if you want to affix a sidebar, wrap the sidebar code in an `AffixedSidebar` component. For instance, - -```js -class OldWay extends Component { - view() { - return
-
-
- -
Actual Page Content
-
-
-
; - } -} - -class NewWay extends Component { - view() { - return
-
-
- - - -
Actual Page Content
-
-
-
; - } -} -``` - -#### Fragment - -**Warning: For Advanced Use Only** - -In some rare cases, we want to have extremely fine grained control over the rendering and display of some significant chunks of the DOM. These are attached with `m.render`, and do not experience automated redraws. Current use cases in core and bundled extensions are: - -- The "Reply" button that shows up when selecting text in a post -- The mentions autocomplete menu that shows up when typing -- The emoji autocomplete menu that shows up when typing - -For this purpose, we provide a helper class (`common/Fragment`), of which you can create an instance, call methods, and render via `m.render(DOM_ROOT, fragmentInstance.render())`. The main benefit of using the helper class is that it allows you to use lifecycle methods, and to access the underlying DOM via `this.$()`, like you would be able to do with a component. - -This should only be used when absolutely necessary. If you are unsure, you probably don't need it. If the goal is to not store component instances, the "state pattern" as described above is preferable. - -### Required Frontend Changes Recap - -Each of these changes has been explained above, this is just a recap of major changes for your convenience. - -- Component Methods: - - `view()` -> `view(vnode)` - - Lifecycle - - `init()` -> `oninit(vnode)` - - `config()` -> Lifecycle hooks `oncreate(vnode)` / `onupdate(vnode)` - - `context.onunload()` -> `onremove()` - - `SubtreeRetainer` -> `onbeforeupdate()` - - if present, `attrs()` method needs to be renamed -> convention `elementAttrs()` - - building component with `MyComponent.component()` -> `children` is now second parameter instead of a named prop/attr (first argument) -> JSX preferred -- Routing - - `m.route()` -> `m.route.get()` - - `m.route(name)` -> `m.route.set(name)` - - register routes with page class, not instance - - special case when passing props - - `` -> `` -- AJAX - - `m.request({...})` -> `data:` key split up into `body:` and `params:` - - `m.deferred` -> native `Promise` -- Redrawing - - `m.redraw(true)` -> `m.redraw.sync()` - - `m.redraw.strategy('none')` -> `e.redraw = false` in event handler - - `m.lazyRedraw()` -> `m.redraw()` - -#### Deprecated changes - -For the following changes, we currently provide a backwards-compatibility layer. This will be removed in time for the stable release. The idea is to let you release a new version that's compatible with Beta 14 to your users as quickly as possible. When you have taken care of the changes above, you should be good to go. For the following changes, we have bought you time until the stable release. Considering you have to make changes anyway, why not do them now? - -- `this.props` -> `this.attrs` -- static `initProps()` -> static `initAttrs()` -- `m.prop` -> `flarum/utils/Stream` -- `m.withAttr` -> `flarum/utils/withAttr` -- `moment` -> `dayjs` - -## Backend (PHP) - -### New Features - -#### Extension Dependencies - -Some extensions are based on, or add features to, other extensions. Prior to this release, there was no way to ensure that those dependencies were enabled before the extension that builds on them. Now, you cannot enable an extension unless all of its dependencies are enabled, and you cannot disable an extension if there are other enabled extensions depending on it. - -So, how do we specify dependencies for an extension? Well, all you need to do is add them as composer dependencies to your extension's `composer.json`! For instance, if we have an extension that depends on Tags and Mentions, our `composer.json` will look like this: - -```json -{ - "name": "my/extension", - "description": "Cool New Extension", - "type": "flarum-extension", - "license": "MIT", - "require": { - "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency - } - // other config -} -``` - -#### View Extender - -Previously, when extensions needed to register Laravel Blade views, they could inject a view factory in `extend.php` and call it's `addNamespace` method. For instance, - -```php -// extend.php -use Illuminate\Contracts\View\Factory; - -return [ - function (Factory $view) { - $view->addNamespace(NAME, RELATIVE PATH); - } -] -``` - -This should NOT be used, as it will break views for all extensions that boot after yours. Instead, the `View` extender should be used: - -```php -// extend.php -use Flarum\Extend\View; - -return [ - (new View)->namespace(NAME, RELATIVE PATH); -] -``` - -#### Application and Container - -Although Flarum uses multiple components of the Laravel framework, it is not a pure Laravel system. In beta 14, the `Flarum\Foundation\Application` class no longer implements `Illuminate\Contracts\Foundation\Application`, and no longer inherits `Illuminate\Container\Container`. Several things to note: - -- The `app` helper now points to an instance of `Illuminate\Container\Container`, not `Flarum\Foundation\Application`. You might need to resolve things through the container before using them: for instance, `app()->url()` will no longer work; you'll need to resolve or inject an instance of `Flarum\Foundation\Config` and use that. -- Injected or resolved instances of `Flarum\Foundation\Application` can no longer resolve things through container methods. `Illuminate\Container\Container` should be used instead. -- Not all public members of `Illuminate\Contracts\Foundation\Application` are available through `Flarum\Foundation\Application`. Please refer to our [API docs on `Flarum\Foundation\Application`](https://api.docs.flarum.org/php/master/flarum/foundation/application) for more information. - -#### Other Changes - -- We are now using Laravel 6. Please see [Laravel's upgrade guide](https://laravel.com/docs/6.x/upgrade) for more information. Please note that we do not use all of Laravel. -- Optional params in url generator now work. For instance, the url generator can now properly generate links to posts in discussions. -- A User Extender has been added, which replaces the deprecated `PrepareUserGroups` and `GetDisplayName` events. -- Error handler middleware can now be manipulated by the middleware extender through the `add`, `remove`, `replace`, etc methods, just like any other middleware. -- `Flarum/Foundation/Config` and `Flarum/Foundation/Paths` can now be injected where needed; previously their data was accessible through `Flarum/Foundation/Application`. - -### Deprecations - -- `url` provided in `config.php` is now an array, accessible via `$config->url()`, for an instance of `Config` - [PR](https://github.com/flarum/core/pull/2271#discussion_r475930358) -- AssertPermissionTrait has been deprecated - [Issue](https://github.com/flarum/core/issues/1320) -- Global path helpers and path methods of `Application` have been deprecated, the injectable `Paths` class should be used instead - [PR](https://github.com/flarum/core/pull/2155) -- `Flarum\User\Event\GetDisplayName` has been deprecated, the `displayNameDriver` method of the `User` extender should be used instead - [PR](https://github.com/flarum/core/pull/2174) - -### Removals - -- Do NOT use the old closure notation for configuring view namespaces. This will break all extensions that boot after your extension. The `View` extender MUST be used instead. -- app()->url() will no longer work: [`Flarum\Http\UrlGenerator`](routes.md) should be injected and used instead. An instance of `Flarum\Http\UrlGenerator` is available in `blade.php` templates via `$url`. -- As a part of the Laravel 6 upgrade, the [`array_` and `str_` helpers](https://laravel.com/docs/6.x/upgrade#helpers) have been removed. -- The Laravel translator interface has been removed; the Symfony translator interface should be used instead: `Symfony\Component\Translation\TranslatorInterface` -- The Mandrill mail driver is no longer provided in Laravel 6, and has been removed. -- The following events deprecated in Beta 13 [have been removed](https://github.com/flarum/core/commit/7d1ef9d89161363d1c8dea19cf8aebb30136e9e3#diff-238957b67e42d4e977398cd048c51c73): - - `AbstractConfigureRoutes` - - `ConfigureApiRoutes` - Use the `Routes` extender instead - - `ConfigureForumRoutes` - Use the `Frontend` or `Routes` extenders instead - - `ConfigureLocales` - Use the `LanguagePack` extender instead - - `ConfigureModelDates` - Use the `Model` extender instead - - `ConfigureModelDefaultAttributes` - Use the `Model` extender instead - - `GetModelRelationship` - Use the `Model` extender instead - - `Console\Event\Configuring` - Use the `Console` extender instead - - `BioChanged` - User bio has not been a core feature for several releases diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b15.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b15.md deleted file mode 100644 index 1e69a9282..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b15.md +++ /dev/null @@ -1,60 +0,0 @@ -# Cập nhật cho Beta 15 - -Beta 15 features multiple new extenders, a total redesign of the admin dashboard, and several other interesting new features for extensions. As before, we have done our best to provide backwards compatibility layers, and we recommend switching away from deprecated systems as soon as possible to make your extensions more stable. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## New Features / Deprecations - -### Bộ mở rộng - -- `Flarum\Api\Event\WillGetData` and `Flarum\Api\Event\WillSerializeData` have been deprecated, the `ApiController` extender should be used instead -- `Flarum\Api\Event\Serializing` and `Flarum\Event\GetApiRelationship` have been deprecated, the `ApiSerializer` extender should be used instead -- `Flarum\Formatter\Event\Parsing` has been deprecated, the `parse` method of the `Formatter` extender should be used instead -- `Flarum\Formatter\Event\Rendering` has been deprecated, the `render` method of the `Formatter` extender should be used instead -- `Flarum\Notification\Event\Sending` has been deprecated, the `driver` method of the `Notification` extender should be used instead - - Please note that the new notification driver system is not an exact analogue of the old `Sending` event, as it can only add new drivers, not change the functionality of the default notification bell alert driver. If your extension needs to modify **how** or **to whom** notifications are sent, you may need to replace `Flarum\Notification\NotificationSyncer` on the service provider level -- `Flarum\Event\ConfigureNotificationTypes` has been deprecated, the `type` method of the `Notification` extender should be used instead -- `Flarum\Event\ConfigurePostTypes` has been deprecated, the `type` method of the `Post` extender should be used instead -- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. -- `Flarum\Event\ConfigureUserPreferences` has been deprecated, the `registerPreference` method of the `User` extender should be used instead -- `Flarum\Foundation\Event\Validating` has been deprecated, the `configure` method of the `Validator` extender should be used instead - -- The Policy system has been reworked a bit to be more intuitive. Previously, policies contained both actual policies, which determine whether a user can perform some ability, and model visibility scopers, which allowed efficient restriction of queries to only items that users have access to. See the [authorization documentation](authorization.md) for more information on how to use the new systems. Now: - - `Flarum\Event\ScopeModelVisibility` has been deprecated. New scopers can be registered via the `ModelVisibility` extender, and any `Eloquent\Builder` query can be scoped by calling the `whereVisibleTo` method on it, with the ability in question as an optional 2nd argument (defaults to `view`). - - `Flarum\Event\GetPermission` has been deprecated. Policies can be registered via the `Policy` extender. `Flarum\User\User::can` has not changed. Please note that the new policies must return one of `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, not a boolean. - -- A `ModelUrl` extender has been added, allowing new slug drivers to be registered. This accompanies Flarum's new slug driving system, which allows for extensions to define custom slugging strategies for sluggable models. The extender supports sluggable models outside of Flarum core. Please see our [model slugging](slugging.md) documentation for more information. -- A `Settings` extender has been added, whose `serializeToForum` method makes it easy to serialize a setting to the forum. -- A `ServiceProvider` extender has been added. This should be used with extreme caution for advanced use cases only, where there is no alternative. Please note that the service provider layer is not considered public API, and is liable to change at any time, without notice. - -### Admin UX Redesign - -The admin dashboard has been completely redesigned, with a focus on providing navbar pages for each extension. The API for extensions to register settings, permissions, and custom pages has also been greatly simplified. You can also now update your extension's `composer.json` to provide links for funding, support, website, etc that will show up on your extension's admin page. Please see [our Admin JS documentation](admin.md) for more information on how to use the new system. - -### Other New Features - -- On the backend, the route name is now available via `$request->getAttribute('routeName')` for controllers, and for middleware that run after `Flarum\Http\Middleware\ResolveRoute.php`. -- `Flarum\Api\Controller\UploadImageController.php` can now be used as a base class for controllers that upload images (like for the logo and favicon). -- Automatic browser scroll restoration can now be disabled for individual pages [see our frontend page documentation for more info](frontend-pages.md). - -## Breaking Changes - -- The following deprecated frontend BC layers were removed: - - `momentjs` no longer works as an alias for `dayjs` - - `this.props` and `this.initProps` no longer alias `this.attrs` and `this.initAttrs` for the `Component` base class - - `m.withAttr` and `m.stream` no longer alias `flarum/utils/withAttr` and `flarum/utils/Stream` - - `app.cache.discussionList` has been removed - - `this.content` and `this.editor` have been removed from `ComposerBody` - - `this.component`, `this.content`, and `this.value` have been removed from `ComposerState` -- The following deprecated backend BC layers were removed: - - The `publicPath`, `storagePath`, and `vendorPath` methods of `Flarum\Foundation\Application` have been removed - - The `base_path`, `public_path`, and `storage_path` global helpers have been removed - - The `getEmailSubject` method of `Flarum\Notification\MailableInterface` MUST now take a translator instance as an argument - - `Flarum\User\AssertPermissionTrait` has been removed, the analogous methods on `Flarum\User\User` should be used instead - - The `Flarum\Event\PrepareUserGroups` event has been removed, use the `User` extender instead - - The `Flarum\User\Event\GetDisplayName` event has been removed, use the display name driver feature of the `User` extender instead diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b16.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b16.md deleted file mode 100644 index 257009432..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b16.md +++ /dev/null @@ -1,138 +0,0 @@ -# Cập nhật cho Beta 16 - -Beta 16 finalizes the PHP extender API, introduces a testing library and JS typings, switches to using namespaces for JS imports, increases extension dependency robustness, and allows overriding routes, among other features. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Frontend - -- A new editor driver abstraction has been introduced, which allows extensions to override the default textarea-based editor with more advanced solutions. -- The `TextEditor` and `TextEditorButton` components, as well as the `BasicEditorDriver` util (which replaces `SuperTextarea`) have been moved from `forum` to `common`. -- The `forum`, `admin`, and `common` namespaces should be used when importing. So instead of `import Component from 'flarum/Component'`, use `import Component from 'flarum/common/Component`. Support for the old import styles will be deprecated through the stable release, and removed with Flarum 2.0. -- A typing library has been released to support editor autocomplete for frontend development, and can be installed in your dev environment via `npm install --save-dev flarum@0.1.0-beta.16`. -- Extension categories have been simplified down to `feature`, `theme`, and `language`. - -## Backend - -### Bộ mở rộng - -- All extenders that support callbacks/closures now support global functions like `'boolval'` and array-type functions like `[ClassName::class, 'methodName']`. -- The `Settings` extender's `serializeToFrontend` method now supports a default value as the 4th argument. -- The `Event` extender now supports registering subscribers for multiple events at once via a `subscribe` method. -- The `Notification` extender now has a `beforeSending` method, which allows you to adjust the list of recipients before a notification is sent. -- The `mutate` method of `ApiSerializer` has been deprecated, and renamed to `attributes`. -- `remove` methods on the `Route` and `Frontend` extenders can be used to remove (and then replace) routes. -- A `ModelPrivate` extender replaces the `GetModelIsPrivate` event, which has been deprecated. -- Methods on the `Auth` extender replace the `CheckingPassword` event, which has been deprecated. -- All search-related events are now deprecated in favor of the `SimpleFlarumSearch` and `Filter` extenders; this is explained in more detail below. - -### Laravel and Symfony - -Beta 16 upgrades from v6.x to v8.x of Laravel components and v4 to v5 of Symfony components. Please see the respective upgrade guides of each for changes you might need to make to your extensions. The most applicable change is the deprecation of `Symfony\Component\Translation\TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface`. The former will be removed in beta 17. - -### Helper Functions - -The remaining `app` and `event` global helper functions have been deprecated. `app` has been replaced with `resolve`, which takes the name of a container binding and resolves it through the container. - -Since some Flarum extensions use Laravel libraries that assume some global helpers exist, we've recreated some commonly used helpers in the [flarum/laravel-helpers](https://github.com/flarum/laravel-helpers) package. These helpers should NOT be used directly in Flarum extension code; they are available so that Laravel-based libraries that expect them to exist don't malfunction. - -### Search Changes - -As part of our ongoing efforts to make Flarum's search system more flexible, we've made several refactors in beta 16. Most notably, filtering and searching are now treated as different mechanisms, and have separate pipelines and extenders. Essentially, if a query has a `filter[q]` query param, it will be treated as a search, and all other filter params will be ignored. Otherwise, it will be handled by the filtering system. This will eventually allow searches to be handled by alternative drivers (provided by extensions), such as ElasticSearch, without impacting filtering (e.g. loading recent discussions). Classes common to both systems have been moved to a `Query` namespace. - -Core's filtering and default search (named SimpleFlarumSearch) implementations are quite similar, as both are powered by the database. `List` API controllers call the `search` / `filter` methods on a resource-specific subclass of `Flarum\Search\AbstractSearcher` or `Flarum\Filter\AbstractFilterer`. Arguments are an instance of `Flarum\Query\QueryCriteria`, as well as sort, offset, and limit information. Both systems return an instance of `Flarum\Query\QueryResults`, which is effectively a wrapper around a collection of Eloquent models. - -The default systems are also somewhat similar in their implementation. `Filterer`s apply Filters (implementing `Flarum\Filter\FilterInterface`) based on query params in the form `filter[FILTER_KEY] = FILTER_VALUE` (or `filter[-FILTER_KEY] = FILTER_VALUE` for negated filters). SimpleFlarumSearch's `Searcher`s split the `filter[q]` param by spaces into "terms", apply Gambits (implementing `Flarum\Search\GambitInterface`) that match the terms, and then apply a "Fulltext Gambit" to search based on any "terms" that don't match an auxiliary gambit. Both systems then apply sorting, an offset, and a result count limit, and allow extensions to modify the query result via `searchMutators` or `filterMutators`. - -Extensions add gambits and search mutators and set fulltext gambits for `Searcher` classes via the `SimpleFlarumSearch` extender. They can add filters and filter mutators to `Filterer` classes via the `Filter` extender. - -With regards to upgrading, please note the following: - -- Search mutations registered by listening to the `Searching` events for discussions and users will be applied as to searches during the search mutation step via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Search gambits registered by listening to the `ConfigureUserGambits` and `ConfigureDiscussionGambits` events will be applied to searcher via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Post filters registered by listening to the `ConfigurePostsQuery` events will be applied to post filters via a temporary BC layer. That event has been deprecated. - -### Testing Library - -The `flarum/testing` package provides utils for PHPUnit-powered automated backend tests. See the [testing documentation](testing.md) for more info. - -### Optional Dependencies - -Beta 15 introduced "extension dependencies", which require any extensions listed in your extension's `composer.json`'s `require` section to be enabled before your extension can be enabled. - -With beta 16, you can specify "optional dependencies" by listing their composer package names as an array in your extension's `extra.flarum-extension.optional-dependencies`. Any enabled optional dependencies will be booted before your extension, but aren't required for your extension to be enabled. - -### Access Token and Authentication Changes - -#### Extension API changes - -The signature to various method related to authentication have been changed to take `$token` as parameter instead of `$userId`. Other changes are the result of the move from `$lifetime` to `$type` - -- `Flarum\Http\AccessToken::generate($userId)` no longer accepts `$lifetime` as a second parameter. Parameter has been kept for backward compatibility but has no effect. It will be removed in beta 17. -- `Flarum\Http\RememberAccessToken::generate($userId)` should be used to create remember access tokens. -- `Flarum\Http\DeveloperAccessToken::generate($userId)` should be used to create developer access tokens (don't expire). -- `Flarum\Http\SessionAccessToken::generate()` can be used as an alias to `Flarum\Http\AccessToken::generate()`. We might deprecate `AccessToken::generate()` in the future. -- `Flarum\Http\Rememberer::remember(ResponseInterface $response, AccessToken $token)`: passing an `AccessToken` has been deprecated. Pass an instance of `RememberAccessToken` instead. As a temporary compatibility layer, passing any other type of token will convert it into a remember token. In beta 17 the method signature will change to accept only `RememberAccessToken`. -- `Flarum\Http\Rememberer::rememberUser()` has been deprecated. Instead you should create/retrieve a token manually with `RememberAccessToken::generate()` and pass it to `Rememberer::remember()` -- `Flarum\Http\SessionAuthenticator::logIn(Session $session, $userId)` second parameter has been deprecated and is replaced with `$token`. Backward compatibility is kept. In beta 17, the second parameter method signature will change to `AccessToken $token`. -- `AccessToken::generate()` now saves the model to the database before returning it. -- `AccessToken::find($id)` or `::findOrFail($id)` can no longer be used to find a token, because the primary key was changed from `token` to `id`. Instead you can use `AccessToken::findValid($tokenString)` -- It's recommended to use `AccessToken::findValid($tokenString): AccessToken` or `AccessToken::whereValid(): Illuminate\Database\Eloquent\Builder` to find a token. This will automatically scope the request to only return valid tokens. On forums with low activity this increases the security since the automatic deletion of outdated tokens only happens every 50 requests on average. - -#### Symfony session changes - -If you are directly accessing or manipulating the Symfony session object, the following changes have been made: - -- `user_id` attribute is no longer used. `access_token` has been added as a replacement. It's a string that maps to the `token` column of the `access_tokens` database table. - -To retrieve the current user from inside a Flarum extension, the ideal solution which was already present in Flarum is to use `$request->getAttribute('actor')` which returns a `User` instance (which might be `Guest`) - -To retrieve the token instance from Flarum, you can use `Flarum\Http\AccessToken::findValid($tokenString)` - -To retrieve the user data from a non-Flarum application, you'll need to make an additional database request to retrieve the token. The user ID is present as `user_id` on the `access_tokens` table. - -#### Token creation changes - -The `lifetime` property of access tokens has been removed. Tokens are now either `session` tokens with 1h lifetime after last activity, or `session_remember` tokens with 5 years lifetime after last activity. - -The `remember` parameter that was previously available on the `POST /login` endpoint has been made available on `POST /api/token`. It doesn't return the remember cookie itself, but the token returned can be used as a remember cookie. - -The `lifetime` parameter of `POST /api/token` has been deprecated and will be removed in Flarum beta 17. Partial backward compatibility has been provided where a `lifetime` value longer than 3600 seconds is interpreted like `remember=1`. Values lower than 3600 seconds result in a normal non-remember token. - -New `developer` tokens that don't expire have been introduced, however they cannot be currently created through the REST API. Developers can create developer tokens from an extension using `Flarum\Http\DeveloperAccessToken::generate($userId)`. - -If you manually created tokens in the database from outside Flarum, the `type` column is now required and must contain `session`, `session_remember` or `developer`. Tokens of unrecognized type cannot be used to authenticate, but won't be deleted by the garbage collector either. In a future version extensions will be able to register custom access token types. - -#### Token usage changes - -A [security issue in Flarum](https://github.com/flarum/core/issues/2075) previously caused all tokens to never expire. This had limited security impact due to tokens being long unique characters. However custom integrations that saved a token in an external database for later use might find the tokens no longer working if they were not used recently. - -If you use short-lived access tokens for any purpose, take note of the expiration time of 1h. The expiration is based on the time of last usage, so it will remain valid as long as it continues to be used. - -Due to the large amount of expired tokens accumulated in the database and the fact most tokens weren't ever used more than once during the login process, we have made the choice to delete all access tokens a lifetime of 3600 seconds as part of the migration, All remaining tokens have been converted to `session_remember` tokens. - -#### Remember cookie - -The remember cookie still works like before, but a few changes have been made that could break unusual implementations. - -Now only access tokens created with `remember` option can be used as remember cookie. Any other type of token will be ignored. This means if you create a token with `POST /api/token` and then place it in the cookie manually, make sure you set `remember=1` when creating the token. - -#### Web session expiration - -In previous versions of Flarum, a session could be kept alive forever until the Symfony session files were deleted from disk. - -Now sessions are linked to access tokens. A token being deleted or expiring will automatically end the linked web session. - -A token linked to a web session will now be automatically deleted from the database when the user clicks logout. This prevents any stolen token from being re-used, but it could break custom integration that previously used a single access token in both a web session and something else. - -### Miscellaneous - -- The IP address is now available in requests via `$request->getAttribute('ipAddress')` -- Policies can now return `true` and `false` as aliases for `$this->allow()` and `$this->deny()`, respectively. -- The `user.edit` permission has been split into `user.editGroups`, `user.editCredentials` (for email, username, and password), and `user.edit` (for other attributes). -- There are now permissions (`bypassTagCounts`) that allow users to bypass tag count requirements. -- Flarum now supports PHP 7.3 - PHP 8.0, with support for PHP 7.2 officially dropped. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b8.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b8.md deleted file mode 100644 index 5a1b82884..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/update-b8.md +++ /dev/null @@ -1,114 +0,0 @@ -# Cập nhật cho Beta 8 - -All extensions will need to be refactored in order to work with beta 8. Here are the main things you will need to do in order to make your extension compatible. - -:::caution - -This guide is not comprehensive. You may encounter some changes we haven't documented. If you need help, start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## PHP Namespaces - -Beta 8 comes with large changes to the overall structure of the PHP backend. You will need to look through [this list](https://discuss.flarum.org/d/6572-help-us-namespace-changes) of namespace changes and make changes to your extension accordingly. - -[This script](https://gist.github.com/tobyzerner/55e7c05c95404e5efab3a9e43799d375) can help you to automate most of the namespace changes. Of course, you should still test your extension after running the script as it may miss something. - -## Database Naming - -Many database columns and JSON:API attributes have been renamed to conform to a [convention](/contributing.md#database). You will need to update any instances where your extension interacts with core data. You can see the changes in [#1344](https://github.com/flarum/core/pull/1344/files). - -## Bộ mở rộng - -Beta 8 introduces a new concept called **extenders** that replace the most common event listeners. You can learn more about how they work in the [updated extension docs](start.md#extenders). - -`bootstrap.php` has been renamed to `extend.php` and returns an array of extender instances and functions: - -```php -use Flarum\Extend; - -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] -``` - -If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. - -| Event | Extender | -| ------------------------------------- | --------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | - -_\* class no longer exists_ - -## JavaScript Tooling - -Previously Flarum and its extensions used a custom Gulp workflow to compile ES6 source code into something that browsers could understand. Beta 8 switches to a more conventional approach with Webpack. - -You will need to tweak the structure of your extension's `js` directory. Currently, your JS file hierarchy looks something like the following: - -``` -js -├── admin -│ ├── src -│ │ └── main.js -│ ├── dist -│ │ └── extension.js -│ ├── Gulpfile.js -│ └── package.json -└── forum - ├── src - │ └── main.js - ├── dist - │ └── extension.js - ├── Gulpfile.js - └── package.json -``` - -You'll need to make the following changes: - -1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.md#transpilation). - -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. - -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. - -4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. - -If everything went right, your folder structure should look something like this: - -``` -js -├── src -│ ├── admin -│ │ └── index.js -│ └── forum -│ └── index.js -├── dist -│ ├── admin.js -│ ├── admin.js.map -│ ├── forum.js -│ └── forum.js.map -├── admin.js -├── forum.js -├── package.json -└── webpack.config.js -``` - -Take a look at the [bundled extensions](https://github.com/flarum) for more examples. - -## Font Awesome Icons - -Beta 8 upgrades to Font Awesome 5, in which icon class names have changed. The `flarum/helpers/icon` helper now requires the **full Font Awesome icon class names** to be passed, eg. `fas fa-bolt`. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extend/views.md b/i18n/vi/docusaurus-plugin-content-docs/current/extend/views.md deleted file mode 100644 index fc4a75a86..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extend/views.md +++ /dev/null @@ -1,63 +0,0 @@ -# Views and Blade - -Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. - -[Blade](https://laravel.com/docs/8.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). [Views](https://laravel.com/docs/8.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. - -For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). - -## Adding Views - -You will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->namespace('acme.hello-world', __DIR__.'/views'), -]; -``` - - -## Blade Templates - -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/8.x/blade). - -Once you've set up your views, you can render them to strings: - -```php -// Here, $view is of type `Illuminate\Contracts\View\Factory` -$renderedString = $view->make('acme.hello-world::greeting')->render(); - -// You can also pass variables to the view: -$renderedString = $view->make('acme.hello-world::greeting', ['varName' => true])->render(); -``` - -You can obtain the view factory instance through dependency injection. - -The format is `"VIEW_NAMESPACE::VIEW_NAME"`. If the view folder is organized as subdirectories, replace `/` with `.` in the pack. So if you have a file at `"forum/error.blade.php"` in a namespace called `"custom-views"`, you would use `"custom-views::forum.error"`. - -Note that all Blade templates rendered this way automatically have access to the following variables: - -- `$url`: a [URL generator](routes#generating-urls) instance. -- `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. -- `$slugManager`: a [SlugManager](slugging) instance. - -Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Serializer/ForumSerializer.php#L19). - -## Overriding Views - -If you want to override templates added by core or extensions, set up a view folder structure matching the one you are trying to override, containing just the files you are trying to override. Then use the `View` extender's `extendNamespace` method: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->extendNamespace('acme.hello-world', __DIR__.'/override_views'); -]; -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extenders.md b/i18n/vi/docusaurus-plugin-content-docs/current/extenders.md deleted file mode 100644 index 782df2f1b..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extenders.md +++ /dev/null @@ -1,23 +0,0 @@ -# Bộ mở rộng cục bộ - -Nếu có các tùy chỉnh bạn muốn thực hiện cho trang web của mình mà không phân phối toàn bộ tiện ích mở rộng, bạn có thể làm như vậy bằng cách sử dụng **bộ mở rộng cục bộ**. Mỗi bản cài đặt Flarum đều đi kèm với một tệp `extend.php` nơi bạn có thể thêm các đối tượng bộ mở rộng, giống như trong một phần mở rộng đầy đủ. - -Xem [tài liệu mở rộng của chúng tôi](extend/start.md) để biết thêm thông tin về bộ mở rộng (và cả [ví dụ về bộ mở rộng cục bộ](extend/start.md#hello-world)). - -Nếu bạn cần tạo tệp mới (khi thêm class tùy chỉnh được nhập cho bộ mở rộng), bạn sẽ cần điều chỉnh composer.json của mình một chút. Thêm những dòng sau: - -```json -"autoload": { - "psr-4": { - "App\\": "app/" - } -}, -``` - -Giờ đây, bạn có thể tạo các tệp PHP mới trong thư mục con `ứng dụng` bằng cách sử dụng namespace `App\...`. - -:::tip Bộ mở rộng cục bộ với Tiện ích mở rộng - -Các bộ mở rộng cục bộ có thể tốt cho các chỉnh sửa nhỏ, nhưng nếu bạn cần các tùy chỉnh lớn, một tiện ích mở rộng có thể là lựa chọn tốt hơn: một cơ sở mã riêng biệt, xử lý tốt hơn nhiều tệp, công cụ dành cho nhà phát triển và khả năng dễ dàng mã nguồn mở là những lợi ích lớn. - -::: diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/extensions.md b/i18n/vi/docusaurus-plugin-content-docs/current/extensions.md deleted file mode 100644 index ad0e91369..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/extensions.md +++ /dev/null @@ -1,118 +0,0 @@ -# Tiện ích mở rộng - -Flarum là tối giản, nhưng nó cũng có khả năng mở rộng cao. Trên thực tế, hầu hết các tính năng đi kèm với Flarum thực sự là phần mở rộng! - -Cách tiếp cận này làm cho Flarum cực kỳ tùy biến: Bạn có thể tắt bất kỳ tính năng nào bạn không cần và cài đặt các tiện ích mở rộng khác để làm cho diễn đàn của bạn trở nên hoàn hảo cho cộng đồng của bạn. - -Để biết thêm thông tin về triết lý của Flarum về những tính năng mà chúng tôi đưa vào cốt lõi hoặc nếu bạn đang muốn tạo tiện ích mở rộng của riêng mình, vui lòng xem [tài liệu về tiện ích mở rộng](extend/README.md) của chúng tôi. Bài viết này sẽ tập trung vào việc quản lý các tiện ích mở rộng từ góc độ của quản trị viên diễn đàn. - -## Extension Manager - -The extension manager is an extension that comes bundled with Flarum when installed via an archive. It provides a graphical interface for installing and updating both extensions and Flarum itself. - -If you do not have the extension manager installed and you wish to install it, you can do so by running the following command in your Flarum directory: - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -![extension manager admin page](https://github.com/flarum/docs/assets/20267363/d0e1f7a5-e194-4acd-af63-7b8ddd95c26b) - - -## Tìm Tiện ích mở rộng - -Flarum có một hệ sinh thái đa dạng các tiện ích mở rộng, hầu hết đều là mã nguồn mở và miễn phí. Để tìm các tiện ích mở rộng mới và tuyệt vời, hãy truy cập thẻ [Tiện ích mở rộng](https://discuss.flarum.org/t/extensions) trên các diễn đàn cộng đồng của Flarum. [Cơ sở dữ liệu mở rộng Extiverse](https://extiverse.com/) không chính thức cũng là một tài nguyên tuyệt vời. - -## Cài đặt Tiện ích mở rộng - -### Through the interface - -Using the extension manager extension, you can install extensions directly from the admin dashboard. Once you have browsed the list of available extensions from the links above, and found one you want to install, you can install it by entering the extension's composer package name into the extension manager's installation input. - -![Installing an extension](/en/img/install-extension.png) - -### Through the command line - -Cũng giống như Flarum, các tiện ích mở rộng được cài đặt thông qua [Composer](https://getcomposer.org), sử dụng SSH. Để cài đặt một tiện ích mở rộng điển hình: - -1. `cd` vào thư mục Flarum của bạn. Thư mục này phải chứa các tệp `composer.json`, `flarum` và thư mục ` storage ` (trong số các tệp khác). Bạn có thể kiểm tra nội dung thư mục qua `ls -la`. -2. Chạy ` composer require TÊN_GÓI_COMPOSER:*`. Điều này sẽ được cung cấp bởi tài liệu của phần mở rộng. - -## Cập nhật Tiện ích mở rộng - -### Through the interface - -Using the extension manager extension, you can update extensions directly from the admin dashboard. You can run a check for updates by clicking the "Check for updates" button in the extension manager. If there are updates available, you can update all extensions by clicking the "Global update" button. Or, you can update individual extensions by clicking the "Update" button next to the extension you want to update. - -![Updating an extension](/en/img/update-extension.png) - -### Through the command line - -Thực hiện theo các hướng dẫn do nhà phát triển tiện ích mở rộng cung cấp. Nếu bạn đang sử dụng `*` làm chuỗi phiên bản cho các tiện ích mở rộng ([như được khuyến nghị](composer.md)), hãy chạy các lệnh được liệt kê trong [Hướng dẫn nâng cấp Flarum](update.md) sẽ cập nhật tất cả các tiện ích mở rộng của bạn. - -## Gỡ cài đặt Tiện ích mở rộng - -### Through the interface - -Using the extension manager extension, you can uninstall extensions directly from the admin dashboard. You can uninstall an extension by clicking the "Uninstall" button next to the extension you want to uninstall inside the extension's page. - -![Uninstalling an extension](/en/img/uninstall-extension.png) - -### Through the command line - -Tương tự như cài đặt, để xóa tiện ích mở rộng: - -0. Nếu bạn muốn xóa tất cả các bảng cơ sở dữ liệu được tạo bởi tiện ích mở rộng, hãy nhấp vào nút "Gỡ cài đặt" trong trang tổng quan quản trị. Xem [bên dưới](#managing-extensions) để biết thêm thông tin. -1. `cd` vào thư mục Flarum của bạn. -2. Chạy `composer remove TÊN_GÓI_COMPOSER`. Điều này sẽ được cung cấp bởi tài liệu của phần mở rộng. - -## Quản lý Tiện ích mở rộng - -Each individual extension page of the admin dashboard provides a convenient way to manage the extension. Bạn có thể: - -- Enable or disable the extension. -- See the settings provided by the extension, and change them. -- Hoàn tác quá trình di chuyển của tiện ích mở rộng để xóa bất kỳ sửa đổi cơ sở dữ liệu nào mà nó đã thực hiện (điều này có thể được thực hiện bằng nút Gỡ cài đặt). Thao tác này sẽ xóa TẤT CẢ dữ liệu được liên kết với tiện ích mở rộng và không thể hoàn tác được. Việc này chỉ nên được thực hiện khi bạn đang xóa một tiện ích mở rộng và không có kế hoạch cài đặt lại. Nó cũng hoàn toàn là tùy chọn. -- See the extension's README, if it has one. -- See the extension's version. -- Uninstall the extension if the extension manager is installed. - -## Configuring additional extension repository sources - -The extension manager uses `composer` under the hood, and as such, it looks for extension packages in the same places as `composer`. By default, this is [Packagist](https://packagist.org/). However, you can configure additional sources for the extension manager to look for extensions in. This is useful if you want to install an extension that is not available on Packagist. - -In the admin page of the extension manager, clicking the **Add Repository** button will open a modal where you can enter the name and URL of the repository you want to add. The name is just a label for the repository, and can be anything you want. The URL should be the URL of the repository which depends on the type of repository you want to add. - -### Adding a repository from a VCS - -If you want to add a repository from a VCS (e.g. GitHub, GitLab, BitBucket, etc), the URL should be the URL of the repository's VCS. For example, if you had a private GitHub repository at `https://github.com/acme/flarum-extension`, you would enter that URL into the URL field. If it is a private source, you will need to enter an authentication method through the **New authentication method** button. The token can be generated from your VCS provider's website, and the host should be the domain of the VCS provider (e.g. `github.com`). - -### Adding a composer repository - -Extiverse provides access to premium extensions. It is a good example of a composer repository. You would specify the URL as `https://flarum.org/composer/` and the name as `premium`. You would also need to enter an authentication method through the **New authentication method** button. The token can be generated from your Flarum account's [subscriptions](https://flarum.org/dashboard/subscriptions) page with the Instructions button. - -* Type: `HTTP Bearer` -* Host: `flarum.org` - -![Configure repositories](/en/img/config-repositories.png) - -:::info - -The configured repositories and auth methods will be active for both the command line and the admin dashboard. If you configure them from the command line however, you must not include the flag `--global`. - -::: - -## Installing Non-stable extensions - -If for whatever reason you want to install a non-stable extension (e.g. a beta, alpha or RC version) you must first update the **Minimum stability** setting to the wanted stability. - -* If you set it to Alpha, you will be able to install alpha, beta, RC (Release Candidate) and stable versions. -* If you set it to Beta, you will be able to install beta, RC and stable versions. -* If you set it to RC, you will be able to install RC and stable versions. -* If you set it to Stable, you will only be able to install stable versions. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/faq.md b/i18n/vi/docusaurus-plugin-content-docs/current/faq.md deleted file mode 100644 index 2aa209ae9..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/faq.md +++ /dev/null @@ -1,35 +0,0 @@ -# FAQ - -### Flarum có ổn định không? - -Có! Sau 6 năm phát triển, Flarum 1.0.0 cuối cùng cũng có mặt ở đây. - -### Điều gì tiếp theo sau phiên bản ổn định? - -Chúng tôi vẫn đang làm việc trên một lộ trình chính thức. Chúng tôi có rất nhiều kế hoạch và ý tưởng, và mong muốn được chia sẻ một cột mốc kỹ lưỡng hơn với cộng đồng. - -### Tôi có thể ủng hộ tiền để đẩy nhanh quá trình phát triển? - -Mọi đóng góp đều được nhận với lòng biết ơn. Bạn có thể đóng góp trên [Nhà tài trợ GitHub](https://github.com/sponsors/flarum) hoặc [OpenCollective](https://opencollective.com/flarum). - -Tuy nhiên, các khoản đóng góp sẽ không tác động trực tiếp đến tốc độ phát triển của Flarum. Chúng tôi cũng khuyến khích người dùng đóng góp theo những cách khác, chẳng hạn như [đóng góp mã](contributing.md), [tiện ích mở rộng xây dựng](/extend/README.md), viết tài liệu, dịch Flarum sang các ngôn ngữ khác, cung cấp trợ giúp và hỗ trợ trên [cộng đồng diễn đàn](https://discuss.flarum.org/)... và chỉ là một nguồn năng lượng tích cực chung cho cộng đồng! - -### Liệu Flarum có [chèn tính năng vào đây] không? Khi nào? Tại sao không? - -Chúng tôi muốn xây dựng vô số tính năng và tiện ích mở rộng cho Flarum, nhưng điều đầu tiên trước tiên: Chúng tôi tập trung vào các yếu tố cần thiết và sự ổn định. - -### Tại sao vẫn chưa khắc phục được [thêm sự cố vào đây]? - -Ở đây một lần nữa, câu trả lời là "những điều đầu tiên trước tiên". Nếu chúng tôi chưa khắc phục được một vấn đề (hoặc chỉ định cho nó một cột mốc quan trọng), thì đó là vì chúng tôi đang làm việc khác cũng quan trọng không kém. những điều đầu tiên trước tiên ”. Xin hãy kiên nhẫn; chúng tôi sẽ cố gắng hoàn thành nó trước khi phát hành. Hoặc nếu bạn đang vội, vui lòng tự sửa và [đóng góp cho dự án](contributing.md)! - -### Có thể di chuyển diễn đàn của tôi qua Flarum được không? - -Chúng tôi hiện không cung cấp người di cư chính thức, nhưng có rất nhiều giải pháp cộng đồng hiện có. Tương đối sớm, chúng tôi sẽ bắt đầu xây dựng các công cụ để nhập dữ liệu từ các phần mềm diễn đàn khác như esoTalk, FluxBB, phpBB, Discourse và các phần mềm khác. - -### Làm thế nào để gia nhập đội ngũ Flarum? - -> "Thông qua một thử thách phức tạp và gian khổ, liên quan đến các nghi lễ thần bí, nguy hiểm đe dọa tính mạng và cuộc phiêu lưu đến những vùng đất xa xôi nơi nhiều người đi và một số ít trở về." ~ jordanjay29 - -Câu trả lời thực sự là chúng tôi thường để mắt đến cộng đồng của mình để tìm kiếm những thành viên nổi bật, những người sẽ tạo ra những nhân viên giỏi. Thành thật mà nói, đối với hầu hết các nhân viên hiện tại của chúng tôi, những gì họ đã làm trước khi trở thành nhân viên không khác nhiều so với những gì họ làm bây giờ. - -Tìm đam mê và đóng góp theo cách bạn cảm thấy tốt nhất. Sau đó, hãy để nó diễn ra theo hướng của nó. Bạn không cần phải có huy hiệu để được tôn trọng ở đây. \ No newline at end of file diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/install.md b/i18n/vi/docusaurus-plugin-content-docs/current/install.md deleted file mode 100644 index 2d4d4352b..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/install.md +++ /dev/null @@ -1,198 +0,0 @@ -# Cài đặt - -:::tip Kiểm tra nhanh driver? - -Vui lòng tham gia Flarum trên một trong những [diễn đàn demo](https://discuss.flarum.org/d/21101) của chúng tôi. Hoặc thiết lập diễn đàn của riêng bạn trong vài giây tại [Flarum miễn phí](https://www.freeflarum.com), một dịch vụ cộng đồng miễn phí không liên kết với nhóm Flarum. - -::: - -## Yêu cầu máy chủ - -Trước khi bạn cài đặt Flarum, điều quan trọng là phải kiểm tra xem máy chủ của bạn có đáp ứng các yêu cầu hay không. Để chạy Flarum, bạn sẽ cần: - -* **Apache** (đã bật mod_rewrite) hoặc **Nginx** -* **PHP 7.3+** với các tiện ích mở rộng sau: curl, dom, fileinfo, gd, json, mbstring, openssl, pdo\_mysql, tokenizer, zip -* **MySQL 5.6+/8.0.23+** hoặc **MariaDB 10.0.5+** -* **SSH (command-line) access** to run potentially necessary software maintenance commands, and Composer if you intend on using the command-line to install and manage Flarum extensions. - -## Cài đặt - -### Installing by unpacking an archive - -If you don't have SSH access to your server or you prefer not to use the command line, you can install Flarum by unpacking an archive. Below is a list of the available archives, make sure you choose the one that matches your PHP version and public path or lack thereof preference. - -| Flarum Version | PHP Version | Public Path | Type | Archive | -| -------------- | ----------------- | ----------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1.x | 8.3 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.zip) | -| 1.x | 8.3 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.tar.gz) | -| 1.x | 8.3 (recommended) | Yes | ZIP | [flarum-v1.x-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.zip) | -| 1.x | 8.2 (recommended) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | Yes | TAR.GZ | [flarum-v1.x-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.tar.gz) | -| 1.x | 8.2 (recommended) | No | ZIP | [flarum-v1.x-no-public-dir-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.zip) | -| 1.x | 8.2 (recommended) | Yes | ZIP | [flarum-v1.x-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.zip) | -| 1.x | 8.1 | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.tar.gz) | -| 1.x | 8.1 | Yes | TAR.GZ | [flarum-v1.x-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.tar.gz) | -| 1.x | 8.1 | No | ZIP | [flarum-v1.x-no-public-dir-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.zip) | -| 1.x | 8.1 | Yes | ZIP | [flarum-v1.x-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.zip) | -| 1.x | 8.0 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.tar.gz) | -| 1.x | 8.0 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.zip) | -| 1.x | 8.0 (end of life) | Yes | ZIP | [flarum-v1.x-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.zip) | -| 1.x | 7.4 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.tar.gz) | -| 1.x | 7.4 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.zip) | -| 1.x | 7.4 (end of life) | Yes | ZIP | [flarum-v1.x-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.zip) | -| 1.x | 7.3 (end of life) | No | TAR.GZ | [flarum-v1.x-no-public-dir-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | Yes | TAR.GZ | [flarum-v1.x-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.tar.gz) | -| 1.x | 7.3 (end of life) | No | ZIP | [flarum-v1.x-no-public-dir-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.zip) | -| 1.x | 7.3 (end of life) | Yes | ZIP | [flarum-v1.x-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.zip) | - -### Installing using the Command Line Interface - -Flarum sử dụng [Composer](https://getcomposer.org) để quản lý các phần phụ thuộc và tiện ích mở rộng của nó. Nếu bạn không quen thuộc với nó, hãy đọc [hướng dẫn của chúng tôi](composer.md) để biết thông tin về nó là gì và cách thiết lập nó. Sau đó, chạy lệnh này ở một vị trí trống mà bạn muốn cài đặt Flarum: - -```bash -composer create-project flarum/flarum:^1.8.0 . -``` - -Trong khi lệnh này đang chạy, bạn có thể định cấu hình máy chủ web của mình. Bạn sẽ cần đảm bảo rằng webroot của mình được đặt thành `/path/to/your/forum/public` và thiết lập [Rewriting URL](#url-rewriting) như theo hướng dẫn bên dưới. - -Khi mọi thứ đã sẵn sàng, hãy điều hướng đến diễn đàn của bạn trong trình duyệt web và làm theo hướng dẫn để hoàn tất cài đặt. - -If you wish to install and update extensions from the admin dashboard, you need to also install the [Extension Manager](extensions.md) extension. - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -## URL Rewriting - -### Apache - -Flarum bao gồm một tệp `.htaccess` trong thư mục `public` - đảm bảo rằng nó đã được tải lên chính xác. **Flarum sẽ không hoạt động bình thường nếu `mod_rewrite` không được bật hoặc `.htaccess` không được phép. ** Hãy nhớ kiểm tra với nhà cung cấp dịch vụ lưu trữ của bạn (hoặc VPS của bạn) mà các tính năng này được bật. Nếu bạn đang quản lý máy chủ của riêng mình, bạn có thể cần thêm phần sau vào cấu hình trang web của mình để kích hoạt các tệp `.htaccess`: - -``` - - AllowOverride All - -``` - -Điều này đảm bảo rằng các ghi đè htaccess được cho phép để Flarum có thể viết lại URL đúng cách. - -Các phương pháp để bật `mod_rewrite` khác nhau tùy thuộc vào hệ điều hành của bạn. Bạn có thể kích hoạt nó bằng cách chạy `sudo a2enmod rewrite` trên Ubuntu. `mod_rewrite` được bật theo mặc định trên CentOS. Đừng quên khởi động lại Apache sau khi thực hiện các sửa đổi! - -### Nginx - -Flarum bao gồm một tệp `.nginx.conf` - hãy đảm bảo rằng nó đã được tải lên một cách chính xác. Sau đó, giả sử bạn có một trang web PHP được thiết lập trong Nginx, hãy thêm phần sau vào khối cấu hình máy chủ của bạn: - -```nginx -include /path/to/flarum/.nginx.conf; -``` - -### Caddy - -Caddy yêu cầu một cấu hình rất đơn giản để Flarum hoạt động bình thường. Lưu ý rằng bạn nên thay thế URL bằng URL của riêng bạn và đường dẫn bằng đường dẫn đến thư mục `public` của riêng bạn. Nếu bạn đang sử dụng một phiên bản PHP khác, bạn cũng cần thay đổi đường dẫn `fastcgi` để trỏ đến đúng ổ cắm hoặc URL cài đặt PHP của bạn. - -``` -www.example.com { - root * /var/www/flarum/public - php_fastcgi unix//var/run/php/php7.4-fpm.sock - header /assets/* { - +Cache-Control "public, must-revalidate, proxy-revalidate" - +Cache-Control "max-age=25000" - Pragma "public" - } - file_server -} -``` -## Quyền sở hữu thư mục - -Trong khi cài đặt, Flarum có thể yêu cầu bạn làm cho một số thư mục có thể ghi được. Các hệ điều hành hiện nay thường có nhiều tài khoản, có nghĩa là tài khoản bạn đăng nhập không giống với tài khoản mà Flarum đang chạy. Tài khoản mà Flarum đang chạy PHẢI có quyền đọc + ghi đối với: - -- Thư mục cài đặt gốc, vì vậy Flarum có thể chỉnh sửa `config.php`. -- Thư mục `storage`, vì vậy Flarum có thể chỉnh sửa nhật ký và lưu trữ dữ liệu đã lưu trong bộ nhớ cache. -- Thư mục `asset` để các biểu trưng và hình đại diện có thể được tải lên hệ thống tệp. - -Các tiện ích mở rộng có thể yêu cầu các thư mục khác, vì vậy bạn có thể muốn cấp đệ quy quyền ghi vào toàn bộ thư mục cài đặt gốc Flarum. - -Có một số lệnh bạn sẽ cần chạy để thiết lập quyền đối với tệp. Xin lưu ý rằng nếu cài đặt của bạn không hiển thị cảnh báo sau khi thực hiện chỉ một số trong số này, bạn không cần phải chạy phần còn lại. - -Đầu tiên, bạn cần cho phép quyền ghi vào thư mục. Trên Linux: - -```bash -chmod 775 -R /path/to/directory -``` - -Nếu vẫn chưa được, bạn có thể cần kiểm tra xem các tệp của mình có thuộc sở hữu của đúng nhóm và người dùng hay không. Theo mặc định, trong hầu hết các bản phân phối Linux, `www-data` là nhóm và người dùng mà cả PHP và máy chủ web đều hoạt động theo. Bạn sẽ cần phải xem xét các chi tiết cụ thể của bản phân phối và thiết lập máy chủ web của mình để đảm bảo. Bạn có thể thay đổi quyền sở hữu thư mục trong hầu hết các hệ điều hành Linux bằng cách chạy: - -```bash -chown -R www-data: www-data /path/to/directory -``` - -Với `www-data` được thay đổi thành thứ khác nếu một người dùng/nhóm khác được sử dụng cho máy chủ web của bạn. - -Ngoài ra, bạn sẽ cần đảm bảo rằng người dùng CLI của mình (người dùng mà bạn đăng nhập vào thiết bị đầu cuối) có quyền sở hữu, để bạn có thể cài đặt các tiện ích mở rộng và quản lý cài đặt Flarum thông qua CLI. Để thực hiện việc này, hãy thêm người dùng hiện tại của bạn (`whoami`) vào nhóm máy chủ web (thường là `www-data`) qua `usermod -a -G www-data YOUR_USERNAME`. Bạn có thể sẽ phải đăng xuất và đăng nhập lại để thay đổi này có hiệu lực. - -Cuối cùng, nếu điều đó không hiệu quả, bạn có thể cần phải cấu hình [SELinux](https://www.redhat.com/en/topics/linux/what-is-selinux) để cho phép máy chủ web để ghi vào thư mục. Để làm như vậy, hãy chạy: - -```bash -chcon -R -t httpd_sys_rw_content_t /path/to/directory -``` - -Để tìm hiểu thêm về các lệnh này cũng như các quyền và quyền sở hữu tệp trên Linux, hãy đọc [hướng dẫn này](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/). Nếu bạn đang thiết lập Flarum trên Windows, bạn có thể tìm thấy câu trả lời cho [câu hỏi về Người dùng siêu cấp này](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) hữu ích. - -:::caution Môi trường có thể khác nhau - -Môi trường của bạn có thể khác với tài liệu được cung cấp, vui lòng tham khảo cấu hình máy chủ web của bạn hoặc nhà cung cấp dịch vụ lưu trữ web để biết người dùng và nhóm thích hợp mà PHP và máy chủ web hoạt động. - -::: - -:::danger Không bao giờ sử dụng quyền 777 - -Bạn không bao giờ được đặt bất kỳ thư mục hoặc tệp nào ở cấp độ quyền `777`, vì cấp độ quyền này cho phép bất kỳ ai cũng có thể truy cập nội dung của thư mục và tệp bất kể người dùng hoặc nhóm. - -::: - -## Tuỳ chỉnh đường dẫn - -Theo mặc định, cấu trúc thư mục của Flarum bao gồm thư mục `public` chỉ chứa các tệp có thể truy cập công khai. Đây là phương pháp tốt nhất về bảo mật, đảm bảo rằng tất cả các tệp mã nguồn nhạy cảm hoàn toàn không thể truy cập được từ web gốc. - -Tuy nhiên, nếu bạn muốn lưu trữ Flarum trong một thư mục con (như `yourite.com/forum`) hoặc nếu máy chủ của bạn không cấp cho bạn quyền kiểm soát webroot của mình (bạn đang mắc kẹt với một cái gì đó như `public_html` hoặc `htdocs`), bạn có thể thiết lập Flarum mà không cần thư mục `public`. - -If you intend to install Flarum using one of the archives, you can simply use the `no-public-dir` (Public Path = No) [archives](#installing-by-unpacking-an-archive) and skip the rest of this section. If you're installing via Composer, you'll need to follow the instructions below. - -Đơn giản chỉ cần di chuyển tất cả các tệp bên trong thư mục `public` (bao gồm cả `.htaccess`) vào thư mục bạn muốn chạy Flarum. Sau đó, chỉnh sửa `.htaccess` và bỏ ghi chú dòng 9-15 để bảo vệ các tài nguyên nhạy cảm. Đối với Nginx, bỏ ghi chú dòng 8-11 của `.nginx.conf`. - -Bạn cũng sẽ cần chỉnh sửa tệp `index.php` và thay đổi dòng sau: - -```php -$site = require './site.php'; -``` - - Chỉnh sửa `site.php` và cập nhật các đường dẫn trong các dòng sau để phản ánh cấu trúc thư mục mới của bạn: - -```php -'base' => __DIR__, -'public' => __DIR__, -'storage' => __DIR__.'/storage', -``` - -Cuối cùng, kiểm tra `config.php` và đảm bảo giá trị `url` là chính xác. - -## Nhập dữ liệu - -Nếu bạn có một cộng đồng hiện có và không muốn bắt đầu lại từ đầu, bạn có thể nhập dữ liệu hiện có của mình vào Flarum. Trong khi chưa có nhà nhập khẩu chính thức, cộng đồng đã có một số trình chuyển dữ liệu không chính thức: - -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) - -Chúng có thể được sử dụng cho các phần mềm diễn đàn khác bằng cách chuyển sang phpBB trước, sau đó đến Flarum. Xin lưu ý rằng chúng tôi không thể đảm bảo rằng những điều này sẽ hoạt động cũng như không thể cung cấp hỗ trợ cho chúng. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/internal/README.md b/i18n/vi/docusaurus-plugin-content-docs/current/internal/README.md deleted file mode 100644 index 98ab9ea30..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/internal/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -slug: '/internal' ---- - -# Tài liệu nhóm nội bộ - -Đây là phần tài liệu mới, nơi chúng tôi sẽ đăng một số tài liệu được nhóm Flarum sử dụng nội bộ. Chúng tôi đang bắt đầu phần này để cung cấp cho cộng đồng sự minh bạch về cách thức hoạt động của Flarum và giúp những người hy vọng đóng góp cho Flarum. \ No newline at end of file diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md b/i18n/vi/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md deleted file mode 100644 index 555e7977c..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bundled Extensions Policy - -This document is to assist in deciding what core features should be bundled or maintained by the Flarum project team. - -Understand that Flarum aims to have a lean and efficient team. To guarantee a transparent workload, we intentionally have a "this could be an extension" mentality. The acronym D.O.R.C. spells out our decision-making process. - -- **Density**: prevent bloating Flarum so that it becomes a burden to install on shared hosting plans with limited space. -- **Opinionatedness**: no extensions should be bundled that is only useful by only a limited amount of communities or on specific hosting environments. -- **Responsibility**: extensions that could easily be maintained by others should be maintained by others. -- **Complexity**: extensions that are complex in terms of design, frontend or backend code should not be a responsibility of the Flarum project team. - -### Density - -To prevent the installation size of Flarum from continuously increasing we need to protect it from extensions that bloat it. We should ship extensions with Flarum that, for instance, have kilobytes in media files. - -### Opinionatedness - -Our goal is to allow installation of Flarum, in its vanilla form, by any community on any hosting environment. This includes shared hosting environment as well. - -Releasing Flarum with extensions that add functionality specific to cloud based (AWS) installations or for corporate support communities, as such, is unwanted. - -### Responsibility - -Protecting the time of the project team is key. To do so we should empower the ecosystem in building extensions that it needs. Therefor we distance ourselves from the responsibility of building every and all extensions. The responsibility of extension development is held primarily by our community. - -### Complexity - -Complex extensions require a vast amount of time, not just for development, but also documentation and support. To protect the lean and efficient principles of the team, we will not take ownership of extensions that add this complexity. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/internal/extension-manager.md b/i18n/vi/docusaurus-plugin-content-docs/current/internal/extension-manager.md deleted file mode 100644 index c2287d5fc..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/internal/extension-manager.md +++ /dev/null @@ -1,87 +0,0 @@ -# Extension Manager -This contains an explanation of how the extension manager works and what it has to offer. - -slightly outdated: see [the extensions guide for more](/extensions.md). - -## Nội dung -* Cài đặt, Cập nhật và Xoá tiện ích mở rộng. -* [Kiểm tra bản cập nhật](#checking-for-updates). -* [Cập nhật toàn bộ Flarum](#global-flarum-updates). -* [Cập nhật từng gói Flarum nhỏ](#patch-minor-flarum-updates). -* [Cập nhật chính Flarum](#major-flarum-updates). -* [Cập nhật Flarum (toàn bộ, từng cái, chính)](#flarum-updates-global-minor-major). -* [Nền tác vụ](#background-tasks). - -## Yêu cầu -Có một số trở ngại cần được lưu ý trước khi sử dụng. - -### Quyền đối với tệp -User web cần có quyền đọc và ghi các tệp và thư mục như: `vendor`, `composer.json`, `composer.lock` và `storage`. Ngay bây giờ, một cảnh báo sẽ hiển thị khi trường hợp này không xảy ra, điều này tốt nhất nên được thay đổi để chỉ đề cập đến các tệp/thư mục thiếu quyền thay vì tất cả. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Đường dẫn kho lưu trữ -Trong môi trường phát triển (và sản xuất trong các tình huống hiếm gặp) nên có một kho lưu trữ đường dẫn đến một thư mục chứa các gói (chủ yếu là dev), đường dẫn đến thư mục này phải được thay đổi thành một đường dẫn tuyệt đối, nếu không trình soạn thảo sẽ gặp khó khăn khi chạy bất kỳ lệnh nào. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the extension manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the extension manager UI. - -## Các hành động phổ biến -Mỗi một trong số các tính năng được liệt kê ở trên về cơ bản là một hoặc hai lệnh của Composer, và có những hành động/hành vi chung giữa tất cả chúng. - -* Hạn chế quyền truy cập vào quản trị viên. -* Xác thực tên gói được cung cấp hoặc id phần mở rộng nếu được cung cấp. -* Lỗi nếu cài đặt tiện ích mở rộng hiện có, cập nhật hoặc xóa tiện ích mở rộng không hiện có ... vv -* Đang chạy lệnh [tự động ghi lại nhật ký đầu ra](#command-output-logging). -* [Lỗi do lỗi câu lệnh](#command-failure). -* Phái một sự kiện. -* Nếu đang chạy bản cập nhật: - + Xóa bộ nhớ cache. - + Chạy di chuyển. - + Xuất bản nội dung. - + Chạy kiểm tra cập nhật và ghi lại bất kỳ tiện ích mở rộng nào không cập nhật lên phiên bản mới nhất của chúng trong quá trình cập nhật. - -### Ghi nhật ký lệnh đầu ra -Xem xét điều này vẫn đang thử nghiệm và đặc biệt là để hỗ trợ dễ dàng hơn, mỗi đầu ra lệnh được ghi vào `storage/logs/composer` giống như các bản ghi lỗi Flarum, cho phép quay lại và xem điều gì đã xảy ra trong một lệnh chấp hành. - -### Lệnh thất bại -Khi một lệnh Composer không thành công (được mã thoát nhận dạng), một ngoại lệ được đưa ra có chứa lý do ngoại lệ đó đoán ra dựa trên văn bản đầu ra của lệnh. Các nguyên nhân được phỏng đoán hiển thị thành các thông báo cảnh báo giải thích thích hợp trên giao diện người dùng. - -## Kiểm tra các bản cập nhật -Thao tác này thực thi lệnh `composer outdated -D --format json` kiểm tra các bản cập nhật của các gói được yêu cầu trực tiếp trong thư mục gốc `composer.json` và xuất ra kết quả ở định dạng JSON. Chỉ những gói được đánh dấu là `semver-safe-update` và `update-could` bởi Composer mới được hiển thị. - -Thông tin về lần kiểm tra cập nhật cuối cùng được lưu vào cài đặt JSON. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Cập nhật toàn bộ Flarum -Chỉ cần chạy lệnh `command update --prefer-dist --no-dev -a --with-all-dependencies`, hữu ích để cập nhật tất cả các gói. - -## Cập nhật Flarum bản vá lỗi nhỏ -Điều này thay đổi trực tiếp các phiên bản gói được yêu cầu thành `*` và sau đó thực thi lệnh `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Cập nhật Flarum chính -Điều này thay đổi trực tiếp các phiên bản gói được yêu cầu thành `*`, thay đổi cốt lõi thành yêu cầu phiên bản chính mới nhất và sau đó thực hiện lệnh tương tự ở trên. Khi thất bại, có thể đoán chính xác rằng một số tiện ích mở rộng không tương thích với phiên bản chính mới, các chi tiết ngoại lệ sẽ bao gồm một loạt các tên gói tiện ích mở rộng không tương thích và nó sẽ được hiển thị trong giao diện người dùng, với khả năng chạy `composer why-not flarum/core 2.0` để biết thêm chi tiết. - -![cập nhật giao diện người dùng chính](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Cập nhật Flarum (toàn bộ, phụ, chính) -Thông tin về các bản cập nhật cuối cùng đã chạy được lưu trong cài đặt `last_update_run` JSON, có thể chứa một loạt các tên gói phần mở rộng không cập nhật lên phiên bản mới nhất của chúng trong quá trình này, điều này được hiển thị trong giao diện người dùng dưới dạng các nút biểu tượng cảnh báo trên các mục tiện ích mở rộng, nhấp vào chúng sẽ thực hiện `composer why-not`, hiển thị chi tiết về lỗi trong một phương thức. - -![Giao diện người dùng với danh sách các tiện ích mở rộng chứa các nút biểu tượng cảnh báo](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![Giao diện người dùng với phương thức hiển thị chi tiết](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Nhiệm vụ nền -Để giải quyết các vấn đề về thời gian chờ, các lệnh của trình soạn nhạc cũng có thể chạy trên nền bằng cách sử dụng hàng đợi. Người dùng có thể được hướng tới [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) như một giải pháp hàng đợi cơ bản. Nó chứa các hướng dẫn về cách kích hoạt hàng đợi thông qua một công việc cron. - -:::danger Phiên bản quy trình PHP Job Cron - -Các máy chủ chia sẻ thường có phiên bản php thấp được sử dụng trong SSH, người dùng phải được chỉ ra thực tế rằng họ phải đảm bảo quy trình php là phiên bản tương thích với Flarum. Bằng cách kiểm tra thủ công hoặc bằng cách hỏi máy chủ của họ. - -::: - -![Extension Manager Queue Table Preview](/en/img/extension-manager-queue.png) - -## TODO -- Hãy thử trên dịch vụ lưu trữ được chia sẻ. -- Giải thích tốt hơn trên giao diện người dùng về các tác vụ nền. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/internal/merging-policy.md b/i18n/vi/docusaurus-plugin-content-docs/current/internal/merging-policy.md deleted file mode 100644 index 067e2809f..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/internal/merging-policy.md +++ /dev/null @@ -1,38 +0,0 @@ -# PR Merging Policy - -Technical contributions to the Flarum source code go through a review process. Over the years we have tuned this process based on our experiences, our targeted development speed and availability. - -## What makes a great Pull Request? - -Great pull requests: - -- Have the [Pull Request template](https://github.com/flarum/.github/blob/main/PULL_REQUEST_TEMPLATE.md) filled out completely when opening a pull request. -- Do not combine different changes. Although tempting, don't change formatting of unrelated code. Stick to the one feature or change you wish to contribute. -- Have a related issue where the technical implementation has been agreed upon by the core team, or has been approved on by the core team through discussion on the official forums or other channels like Discord. -- Clearly explain the need for the change and list the areas where the pull request requires discussion. - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. We usually find several commits from bots like StyleCI in these prefabricated commit messages, their commit messages should be removed. - -- After merging: - - Assign the related issue (if none exists, the pull request itself, but never both) to the appropriate milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/internal/merging.md b/i18n/vi/docusaurus-plugin-content-docs/current/internal/merging.md deleted file mode 100644 index 0408b1bee..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/internal/merging.md +++ /dev/null @@ -1,29 +0,0 @@ -# PR Merging Workflow - - -## Implementation Review Criteria - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all of the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- Merging: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. - -- After merging: - - Make sure the *issue* (if none exists, the PR - but not both) belongs to the appropriate milestone and project board. - - PRs in extensions cannot be assigned to core milestones, so create a core issue that references it and add it to the milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/internal/package-manager.md b/i18n/vi/docusaurus-plugin-content-docs/current/internal/package-manager.md deleted file mode 100644 index 63aa29268..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/internal/package-manager.md +++ /dev/null @@ -1,89 +0,0 @@ -# Trình quản lý gói -Dưới đây sẽ giải thích về cách hoạt động của Trình quản lý gói và những gì nó có thể làm được. - -## Nội dung -* Cài đặt, Cập nhật và Xoá tiện ích mở rộng. -* [Kiểm tra bản cập nhật](#checking-for-updates). -* [Cập nhật toàn bộ Flarum](#global-flarum-updates). -* [Cập nhật từng gói Flarum nhỏ](#patch-minor-flarum-updates). -* [Cập nhật chính Flarum](#major-flarum-updates). -* [Cập nhật Flarum (toàn bộ, từng cái, chính)](#flarum-updates-global-minor-major). -* [Nền tác vụ](#background-tasks). - -## Yêu cầu -Có một số trở ngại cần được lưu ý trước khi sử dụng. - -### Quyền đối với tệp -User web cần có quyền đọc và ghi các tệp và thư mục như: `vendor`, `composer.json`, `composer.lock` và `storage`. Ngay bây giờ, một cảnh báo sẽ hiển thị khi trường hợp này không xảy ra, điều này tốt nhất nên được thay đổi để chỉ đề cập đến các tệp/thư mục thiếu quyền thay vì tất cả. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Đường dẫn kho lưu trữ -Trong môi trường phát triển (và sản xuất trong các tình huống hiếm gặp) nên có một kho lưu trữ đường dẫn đến một thư mục chứa các gói (chủ yếu là dev), đường dẫn đến thư mục này phải được thay đổi thành một đường dẫn tuyệt đối, nếu không trình soạn thảo sẽ gặp khó khăn khi chạy bất kỳ lệnh nào. Ngoài ra, kho lưu trữ đường dẫn theo mặc định có mức độ ưu tiên cao hơn, vì vậy việc yêu cầu một phần mở rộng tồn tại trong kho lưu trữ đó có thể sẽ không thành công, trừ khi một ràng buộc `*@dev` được chỉ định, trong trường hợp đó, trình quản lý gói không được sử dụng cho các mục đích của nhà phát triển dù sao. - -Hiện tại có gợi ý về bất kỳ điều này trong giao diện người dùng của trình quản lý gói. - -## Các hành động phổ biến -Mỗi một trong số các tính năng được liệt kê ở trên về cơ bản là một hoặc hai lệnh của Composer, và có những hành động/hành vi chung giữa tất cả chúng. - -* Hạn chế quyền truy cập vào quản trị viên. -* Xác thực tên gói được cung cấp hoặc id phần mở rộng nếu được cung cấp. -* Lỗi nếu cài đặt tiện ích mở rộng hiện có, cập nhật hoặc xóa tiện ích mở rộng không hiện có ... vv -* Đang chạy lệnh [tự động ghi lại nhật ký đầu ra](#command-output-logging). -* [Lỗi do lỗi câu lệnh](#command-failure). -* Phái một sự kiện. -* Nếu đang chạy bản cập nhật: - + Xóa bộ nhớ cache. - + Chạy di chuyển. - + Xuất bản nội dung. - + Chạy kiểm tra cập nhật và ghi lại bất kỳ tiện ích mở rộng nào không cập nhật lên phiên bản mới nhất của chúng trong quá trình cập nhật. - -### Ghi nhật ký lệnh đầu ra -Xem xét điều này vẫn đang thử nghiệm và đặc biệt là để hỗ trợ dễ dàng hơn, mỗi đầu ra lệnh được ghi vào `storage/logs/composer` giống như các bản ghi lỗi Flarum, cho phép quay lại và xem điều gì đã xảy ra trong một lệnh chấp hành. - -### Lệnh thất bại -Khi một lệnh Composer không thành công (được mã thoát nhận dạng), một ngoại lệ được đưa ra có chứa lý do ngoại lệ đó đoán ra dựa trên văn bản đầu ra của lệnh. Các nguyên nhân được phỏng đoán hiển thị thành các thông báo cảnh báo giải thích thích hợp trên giao diện người dùng. - -## Kiểm tra các bản cập nhật -Thao tác này thực thi lệnh `composer outdated -D --format json` kiểm tra các bản cập nhật của các gói được yêu cầu trực tiếp trong thư mục gốc `composer.json` và xuất ra kết quả ở định dạng JSON. Chỉ những gói được đánh dấu là `semver-safe-update` và `update-could` bởi Composer mới được hiển thị. - -Thông tin về lần kiểm tra cập nhật cuối cùng được lưu vào cài đặt JSON. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Cập nhật toàn bộ Flarum -Chỉ cần chạy lệnh `command update --prefer-dist --no-dev -a --with-all-dependencies`, hữu ích để cập nhật tất cả các gói. - -## Cập nhật Flarum bản vá lỗi nhỏ -Điều này thay đổi trực tiếp các phiên bản gói được yêu cầu thành `*` và sau đó thực thi lệnh `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Cập nhật Flarum chính -Điều này thay đổi trực tiếp các phiên bản gói được yêu cầu thành `*`, thay đổi cốt lõi thành yêu cầu phiên bản chính mới nhất và sau đó thực hiện lệnh tương tự ở trên. Khi thất bại, có thể đoán chính xác rằng một số tiện ích mở rộng không tương thích với phiên bản chính mới, các chi tiết ngoại lệ sẽ bao gồm một loạt các tên gói tiện ích mở rộng không tương thích và nó sẽ được hiển thị trong giao diện người dùng, với khả năng chạy `composer why-not flarum/core 2.0` để biết thêm chi tiết. - -![cập nhật giao diện người dùng chính](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Cập nhật Flarum (toàn bộ, phụ, chính) -Thông tin về các bản cập nhật cuối cùng đã chạy được lưu trong cài đặt `last_update_run` JSON, có thể chứa một loạt các tên gói phần mở rộng không cập nhật lên phiên bản mới nhất của chúng trong quá trình này, điều này được hiển thị trong giao diện người dùng dưới dạng các nút biểu tượng cảnh báo trên các mục tiện ích mở rộng, nhấp vào chúng sẽ thực hiện `composer why-not`, hiển thị chi tiết về lỗi trong một phương thức. - -![Giao diện người dùng với danh sách các tiện ích mở rộng chứa các nút biểu tượng cảnh báo](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![Giao diện người dùng với phương thức hiển thị chi tiết](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Nhiệm vụ nền -Để giải quyết các vấn đề về thời gian chờ, các lệnh của trình soạn nhạc cũng có thể chạy trên nền bằng cách sử dụng hàng đợi. Người dùng có thể được hướng tới [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) như một giải pháp hàng đợi cơ bản. Nó chứa các hướng dẫn về cách kích hoạt hàng đợi thông qua một công việc cron. - -:::danger Phiên bản quy trình PHP Job Cron - -Các máy chủ chia sẻ thường có phiên bản php thấp được sử dụng trong SSH, người dùng phải được chỉ ra thực tế rằng họ phải đảm bảo quy trình php là phiên bản tương thích với Flarum. Bằng cách kiểm tra thủ công hoặc bằng cách hỏi máy chủ của họ. - -::: - -![Xem trước bảng xếp hàng của trình quản lý gói](/en/img/package-manager-queue.png) - -## TODO -- Hãy thử trên dịch vụ lưu trữ được chia sẻ. -- Lệnh của Composer không được trùng lặp. -- Mã TODOs. -- Giải thích tốt hơn trên giao diện người dùng về các tác vụ nền. -- Hãy xem xét một tình huống trong đó chúng tôi đang cập nhật tiện ích mở rộng không phải là phần phụ thuộc bắt buộc gốc, chẳng hạn như gói. -- Chạy một tác vụ nền tại một thời điểm, ngăn người dùng kích hoạt nhiều tác vụ. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/languages.md b/i18n/vi/docusaurus-plugin-content-docs/current/languages.md deleted file mode 100644 index bc0a73685..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/languages.md +++ /dev/null @@ -1,29 +0,0 @@ -# Ngôn ngữ - -Thật dễ dàng để thêm một ngôn ngữ mới vào cài đặt Flarum cơ bản của bạn. Chỉ cần làm theo hướng dẫn bên dưới để tải xuống và cài đặt gói ngôn ngữ bạn chọn. - -Khi bạn đã thêm gói ngôn ngữ, bạn có thể [ đặt nó làm ngôn ngữ mặc định ](#setting-the-default-language) cho diễn đàn của mình. Và nếu bạn thấy mình không cần một trong các gói ngôn ngữ đã cài đặt, bạn luôn có thể [ tắt nó ](#disabling-a-language-pack). Nếu bạn đang sử dụng bất kỳ tiện ích mở rộng nào của bên thứ ba, hãy nhớ [ đọc phần này ](#third-party-extensions) trước khi bắt đầu. - -## Cài đặt Gói ngôn ngữ - -Để bắt đầu, hãy truy cập thẻ [Extensions > Languages](https://discuss.flarum.org/t/languages) tại trang Cộng đồng Flarum và tìm gói ngôn ngữ mà bạn muốn cài đặt. - -Gói ngôn ngữ được cài đặt giống như [ phần mở rộng ](extensions.md). Ngôn ngữ sẽ xuất hiện trong trang ** Tiện ích mở rộng ** của giao diện quản trị và bạn có thể bật ngôn ngữ đó ở đó. - -Đó là tất cả để có nó! Giờ đây, bạn có thể sử dụng công cụ chọn ngôn ngữ trong tiêu đề trang web của mình để chuyển hiển thị của diễn đàn sang ngôn ngữ mới. - -## Thiết lập ngôn ngữ mặc định - -Sau khi bạn đã cài đặt gói ngôn ngữ và đảm bảo rằng nó đang hoạt động, bạn có thể muốn đặt gói này làm ngôn ngữ mặc định cho người dùng và khách mới. Bạn có thể làm điều đó trên trang **Cơ bản** của giao diện quản trị viên. - -## Vô hiệu hoá Gói ngôn ngữ - -Nếu bạn quyết định rằng bạn không cần phải hỗ trợ một ngôn ngữ nhất định, thì bạn có thể tắt nó đi. Chỉ cần tìm gói ngôn ngữ trong trang **Tiện ích mở rộng** của giao diện quản trị viên và tắt nó. - -Việc tắt một ngôn ngữ có thể hữu ích nếu bạn đang chạy một trang web đơn ngữ và không muốn bộ chọn ngôn ngữ xuất hiện trong tiêu đề trang web. Bộ chọn ngôn ngữ bị ẩn khi chỉ một ngôn ngữ được bật. - -## Cộng đồng Tiện ích mở rộng - -Mặc dù các gói ngôn ngữ được tải xuống từ trang web Cộng đồng Flarum nói chung sẽ bao gồm bản dịch cho tất cả các tiện ích mở rộng đi kèm với Flarum, chúng _sẽ không_ như một quy tắc bao gồm bất kỳ tiện ích mở rộng cộng đồng nào mà bạn có thể có Cài đặt. Việc cung cấp và duy trì bản dịch cho các tiện ích mở rộng của họ là tùy thuộc vào các nhà phát triển. - -Vì vậy, trước khi cài đặt tiện ích mở rộng cộng đồng, bạn nên kiểm tra để đảm bảo rằng nó bao gồm các bản dịch cho từng gói ngôn ngữ mà bạn đã cài đặt. Nếu bạn nhận thấy rằng tiện ích mở rộng không hỗ trợ ngôn ngữ bạn cần, vui lòng liên hệ trực tiếp với nhà phát triển và sắp xếp để được bổ sung các bản dịch cần thiết. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/mail.md b/i18n/vi/docusaurus-plugin-content-docs/current/mail.md deleted file mode 100644 index 7aee74e87..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/mail.md +++ /dev/null @@ -1,29 +0,0 @@ -# Cấu hình Email - -Bất kỳ cộng đồng nào cũng cần gửi email để cho phép xác minh email, đặt lại mật khẩu, thông báo và các giao tiếp khác tới người dùng. Định cấu hình diễn đàn của bạn để gửi email nên là một trong những bước đầu tiên của bạn với tư cách là quản trị viên: cấu hình không chính xác sẽ gây ra lỗi khi người dùng cố gắng đăng ký. - -## Trình điều khiển có sẵn - -Flarum cung cấp một số trình điều khiển theo mặc định, chúng được liệt kê và giải thích bên dưới. Các nhà phát triển cũng có thể thêm [trình điều khiển thư tùy chỉnh thông qua các tiện ích mở rộng](extend/mail.md). - -### SMTP - -Đây có lẽ là trình điều khiển email được sử dụng phổ biến nhất, cho phép bạn định cấu hình máy chủ lưu trữ, cổng / mã hóa, tên người dùng và mật khẩu cho dịch vụ SMTP bên ngoài. Xin lưu ý rằng trường mã hóa yêu cầu `ssl` hoặc `tls`. - -### Mail - -Trình điều khiển `mail` sẽ cố gắng sử dụng hệ thống email sendmail/postfix có trong nhiều máy chủ lưu trữ. Bạn phải cài đặt đúng cách và định cấu hình sendmail trên máy chủ của mình để nó hoạt động. - -### Mailgun - -Trình điều khiển này sử dụng tài khoản [Mailgun](https://www.mailgun.com/) của bạn để gửi email. Bạn sẽ cần một khóa bí mật, cũng như miền và khu vực từ cấu hình mailgun của bạn. - -Để sử dụng trình điều khiển mailgun, bạn sẽ cần cài đặt gói trình soạn nhạc Guzzle (một ứng dụng khách PHP HTTP). Bạn có thể thực hiện việc này bằng cách chạy `composer require guzzlehttp/guzzle:^6.0|^7.0` trong thư mục gốc của cài đặt Flarum của bạn. - -### Nhật ký - -Trình điều khiển thư nhật ký KHÔNG GỬI MAIL, và chủ yếu được sử dụng bởi các nhà phát triển. Nó ghi nội dung của bất kỳ email nào vào tệp nhật ký trong `FLARUM_ROOT_DIRECTORY/storage/logs`. - -## Thử nghiệm Email - -Khi bạn đã lưu cấu hình email, bạn có thể nhấp vào nút "Gửi Thư Kiểm tra" trên trang Thư của bảng điều khiển quản trị để đảm bảo cấu hình của bạn hoạt động. Khi bạn đã lưu email cấu hình, bạn có thể chạm vào nút "Gửi Thư Kiểm tra" trên trang Thư của người quản lý bảng để đảm bảo cấu hình của bạn hoạt động. Đảm bảo kiểm tra thư rác của bạn nếu không có lỗi, nhưng không có gì hiển thị trong hộp thư đến của bạn. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/releases.md b/i18n/vi/docusaurus-plugin-content-docs/current/releases.md deleted file mode 100644 index 26f3474ca..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/releases.md +++ /dev/null @@ -1,15 +0,0 @@ -# Ghi chú phát hành - - - - -Các ghi chú phát hành để thể tìm thấy trong [Cộng đồng Flarum](https://discuss.flarum.org/t/blog?sort=newest). diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/rest-api.md b/i18n/vi/docusaurus-plugin-content-docs/current/rest-api.md deleted file mode 100644 index 79552d7d8..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/rest-api.md +++ /dev/null @@ -1,375 +0,0 @@ -# Sử dụng REST API - -Flarum có sẵn API REST được ứng dụng một trang sử dụng nhưng cũng có sẵn cho các tập lệnh bên ngoài. - -API tuân theo các phương pháp hay nhất được xác định bởi đặc tả [JSON: API](https://jsonapi.org/). - -:::info - -Để mở rộng REST API với các điểm cuối mới, hãy xem [API và Luồng dữ liệu](extend/api.md) trong tài liệu dành cho nhà phát triển. - -::: - -## Xác thực - -Ứng dụng trang đơn sử dụng cookie phiên để xác thực dựa trên API. Các tập lệnh bên ngoài có thể sử dụng xác thực không trạng thái bằng [Khóa API](#api-keys) hoặc [Mã token truy cập](#access-tokens). - -Điểm cuối `GET` có thể được sử dụng mà không cần xác thực. Chỉ nội dung hiển thị cho khách sẽ được trả lại. Các điểm cuối khác thường không thể được sử dụng mà không có xác thực vì [bảo vệ CSRF](#csrf-protection). - -### Khoá API - -Khóa API là cách chính để các tập lệnh, công cụ và tích hợp tương tác với Flarum. - -#### Tạo - -Hiện không có giao diện người dùng nào để quản lý Khóa API, nhưng chúng có thể được tạo theo cách thủ công trong bảng `api_keys` của cơ sở dữ liệu. - -Các thuộc tính sau có thể được điền: - -- `key`: Tạo một mã token dài duy nhất (khuyến nghị: chữ-số, 40 ký tự) và đặt nó ở đây, đây sẽ là mã thông báo được sử dụng trong header `Authorization`. -- `user_id`: Tùy chọn. Nếu được đặt, khóa chỉ có thể được sử dụng để hoạt động như một người dùng nhất định. - -Các thuộc tính còn lại hoặc được điền tự động hoặc hiện không được sử dụng: - -- `id`: Sẽ được điền bằng cách tăng tự động MySQL. -- `allow_ips`: Không được triển khai. -- `scopes`: Không được triển khai. -- `created_at`: Có thể được đặt thành bất kỳ ngày nào, nhưng có nghĩa là ngày tạo khóa. -- `last_activity_at`: Sẽ được cập nhật tự động khi mã thông báo được sử dụng. - -#### Sử dụng - -Đính kèm giá trị khóa của bạn vào mỗi yêu cầu API bằng header `Authorization`. Sau đó, cung cấp ID người dùng bạn muốn tương tác ở cuối header: - - Authorization: Token YOUR_API_KEY_VALUE; userId=1 - -Nếu giá trị `user_id` đã được đặt cho khóa trong cơ sở dữ liệu, thì `userId=` sẽ bị bỏ qua. Nếu không, nó có thể được đặt thành bất kỳ ID người dùng hợp lệ nào tồn tại trong cơ sở dữ liệu. - -### Mã token truy cập - -Mã token truy cập là mã token tồn tại trong thời gian ngắn thuộc về một người dùng cụ thể. - -Những mã token đó được sử dụng trong hậu trường cho các phiên cookie. Việc sử dụng chúng trong các yêu cầu API không trạng thái có tác dụng giống như một phiên thông thường. Hoạt động gần đây nhất của người dùng sẽ được cập nhật mỗi khi mã thông báo được sử dụng. - -#### Tạo - -Tất cả người dùng được phép tạo mã token truy cập. Để tạo mã token, hãy sử dụng điểm cuối `/api/token` với thông tin đăng nhập của người dùng của bạn: - -``` -POST /api/token HTTP/1.1 - -{ - "identification": "Toby", - "password": "pass7word" -} - -HTTP/1.1 200 OK - -{ - "token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX", - "userId": "1" -} -``` - -Hiện tại, 3 loại mã thông báo tồn tại, mặc dù chỉ có 2 loại có thể được tạo thông qua REST API. - -- Các mã token `session` hết hạn sau 1 giờ không hoạt động. Đây là loại mã token mặc định. -- Các mã token `session_remember` sẽ hết hạn sau 5 năm không hoạt động. Nó có thể được lấy bằng cách chỉ định `remember=1` trong các thuộc tính yêu cầu. -- Mã token `developer` không bao giờ hết hạn. Chúng chỉ có thể được tạo thủ công trong cơ sở dữ liệu vào lúc này. - -**Tất cả các mã token truy cập sẽ bị xóa khi người dùng đăng xuất** (điều này bao gồm các mã token của `developer`, mặc dù người ta đã lên kế hoạch thay đổi nó). - -#### Sử dụng - -Đính kèm giá trị `token` được trả về vào mỗi yêu cầu API bằng cách sử dụng header ` Authorization`: - - Authorization: Token YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX - -### Bảo vệ CSRF - -Hầu hết các điểm cuối API `POST`/`PUT`/`DELETE` được bảo vệ chống lại [Giả mạo yêu cầu Cross-site](https://en.wikipedia.org/wiki/Cross-site_request_forgery). Điều này có nghĩa là không thể thực hiện các yêu cầu không trạng thái nếu không có xác thực. - -Khi sử dụng Khóa API hoặc Mã Token, bảo vệ CSRF bị bỏ qua. - -## Điểm cuối - -Phần tài liệu này vẫn đang được hoàn thiện. Chúng tôi đang nghiên cứu các tùy chọn để cung cấp tài liệu tự động về các điểm cuối. - -Mọi tiện ích mở rộng đều thêm các điểm cuối và thuộc tính mới, vì vậy rất khó để cung cấp tài liệu đầy đủ về tất cả các điểm cuối. Một cách tốt để phát hiện ra các điểm cuối là sử dụng các công cụ phát triển trình duyệt để kiểm tra các yêu cầu do ứng dụng một trang đưa ra. - -Dưới đây là một vài ví dụ về các điểm cuối thường được sử dụng. JSON đã được cắt bớt để giúp việc đọc dễ dàng hơn. - -### Danh sách cuộc thảo luận - - GET /api/discussions - -```json -{ - "links": { - "first": "https://flarum.tld/api/discussions", - "next": "https://flarum.tld/api/discussions?page%5Boffset%5D=20" - }, - "data": [ - { - "type": "discussions", - "id": "234", - "attributes": { - "title": "Lorem Ipsum", - "slug": "234-lorem-ipsum", - "commentCount": 10, - "participantCount": 3, - "createdAt": "2022-01-01T10:20:30+00:00", - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "lastPostNumber": 10, - "canReply": true, - "canRename": true, - "canDelete": true, - "canHide": true, - "isHidden": true, - "hiddenAt": "2022-01-06T10:20:30+00:00", - "lastReadAt": "2022-01-02T10:20:30+00:00", - "lastReadPostNumber": 2, - "isApproved": true, - "canTag": true, - "isLocked": false, - "canLock": true, - "isSticky": false, - "canSticky": true, - "canMerge": true, - "subscription": null - }, - "relationships": { - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - "lastPostedUser": { - "data": { - "type": "users", - "id": "64" - } - }, - "tags": { - "data": [ - { - "type": "tags", - "id": "3" - } - ] - }, - "firstPost": { - "data": { - "type": "posts", - "id": "668" - } - } - } - }, - { - "type": "discussions", - "id": "234", - "attributes": { - // [...] - }, - "relationships": { - // [...] - } - }, - // [...] còn nhiều - ], - "included": [ - { - "type": "users", - "id": "1", - "attributes": { - "username": "Admin", - "displayName": "Admin", - "avatarUrl": null, - "slug": "1" - } - }, - { - "type": "users", - "id": "64", - "attributes": { - "username": "Flarum", - "displayName": "Flarum", - "avatarUrl": "https://flarum.tld/assets/avatars/Z4hEncw0ndVqZ8be.png", - "slug": "64" - } - }, - { - "type": "tags", - "id": "3", - "attributes": { - "name": "Welcome", - "description": "Post interesting things here", - "slug": "welcome", - "color": "#888", - "backgroundUrl": null, - "backgroundMode": null, - "icon": "fas fa-bullhorn", - "discussionCount": 30, - "position": 1, - "defaultSort": null, - "isChild": false, - "isHidden": false, - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "canStartDiscussion": true, - "canAddToDiscussion": true, - "isRestricted": false - } - }, - { - "type": "posts", - "id": "668", - "attributes": { - "number": 1, - "createdAt": "2022-01-01T10:20:30+00:00", - "contentType": "comment", - "contentHtml": "

Hello World

" - } - }, - // [...] còn nhiều cuộc thảo luận khác - ] -} -``` - -### Tạo cuộc thảo luận - - POST /api/discussions - -```json -{ - "data":{ - "type": "discussions", - "attributes": { - "title": "Lorem Ipsum", - "content": "Hello World" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "1" - } - ] - } - } - } -} -``` - -Phản hồi trả về bao gồm ID của cuộc thảo luận mới: - -```json -{ - "data": { - "type": "discussions", - "id": "42", - "attributes": { - "title": "Lorem Ipsum", - "slug": "42-lorem-ipsum", - "commentCount": 1 - // [...] other attributes - }, - "relationships": { - "posts": { - "data": [ - { - "type": "posts", - "id": "58" - } - ] - }, - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - // [...] các quan hệ khác - } - }, - "included":[ - { - "type": "posts", - "id": "38", - "attributes": { - "number": 1, - "contentType": "comment", - "contentHtml": "\u003Cp\u003EHello World\u003C\/p\u003E" - // [...] các thuộc tính khác - } - } - // [...] other includes - ] -} -``` - -### Tạo người dùng - - POST /api/users - -```json -{ - "data": { - "attributes": { - "username": "Flarum", - "email": "flarum@example.com", - "password": "correcthorsebatterystaple" - } - } -} -``` - -## Lỗi - -Flarum sử dụng nhiều mã trạng thái HTTP khác nhau và bao gồm các mô tả lỗi tuân theo [JSON:Thông số lỗi API](https://jsonapi.org/format/#errors). - -Dưới đây là một số lỗi phổ biến mà bạn có thể gặp phải khi sử dụng REST API: - -### Mã token CSRF không khớp - -Nếu bạn nhận được lỗi HTTP 400 với thông báo `csrf_token_mismatch`, điều đó có nghĩa là header `Authorization` không có hoặc không hợp lệ và Flarum đã cố gắng xác thực thông qua cookie phiên. - -```json -{ - "errors": [ - { - "status": "400", - "code": "csrf_token_mismatch" - } - ] -} -``` - -### Lỗi xác thực - -Lỗi xác thực được trả về với mã trạng thái 422 HTTP. Tên của trường không hợp lệ được trả về dưới dạng giá trị `pointer`. Có thể có nhiều lỗi cho một trường cùng một lúc. - -```json -{ - "errors": [ - { - "status": "422", - "code": "validation_error", - "detail": "The username has already been taken.", - "source":{ - "pointer":"\/data\/attributes\/username" - } - }, - { - "status": "422", - "code": "validation_error", - "detail": "The email has already been taken.", - "source": { - "pointer":"\/data\/attributes\/email" - } - } - ] -} -``` diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/scheduler.md b/i18n/vi/docusaurus-plugin-content-docs/current/scheduler.md deleted file mode 100644 index 6123ce7c3..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/scheduler.md +++ /dev/null @@ -1,55 +0,0 @@ -# Scheduler - -The Flarum scheduler allows extensions to automate certain tasks effortlessly. In this guide we will see how to set it up. We won't go into the details of cron itself, but if you want to read more about it, I suggest you take a look at [this Wikipedia article](https://en.wikipedia.org/wiki/Cron) on cron. - -## Why should I care? - -Quite simply, a growing list of extensions now support handling certain functions automatically for you, completely behind the scenes. Wondering why `fof/drafts` 'scheduled drafts' are not posting, or `fof/best-answer` 'remind users to set a best answer after X days' does not fire? That'll be because they will setup themselves with the scheduler service, but without a one-liner cron job, nothing will happen! - -## What extensions currently use the scheduler? - -Some of the most popular examples are the following: - -- [FoF Best Answer](https://github.com/FriendsOfFlarum/best-answer) -- [FoF Drafts](https://github.com/FriendsOfFlarum/drafts) -- [FoF Sitemap](https://github.com/FriendsOfFlarum/sitemap) -- [FoF Open Collective](https://github.com/FriendsOfFlarum/open-collective) -- [FoF Github Sponsors](https://github.com/FriendsOfFlarum/github-sponsors) - -## Ok, let's get this setup! - -Most (if not all) Linux distros either come with, or can have, cron installed. For example, on Debian and Ubuntu based systems, you can install `cron` like this: - -``` -sudo apt-get update -sudo apt-get install cron -``` - -In case you are using a RHEL based Linux distribution (CentOS, AlmaLinux, Rocky Linux...), install cron like this: - -``` -sudo dnf update -sudo dnf install crontabs -``` - -Once you have cron installed, let's create the one and only entry you need for Flarum: - -``` -crontab -e -``` - -This will open the cron editor. You may or may not have other entries there. Add this line, and remember to leave an empty line at the bottom. - -``` -* * * * * cd /path-to-your-project && php flarum schedule:run >> /dev/null 2>&1 -``` - -`* * * * *` tells cron to run your command every minute. - -In case you want to use a different value and don't know exactly how cron expressions work, you can use a [cron expression generator](https://crontab.guru) to easily get the desired string. - -`cd /path-to-your-project && php flarum schedule:run` executes Flarum's scheduler to trigger any tasks currently waiting to be run. If PHP isn't in your system's path, you may need to experiment with setting the full path to PHP. - -Lastly `>> /dev/null 2>&1` suppresses any output from the command. - -Voila! Now any extension that registers a task to run, anything from every minute to daily, monthly, yearly - whatever - will now run on your server. diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/themes.md b/i18n/vi/docusaurus-plugin-content-docs/current/themes.md deleted file mode 100644 index 66b38413b..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/themes.md +++ /dev/null @@ -1,29 +0,0 @@ -# Chủ đề - -Mặc dù chúng tôi đã làm việc chăm chỉ để làm cho Flarum đẹp nhất có thể, nhưng mỗi cộng đồng có thể sẽ muốn thực hiện một số chỉnh sửa/sửa đổi để phù hợp với phong cách mong muốn của họ. - -## Bảng điều khiển Quản trị - -The [admin dashboard](admin.md)'s Appearance page is a great first place to start customizing your forum. Tại đây, bạn có thể: - -- Chọn màu chủ đề -- Chuyển đổi chế độ tối và màu đầu trang -- Tải lên icon và favicon (icon hiển thị trong các tab của trình duyệt) -- Thêm HTML cho đầu trang và chân trang tùy chỉnh -- Thên [mã LESS/CSS](#css-theming) để thay đổi cách các phần tử được hiển thị - -## Chủ đề CSS - -CSS là một ngôn ngữ biểu định kiểu cho các trình duyệt biết cách hiển thị các phần tử của một trang web. Nó cho phép chúng tôi sửa đổi mọi thứ từ màu sắc, phông chữ đến kích thước phần tử và vị trí cho đến hình ảnh động. Thêm CSS tùy chỉnh có thể là một cách tuyệt vời để sửa đổi cài đặt Flarum của bạn cho phù hợp với chủ đề. - -Hướng dẫn CSS nằm ngoài phạm vi của tài liệu này, nhưng có rất nhiều tài nguyên trực tuyến tuyệt vời để tìm hiểu kiến ​​thức cơ bản về CSS. - -:::tip - -Flarum thực sự sử dụng LESS, giúp viết CSS dễ dàng hơn bằng cách cho phép các biến, điều kiện và hàm. - -::: - -## Tiện ích mở rộng - -[Hệ thống tiện ích mở rộng](extensions.md) linh hoạt của Flarum cho phép bạn thêm, xóa hoặc sửa đổi trên thực tế bất kỳ phần nào của Flarum. Nếu bạn muốn thực hiện các sửa đổi đáng kể về chủ đề ngoài việc thay đổi màu sắc/kích thước/kiểu dáng, thì một tiện ích mở rộng tùy chỉnh chắc chắn là cách tốt nhất. Để tìm hiểu cách tạo tiện ích mở rộng, hãy xem [tài liệu về tiện ích mở rộng](extend/README.md) của chúng tôi! diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/troubleshoot.md b/i18n/vi/docusaurus-plugin-content-docs/current/troubleshoot.md deleted file mode 100644 index 4014c6d98..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/troubleshoot.md +++ /dev/null @@ -1,56 +0,0 @@ -# Khắc phục sự cố - -Nếu Flarum không cài đặt hoặc hoạt động như mong đợi, điều đầu tiên bạn nên làm là *kiểm tra lại* xem môi trường của bạn có đáp ứng [yêu cầu hệ thống](install.md#server-requirements). Nếu bạn đang thiếu thứ gì đó mà Flarum cần để chạy, trước tiên bạn cần phải khắc phục điều đó. - -Tiếp theo, bạn nên dành vài phút để tìm kiếm trong [Diễn đàn hỗ trợ](https://discuss.flarum.org/t/support) và [trình theo dõi vấn đề](https://github.com/flarum/core/issues). Có thể ai đó đã báo cáo sự cố và bản sửa lỗi đã có sẵn hoặc đang được xử lý. Nếu bạn đã tìm kiếm kỹ lưỡng và không thể tìm thấy bất kỳ thông tin nào về vấn đề, đã đến lúc bắt đầu khắc phục sự cố. - -## Step 0: Activate debug mode - -:::danger Bỏ qua phần Sản xuất - -Các công cụ gỡ lỗi này rất hữu ích, nhưng có thể tiết lộ thông tin không nên công khai. Đây là những bước tốt nếu bạn đang sử dụng môi trường dàn dựng hoặc phát triển, nhưng nếu bạn không biết mình đang làm gì, hãy bỏ qua bước này khi ở trong môi trường sản xuất. - -::: - -Trước khi tiếp tục, bạn nên kích hoạt các công cụ gỡ lỗi của Flarum. Chỉ cần mở **config.php** bằng trình soạn thảo văn bản, thay đổi giá trị `debug` thành `true =` và lưu tệp. Điều này sẽ khiến Flarum hiển thị các thông báo lỗi chi tiết, giúp bạn có cái nhìn sâu sắc về những gì đang xảy ra. - -Nếu bạn thấy các trang trống và thay đổi ở trên không hữu ích, hãy thử đặt `display_errors` thành `On` trong tệp cấu hình **php.ini** của bạn. - -## Bước 1: Các lỗi phổ biến - -Rất nhiều vấn đề có thể được khắc phục bằng cách sau: - -* Xóa bộ nhớ cache của trình duyệt của bạn -* Xóa bộ đệm backend bằng [`php flarum cache:clear`](console.md). -* Đảm bảo rằng cơ sở dữ liệu của bạn được cập nhật với [`php flarum migrate`](console.md). -* Đảm bảo rằng [cấu hình email](mail.md) trong bảng điều khiển quản trị của bạn là đúng: cấu hình email không hợp lệ sẽ gây ra lỗi khi đăng ký, đặt lại mật khẩu, thay đổi email và gửi thông báo. -* Kiểm tra xem `config.php` của bạn có đúng không. Ví dụ: đảm bảo rằng `url` đang được sử dụng (`https` so với `http` và vấn đề phân biệt chữ hoa chữ thường ở đây!). -* Một thủ phạm tiềm năng có thể là đầu trang tùy chỉnh, chân trang tùy chỉnh hoặc LESS tùy chỉnh. Nếu sự cố của bạn nằm ở giao diện người dùng, hãy thử tạm thời xóa chúng qua trang Giao diện của trang tổng quan quản trị. - -Bạn cũng sẽ muốn xem kết quả đầu ra của [`php flarum info`](console.md) để đảm bảo rằng không có điều gì chính xảy ra. - -## Bước 2: Tạo lại vấn đề - -Cố gắng làm cho vấn đề xảy ra một lần nữa. Hãy chú ý cẩn thận đến những gì bạn đang làm khi nó xảy ra. Nó xảy ra mọi lúc, hay chỉ thỉnh thoảng? Hãy thử thay đổi một cài đặt mà bạn cho rằng có thể ảnh hưởng đến sự cố hoặc thứ tự mà bạn đang thực hiện. Nó có xảy ra trong một số điều kiện, nhưng không phải những điều kiện khác? - -Nếu gần đây bạn đã thêm hoặc cập nhật tiện ích mở rộng, bạn nên tạm thời vô hiệu hóa tiện ích đó để xem liệu điều đó có làm cho sự cố biến mất hay không. Đảm bảo rằng tất cả các tiện ích mở rộng của bạn đều được sử dụng với phiên bản Flarum bạn đang chạy. Các tiện ích mở rộng lỗi thời có thể gây ra nhiều vấn đề. - -Ở một nơi nào đó trong quá trình thực hiện, bạn có thể nhận ra ý tưởng về nguyên nhân gây ra sự cố của mình và tìm ra cách khắc phục nó. Nhưng ngay cả khi điều đó không xảy ra, bạn có thể sẽ tìm thấy một vài manh mối có giá trị giúp chúng tôi tìm ra điều gì đang xảy ra sau khi bạn đã gửi báo cáo lỗi của mình. - -## Bước 3: Thu thập thông tin - -Nếu có vẻ như bạn đang cần trợ giúp để giải quyết vấn đề, thì đã đến lúc nghiêm túc với việc thu thập dữ liệu. Tìm thông báo lỗi hoặc thông tin khác về sự cố ở những nơi sau: - -* Hiển thị trên trang thực tế -* Được hiển thị trong console của trình duyệt (Chrome: More tools -> Developer Tools -> Console) -* Được ghi lại trong nhật ký lỗi của máy chủ (ví dụ: `/var/log/nginx/error.log`) -* Được ghi lại trong nhật ký lỗi của PHP-FPM (ví dụ: `/var/log/php7.x-fpm.log`) -* Được ghi lại bởi Flarum (`storage/logs`) - -Sao chép bất kỳ tin nhắn nào vào tệp văn bản và ghi lại một vài ghi chú về *khi* xảy ra lỗi, bạn *bị gì* đang làm vào thời điểm đó. Đảm bảo bao gồm bất kỳ thông tin chi tiết nào bạn có thể thu thập được về các điều kiện mà sự cố xảy ra và không xảy ra. Thêm càng nhiều thông tin càng tốt về môi trường máy chủ của bạn: phiên bản hệ điều hành, phiên bản máy chủ web, phiên bản PHP và trình xử lý. - -## Bước 4: Chuẩn bị một báo cáo - -Khi bạn đã thu thập tất cả thông tin có thể về sự cố, bạn đã sẵn sàng để gửi báo cáo lỗi. Vui lòng làm theo hướng dẫn về [Báo cáo lỗi](bugs.md). - -Nếu bạn phát hiện ra điều gì đó mới về vấn đề này sau khi gửi báo cáo, vui lòng thêm thông tin đó vào cuối bài đăng ban đầu của bạn. Bạn nên gửi báo cáo ngay cả khi bạn đã tự mình giải quyết vấn đề, vì những người dùng khác cũng có thể được hưởng lợi từ giải pháp của bạn. Nếu bạn đã tìm thấy giải pháp tạm thời cho vấn đề, hãy nhớ đề cập đến vấn đề đó. \ No newline at end of file diff --git a/i18n/vi/docusaurus-plugin-content-docs/current/update.md b/i18n/vi/docusaurus-plugin-content-docs/current/update.md deleted file mode 100644 index 9de400ff6..000000000 --- a/i18n/vi/docusaurus-plugin-content-docs/current/update.md +++ /dev/null @@ -1,110 +0,0 @@ -# Cập nhật - -## From the Admin Dashboard - -:::info - -If you have the extension manager extension installed you can simply run the update from its interface and skip this page entirely. - -::: - ---- - -Để cập nhật Flarum, bạn cần sử dụng [Composer](https://getcomposer.org). Nếu bạn không biết gì về nó, bạn cần phải biết 1 ít về Composer để cài đặt Flarum, đọc [hướng dẫn](composer.md) để biết cách cài đặt và sử dụng như thế nào. - -Nếu cập nhật trên các phiên bản chính (ví dụ: <= 0.1.0 đến 1.x.x, 1.x.x thành 2.x.x, ...), hãy nhớ đọc "hướng dẫn cập nhật phiên bản chính" thích hợp trước khi chạy các bước nâng cấp chung. - -## Các bước chung - -**Bước 1:** Đảm bảo các tiện ích mở rộng của bạn có phiên bản tương thích với phiên bản Flarum bạn đang cài đặt. Điều này chỉ cần thiết trên các phiên bản chính (ví dụ: bạn có thể không cần kiểm tra điều này nếu nâng cấp từ v1.0.0 lên v1.1.0, giả sử các tiện ích mở rộng của bạn tuân theo cách lập phiên bản được đề xuất). Bạn có thể kiểm tra điều này bằng cách xem [Cuộc thảo luận](https://discuss.flarum.org/t/extensions) của tiện ích mở rộng, tìm kiếm nó trên [Packagist](http://packagist.org/) hoặc kiểm tra cơ sở dữ liệu như [Extiverse](https://extiverse.com). Bạn sẽ cần phải xóa (không chỉ tắt) bất kỳ tiện ích mở rộng nào không tương thích trước khi cập nhật. Hãy kiên nhẫn với các nhà phát triển tiện ích mở rộng! - -**Bước 2:** Hãy xem tệp `composer.json` của bạn. Trừ khi bạn có lý do để yêu cầu các phiên bản tiện ích mở rộng hoặc thư viện cụ thể, bạn nên đặt chuỗi phiên bản của mọi thứ ngoại trừ `flarum/core ` thành `*` (bao gồm cả `flarum/tags`, `flarum/mentions` và các tiện ích mở rộng đi kèm khác). Đảm bảo rằng `flarum/core` KHÔNG được đặt thành `*`. Nếu bạn đang muốn cài phiên bản cụ thể của Flarum, hãy đặt `flarum/core` thành phiên bản đó (ví dụ: `"flarum/core":"v0.1.0-beta.16"`). Nếu bạn muốn phiên bản mới nhất, hãy sử dụng `"flarum/core":"^1.0"`. - -**Bước 3:** Nếu cài đặt cục bộ của bạn sử dụng [bộ mở rộng cục bộ](extenders.md), đảm bảo rằng chúng được cập nhật với những thay đổi trong Flarum. - -**Bước 4:** Chúng tôi khuyên bạn nên tắt tiện ích của bên thứ ba trong trang tổng quan quản trị trước khi cập nhật. Bước này không bắt buộc, nhưng sẽ giúp gỡ lỗi dễ dàng hơn nếu bạn gặp sự cố. - -**Bước 5:** Đảm bảo rằng phiên bản PHP của bạn được hỗ trợ bởi phiên bản Flarum mà bạn đang chuẩn bị nâgn cấp, và kiểm tra nó bằng cách sử dụng Composer 2 (`composer --version)`. - -**Bước 6:** Cuối cùng, chạy lệnh sau để cập nhật: - -``` -composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -php flarum migrate -php flarum cache:clear -``` - -**Bước 7:** Nếu có thể, hãy khởi động lại máy chủ PHP và opcache của bạn. - -## Hướng dẫn cập nhật phiên bản chính - -### Cập nhật từ Beta (<=0.1.0) lên Ổn định v1 (^1.0.0) - -1. Thực hiện các bước 1-5 ở trên. -2. Thay đổi chuỗi phiên bản của tất cả các tiện ích mở rộng đi kèm (`flarum/tags`, `flarum/mentions`, `flarum/likes`, vv) trong `composer.json` từ `^0.1.0` thành `*`. -3. Đổi phiên bản của `flarum/core` trong `composer.json` từ `^0.1.0` thành `^1.0`. -4. Xoá dòng `"minimum-stability": "beta",` từ tệp `composer.json` -5. Thực hiện bước 6 và 7 ở trên. - -## Các vấn đề gặp phải - -Có 2 nơi chính mà bạn có thể gặp lỗi khi cập nhật Flarum: khi đang chạy chính lệnh cập nhật hoặc khi truy cập diễn đàn sau khi cập nhật. - -### Gặp lỗi khi cập nhật - -Sau đây, chúng ta sẽ xem xét một số loại sự cố thường gặp khi cố gắng cập nhật Flarum. - ---- - -Nếu đầu ra ngắn và chứa: - -``` -Nothing to modify in lock file -``` - -Hoặc không liệt kê `flarum/core` như một gói cập nhật và bạn không sử dụng phiên bản flarum mới nhất: - -- Xem lại bước 2 ở trên, đảm bảo rằng tất cả các tiện ích mở rộng của bên thứ ba đều có dấu hoa thị cho chuỗi phiên bản của chúng. -- Đảm bảo yêu cầu phiên bản `flarum/core` của bạn không bị khóa đối với một phiên bản nhỏ cụ thể (ví dụ: `v0.1.0-beta.16` bị khóa, `^1.0.0` không). Nếu bạn đang cố gắng cập nhật các phiên bản chính của Flarum, hãy làm theo hướng dẫn cập nhật phiên bản chính có liên quan ở trên. - ---- - -Cho các lỗi khác, thử chạy `composer why-not flarum/core PHIÊN_BẢN_BẠN_MUỐN_NÂNG_CẤP_LÊN` - -Nếu đầu ra giống kiểu như này: - -``` -flarum/flarum - requires flarum/core (v0.1.0-beta.15) -fof/moderator-notes 0.4.4 requires flarum/core (>=0.1.0-beta.15 <0.1.0-beta.16) -jordanjay29/flarum-ext-summaries 0.3.2 requires flarum/core (>=0.1.0-beta.14 <0.1.0-beta.16) -flarum/core v0.1.0-beta.16 requires dflydev/fig-cookies (^3.0.0) -flarum/flarum - does not require dflydev/fig-cookies (but v2.0.3 is installed) -flarum/core v0.1.0-beta.16 requires franzl/whoops-middleware (^2.0.0) -flarum/flarum - does not require franzl/whoops-middleware (but 0.4.1 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/bus (^8.0) -flarum/flarum - does not require illuminate/bus (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/cache (^8.0) -flarum/flarum - does not require illuminate/cache (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/config (^8.0) -flarum/flarum - does not require illuminate/config (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/container (^8.0) -flarum/flarum - does not require illuminate/container (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/contracts (^8.0) -flarum/flarum - does not require illuminate/contracts (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/database (^8.0) -flarum/flarum - does not require illuminate/database (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/events (^8.0) -flarum/flarum - does not require illuminate/events (but v6.20.19 is installed) -... (this'll go on for a bit) -``` - -Rất có thể một số tiện ích mở rộng của bạn chưa được cập nhật lên phiên bản mới nhất. - -- Xem lại bước 1, đảm bảo rằng phiên bản của các tiện ích mở rộng của bạn tương thích với phiên bản core mà bạn đang cần cập nhật. Hãy xoá bất kỳ tiện ích nào không tương thích. -- Đảm bảo rằng bạn đang chạy `composer update` với tất cả các flag được chỉ định trong bước cập nhật. - -Nếu các cách khắc phục trên không giúp ích được cho bạn, hãy tham gia [Hỗ trợ diễn đàn](https://discuss.flarum.org/t/support). Khi đăng bài hỏi cách khắc phục, hãy kèm theo nội dung khi chạy lệnh `php flarum info` và `composer why-not flarum/core PHIÊN_BẢN_MÀ_BẠN_MUỐN_NÂNG_CẤP_LÊN`. - -### Gặp lỗi sau khi cập nhật - -Nếu bạn không thể truy cập diễn đàn của bạn sau khi cập nhật, làm theo [hướng dẫn khắc phục sự cố](troubleshoot.md). diff --git a/i18n/vi/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md b/i18n/vi/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md index 64889e0a7..0cd7c08d2 100644 --- a/i18n/vi/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md +++ b/i18n/vi/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md @@ -305,7 +305,7 @@ export default class NewPostNotification extends Notification { } ``` -In the example, the icon is a star, the link will go to the new post, and the content will say that "{user} posted". +In the example, the icon is a star, the link will go to the new post, and the content will say that "`{user}` posted". Next, we need to tell Flarum that the notification you send in the backend corresponds to the frontend notification we just created. diff --git a/i18n/vi/docusaurus-plugin-content-docs/version-1.x/update.md b/i18n/vi/docusaurus-plugin-content-docs/version-1.x/update.md index 9de400ff6..f99a21224 100644 --- a/i18n/vi/docusaurus-plugin-content-docs/version-1.x/update.md +++ b/i18n/vi/docusaurus-plugin-content-docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd Để cập nhật Flarum, bạn cần sử dụng [Composer](https://getcomposer.org). Nếu bạn không biết gì về nó, bạn cần phải biết 1 ít về Composer để cài đặt Flarum, đọc [hướng dẫn](composer.md) để biết cách cài đặt và sử dụng như thế nào. -Nếu cập nhật trên các phiên bản chính (ví dụ: <= 0.1.0 đến 1.x.x, 1.x.x thành 2.x.x, ...), hãy nhớ đọc "hướng dẫn cập nhật phiên bản chính" thích hợp trước khi chạy các bước nâng cấp chung. +Nếu cập nhật trên các phiên bản chính (ví dụ: `<= 0.1.0` đến 1.x.x, 1.x.x thành 2.x.x, ...), hãy nhớ đọc "hướng dẫn cập nhật phiên bản chính" thích hợp trước khi chạy các bước nâng cấp chung. ## Các bước chung @@ -38,7 +38,7 @@ php flarum cache:clear ## Hướng dẫn cập nhật phiên bản chính -### Cập nhật từ Beta (<=0.1.0) lên Ổn định v1 (^1.0.0) +### Cập nhật từ Beta (`<=0.1.0`) lên Ổn định v1 (^1.0.0) 1. Thực hiện các bước 1-5 ở trên. 2. Thay đổi chuỗi phiên bản của tất cả các tiện ích mở rộng đi kèm (`flarum/tags`, `flarum/mentions`, `flarum/likes`, vv) trong `composer.json` từ `^0.1.0` thành `*`. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/README.md b/i18n/zh/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index b98c1530a..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,45 +0,0 @@ -- - - -slug: / -- - - - -# 关于 Flarum - -Flarum 是一款非常简洁的开源论坛软件。 它响应快速、简便易用,拥有打造一片成功的社区所需的所有功能。 它也极其可扩展,允许达到终极的可定制性。 - -![Flarum Home Screenshot](/en/img/home_screenshot.png) - -## 目标 - -Flarum 的前身是 [esoTalk](https://github.com/esotalk/esoTalk) 和 [FluxBB](https://fluxbb.org), 它生来就被设计如此: - -* **快速、简单。 ** 不杂乱不臃肿,没有复杂的依赖关系。 Flarum 使用 PHP 构建,因此很容易被部署。 界面采用高性能且小巧的 JavaScript 框架 [Mithril](https://mithril.js.org)。 - -* **漂亮、响应式。 ** 以人为本的论坛软件。 Flarum 被精心设计以在不同平台间保持一致性和直观性,开箱即用。 - -* **强大、可扩展。** 您可以客制化、扩展或集成 Flarum 以满足您的社区需求。 Flarum 基于 [MIT 协议](https://github.com/flarum/flarum/blob/master/LICENSE) 发布。 - -* **免费、开源。 ** Flarum 以 [MIT 许可证](https://github.com/flarum/flarum/blob/master/LICENSE) 发布。 - -你可以在这里阅读更多关于我们 [对于 Flarum 的哲学和价值观](https://discuss.flarum.org/d/28869-flarum-philosophy-and-values) 的信息。 - -## 帮助Flarum项目 - -Flarum 是 [免费、开源](https://github.com/flarum/core) 的软件,由志愿者们维护和管理。 我们依靠社区的贡献来帮助我们改进和拓展 Flarum。 - -🧑‍💻 如果你是一个开发者,可以考虑 [为Flarum或者其扩展做出贡献](contributing.md)。 这是帮助 Flarum 的**最有效的方式**,而且您的帮助可能会产生很大的影响:市面上有成千上万的Flarum站点,拥有数百万的最终用户。 - -🧩 如果有您缺少的功能,或您有一些新的想法,[编写一个自定义扩展](extend/README.md) 将使 Flarum 更适合您和其他人使用。 - -✒️ 如果您在技术写作方面有经验,那么您对[我们文档](https://github.com/flarum/docs/issues)的贡献将有助于未来的用户、管理员和开发人员充分利用 Flarum。 - -🌐 如果您会说多种语言,那么您可以 [为Flarum提供翻译](extend/language-packs.md),从而帮助世界各地无数用户访问 Flarum。 - -💸 Flarum基金会 并不通过Flarum赚钱,但确实有账单要付。 首先,非常感谢您有捐款意向,您可以在 [Github Sponsors](https://github.com/sponsors/flarum) 或 [OpenCollective](https://opencollective.com/flarum) 上捐款。 在过去,我们还能够在财务上支持一些核心开发人员,这样他们就可以兼职工作于 Flarum。 如果没有您的财政支持,这是不可能的。 - -🧑‍🤝‍🧑 加入 [我们的社区](https://discuss.flarum.org) 来讨论 Flarum 的发展,获得实例帮助,或者遇见一些很酷的人! 如果您熟悉 Flarum,您还可以帮助初学者! - -🐛 如果有 bug 困扰着您,或者您脑海中有一个功能的想法,在您告诉我们之前我们是不会知道的! 我们通过 [GitHub issues](https://github.com/flarum/core/issues) 跟踪错误、建议和未来的开发计划。 如果已经有 issue 被打开,点个赞和添加一些(建设性的)额外信息可能对我们非常有帮助! - -📣 如果您喜欢 Flarum ,请考虑在博客/推特/聊天中提到它! 更多的人认识到 Flarum,就会有更多的人参与 Flarum,从而带来更多的活动、更好的扩展和更快的发展。 - -没有我们社区的贡献,Flarum就不会有今天。 如果您有意贡献,请参阅我们的 [开发人员贡献](contributing.md) 和 [其他贡献](contributing-docs-translations.md) 文档以获取更多信息。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/admin.md b/i18n/zh/docusaurus-plugin-content-docs/current/admin.md deleted file mode 100644 index 74a41cdbc..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/admin.md +++ /dev/null @@ -1,13 +0,0 @@ -# 后台管理面板 - -Flarum 管理面板是一个友好的论坛管理界面。 且只对「管理组」成员可见。 点击论坛右上角您的 **用户名**, 选择 **后台管理** 即可进入管理面板。 - -管理员控制面板有如下部分,具体是: -- **仪表盘** - 显示主要的管理员控制面板,包含统计信息和其他相关信息。 -- [常规](https://docs.flarum.org/mail) - 设置论坛名称、简介以及其他基础设置。 -- **邮箱** - 允许您配置论坛邮件服务。 更多信息请 [点击此处](https://docs.flarum.org/mail)。 -- **权限** - 显示每个用户组的权限,并允许您配置全站和特定范围。 -- **外观** - 允许您自定义论坛的颜色、图标和添加额外的 CSS 以自定义论坛样式。 -- **用户** - 为您提供论坛中所有用户的分页列表,可以在此编辑或管理用户。 - -除了以上提到的这些部分,主管理面板还通过_扩展_部分来允许你管理安装的扩展,这也包括 Flarum 的核心扩展,例如 Tags。 在 _主题 _ 和 _语言_ 模块下,您可以修改论坛主题或使用扩展以适应多语言。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/appearance.md b/i18n/zh/docusaurus-plugin-content-docs/current/appearance.md deleted file mode 100644 index 6b4c5452f..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/appearance.md +++ /dev/null @@ -1,3 +0,0 @@ -# 外观 -此页面正在建设中。 -This page is under construction. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/bugs.md b/i18n/zh/docusaurus-plugin-content-docs/current/bugs.md deleted file mode 100644 index 49366fae4..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/bugs.md +++ /dev/null @@ -1,28 +0,0 @@ -# 反馈 Bug - -:::danger 安全漏洞 - -如果您发现 Flarum 存在安全漏洞,请遵循我们的[安全政策](https://github.com/flarum/core/security/policy),我们会及时处理 - -::: - -感谢您帮助我们测试 Flarum! 我们很高兴让您加入这个队伍! 我们需要可以*排除问题*和*清晰地沟通*的人。 您可能知道,优秀的错误报告需要花费一些时间和精力。 如果您可以做到这些,那让我们开始吧! - -## 重复项 - -已经发现了 Bug? 太棒了! 我们很乐意听到关于它的消息— 但首先您应该检查一下相关情况,以确保您不会在一个已知问题上浪费时间: - -- 搜索我们的 [支持论坛](https://discuss.flarum.org/t/support) 来查看它是否已经报告。 -- 我们也可能正在进行修复,所以也请搜索我们的 [问题跟踪器](https://github.com/flarum/core/issues)。 - -在 *彻底地*搜索一番后,如果无人报告该问题,欢迎您提交报告。 如果只是一个简单的小问题(例如单词拼写问题或图像问题),请直接跳到下一节。 但如果您看到错误,或者它已经明显损坏,我们需要您先收集一些信息。 请跳转到我们的 [故障排除](troubleshoot.md) 指南并遵循那里的指引。 请收集尽可能多的信息! - -## 报告 - -我们在GitHub上跟踪问题。 请您确保在 [正确的仓库](https://github.com/flarum) 创建问题(Issue),并填写模版中的所有内容。 - -如果可以,请检查最新版本的 Flarum 是否可以重现该问题。 如果您使用的是预发布版本或开发版本,请指出您正在使用的版本。 - -记住:错误报告的目的是让我们轻松地重现并修复它。 您可能需要阅读 [这篇文章](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html),了解如何撰写有效的错误报告。 请您 **务必** 清晰描述重现问题的必要步骤。 没有明确重现步骤的问题将不会被标记/分类。 如果一个标记为「需要验证(needs verification)」的问题从被标记开始 5 天内创建者没有进一步反馈信息,该问题将被关闭。 - -一旦您提交了报告,请您 *持续关注* 并耐心等待。 我们可能需要要求进一步的细节或说明。 但我们总是有很多事情要做,所以我们可能需要一段时间才会处理您的报告。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/code-of-conduct.md b/i18n/zh/docusaurus-plugin-content-docs/current/code-of-conduct.md deleted file mode 100644 index 3b174f36b..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/code-of-conduct.md +++ /dev/null @@ -1,51 +0,0 @@ -# 行为准则 - -### _欢迎光临 Flarum 社区!_ - -... 感谢您的加入! 我们对 Flarum 充满信心与激情,也很高兴认识同样的人。 我们希望 *每个人* 都能从 Flarum 及其社区中得到最大的帮助,因此请阅读并遵守下列准则。 我们希望每位用户都能充分利用 Flarum 和 Flarum 社区,因此,请您阅读并遵守以下准则。 无论您是使用我们的论坛,还是在 Discord、GitHub 上交流,亦或是在其他平台进行任何形式的交流,这些准则均适用。 - -### 重中之重,为人友善! - -我们在这里探讨与 Flarum 有关的事情,并努力使她成长为一个更完美的程序。 批判思维(当然,得通过合理的论证)是其中重要的一环。 不过千万不要冲动,不要让事态演变成人身攻击,不要让消极情绪搞人心态。 因此,请杜绝以下行为: - -- 发表攻击性或辱骂性的、以及任何形式的仇恨词汇或言论; -- 发表旨在骚扰、冒充或诽谤他人的帖子; -- 毫无必要地删除已发布的帖子; -- 未经自然人同意,滥用或企图滥用、公开或企图公开他人的个人信息; -- 发表淫秽或色情内容(包括但不限于文字、链接或图片等); -- 发表垃圾信息、钓鱼贴,以及任何旨在破坏本网站的行为; -- 讨论盗版软件或类似事情。 - -*上述条例将作为版主采取行动的依据。 * 如果您对其他成员有意见,请不要相互对峙。 如果违规行为发生于论坛,请 *举报* 相关帖字,然后等待工作人员处理。 否则,请通过我们的 [联系页面](https://flarum.org/foundation/contact) 报告不合法的违规行为。 - -我们的管理员和版主可以编辑或删除任何具有冒犯性或破坏性的内容。 严重或屡次违规的用户,可能会被封禁账户。 所以,你懂的,*待人友善一些*。 😎 - -### 提高自己的曝光度 - -想发起一个新讨论? 请务必先阅读我们的 [常见问题](faq.md),通过其中的相关链接充分了解这个项目。 然后花一些时间浏览论坛,熟悉一下 [标签系统](https://discuss.flarum.org/tags),并搜索一些关键词,*可能您想讨论的早已被大家讨论过。 - -当您确定要发起一个讨论时,请牢记: - -- 起个好标题! 如果您的标题能简洁明了地阐明您要讨论的内容,您会得到更加理想的结果。 -- 标签要选对! 这将增加帖子被及时阅读、回复的可能性。 -- *不要*翻来覆去的发布相同主题的帖子。这样通常会适得其反。 -- 如果不使用标签组标记为多语言,则请*务必使用英语来发表帖子*。如果我们无法理解你发的帖子想表达什么,我们就无从帮助你。 -- 不要在帖子中签名或者添加小尾巴! 个人资料的辨识度足够了。 - -帮我们一起把事务整理的有条不紊吧。 可别让我们把用来了解您、帮助您解决问题、谈论 Flarum 的大好时光浪费在杂七杂八的琐碎事儿上,您说对吗? 毕竟,那才是我们应该在这里做的事情。 - -### 提升您回帖的价值 - -大家参与讨论,都是希望自己的观点或建议能被他人采纳、为他人提供帮助。 既然如此,为什么不从一开始就让您的回帖值得一读呢? - -- 不要回复标题。 花点时间 *看一下* 看看一楼在说什么,至少先 *速览一下* 后面的对话。 -- 问问自己,您的回复是否对讨论有帮助。 如果没有,请斟酌斟酌。 -- 避免仅仅为了同意某人就去顶帖,您可以使用「喜欢」按钮表达您的态度。 -- 不要刷帖。 这里是论坛,不是聊天室。 -- 如果您的回复偏题了,或者会导致整个讨论的方向发生转变,请考虑发起一个全新的讨论。 -- 如果您只是想发表一些废话,作为测试,请到[「测试」](https://discuss.flarum.org/t/sandbox)标签中发表。 -- 请确保您的回复能提供建设性的反馈和支持,以便建设一个惠及所有人的社区。 - -没有人会抱怨一次两次的笑话或者是抖机灵的评论。 我们喜欢快保持着轻松的气氛! 不过为了保证办事效率,请不要和讨论完全脱轨。 - -> 感谢 Dominion 帮助我们制定了这些准则。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/composer.md b/i18n/zh/docusaurus-plugin-content-docs/current/composer.md deleted file mode 100644 index 6a4bbcb38..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/composer.md +++ /dev/null @@ -1,152 +0,0 @@ - -# Composer - -Flarum 使用一个叫 [Composer](https://getcomposer.org) 的程序来管理其依赖包和扩展程序。 你需要 Composer 以实现: - -- 通过命令行安装或更新 Flarum -- 通过命令行安装、更新或删除 Flarum 扩展 - -本指南会简单阐述 Composer 的使用。 我们强烈建议查阅 [官方文档](https://getcomposer.org/doc/00-intro.md) 以获取更多信息。 - -:::tip 即刻测试 Flarum? - -在共享主机上,建议使用扩展管理器扩展而不是 Composer。 这是一个 Composer 的图形界面,允许您安装、更新和删除扩展,而无需使用 SSH。 您可以直接用一个归档安装 Flarum,而不需要 Composer。 在扩展管理器预装后,请检查[安装指南](install.md#installing-by-unpacking-an-archive)获取更多信息。 - -::: - -## 什么是 Composer? - -> Composer 是一个 PHP 依赖管理工具。 它允许您声明项目所依赖的库,并管理 (安装/更新) 这些库 。 — [Composer Introduction](https://getcomposer.org/doc/00-intro.md](https://getcomposer.org/doc/00-intro.md)) - -每次安装 Flarum 都包含了 Flarum 的核心和一系列的 [扩展](extensions.md) 他们都有自己的自己的依赖和发布包。 - -在过去,论坛框架会通过让用户上传带有拓展代码的压缩文件来管理拓展。 这看上去很简单,但问题会很快显现出来: - -- 通过网络上传随机的压缩文件通常是一个不好的主意。 要求扩展从像 [Packagist](https://packagist.org/) 这样的中央源头下载能够使得恶意代码的传播变得更加繁琐,并确保源代码在 GitHub 上对免费/公共扩展可用。 -- 比方说,扩展 A 需要某个库的第 4 版,而扩展 B 需要同一个库的第 5 版。 在基于压缩文件的解决方案中,这两个依赖中的任何一个都可能覆盖另一个,以造成各种不一致的问题。 或者两个都试图同时运行,这将导致 PHP 崩溃(同一个类不能声明两次)。 -- 如果试图自动部署,运行自动测试,或扩展到多个服务器节点,压缩文件会造成很多麻烦。 -- 我们无法确保冲突的扩展版本不被安装,或者确保系统的 PHP 版本和扩展要求被满足。 -- 当然,我们可以通过替换压缩文件来升级扩展。 但是,升级 Flarum 核心呢? 我们又如何确保扩展可以声明它们与哪些版本的核心兼容? - -Composer 解决了所有这些,乃至更多的问题! - -## Flarum & Composer - -当你去 [安装 Flarum](install.md#installing) 时,你实际上在做两件事。 - -1. 下载一个 Flarum 的模板“骨架”。 这包括一个处理网络请求的 `index.php` 文件,一个提供 CLI 的 `flarum` 文件,以及一系列的网络服务器配置和文件夹设置。 这是从[`flarum/flarum` github仓库](https://github.com/flarum/flarum)中提取的,实际上并不包含 Flarum 运行所需的任何代码。 -2. 安装 Flarum 所需的 `composer` 包,即 Flarum 核心和几个捆绑的扩展。 这些是由步骤 1 中的 `index.php` 和 `flarum` 文件调用的,是 Flarum 的实现。 这些都是在骨架中的 `composer.json` 文件中指定的。 - -当你想更新 Flarum 或添加/更新/删除扩展时,你将通过运行 `composer` 命令来实现。 每个命令都不同,但所有命令都遵循相同的一般流程: - -1. 更新 `composer.json` 文件来添加/删除/更新软件包。 -2. 如果可能的话,我们需要做一些计算以得知所有依赖的最新兼容版本,或者弄清楚为什么所要求的安排是不可能的。 -3. 如果一切正常,下载所有需要更新的东西的新版本。 如果遇到问题,你可以尝试恢复 `composer.json` 的更改。 - -当运行 `composer.json` 命令时,一定要注意输出信息。 如果有错误,它可能会告诉你是否是因为扩展程序不兼容,不支持的 PHP 版本,缺少 PHP 扩展程序,或其他原因。 - -### `composer.json` 文件 - -如上所述,整个 Flarum 网站的 composer 配置都包含在 `composer.json` 文件中。 你可以查阅 [composer 文档](https://getcomposer.org/doc/04-schema.md)以了解具体的模式,但现在,让我们看看来自 `flarum/flarum` 的 `composer.json` 注释: - -```json -{ - // 以下章节大部分只是关于包的元数据。 - // 对论坛管理员来说,这并不重要。 - "name": "flarum/flarum", - "description": "Delightfully simple forum software.", - "type": "project", - "keywords": [ - "forum", - "discussion" - ], - "homepage": "https://flarum.org/", - "license": "MIT", - "authors": [ - { - "name": "Flarum", - "email": "info@flarum.org", - "homepage": "https://flarum.org/team" - } - ], - "support": { - "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flarum", - "docs": "https://flarum.org/docs/" - }, - // 元数据结束 - - // 下面是我们最关心的部分 - // 这是我们想要的包清单和每个包的版本。 - // 我们会简单略过他们 - "require": { - "flarum/core": "^1.0", - "flarum/approval": "*", - "flarum/bbcode": "*", - "flarum/emoji": "*", - "flarum/lang-english": "*", - "flarum/flags": "*", - "flarum/likes": "*", - "flarum/lock": "*", - "flarum/markdown": "*", - "flarum/mentions": "*", - "flarum/nicknames": "*", - "flarum/pusher": "*", - "flarum/statistics": "*", - "flarum/sticky": "*", - "flarum/subscriptions": "*", - "flarum/suspend": "*", - "flarum/tags": "*" - }, - - // Composer 的配置多种多样。 这是合理的默认值。 - // 您可在 https://getcomposer.org/doc/06-config.md 找到选项列表。 - "config": { - "preferred-install": "dist", - "sort-packages": true - }, - - // 如果 composer 可以找到一个软件包的稳定(而非测试)版本, - // 它应当使用它。 一般来说,生产站点不应运行测试版软件, - // 除非你明白自己在做什么。 - "prefer-stable": true -} -``` - -让我们把重点放在 `require` 部分。 这个部分的每个条目都是一个 composer 包的名字和一个版本字符串。 要阅读更多关于版本字符串的信息,请参见相关的 [composer documentation](https://semver.org/)。 - -对于 Flarum 项目来说,在安装 `flarum/core` 的 `require` 字段中,你会看到有几种类型的条目: - -- 你必须有一个 `flarum/core` 节点。 这应该包含一个与您想要安装的版本相对应的明确的版本字段。 对于 1.x 版本的 Flarum,这应是 `^1.0`。 -- 你应该为你安装的每个扩展配备一个节点。 一些内置扩展(比如 `flarum/tags` 和 `flarum/suspend` 等)已被默认包含,[其他的由您通过 composer 指令添加](extensions.md)。 除非你有其它原因(比如正在测试一个包的测试版本),我们建议使用星号作为扩展的版本字段(`*`)。 它的意思是“安装与我的 flarum/core 相适配的最新版本”。 -- 某些扩展/功能可能需要 PHP 包,而不是 Flarum 扩展。 比如,你需要 guzzle 库来使用 [Mailgun 邮件驱动器](mail.md)。 在这种情况下,该扩展/功能的说明应该解释使用哪个版本字段。 - -## 如何安装 Composer? - -就像其他的软件一样,Composer需要先安装在你要安装Flarum的服务器上 这里有很多选项,取决于你使用网站服务的类型 - -### 独立服务器 - -在这种情况下,你可以安装Composer通过阅读[Composer Guide](https://getcomposer.org/doc/00-intro.md#system-requirements) - -### 共享服务器 - -如果Composer没有预先安装(你可以通过执行`composer --version`命令来判断),你可以查阅[手动安装手册](https://getcomposer.org/composer-stable.phar) 只需要上传 composer.phar 到你的文件夹中,并执行`/path/to/your/php7 composer.phar COMMAND` 对于所有的命令应该以`composer COMMAND`执行 - -:::danger - -互联网上的一些文章会提到你可以使用像 PHP shell 这样的工具。 如果你不知道你在做什么或他们在说什么,请小心! 无保护的 web shell 是 **极危险的**。 - -::: - -## 如何使用 Composer - -你需要在命令行界面(CLI)上运行 Composer。 请确保你可以通过 SSH 访问你的服务器。 - -一旦你安装了 Composer,你应该能够通过 `composer COMMAND` 在您的 SSH 终端中运行 composer 命令。 - -:::info 优化 - -在大多数命令后,你可以运行 `composer dump-autoload -a`。 基本上,这会缓存 PHP 文件使他们运行得更快。 - -::: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/config.md b/i18n/zh/docusaurus-plugin-content-docs/current/config.md deleted file mode 100644 index e0331c835..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/config.md +++ /dev/null @@ -1,35 +0,0 @@ -# 配置文件 - -除数据库外,只有一处配置是无法通过后台管理面板修改的,那就是位于 Flarum 安装根目录下的 `config.php` 文件。 - -虽然这个文件很小,但包含了 Flarum 安装时至关重要的信息。 - -如果存在这个文件,Flarum 就知道它自己已经被安装了。 另外这个文件还为 Flarum 提供数据库信息等内容。 - -下面是一个示例文件,我们来了解一下所有内容的含义: - -```php - false, // 启用或禁用调试模式,用于排查问题 - 'offline' => false, // 启用或禁用网站维护模式。这使得所有用户(包括管理员)无法访问您的网站。 - 'database' => - array ( - 'driver' => 'mysql', // 数据库驱动,例如 MySQL, MariaDB …… - 'host' => 'localhost', // 连接的主机,除非使用外部服务,否则多数情况下是 localhost - 'database' => 'flarum', // 数据库实例名 - 'username' => 'root', // 数据库用户名 - 'password' => '', // 数据库密码 - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', // 数据表的前缀,如果您和其他服务共享一个数据库,那么添加前缀会很有用 - 'port' => '3306', // 连接数据库的端口,MySQL 默认为 3306 - 'strict' => false, - ), - 'url' => 'https://flarum.localhost', // URL 配置,如果您改变了域名,您需要变更这个 - 'paths' => - array ( - 'api' => 'api', // /api 跳转到 API - 'admin' => 'admin', // /admin 跳转到 admin - ), -); -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/console.md b/i18n/zh/docusaurus-plugin-content-docs/current/console.md deleted file mode 100644 index 3cbf42389..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# 控制台 - -除了 Flarum 核心提供的 [默认命令](../console.md),我们还允许扩展程序的开发者添加自定义控制台命令。 - -使用控制台: - -1. `ssh` 连接到安装 Flarum 的服务器 -2. `cd` 进入含有一个叫做 `flarum` 的文件的文件夹中 -3. 执行 `php flarum [命令名]` - -## 注册控制台命令 - -### list - -要注册控制台命令,请在您插件的 `extend.php` 文件中使用 `Flarum\Extend\Console` 扩展器: - -### help - -`php flarum help [命令名]` - -输出指定命令的帮助信息。 - -要以其他格式输出,请添加 --format 参数: - -`php flarum help --format=xml list` - -要显示可用的命令列表,请使用 list 命令。 - -### info - -`php flarum info` - -获取 Flarum 核心及已安装插件的信息。 调试问题时这个命令会很有用,在您提交的问题报告中也应当附上该输出内容。 - -### cache:clear - -`php flarum cache:clear` - -清楚后端 Flarum 缓存,包括已生成的 js/css,文本格式器缓存、翻译缓存。 这应当在每次安装或移除扩展后运行,在出现问题时这应该是第一步。 - -### assets:publish - -`php flarum migrate:reset --extension [插件ID]` - -发布核心和扩展插件中的资源文件(例如编译的 JS/CSS、bootstrap 图标、logos 等)。 这在您的资源文件发生损坏,或者您切换了 [文件系统驱动程序](extend/filesystem.md) 的 `flarum-assets` 存储磁盘时可以帮助您。 - -### 迁移 - -`php flarum migrate` - -执行所有未完成的迁移。 当安装或更新一个要修改数据库的插件时,会用到此命令。 - -### migrate:reset - -`php flarum migrate:reset --extension [插件ID]` - -重置指定插件的所有迁移。 这个命令大多被插件开发人员使用,如果您要卸载插件,并且想要从数据库中清除该插件的所有数据,也会需要用它。 请注意,该命令的被执行插件必须处于已安装状态(插件启用不启用都行)。 - -### schedule:run - -`php flarum schedule:run` - -许多扩展使用预定作业定期执行任务。 包括清理数据库缓存,定时发布草稿,生成站点地图等。 If any of your extensions use scheduled jobs, you should add a [cron job](https://ostechnix.com/a-beginners-guide-to-cron-jobs/) to run this command on a regular interval: - -``` -* * * * * cd /path-to-your-flarum-install && php flarum schedule:run >> /dev/null 2>&1 -``` - -这个命令一般不应被手动执行。 - -Note that some hosts do not allow you to edit cron configuration directly. In this case, you should consult your host for more information on how to schedule cron jobs. - -### schedule:list - -`php flarum schedule:list` - -此命令将返回已计划命令的列表(更多信息请参阅 `schedule:run`)。 这有助于确认扩展程序提供的命令已正确注册。 This **can not** check that cron jobs have been scheduled successfully, or are being run. \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/contributing-docs-translations.md b/i18n/zh/docusaurus-plugin-content-docs/current/contributing-docs-translations.md deleted file mode 100644 index 4d4c78a3a..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/contributing-docs-translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# 文档与翻译 - -## 补充文档 - -补充文档可以帮助无数未来的Flarum用户。 你可以在以下几点上下功夫: - -- 帮助Flarum最终用户使用一些高级Flarum功能的用户指南。 -- 更多 [常见问题](faq.md)。 -- 更加详细的 [故障排除](troubleshoot.md) 的步骤。 -- Flarum 开发或安装的逐步教程。 -- 扩展开发者的[技术参考指南](extend/README.md)。 -- 帮助我们提升你认为我们应该进一步阐述或更好地解释的其他事物。 - -找到相关主题的好方法是在我们社区的 [支持标签](https://discuss.flarum.org/t/support) 中寻找常见问题。 - -## 翻译Flarum - -我们希望每个人都能使用Flarum,不论其掌握的语言种类! 通过提供翻译,您可以让更多的人享受Flarum。 最好的是,我们使用方便用户的用户界面进行翻译,所以如果您想提供帮助,不需要硬性技术要求! - -Flarum Core的翻译、捆绑扩展和社区扩展是通过 [Weblate](https://weblate.rob006.net/projects/flarum/) 管理的。 - -此文档的翻译通过 [Crowdin](https://crowdin.com/project/flarum-docs) 管理。 - -Flarum基金会设立了“flarum-lang”组织,以支助笔译员以确保各种语言包的可用性。 您可以通过 [访问 GitHub 仓库](https://github.com/flarum-lang/about) 了解更多信息。 - -如果你想要支持现有的语言包,开始一项新的翻译,或者在使用weblate或crowdin时出现问题,您 [最好与 `flarum-lang` 团队](https://discuss.flarum.org/d/27519-the-flarum-language-project) 取得联系。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/contributing.md b/i18n/zh/docusaurus-plugin-content-docs/current/contributing.md deleted file mode 100644 index db188b72f..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/contributing.md +++ /dev/null @@ -1,170 +0,0 @@ -# 贡献代码 - -有兴趣为 Flarum 的发展做贡献吗? 那太好了! 竭诚欢迎,[报告错误](bugs.md) 或是 Pull Request 都没问题! 没有我们社区的贡献,Flarum就不会有今天。 - -在贡献之前,请仔细阅读 [行为准则](code-of-conduct.md)。 - -本文档是想要为 Flarum 贡献代码的开发者的指南。 如果您只是入门,建议您阅读进阶文档中的 [Getting Started](https://flarum.org/extend/start.md) 文档了解 Flarum 的工作原理。 - -## 为什么要为Flarum做贡献? - -⚡ **作出实际影响。** 成千上万的Flarum实例,和数百万的累积最终用户, 都会因为你的贡献而受益。 - -🔮 **塑造Flarum的未来。** 我们有很长的待办事项列表,但时间有限。 如果你愿意成为一个特性或更新的代言人,它将更有可能发生,并且你将能够实现你的愿景。 此外,我们的路线图和里程碑是由我们 [的核心开发团队](https://flarum.org/team)设定的,我们所有人都是贡献者。 影响的最佳途径是贡献。 - -🧑‍💻 **成为更好的工程师。** 我们的代码库是现代化的,我们非常重视良好的工程和清晰的代码。 在设计、基础设施、性能和可扩展性方面,也有很多有趣、具有挑战性的问题需要解决。 特别的,如果你是一名学生或处于职业生涯的初期,参与 Flarum 的开发是一个培养开发技能的绝佳机会。 - -🎠 **很有趣!** 我们非常喜欢在 Flarum 上工作:有很多有趣的挑战和有趣的特性可以构建。 我们在[论坛](https://discuss.flarum.org)和 [Discord 服务器](https://flarum.org/chat)上也有一个活跃的社区。 - -## 开发设置 - -请查看我们的规划 [里程碑](https://github.com/flarum/core/milestones),了解一下需要做的事情。 您可以查看[「Good first issue」](https://github.com/flarum/core/labels/Good%20first%20issue)标签中的 Issue,这些 Issue 都比较容易上手。 有任何您不确定的问题,不要犹豫,直接提问! 我们曾经都是新手。 - -如果您打算揽下某项工作,请先在相关 Issue 上发表评论或创建一个新的 Issue 告知我们, 以免做无用功。 - -由于 Flarum 是如此依赖扩展,因此在处理核心问题以及捆绑扩展时,我们强烈推荐使用[我们的扩展文档](extend/README.md)作为参考。 你应该从[介绍](extend/README.md)开始,以更好地了解我们扩展中的学问。 - -## 开发流程 - -### 建立本地代码库 - -[flarum/flarum 是一个「骨架」应用程序,它使用 Composer 下载核心包 和 一堆扩展程序](https://github.com/flarum/flarum)。 Flarum 核心、扩展和前述使用的所有包的源代码都位于 Flarum Monorepo [flarum/framework ](https://github.com/flarum/framework)中。 若要对其进行贡献,你需要在本地 fork 和 clone Monorepo 代码库,然后将其作为 [Composer 路径库](https://getcomposer.org/doc/05-repositories.md#path)添加到开发环境中: - -```bash -git clone https://github.com/flarum/flarum.git -cd flarum - -# 或者,如果你想要直接克隆到当前目录: -git clone https://github.com/flarum/flarum.git . -# Note, the directory must be empty - -# Set up a Composer path repository for Flarum monorepo packages -composer config repositories.0 path "PATH_TO_MONOREPO/*/*" -git clone https://github.com//framework.git PATH_TO_MONOREPO -``` - -一个典型的贡献流程如下所示: - -最后,运行 `composer install` 从本地路径存储库完成插件安装。 - -准备好以上本地环境后,请务必打开 **config.php** 中的 `debug` 调试模式,并在 PHP 配置中将 `display_errors` 设置为 `On`。 这样您就能同时看到 Flarum 和 PHP 的详细报错内容。 调试模式还会在每个请求时强制重新编译Flarum的文件,省去了在每次更改扩展的JavaScript或CSS后调用`php flarum cache:clear`的需要。 - -Flarum 的前端代码是用 ES6 编写的,并已编译为 JavaScript。 在开发过程中,你需要使用 [Node.js ](https://nodejs.org/)和 [`yarn`](https://yarnpkg.com/) 重新编译 JavaScript。 **请不要在发送 PR 时提交生成的 `dist `文件**;这会在更改合并到`主分支`时自动处理。 - -要为前端做出贡献,你需要先安装 JavaScript 依赖项。 Monorepo 使用[ yarn 工作区](https://classic.yarnpkg.com/lang/en/docs/workspaces/)来轻松地在所有包之间安装 JS 依赖项。 - -```bash -cd packages/framework -yarn install -``` - -Then you can watch JavaScript files for changes during development: - -```bash -cd framework/core/js -yarn dev -``` - -对于扩展程序,过程是一样的。 - -```bash -cd extensions/tags/js -yarn dev -``` - -### 开发工具 - -在 fork 和 clone 要工作的代码库之后,你需要设置本地主机来测试你的更改。 Flarum 目前没有开发服务器,所以你需要设置 Apache/NGINX/Caddy 等来提供本地 Flarum 安装的服务。 - -或者,你可以使用以下工具:[ Laravel Valet](https://laravel.com/docs/master/valet)(Mac)、[XAMPP](https://www.apachefriends.org/index.html)(Windows)或 [Docker-Flarum](https://github.com/mondediefr/docker-flarum)(Linux)来提供本地论坛服务。 - -大多数 Flarum 贡献者使用 [PHPStorm](https://www.jetbrains.com/phpstorm/download/) 或 [Visual Studio Code](https://code.visualstudio.com/) 进行开发。 - -## 编码风格 - -典型的作出贡献的工作流会像这样: - -0. 🧭 **计划** 为你的贡献做计划。 - * *Bug 修复* 应当提交合并到最新的稳定分支。 - * 与当前 Flarum 版本完全向后兼容的 *次要* 功能可以提交合并到最新的稳定分支。 - -1. 🌳 **建立分支**,从合适的分支建立一个新功能分支。 - * 请参见这里的 [编码风格](#编码风格)。 - * *主要* 功能应当始终提交合并到 `master` 分支,该分支包含即将推出的 Flarum 版本。 - * *重要的*功能应该总是被提交到`主分支`,该分支包含即将发布的 Flarum 版本。 - * 在内部,我们使用 `<姓名首字母缩写>/<简短描述>` 的分支命名方案(例如:`tz/refactor-frontend`)。 - -2. 🔨 **编写代码**,编写一些代码。 - * 修复错误或添加功能时,请根据需要添加单元测试。 - -3. 🚦 **测试代码**,测试您的代码。 - * 修复错误或添加功能时,请根据需要添加单元测试。 - * 使用相关包文件夹中的 `vendor/bin/phpunit` 运行测试套件。 - * 查看 [这里 ](extend/testing.md) 来获取更多在Flarum中测试的信息。 - -4. 💾 **提交代码**,并附上一条描述性信息。 - * 如果您的修改解决了一个现有的 Issue(通常情况下应该是这样),请在新行加上「Fixes #123」,其中 123 是 Issue 的编号。 - * 请务必按照 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) 规范提交。 - * *修复*提交应该描述被修复的问题,而不是如何修复该问题。 - -5. 🎁 **提交 PR**,在 GitHub 上提交一个 Pull Request。 - * 填写 Pull Request 模板。 - * 如果您的更改是视觉上的,请附上一张截图或 GIF 来演示变更。 - * 请不要包含 JavaScript `dist` 文件。 这些文件会在合并时自动编译。 - -6. 🤝 **合作共赢**,等待 Flarum 团队批准您的请求。 - * 团队成员将审核您的代码。 我们可能会提出一些修改、改进或替代方案,但对于一些小的改动,应该很快就会接受您的 Pull Request。 - * 在处理反馈时,请附加 commit,不要覆盖或压缩提交(我们将在合并时压缩)。 - -7. 🕺 **恭喜**,您刚刚向 Flarum 做了贡献。 - -## 开发工具 - -In order to keep the Flarum codebase clean and consistent, we have a number of coding style guidelines that we follow. When in doubt, read the source code. - -Don't worry if your code styling isn't perfect! StyleCI and Prettier will automatically check formatting for every pull request. This allows us to focus on the content of the contribution, not the code style. - -### PHP - -Flarum follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard. On top of this, we conform to a number of [other style rules](https://github.com/flarum/framework/blob/main/.styleci.yml). We use PHP 7 type hinting and return type declarations where possible, and [PHPDoc](https://docs.phpdoc.org/) to provide inline documentation. Try and mimic the style used by the rest of the codebase in your contributions. - -* 命名空间应当是单数(例如:`Flarum\Discussion`,而非 `Flarum\Discussions`) -* 接口命名应当以 `Interface` 结尾(例如:`MailableInterface`) -* 抽象类命名应当以 `Abstract` 开头(例如:`AbstractModel`) -* Trait 命名应当以 `Trait` 结尾(例如:`ScopeVisibilityTrait`) - -### JavaScript - -Flarum's JavaScript mostly follows the [Airbnb Style Guide](https://github.com/airbnb/javascript). We use [ESDoc](https://esdoc.org/manual/tags.html) to provide inline documentation. - -### 翻译 - -**Columns** should be named according to their data type: -* DATETIME 或 TIMESTAMP:`{动词}_at`(例如:created_at,read_at)或 `{动词}_until`(例如:suspended_until) -* INT 用于计数:`{名词}_count`(例如:comment_count,word_count) -* 外键:`{动词}_{实体对象}_id`(例如:hidden_user_id) - * 动词可以使用具有相同意义的主键等替代(例如:帖子作者可以是 `user_id`) -* 布尔值:`is_{形容词}`(例如:is_locked) - -**Tables** should be named as follows: -* 使用复数形式(`discussions`) -* 多个单词之间用下划线分隔(`access_tokens`) -* 对于关系表,请将两个表名用单数的形式连接起来,并按字母顺序排列。 (例如:`discussion_user`) - -### CSS - -Flarum's CSS classes roughly follow the [SUIT CSS naming conventions](https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md) using the format `.ComponentName-descendentName--modifierName`. - -### Translations - -We use a [standard key format](/extend/i18n.md#appendix-a-standard-key-format) to name translation keys descriptively and consistently. - -## 贡献者许可协议 - -By contributing your code to Flarum you grant the Flarum Foundation (Stichting Flarum) a non-exclusive, irrevocable, worldwide, royalty-free, sublicensable, transferable license under all of Your relevant intellectual property rights (including copyright, patent, and any other rights), to use, copy, prepare derivative works of, distribute and publicly perform and display the Contributions on any licensing terms, including without limitation: (a) open source licenses like the MIT license; and (b) binary, proprietary, or commercial licenses. Except for the licenses granted herein, You reserve all right, title, and interest in and to the Contribution. - -You confirm that you are able to grant us these rights. You represent that You are legally entitled to grant the above license. If Your employer has rights to intellectual property that You create, You represent that You have received permission to make the Contributions on behalf of that employer, or that Your employer has waived such rights for the Contributions. - -You represent that the Contributions are Your original works of authorship, and to Your knowledge, no other person claims, or has the right to claim, any right in any invention or patent related to the Contributions. You also represent that You are not legally obligated, whether by entering into an agreement or otherwise, in any way that conflicts with the terms of this license. - -The Flarum Foundation acknowledges that, except as explicitly described in this Agreement, any Contribution which you provide is on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/README.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/README.md deleted file mode 100644 index a1b69784c..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/README.md +++ /dev/null @@ -1,40 +0,0 @@ -- - - -slug: /extend -- - - - -# 扩展 Flarum - -Flarum 是简约的,同时也是高度可扩展的。 实际上,Flarum 附带的大部分功能都是扩展程序。 - -这使得 Flarum 具有高度的可定制性。 用户可以随时禁用任何不需要的功能,或者安装其他扩展程序,打造完美的社区论坛。 - -为了实现这种扩展性,Flarum 构建时使用了丰富的 API 和扩展点 您只要掌握一些编程知识,就可以利用这些 API 来添加几乎所有您想拥有的功能。 本章节将为您介绍 Flarum 的工作方式和如何使用 API,以便您构建自己的扩展程序。 - -## 核心 vs 扩展 - -Flarum 的核心和扩展之间有清晰的界限吗? 为什么有些功能核心里有,而有些又没有? 了解这种区别非常有助于我们在 Flarum 的生态系统中保持一致性和高质量。 - -**Flarum 的核心** 不会拥有所有功能。 相反,它是一个基础或一个框架,为扩展提供了一个可靠的基础。 它只包含对论坛至关重要的基本的、未提出意见的功能:讨论、帖子、用户群组和通知。 - -**捆绑扩展** 又称原生扩展,是与核心打包到一块、默认启用的。 它们和其他扩展一样,可以被禁用或卸载。 我们的想法是使其具有良好的通用性、可配置性,以满足大多数人的需求,因此,捆绑扩展无法满足一切使用需求。 - -**第三方扩展** 由他人开发,Flarum 团队也不会提供官方支持。 他们大多用于解决特定的需求。 - -如果您想要解决核心或现有捆绑扩展的 Bug 或功能缺陷,我们建议您 *直接为对应的项目贡献代码*,这要比分散精力去开发一个新的第三方扩展更合适一些。 您可以在 [Flarum 社区](https://discuss.flarum.org/) 发帖与 Flarum 开发者交流有关事宜。 - -## 资料推荐 - -- [本文档](start.md) -- [扩展开发小贴士](https://discuss.flarum.org/d/5512-extension-development-tips) -- [开发者讲解:扩展开发的工作流程](https://github.com/flarum/cli) -- [扩展名空间小贴士](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) -- [Mithril js 文档](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) -- [Laravel API 文档](https://mithril.js.org/) -- [Flarum API 文档](https://laravel.com/api/8.x/) -- [Flarum API 文档](https://api.flarum.org) -- [ES6 代码速查表](https://github.com/DrkSephy/es6-cheatsheet) - -### 获取帮助 - -- [Flarum 官方开发社区](https://discuss.flarum.org/t/dev) -- [加入 Discord 中的 #extend 频道](https://flarum.org/discord/) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/admin.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/admin.md deleted file mode 100644 index 2f7da8d3b..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/admin.md +++ /dev/null @@ -1,214 +0,0 @@ -# 后台管理面板 - -Beta 15引入了一个完全重新设计的管理面板和前端API。 现在比以往任何时候都更容易为您的扩展添加设置或权限。 - -在测试版15之前,扩展设置要么在 `设置模式` 中添加,要么为更复杂的设置添加了一个新的页面。 现在,每个扩展程序都有一个包含信息、设置和扩展程序自身权限的页面。 - -您可以简单地注册设置,扩展页面 [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage),或完全自定义页面。 - -## 扩展数据API - -这个新的 API 允许您用极少的代码添加设置到扩展中。 - -### 告诉API您扩展的信息 - -在注册任何内容之前,您需要告诉`ExtensionData`它将为哪个扩展获取数据。 - -只需在`app.extensionData`上运行`for`函数,并传入扩展的id。 要找到您的扩展id,取编写器名称并用破折号替换任何斜杠(例如:'fof/merge-discussion '变成'fof-merge-discussion ')。 带有`flarum-`和`flarum-ext-`的扩展将从名称中省略这些内容(例如:'webbinaro/flarum-calendar'变成'webbinaro-calendar')。 - -对于下面的例子,我们将使用虚构的扩展名'acme/interstellar': - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') -}); -``` - -完成后,您可以开始添加设置和权限。 - -:::注意 - -`ExtensionData`上的所有注册函数都是可链接的,这意味着您可以一个接一个地调用它们而无需再次运行`for` 。 - -::: - -### 注册设置 - -对于简单的项目,建议使用这种方式添加设置字段。 一般来说,如果您只需要在设置表中存储东西,这对您来说应该足够了。 - -要添加字段,请在`app.extensionData`的`for`之后调用`registerSetting`函数,并传递一个“设置对象”作为第一个参数。 在场景背后的 `ExtensionData` 实际上将您的设置变成了一个 [`ItemLis`](https://api.docs.flarum.org/js/master/class/src/common/utils/itemlist.ts~itemlist)您可以传递优先级编号作为第二个参数。 - -Here's an example with a switch (boolean) item: - -```js - -app.initializers.add('interstellar', function(app){ - - app.extensionData - .for('acme-interstellar') - registerSetting( - { - setting: 'acme-interstellar.coordinates', //这是数据库设置表中保存设置的键值。 - label: app.translator.trans('acme-interstellar.admin.coordinates_label'), // The label to be shown letting the admin know what the setting does. - help: app.translator.trans('acme-interstellar.admin.coordinates_help'), // Optional help text where a longer explanation of the setting can go. - type: 'boolean', // 这是什么类型的设置,有效选项包括:布尔、文本(或任何其他" " 标记类型)和选择。 - }, - 30 // 选择: 优先 - ) -}); -``` - -如果您使用 `type: 'select'` 设置对象看起来有一点不同: - -```js -{ - setting: 'acme-interstellar.fuel_type', - label: app.translator.trans('acme-interstellar.admin.fuel_type_label'), - type: 'select', - options: { - 'LOH': 'Liquid Fuel', // 该对象中的键作为设置项,存储在数据库中,值是管理员将看到的标签(如果翻译在上下文中有意义,请记住使用翻译)。 - 'RDX': 'Solid Fuel', - }, - default: 'LOH', -} -``` - -Also, note that additional items in the setting object will be used as component attrs. This can be used for placeholders, min/max restrictions, etc: - -```js -{ - setting: 'acme-interstellar.crew_count', - label: app.translator.trans('acme-interstellar.admin.crew_count_label'), - type: 'number', - min: 1, - max: 10 -} -``` - -If you want to add something to the settings like some extra text or a more complicated input, you can also pass a callback as the first argument that returns JSX. This callback will be executed in the context of [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) and setting values will not be automatically serialized. - -```js - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerSetting(function () { - if (app.session.user.username() === 'RocketMan') { - - return ( -
-

{app.translator.trans('acme-interstellar.admin.you_are_rocket_man_label')}

- -
- ); - } - }) -}); -``` - -### Registering Permissions - -New in beta 15, permissions can now be found in 2 places. Now, you can view each extension's individual permissions on their page. All permissions can still be found on the permissions page. - -In order for that to happen, permissions must be registered with `ExtensionData`. This is done in a similar way to settings, call `registerPermission`. - -Arguments: - * Permission object - * What type of permission - see [`PermissionGrid`](https://api.docs.flarum.org/js/master/class/src/admin/components/permissiongrid.js~permissiongrid)'s functions for types (remove items from the name) - * `ItemList` priority - -Back to our favorite rocket extension: - -```js -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPermission( - { - icon: 'fas fa-rocket', // Font-Awesome Icon - label: app.translator.trans('acme-interstellar.admin.permissions.fly_rockets_label'), // Permission Label - permission: 'discussion.rocket_fly', // Actual permission name stored in database (and used when checking permission). - tagScoped: true, // Whether it be possible to apply this permission on tags, not just globally. Explained in the next paragraph. - }, - 'start', // Category permission will be added to on the grid - 95 // Optional: Priority - ); -}); -``` - -If your extension interacts with the [tags extension](https://github.com/flarum/tags) (which is fairly common), you might want a permission to be tag scopable (i.e. applied on the tag level, not just globally). You can do this by including a `tagScoped` attribute, as seen above. Permissions starting with `discussion.` will automatically be tag scoped unless `tagScoped: false` is indicated. - -To learn more about Flarum permissions, see [the relevant docs](permissions.md). - -### Chaining Reminder - -Remember these functions can all be chained like: - -```js -app.extensionData - .for('acme-interstellar') - .registerSetting(...) - .registerSetting(...) - .registerPermission(...) - .registerPermission(...); -``` - -### Extending/Overriding the Default Page - -Sometimes you have more complicated settings that mess with relationships, or just want the page to look completely different. In this case, you will need to tell `ExtensionData` that you want to provide your own page. Note that `buildSettingComponent`, the util used to register settings by providing a descriptive object, is available as a method on `ExtensionPage` (extending from `AdminPage`, which is a generic base for all admin pages with some util methods). - -Create a new class that extends the `Page` or `ExtensionPage` component: - -```js -import ExtensionPage from 'flarum/admin/components/ExtensionPage'; - -export default class StarPage extends ExtensionPage { - content() { - return ( -

Hello from the settings section!

- ) - } -} - -``` - -Then, simply run `registerPage`: - -```js - -import StarPage from './components/StarPage'; - -app.initializers.add('interstellar', function(app) { - - app.extensionData - .for('acme-interstellar') - .registerPage(StarPage); -}); -``` - -This page will be shown instead of the default. - -您可以扩展 [`ExtensionPage`](https://api.docs.flarum.org/js/master/class/src/admin/components/extensionpage.js~extensionpage) 或扩展基本 `Page` 并设计自己的页面! - -## Composer.json Metadata - -In beta 15, extension pages make room for extra info which is pulled from extensions' composer.json. - -For more information, see the [composer.json schema](https://getcomposer.org/doc/04-schema.md). - -| Description | 在composer.json 中的位置 | -| ---------------------------------- | ------------------------------------------------------------ | -| discuss.flarum.org discussion link | "forum" key inside "support" | -| Documentation | "docs" key inside "support" | -| Support (email) | "email" key inside "support" | -| Website | "homepage" key | -| Donate | "funding" key block (Note: Only the first link will be used) | -| Source | "source" key inside "support" | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/api-throttling.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/api-throttling.md deleted file mode 100644 index 354ef8d8e..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/api-throttling.md +++ /dev/null @@ -1,58 +0,0 @@ -# API 调节器 - -Flarum comes with a builtin `Flarum\Api\Middleware\ThrottleApi` [middleware](middleware.md) for throttling requests to the API. This runs on every API route, and extensions can add their own custom logic to throttle requests. - -:::caution Forum Routes - -Some forum routes (login, register, forgot password, etc) work by calling an API route under the surface. The `ThrottleApi` middleware does not currently run for these requests, but that is planned for the future. - -::: - -## Custom Throttlers - -The format for a custom throttler is extremely simple: all you need is a closure or invokable class that takes the current request as an argument, and returns one of: - -- `false`: This explicitly bypasses throttling for this request, overriding all other throttlers -- `true`: This marks the request as to be throttled. -- `null`: This means that this throttler doesn't apply. Any other outputs will be ignored, with the same effect as `null`. - -Throttlers will be run on EVERY request, and are responsible for figuring out whether or not they apply. For example, consider Flarum's post throttler: - -```php -use DateTime; -use Flarum\Post\Post; - -function ($request) { - if (! in_array($request->getAttribute('routeName'), ['discussions.create', 'posts.create'])) { - return; - } - - $actor = $request->getAttribute('actor'); - - if ($actor->can('postWithoutThrottle')) { - return false; - } - - if (Post::where('user_id', $actor->id)->where('created_at', '>=', new DateTime('-10 seconds'))->exists()) { - return true; - } -}; -``` - -Throttlers can be added or removed via the `ThrottleApi` middleware in `extend.php`. For example: - -```php -set('throttleAll', function () { - return false; - }) - ->remove('bypassThrottlingAttribute'), - // Other extenders -]; -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/api.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/api.md deleted file mode 100644 index f4451d0c4..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/api.md +++ /dev/null @@ -1,353 +0,0 @@ -# 接口与数据流 - -在[上一篇文章中](models.md), 我们学习了Flarum是如何通过模型与数据交互的。 在这里,我们将学习如何将数据从数据库到 JSON-API 再到前端,然后再返回。 - -:::info - -To use the built-in REST API as part of an integration, see [Consuming the REST API](../rest-api.md). - -::: - -## API请求生命周期 - -Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical API request: - -![Flarum API Flowchart](/en/img/api_flowchart.png) - -1. An HTTP request is sent to Flarum's API. Typically, this will come from the Flarum frontend, but external programs can also interact with the API. Flarum's API mostly follows the [JSON:API](https://jsonapi.org/) specification, so accordingly, requests should follow [said specification](https://jsonapi.org/format/#fetching). -2. The request is run through [middleware](middleware.md), and routed to the proper controller. You can learn more about controllers as a whole on our [routes and content documentation](routes.md). Assuming the request is to the API (which is the case for this section), the controller that handles the request will be a subclass of `Flarum\Api\AbstractSerializeController`. -3. Any modifications done by extensions to the controller via the [`ApiController` extender](#extending-api-controllers) are applied. This could entail changing sort, adding includes, changing the serializer, etc. -4. The `$this->data()` method of the controller is called, yielding some raw data that should be returned to the client. Typically, this data will take the form of a Laravel Eloquent model collection or instance, which has been retrieved from the database. 也就是说,只要控制器的序列化器可以处理,数据可以是任何东西。 Each controller is responsible for implementing its own `data` method. 请注意,对于 `PATCH`、`POST` 和 `DELETE` 请求,`data` 将执行相关操作,并返回修改后的模型实例。 -5. That data is run through any pre-serialization callbacks that extensions register via the [`ApiController` extender](#extending-api-controllers). -6. The data is passed through a [serializer](#serializers), which converts it from the backend, database-friendly format to the JSON:API format expected by the frontend. 它还会附加任何相关对象,这些对象会通过各自的序列化器运行。 As we'll explain below, extensions can [add / override relationships and attributes](#attributes-and-relationships) at the serialization level. -7. The serialized data is returned as a JSON response to the frontend. -8. 如果请求是通过 Flarum 前端的 `Store`发出的,返回的数据 (包括任何相关对象) 将作为 [frontend models](#frontend-models)存储在前端存储中。 - -## API Endpoints - -We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. - -As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: - -- Listing instances of a model (possibly including searching/filtering) -- Getting a single model instance -- Creating a model instance -- Updating a model instance -- Deleting a single model instance - -We'll go over each type of controller shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -:::caution - -Paths to API endpoints are not arbitrary! To support interactions with frontend models: - -- 对于获取/更新/删除,路径应为 `/prefix/{id}`;对于列表/创建,路径应为 `/prefix`。 -- the prefix (`tags` in the example above) must correspond to the JSON:API model type. You'll also use this model type in your serializer's `$type` attribute, and when registering the frontend model (`app.store.models.TYPE = MODEL_CLASS`). -- The methods must match the example above. - -Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! - -::: - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your endpoint controllers: -```bash -$ flarum-cli make backend api-controller -``` - -::: - -### Listing Resources - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -#### Pagination - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // The number of records included by default. - public $limit = 20; - - // The maximum number of records that can be requested. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. - -#### Sorting - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // The default sort field and order to use. - public $sort = ['name' => 'asc']; - - // The fields that are available to be sorted by. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -use Illuminate\Support\Str; - -// ... - -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(Str::snake($field), $order); -} - -return $query->get(); -``` - -#### 搜索 - -Read our [searching and filtering](search.md) guide for more information! - -### Showing a Resource - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creating a Resource - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Updating a Resource - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Deleting a Resource - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Including Relationships - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Extending API Controllers - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -The `ApiController` extender can also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Serializers - -Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically create your serializer: -```bash -$ flarum-cli make backend api-serializer -``` - -::: - -### Attributes and Relationships - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -### Extending Serializers - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -### Non-Model Serializers and `ForumSerializer` - -Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/assets.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/assets.md deleted file mode 100644 index 16b401fc3..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/assets.md +++ /dev/null @@ -1,7 +0,0 @@ -# Extension Assets - -Some extensions might want to include assets like images or JSON files in their source code (note that this is not the same as uploads, which would probably require a [filesystem disk](filesystem.md)). - -This is actually very easy to do. Just create an `assets` folder at the root of your extension, and place any asset files there. Flarum will then automatically copy those files to its own `assets` directory (or other storage location if [one is offered by extensions](filesystem.md)) every time the extension is enabled or [`php flarum assets:publish`](../console.md) is executed. - -If using the default storage driver, assets will be available at `https://FORUM_URL/assets/extensions/EXTENSION_ID/file.path`. However, since other extensions might use remote filesystems, we recommend serializing the url to assets you need in the backend. See [Flarum's serialization of the logo and favicon URLs](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Serializer/ForumSerializer.php#L85-L86) for an example. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/authorization.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/authorization.md deleted file mode 100644 index 3e56666d0..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/authorization.md +++ /dev/null @@ -1,206 +0,0 @@ -# 身份认证 - -与其他框架类似,Flarum 可以将指定的操作和内容访问权限授权给特定的用户。 这方面有两套平行的系统: - -- 授权程序决定用户是否可以采取某些操作。 -- 可见性作用域可以应用于数据库查询,有效地限制用户能够访问的记录。 这记录在我们的 [模型可见性](model-visibility.md) 文档中。 - -## 认证流程 - -The authorization process is used to check whether a person is allowed to perform certain actions. For instance, we want to check if a user is authorized before they: - -- Access the admin dashboard -- Start a discussion -- Edit a post -- Update another user's profile - -Each of these is determined by unique criteria: in some cases a flag is sufficient; otherwise, we might need custom logic. - -## How It Works - -Authorization queries are made with 3 parameters, with logic contained in [`Flarum\User\Gate`](https://api.docs.flarum.org/php/master/flarum/user/access/gate): - -1. The actor: the user attempting to perform the action -2. The ability: a string representing the action the actor is attempting -3. The arguments: usually an instance of a database model which is the subject of the attempted ability, but could be anything. - -First, we run the entire request (all three parameters) through all [policies](#policies) registered by extensions and core. Policies are blocks of logic provided by core and extensions that determine whether the actor can perform the ability on the arguments. Policies can return one of the following: - -- `Flarum\User\Access\AbstractPolicy::ALLOW` (via `$this->allow()`) -- `Flarum\User\Access\AbstractPolicy::DENY` (via `$this->deny()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_ALLOW` (via `$this->forceAllow()`) -- `Flarum\User\Access\AbstractPolicy::FORCE_DENY` (via `$this->forceDeny()`) - -Policy results are considered in the priority `FORCE_DENY` > `FORCE_ALLOW` > `DENY` > `ALLOW`. For example, if a single policy returns `FORCE_DENY`, all other policies will be ignored. If one policy returns `DENY` and 10 policies return `ALLOW`, the request will be denied. This allows decisions to be made regardless of the order in which extensions are booted. Note that policies are extremely powerful: if access is denied at the policy stage, that will override group permissions and even admin privileges. - -Secondly, if all policies return null (or don't return anything), we check if the user is in a group that has a permission equal to the ability (note that both permissions and abilities are represented as strings). If so, we authorize the action. See our [Groups and Permissions documentation](permissions.md) for more information on permissions. - -Then, if the user is in the admin group, we will authorize the action. - -Finally, as we have exhausted all checks, we will assume that the user is unauthorized and deny the request. - -## How To Use Authorization - -Flarum's authorization system is accessible through public methods of the `Flarum\User\User` class. The most important ones are listed below; others are documented in our [PHP API documentation](https://api.docs.flarum.org/php/master/flarum/user/user). - - -In this example, we will use `$actor` as an instance of `Flarum\User\User`, `'viewForum'` and `'reply'` as examples of abilities, and `$discussion` (instance of `Flarum\Discussion\Discussion`) as an example argument. - -```php -// Check whether a user can perform an action. -$canDoSomething = $actor->can('viewForum'); - -// Check whether a user can perform an action on a subject. -$canDoSomething = $actor->can('reply', $discussion); - -// Raise a PermissionDeniedException if a user cannot perform an action. -$actor->assertCan('viewForum'); -$actor->assertCan('reply', $discussion); - -// Raise a NotAuthenticatedException if the user is not logged in. -$actor->assertRegistered(); - -// Raise a PermissionDeniedException if the user is not an admin. -$actor->assertAdmin(); - -// Check whether one of the user's groups have a permission. -// WARNING: this should be used with caution, as it doesn't actually -// run through the authorization process, so it doesn't account for policies. -// It is, however, useful in implementing custom policies. -$actorHasPermission = $actor->hasPermission(`viewForum`); -``` - -## Custom Policies - -Policies allow us to use custom logic beyond simple groups and permissions when evaluating authorization for an ability with a subject. For instance: - -- We want to allow users to edit posts even if they aren't moderators, but only their own posts. -- Depending on settings, we might allow users to rename their own discussions indefinitely, for a short period of time after posting, or not at all. - -As described [above](#how-it-works), on any authorization check, we query all policies registered for the target's model, or any parent classes of the target's model. If no target is provided, any policies registered as `global` will be applied. - -So, how does a policy get "checked"? - -First, we check if the policy class has a method with the same name as the ability being evaluated. If so, we run it with the actor and subject as parameters. If that method returns a non-null value, we return that result. Otherwise, we continue to the next step (not necessarily the next policy). - -Then, we check if the policy class has a method called `can`. If so, we run it with the actor, ability, and subject, and return the result. - -If `can` doesn't exist or returns null, we are done with this policy, and we proceed to the next one. - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate policies: -```bash -$ flarum-cli make backend policy -``` - -::: - -### Example Policies - -Let's take a look at an example policy from [Flarum Tags](https://github.com/flarum/tags/blob/master/src/Access): - -```php -is_restricted) { - return $actor->hasPermission('tag'.$tag->id.'.startDiscussion') ? $this->allow() : $this->deny(); - } - } - - /** - * @param User $actor - * @param Tag $tag - * @return bool|null - */ - public function addToDiscussion(User $actor, Tag $tag) - { - return $this->startDiscussion($actor, $tag); - } -} -``` - -We can also have global policies, which are run when `$user->can()` is called without a target model instance. Again from Tags: - -```php -settings = $settings; - } - - /** - * @param Flarum\User\User $actor - * @param string $ability - * @return bool|void - */ - public function can(User $actor, string $ability) - { - if (in_array($ability, ['viewForum', 'startDiscussion'])) { - $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('min_primary_tags'); - $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('min_secondary_tags'); - - if ($enoughPrimary && $enoughSecondary) { - return $this->allow(); - } else { - return $this->deny(); - } - } - } -} -``` - -### Registering Policies - -Both model-based and global policies can be registered with the `Policy` extender in your `extend.php` file: - -```php -use Flarum\Extend; -use Flarum\Tags\Tag; -use YourNamespace\Access; - -return [ - // Other extenders - (new Extend\Policy()) - ->modelPolicy(Tag::class, Access\TagPolicy::class) - ->globalPolicy(Access\GlobalPolicy::class), - // Other extenders -]; -``` - -## Frontend Authorization - -Commonly, you'll want to use authorization results in frontend logic. For example, if a user doesn't have permission to see search users, we shouldn't send requests to that endpoint. And if a user doesn't have permission to edit users, we shouldn't show menu items for that. - -Because we can't do authorization checks in the frontend, we have to perform them in the backend, and attach them to serialization of data we're sending. Global permissions (`viewForum`, `viewUserList`) can be included on the `ForumSerializer`, but for object-specific authorization, we may want to include those with the subject object. For instance, when we return lists of discussions, we check whether the user can reply, rename, edit, and delete them, and store that data on the frontend discussion model. It's then accessible via `discussion.canReply()` or `discussion.canEdit()`, but there's nothing magic there: it's just another attribute sent by the serializer. - -For an example of how to attach data to a serializer, see a [similar case for transmitting settings](settings.md#accessing-settings). diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/backend-events.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/backend-events.md deleted file mode 100644 index 25142b030..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/backend-events.md +++ /dev/null @@ -1,172 +0,0 @@ -# Backend Events - -Often, an extension will want to react to some events occuring elsewhere in Flarum. For instance, we might want to increment a counter when a new discussion is posted, send a welcome email when a user logs in for the first time, or add tags to a discussion before saving it to the database. These events are known as **domain events**, and are broadcasted across the framework through [Laravel's event system](https://laravel.com/docs/8.x/events). - -For a full list of backend events, see our [API documentation](https://api.docs.flarum.org/php/master/search.html?search=Event). Domain events classes are organized by namespace, usually `Flarum\TYPE\Event`. - - -:::info [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically generate event listeners: -```bash -$ flarum-cli make backend event-listener -``` - -::: - -## Listening to Events - -You can attach a listener to an event using the [`Event`](https://api.docs.flarum.org/php/master/flarum/extend/event) [extender](start.md#extenders): - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->listen(Deleted::class, function($event) { - // do something here - }) - ->listen(Deleted::class, PostDeletedListener::class) -]; -``` -```php -class PostDeletedListener -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function handle(Deleted $event) - { - // Your logic here - } -} -``` - -As shown above, a listener class can be used instead of a callback. This allows you to [inject dependencies](https://laravel.com/docs/8.x/container) into your listener class via constructor parameters. In this example we resolve a translator instance, but we can inject anything we want/need. - -You can also listen to multiple events at once via an event subscriber. This is useful for grouping common functionality; for instance, if you want to update some metadata on changes to posts: - -```php -use Flarum\Extend; -use Flarum\Post\Event\Deleted; -use Flarum\Post\Event\Saving; -use Symfony\Contracts\Translation\TranslatorInterface; - - -return [ - (new Extend\Event) - ->subscribe(PostEventSubscriber::class), -]; -``` -```php -class PostEventSubscriber -{ - protected $translator; - - public function __construct(TranslatorInterface $translator) - { - $this->translator = $translator; - } - - public function subscribe($events) - { - $events->listen(Deleted::class, [$this, 'handleDeleted']); - $events->listen(Saving::class, [$this, 'handleSaving']); - } - - public function handleDeleted(Deleted $event) - { - // Your logic here - } - - public function handleSaving(Saving $event) - { - // Your logic here - } -} -``` - -## Dispatching Events - -Dispatching events is very simple. All you need to do is inject `Illuminate\Contracts\Events\Dispatcher` into your class, and then call its `dispatch` method. For instance: - -```php -use Flarum\Post\Event\Deleted; -use Illuminate\Contracts\Events\Dispatcher; - - -class SomeClass -{ - /** - * @var Dispatcher - */ - protected $events; - - /** - * @param Dispatcher $events - */ - public function __construct(Dispatcher $events) - { - $this->events = $events; - } - - public function someMethod() - { - // Logic - $this->events->dispatch( - new Deleted($somePost, $someActor) - ); - // More Logic - } -} -``` - -## Custom Events - -As an extension developer you can define your own events to allow yourself (or other extensions) to react to events in your extension. Events are generally instances of simple classes (no need to extend anything). When defining a new event, you'll typically want to use public properties, and maybe some methods for convenience of users. For example, if we take a look at `Flarum\Post\Event\Deleted`, it's just a wrapping around some data: - -```php -post = $post; - $this->actor = $actor; - } -} -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/cli.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/cli.md deleted file mode 100644 index 7c69594f8..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/cli.md +++ /dev/null @@ -1,15 +0,0 @@ -# 开发者讲解:扩展开发的工作流程 - -The Flarum development ecosystem is oriented around many small, modules, interacting extensions. This is a very powerful and flexible paradigm, but it also brings the maintenance cost of creating and maintaining all these extensions. - -We've created the Flarum CLI (command line interface) as a tool to help developers by automating some repetitive and menial tasks, and allow them to get into the actual work without much hassle. - -Major updates about Flarum CLI will be published [on this discussion](https://discuss.flarum.org/d/28427-flarum-cli-v10). - -See the [package's readme](https://github.com/flarum/cli#readme) for information on: - -- 安装 -- Usage -- Upgrading -- Available commands -- Some implementation details, if you're interested diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/console.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/console.md deleted file mode 100644 index b61d31e83..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/console.md +++ /dev/null @@ -1,77 +0,0 @@ -# 控制台 - -除了 Flarum 核心提供的 [默认命令](../console.md),我们还允许扩展程序的开发者添加自定义控制台命令。 - -所有控制台命令开发都是在后端使用 PHP 完成的。 要创建自定义控制台命令,您需要创建一个类实现 `\Flarum\Console\AbstractCommand`。 - -```php -use Flarum\Console\AbstractCommand; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Server\MiddlewareInterface; -use Psr\Http\Server\RequestHandlerInterface; - -class YourCommand implements AbstractCommand { - protected function configure() - { - $this - ->setName('您的命令名') - ->setDescription('您的命令描述'); - } - protected function fire() - { - // 逻辑实现! - } -} -``` - -:::info [Flarum CLI](https://github.com/flarum/cli) - -:::tip 定时命令 -```bash -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // 其他扩展器 - (new Extend\Console())->command(CustomCommand::class) - // 其他扩展器 -]; -``` - -::: - -## 注册控制台命令 - -To register console commands, use the `Flarum\Extend\Console` extender in your extension's `extend.php` file: - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; - -return [ - // Other extenders - (new Extend\Console())->command(CustomCommand::class) - // Other extenders -]; -``` - -## Scheduled Commands - -The `Flarum\Extend\Console`'s `schedule` method allows extension developers to create scheduled commands that run on an interval: - - -```php -use Flarum\Extend; -use YourNamespace\Console\CustomCommand; -use Illuminate\Console\Scheduling\Event; - -return [ - // Other extenders - (new Extend\Console())->schedule('cache:clear', function (Event $event) { - $event->everyMinute(); - }, ['Arg1', '--option1', '--option2']), - // Other extenders -]; -``` - -In the callback provided as the second argument, you can call methods on the [$event object](https://laravel.com/api/8.x/Illuminate/Console/Scheduling/Event.html) to schedule on a variety of frequencies (or apply other options, such as only running on one server). See the [Laravel documentation](https://laravel.com/docs/8.x/scheduling#scheduling-artisan-commands) for more information. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/distribution.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/distribution.md deleted file mode 100644 index 7061d5aa0..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/distribution.md +++ /dev/null @@ -1,40 +0,0 @@ -# Distribution - -You've written a great extension — and now you want the whole world to be able to use it. This document will take you through the process of distribution, from setting up a Git repository for your extension, to publishing it on Packagist. - -## Setting Up Git - -The first thing you'll need to do is set up a version control system (VCS). The most popular VCS is [Git](https://git-scm.com/). In this guide we'll be using Git, so make sure you have it [installed](https://git-scm.com/downloads) before continuing. If you don't have much Git knowledge, you may want to check out [these learning resources](https://try.github.io/). - -After you have installed Git, you'll need to initialize your repository. You can use `git init` on the command line if you're comfortable, or use a GUI tool like [SourceTree](https://www.sourcetreeapp.com/) or [GitKraken](https://www.gitkraken.com/). - -Then, you'll need an account in a Git hosting server, the most popular being [GitHub](https://github.com) and [GitLab](https://gitlab.com). These will instruct you on how to hook up your local repository with the online "remote" repository. - -## Tagging a Release - -As you are going to be publishing this extension, you'll want to make sure that the information is up to date. Take a minute to revisit `composer.json` and make sure package name, description, and Flarum extension information are all correct. It is recommended to have a `README.md` file in your repository to explain what the extension is, so create one if you haven't already. - -When you're ready to release, commit your extension's files to the repo and tag your first version: - -```bash -git tag v0.1.0 -git push && git push --tags -``` - -## Publishing on Packagist - -Composer packages are published to a Composer repository, usually [Packagist](https://packagist.org/). You will need an account to proceed. - -If this is the first release you are publishing of your extension, you will need to [submit your package](https://packagist.org/packages/submit) using its public repository URL. If your extension is located on GitHub, this URL will look something like `https://github.com/AUTHOR/NAME.git`. - -### Future Releases - -You can set up Packagist to [auto-update packages](https://packagist.org/about#how-to-update-packages). Then for future releases, all you will need to do with Git is commit, tag, and push it to the remote server. - -## Promoting Your Extension - -You will most likely want to create a discussion on the Flarum Community in the [Extensions tag](https://discuss.flarum.org/t/extensions). Other people can install your extension using the following command: - -```bash -composer require vendor/package -``` \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/extending-extensions.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/extending-extensions.md deleted file mode 100644 index 7a8db4f8c..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/extending-extensions.md +++ /dev/null @@ -1,122 +0,0 @@ -# Extending Extensions - -Flarum extensions aren't just for adding features to core: extensions can extend other extensions! - -:::tip - -To learn how to make your extension extensible, see the [relevant documentation](extensibility.md) - -::: - -## Dependencies - -If your extension relies on another extension, you'll want to ensure that: - -- The other extension is installed and enabled before yours can be. -- The other extension can't be disabled while yours is enabled. -- The other extension is booted before your extension. - -Flarum makes this very easy: just add the other extension to your extension's `composer.json`'s `require` section. - -For example, if you were building a new theme for the Flarum Tags extension, your `composer.json` would look like this: - -```json -{ - // ... - "require": { - "flarum/core": "^0.1.0-beta.15", // Since all extensions need to require core. - "flarum/tags": "^0.1.0-beta.15" // This tells Flarum to treat tags as a dependency of your extension. - }, - // ... -} -``` - -## Optional Dependencies - -Sometimes, extension A might want to extend extension B only if extension B is enabled. In this case, we call B an "Optional Dependency" of A. For instance, a drafts extension might want to add support for saving private discussion drafts, but only if the private discussion extension is enabled. - -The first step here is detecting whether extension B is enabled. In the frontend, this is easy: if extension B does anything in the frontend, its extension ID will appear as a key in the `flarum.extensions` global object. For instance: - -```js -if ('some-extension-id' in flarum.extensions) { - // do something -} -``` - -In the backend, you'll need to inject an instance of `Flarum\Extension\ExtensionManager`, and use its `isEnabled()` method. For instance: - -```php -extensions = $extensions; - } - - public function someMethod() - { - if ($this->extensions->isEnabled('some-extension-id')) { - // do something. - } - } -} -``` - -Generally, if your extension has optional dependencies, you'll want it to be booted after said optional dependencies. You can also do this by specifying composer package names (NOT flarum extension IDs) in an array for the `extra.flarum-extension.optional-dependencies` key of your composer.json. - -For instance: - -```json -{ - // ... - "extra": { - "flarum-extension": { - "optional-dependencies": [ - "flarum/tags" - ] - } - }, - // ... -} -``` - -## Importing from Extensions - -In the backend, you can import the classes you need via regular PHP `use` statements: - -```php - { - // Your Extension Code Here -}) - -export { - // Put all the stuff you want to export here. -} -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/filesystem.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/filesystem.md deleted file mode 100644 index ef202b2c7..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/filesystem.md +++ /dev/null @@ -1,129 +0,0 @@ -# Filesystem - -Flarum core integrates with the filesystem to store and serve assets (like compiled JS/CSS or upload logos/favicons) and avatars. - -Extensions can use Flarum's provided utils for their own filesystem interaction and file storage needs. This system is based around [Laravel's filesystem tools](https://laravel.com/docs/8.x/filesystem), which are in turn based on the [Flysystem library](https://github.com/thephpleague/flysystem). - -## Disks - -Filesystem **disks** represent storage locations, and are backed by storage drivers, which we'll cover later. Flarum core has 2 disks: `flarum-assets` and `flarum-avatars`. - -### Using existing disks - -To access a disk, you'll need to retrieve it from the [Filesystem Factory](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Factory.html). To do so, you should inject the factory contract in your class, and access the disks you need. - -Let's take a look at core's [`DeleteLogoController`](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/src/Api/Controller/DeleteLogoController.php#L19-L58) for an example: - -```php -settings = $settings; - $this->uploadDir = $filesystemFactory->disk('flarum-assets'); - } - - /** - * {@inheritdoc} - */ - protected function delete(ServerRequestInterface $request) - { - RequestUtil::getActor($request)->assertAdmin(); - - $path = $this->settings->get('logo_path'); - - $this->settings->set('logo_path', null); - - if ($this->uploadDir->exists($path)) { - $this->uploadDir->delete($path); - } - - return new EmptyResponse(204); - } -} -``` - -The object returned by `$filesystemFactory->disk(DISK_NAME)` implements the [Illuminate\Contracts\Filesystem\Cloud](https://laravel.com/api/8.x/Illuminate/Contracts/Filesystem/Cloud.html) interface, and can be used to create/get/move/delete files, and to get the URL to a resource. - -### Declaring new disks - -Some extensions will want to group their resources / uploads onto a custom disk as opposed to using `flarum-assets` or `flarum-avatars`. - -This can be done via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->disk('flarum-uploads', function (Paths $paths, UrlGenerator $url) { - return [ - 'root' => "$paths->public/assets/uploads", - 'url' => $url->to('forum')->path('assets/uploads') - ]; - }); -``` - -Since all disks use the local filesystem by default, you'll need to provide a base path and base URL for the local filesystem. - -The config array can contain other entries supported by [Laravel disk config arrays](https://laravel.com/docs/8.x/filesystem#configuration). The `driver` key should not be provided, and will be ignored. - -## Storage drivers - -Flarum selects the active driver for each disk by checking the `disk_driver.DISK_NAME` key in the [settings repository](settings.md) and [config.php file](../config.md). If no driver is configured, or the configured driver is unavailable, Flarum will default to the `local` driver. - -You can define new storage drivers by implementing the [`Flarum\Filesystem\DriverInterface` interface](https://github.com/flarum/framework/blob/main/framework/core/src/Filesystem/DriverInterface.php#L16), and registering it via the `Filesystem` extender: - -```php -use Flarum\Extend; - -return [ - (new Extend\Filesystem) - ->driver('aws-with-cdn', AwsWithCdnDriver::class); -``` - -Filesystem storage drivers are a very powerful tool that allows you to completely customize file storage locations, attach arbitrary CDNs, and otherwise extend the filesystem / cloud storage integration layer. - -:::danger - -Some drivers might try to index their filesystem every time the driver is instantiated, even if only the `url` method is needed. This can have serious performance implications. In most cases, you'll want to ensure that your driver's `url` method does not ping the remote filesystem. Similarly, the remote filesystem should usually not be accessed until operations are actually executed. - -::: - -## GUI and Admin Configuration - -Flarum does not currently provide a GUI for selecting drivers for disks, or for entering settings for drivers. This might be added in the future. For now, extensions are responsible for providing a GUI for their disks and drivers. - -As noted [above](#storage-drivers), if your extension provides a GUI for selecting drivers for a disk, it should modify the `disk_driver.DISK_NAME` key in settings. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/formatting.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/formatting.md deleted file mode 100644 index d4ea23b12..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/formatting.md +++ /dev/null @@ -1,42 +0,0 @@ -# Formatting - -Flarum uses the powerful [s9e TextFormatter](https://github.com/s9e/TextFormatter) library to format posts from plain markup into HTML. You should become familiar with [how TextFormatter works](https://s9etextformatter.readthedocs.io/Getting_started/How_it_works/) before you attempt to extend it. - -In Flarum, post content is formatted with a minimal TextFormatter configuration by default. The bundled **Markdown** and **BBCode** extensions simply enable the respective plugins on this TextFormatter configuration. - -## Configuration - -You can configure the TextFormatter `Configurator` instance, as well as run custom logic during parsing and rendering, using the `Formatter` extender: - -```php -use Flarum\Extend; -use Psr\Http\Message\ServerRequestInterface as Request; -use s9e\TextFormatter\Configurator; -use s9e\TextFormatter\Parser; -use s9e\TextFormatter\Renderer; - -return [ - (new Extend\Formatter) - // Add custom text formatter configuration - ->configure(function (Configurator $config) { - $config->BBCodes->addFromRepository('B'); - }) - // Modify raw text before it is parsed. - // This callback should return the modified text. - ->parse(function (Parser $parser, $context, $text) { - // custom logic here - return $newText; - }) - // Modify the XML to be rendered before rendering. - // This callback should return the new XML. - // For example, in the mentions extension, this is used to - // provide the username and display name of the user being mentioned. - // Make sure that the last $request argument is nullable (or omitted entirely). - ->render(function (Renderer $renderer, $context, $xml, Request $request = null) { - // custom logic here - return $newXml; - }) -]; -``` - -With a good understanding of TextFormatter, this will allow you to achieve anything from simple BBCode tag additions to more complex formatting tasks like Flarum's **Mentions** extension. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/forms.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/forms.md deleted file mode 100644 index af8d74fb6..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/forms.md +++ /dev/null @@ -1,108 +0,0 @@ -# Forms and Requests - -In this article, we'll go over some frontend tools that are available to us for building and managing forms, as well how to send HTTP requests via Flarum. - -## Form Components - -As with any interactive site, you will likely want to include forms in some pages and modals. Flarum provides some components to make building (and styling!) these forms easier. Please see the linked API documentation for each of these to learn more about its accepted attrs. - -- The [`flarum/common/components/FieldSet` component](https://api.docs.flarum.org/js/master/class/src/common/components/fieldset.js~fieldset) wraps its children in a HTML fieldset tag, with a legend. -- The [`flarum/common/components/Select` component](https://api.docs.flarum.org/js/master/class/src/common/components/select.js~select) is a stylized select input. -- The [`flarum/common/components/Switch`](https://api.docs.flarum.org/js/master/class/src/common/components/switch.js~switch) and [`flarum/common/components/Checkbox` components](https://api.docs.flarum.org/js/master/class/src/common/components/checkbox.js~checkbox) are stylized checkbox input components. Their `loading` attr can be set to `true` to show a loading indicator. -- The [`flarum/common/components/Button` component](https://api.docs.flarum.org/js/master/class/src/common/components/button.js~button) is a stylized button, and is used frequently throughout Flarum. - -You'll typically want to assign logic for reacting to input changes via Mithril's `on*` attrs, not external listeners (as is common with jQuery or plain JS). For example: - -```jsx -import Component from 'flarum/common/Component'; -import FieldSet from 'flarum/common/components/FieldSet'; -import Button from 'flarum/common/components/Button'; -import Switch from 'flarum/common/components/Switch'; - - -class FormComponent extends Component { - oninit(vnode) { - this.textInput = ""; - this.booleanInput = false; - } - - view() { - return ( -
-
- this.textInput = e.target.value}> - - this.booleanInput = val}> - -
- -
- ) - } - - onsubmit() { - // Some form handling logic here - } -} -``` - -Don't forget to use [translations](i18n.md)! - - -## Streams, bidi, and withAttr - -Flarum provides [Mithril's Stream](https://mithril.js.org/stream.html) as `flarum/common/util/Stream`. This is a very powerful reactive data structure, but is most commonly used in Flarum as a wrapper for form data. Its basic usage is: - -```js -import Stream from 'flarum/common/utils/Stream'; - - -const value = Stream("hello!"); -value() === "hello!"; // true -value("world!"); -value() === "world!"; // true -``` - -In Flarum forms, streams are frequently used together with the bidi attr. Bidi stands for bidirectional binding, and is a common pattern in frontend frameworks. Flarum patches Mithril with the [`m.attrs.bidi` library](https://github.com/tobyzerner/m.attrs. This abstracts away input processing in Mithril. For instance: - -```jsx -import Stream from 'flarum/common/utils/Stream'; - -const value = Stream(); - -// Without bidi - value(e.target.value)}> - -// With bidi - -``` - -You can also use the `flarum/common/utils/withAttr` util for simplified form processing. `withAttr` calls a callable, providing as an argument some attr of the DOM element tied to the component in question: - -```jsx -import Stream from 'flarum/common/utils/Stream'; -import withAttr from 'flarum/common/utils/withAttr'; - -const value = Stream(); - -// With a stream - - -// With any callable - { - // Some custom logic here -})}> -``` - -## Making Requests - -In our [models](models.md) documentation, you learned how to work with models, and save model creation, changes, and deletion to the database via the Store util, which is just a wrapper around Flarum's request system, which itself is just a wrapper around [Mithril's request system](https://mithril.js.org/request.html). - -Flarum's request system is available globally via `app.request(options)`, and has the following differences from Mithril's `m.request(options)`: - -- It will automatically attach `X-CSRF-Token` headers. -- It will convert `PATCH` and `DELETE` requests into `POST` requests, and attach a `X-HTTP-Method-Override` header. -- If the request errors, it will show an alert which, if in debug mode, can be clicked to show a full error modal. -- You can supply a `background: false` option, which will run the request synchronously. However, this should almost never be done. - -Otherwise, the API for using `app.request` is the same as that for `m.request`. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend-pages.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend-pages.md deleted file mode 100644 index 396292ad1..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend-pages.md +++ /dev/null @@ -1,218 +0,0 @@ -# Frontend Pages and Resolvers - -As explained in the [Routes and Content](routes.md#frontend-routes) documentation, we can use Mithril's routing system to show different [components](frontend.md#components) for different routes. Mithril allows you to use any component you like, even a Modal or Alert, but we recommend sticking to component classes that inherit the `Page` component. - -## The Page Component - -We provide `flarum/common/components/Page` as a base class for pages in both the `admin` and `forum` frontends. It has a few benefits: - -- Automatically updates [`app.current` and `app.previous` PageState](#pagestate) when switching from one route to another. -- Automatically closes the modal and drawer when switching from one route to another. -- Applies `this.bodyClass` (if defined) to the '#app' HTML element when the page renders. -- It's also good for consistency's sake to use a common base class for all pages. -- If the page's `scrollTopOnCreate` attribute is set to `false` in `oninit`, the page won't be scrolled to the top when changed. -- If the page's `useBrowserScrollRestoration` is set to `false` in `oninit`, the browser's automatic scroll restoration won't be used on that page. - -Page components work just like any other inherited component. For a (very simple) example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - view() { - return

Hello!

- } -} -``` - -### Setting Page as Homepage - -Flarum uses a setting to determine which page should be the homepage: this gives admins flexibility to customize their communities. To add your custom page to the homepage options in Admin, you'll need to extend the `BasicsPage.homePageItems` method with your page's path. - -An example from the [Tags extension](https://github.com/flarum/tags/blob/master/js/src/admin/addTagsHomePageOption.js): - -```js -import { extend } from 'flarum/common/extend'; -import BasicsPage from 'flarum/common/components/BasicsPage'; - -export default function() { - extend(BasicsPage.prototype, 'homePageItems', items => { - items.add('tags', { - path: '/tags', - label: app.translator.trans('flarum-tags.admin.basics.tags_label') - }); - }); -} -``` - -To learn how to set up a path/route for your custom page, see the [relevant documentation](routes.md). - -### Page Titles - -Often, you'll want some custom text to appear in the browser tab's title for your page. For instance, a tags page might want to show "Tags - FORUM NAME", or a discussion page might want to show the title of the discussion. - -To do this, your page should include calls to `app.setTitle()` and `app.setTitleCount()` in its `oncreate` [lifecycle hook](frontend.md) (or when data is loaded, if it pulls in data from the API). - -For example: - -```js -import Page from 'flarum/common/components/Page'; - - -export default class CustomPage extends Page { - oncreate(vnode) { - super.oncreate(vnode); - - app.setTitle("Cool Page"); - app.setTitleCount(0); - } - - view() { - // ... - } -} - -export default class CustomPageLoadsData extends Page { - oninit(vnode) { - super.oninit(vnode); - - app.store.find("users", 1).then(user => { - app.setTitle(user.displayName()); - app.setTitleCount(0); - }) - } - - view() { - // ... - } -} -``` - -Please note that if your page is [set as the homepage](#setting-page-as-homepage), `app.setTitle()` will clear the title for simplicity. It should still be called though, to prevent titles from previous pages from carrying over. - -## PageState - -Sometimes, we want to get information about the page we're currently on, or the page we've just come from. To allow this, Flarum creates (and stores) instances of [`PageState`](https://api.docs.flarum.org/js/master/class/src/common/states/pagestate.js~pagestate) as `app.current` and `app.previous`. These store: - -- The component class being used for the page -- A collection of data that each page sets about itself. The current route name is always included. - -Data can be set to, and retrieved from, Page State using: - -```js -app.current.set(KEY, DATA); -app.current.get(KEY); -``` - -For example, this is how the Discussion Page makes its [`PostStreamState`](https://api.docs.flarum.org/js/master/class/src/forum/states/poststreamstate.js~poststreamstate) instance globally available. - -You can also check the type and data of a page using `PostStreamState`'s `matches` method. For instance, if we want to know if we are currently on a discussion page: - -```jsx -import IndexPage from 'flarum/forum/components/DiscussionPage'; -import DiscussionPage from 'flarum/forum/components/DiscussionPage'; - -// To just check page type -app.current.matches(DiscussionPage); - -// To check page type and some data -app.current.matches(IndexPage, {routeName: 'following'}); -``` - -## Admin Pages - -See the [Admin Dashboard documentation](admin.md) for more information on tools specifically available to admin pages (and how to override the admin page for your extension). - -## Route Resolvers (Advanced) - -[Advanced use cases](https://mithril.js.org/route.html#advanced-component-resolution) can take advantage of Mithril's [route resolver system](https://mithril.js.org/route.html#routeresolver). Flarum actually already wraps all its components in the `flarum/common/resolvers/DefaultResolver` resolver. This has the following benefits: - -- It passes a `routeName` attr to the current page, which then provides it to `PageState` -- It assigns a [key](https://mithril.js.org/keys.html#single-child-keyed-fragments) to the top level page component. When the route changes, if the top level component's key has changed, it will be completely rerendered (by default, Mithril does not rerender components when switching from one page to another if both are handled by the same component). - -### Using Route Resolvers - -There are actually 3 ways to set the component / route resolver when registering a route: - -- the `resolver` key can be used to provide an **instance** of a route resolver. This instance should define which component should be used, and hardcode the route name to be passed into it. This instance will be used without any modifications by Flarum. -- The `resolverClass` key AND `component` key can be used to provide a **class** that will be used to instantiate a route resolver, to be used instead of Flarum's default one, as well as the component to use. Its constructor should take 2 arguments: `(component, routeName)`. -- The `component` key can be used alone to provide a component. This will result in the default behavior. - -For example: - -```js -// See above for a custom page example -import CustomPage from './components/CustomPage'; -// See below for a custom resolver example -import CustomPageResolver from './resolvers/CustomPageResolver'; - -// Use a route resolver instance -app.routes['resolverInstance'] = {path: '/custom/path/1', resolver: { - onmatch: function(args) { - if (!app.session.user) return m.route.SKIP; - - return CustomPage; - } -}}; - -// Use a custom route resolver class -app.routes['resolverClass'] = {path: '/custom/path/2', resolverClass: CustomPageResolver, component: CustomPage}; - -// Use the default resolver class (`flarum/common/resolvers/DefaultResolver`) -app.routes['resolverClass'] = {path: '/custom/path/2', component: CustomPage}; -``` - -### Custom Resolvers - -We strongly encourage custom route resolvers to extend `flarum/common/resolvers/DefaultResolver`. For example, Flarum's `flarum/forum/resolvers/DiscussionPageResolver` assigns the same key to all links to the same discussion (regardless of the current post), and triggers scrolling when using `m.route.set` to go from one post to another on the same discussion page: - -```js -import DefaultResolver from '../../common/resolvers/DefaultResolver'; - -/** - * This isn't exported as it is a temporary measure. - * A more robust system will be implemented alongside UTF-8 support in beta 15. - */ -function getDiscussionIdFromSlug(slug: string | undefined) { - if (!slug) return; - return slug.split('-')[0]; -} - -/** - * A custom route resolver for DiscussionPage that generates the same key to all posts - * on the same discussion. It triggers a scroll when going from one post to another - * in the same discussion. - */ -export default class DiscussionPageResolver extends DefaultResolver { - static scrollToPostNumber: number | null = null; - - makeKey() { - const params = { ...m.route.param() }; - if ('near' in params) { - delete params.near; - } - params.id = getDiscussionIdFromSlug(params.id); - return this.routeName.replace('.near', '') + JSON.stringify(params); - } - - onmatch(args, requestedPath, route) { - if (route.includes('/d/:id') && getDiscussionIdFromSlug(args.id) === getDiscussionIdFromSlug(m.route.param('id'))) { - DiscussionPageResolver.scrollToPostNumber = parseInt(args.near); - } - - return super.onmatch(args, requestedPath, route); - } - - render(vnode) { - if (DiscussionPageResolver.scrollToPostNumber !== null) { - const number = DiscussionPageResolver.scrollToPostNumber; - // Scroll after a timeout to avoid clashes with the render. - setTimeout(() => app.current.get('stream').goToNumber(number)); - DiscussionPageResolver.scrollToPostNumber = null; - } - - return super.render(vnode); - } -} -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend.md deleted file mode 100644 index d2e0533a7..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/frontend.md +++ /dev/null @@ -1,422 +0,0 @@ -# 前端开发 - -这个页面描述如何改变Flarum的用户界面—— 添加按钮、文字滚动、和闪耀的文本 🤩 - -[记住](/extend/start.md#architecture), Flarum 的前端是**单页 JavaScript 应用**。 我们不会用到Twig、Blade或任何其他的PHP模板。 后端中存在的少数模板仅用于渲染针对搜索引擎优化的内容。 所有对UI的改动都需要通过JavaScript实现。 - -Flarum有两个分开的前端应用: - -* `forum`,论坛的公共部分,用户在此处创建讨论和帖子。 -* `admin`,论坛的私有部分,你作为论坛管理员在此处对Flarum进行配置。 - -它们共享相同的基础代码,所以只要你学会了如何拓展其中一个,你就能够拓展另一个。 - -:::tip 类型申明(typings)! - -我们在提供新的 TypeScript 支持的同时,提供了一个 [`tsconfig` 配置包](https://www.npmjs.com/package/flarum-tsconfig),你应该将它作为开发依赖安装,以查看我们的类型申明。 请确保你按照[配置包的README文件](https://github.com/flarum/flarum-tsconfig#readme)中的指示配置类型申明支持。 - -::: - -## 转译和文件结构 - -本教程的这个部分讲解释编写拓展的必要文件设置。 再说一次,我们高度推荐使用[Flarum CLI](https://github.com/flarum/cli)来为你创建文件结构。 话虽如此,你仍然应该阅读这一部分以理解文件结构背后的原理。 - -在我们编写JavaScript之前,我们需要配置**转译器**。 这使得我们可以在Flarum核心代码以及拓展中使用[TypeScript](https://www.typescriptlang.org/)和它的魔力。 - -为了进行转译,你需要一个好的工作环境。 不是说在家或者办公室这种环境——你想在厕所写代码我都不管! 我指的是安装在你系统上的工具。 你需要: - -* Node.js和npm ([下载](https://nodejs.org/en/download/)) -* Webpack (`npm install -g webpack`) - -这可能比较麻烦,因为每个人的系统都不一样。 从您正在使用的操作系统,到您已安装的程序版本,到用户访问权限——想想就令人胆寒。 如果你遇上了困难,~~帮我向他问好~~ 上[谷歌](https://google.com)查查是否有人遇到了同样的问题并找到解决方案。 如果找不到,可以去[Flarum社区](https://discuss.flarum.org)或者[Discord群聊](https://flarum.org/discord/)寻求帮助。 - -是时候设置我们的小 JavaScript 转译项目了。 在你的扩展中创建一个新文件夹,名为 `js`,然后再丢进去几个新文件。 一个典型拓展的前端结构是这样的: - -``` -js -├── dist (编译后的js文件保存在此处) -├── src -│ ├── admin -│ └── forum -├── admin.js -├── forum.js -├── package.json -├── tsconfig.json -└── webpack.config.js -``` - -### package.json - -```json -{ - "private": true, - "name": "@acme/flarum-hello-world", - "dependencies": { - "flarum-webpack-config": "^1.0.0", - "webpack": "^4.0.0", - "webpack-cli": "^4.0.0" - }, - "devDependencies": { - "flarum-tsconfig": "^1.0.0" - }, - "scripts": { - "dev": "webpack --mode development --watch", - "build": "webpack --mode production" - } -} -``` - -这是一个标准 JS [包描述文件](https://docs.npmjs.com/files/package.json),被 npm 和 Yarn (JavaScript 包管理器) 使用。 你可以使用它来添加指令、JS依赖和包元数据。 我们不是在真正发布一个npm包:这只是用来收集依赖项。 - -请注意,我们不需要将 `flarum/core` 或任何flarum扩展作为依赖:它们会在Flarum编译所有前端拓展时自动被打包。 - -### webpack.config.js - -```js -const config = require('flarum-webpack-config'); - -module.exports = config(); -``` - -[Webpack](https://webpack.js.org/concepts/)是真正为我们的插件编译并打包所有Javascript (及其依赖) 的系统。 为了使我们的扩展正常工作,它应该使用 [官方的 flarum webpack 配置](https://github.com/flarum/flarum-webpack-config) (在上述例子中展示)。 - -### tsconfig.json - -```json -{ - //使用Flarum的tsconfig作为开始 - "extends": "flarum-tsconfig", - // 这会匹配你的 `src` 文件夹中所有的.ts、.tsx、.d.ts、.js和.jsx文件 - // 同时会让你的Typescript读取论坛核心的全局类型申明 - // 以获取全局命名空间中的`dayjs`和`$` - "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"], - "compilerOptions": { - // 这会让类型申明输出到 `dist-typings` - "declarationDir": "./dist-typings", - "baseUrl": ".", - "paths": { - "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] - } - } -} -``` - -This is a standard configuration file to enable support for Typescript with the options that Flarum needs. - -Always ensure you're using the latest version of this file: https://github.com/flarum/flarum-tsconfig#readme. - -Even if you choose not to use TypeScript in your extension, which is supported natively by our Webpack config, it's still recommended to install the `flarum-tsconfig` package and to include this configuration file so that your IDE can infer types for our core JS. - -To get the typings working, you'll need to run `composer update` in your extension's folder to download the latest copy of Flarum's core into a new `vendor` folder. Remember not to commit this folder if you're using a version control system such as Git. - -You may also need to restart your IDE's TypeScript server. In Visual Studio Code, you can press F1, then type "Restart TypeScript Server" and hit ENTER. This might take a minute to complete. - -### admin.js and forum.js - -These files contain the root of our actual frontend JS. You could put your entire extension here, but that would not be well organized. For this reason, we recommend putting the actual source code in `src`, and having these files just export the contents of `src`. For instance: - -```js -// admin.js -export * from './src/admin'; - -// forum.js -export * from './src/forum'; -``` - -### src - -If following the recommendations for `admin.js` and `forum.js`, we'll want to have 2 subfolders here: one for `admin` frontend code, and one for `forum` frontend code. If you have components, models, utils, or other code that is shared across both frontends, you may want to create a `common` subfolder and place it there. - -Structure for `admin` and `forum` is identical, so we'll just show it for `forum` here: - -``` -src/forum/ -├── components/ -├── models/ -├── utils/ -└── index.js -``` - -`components`, `models`, and `utils` are directories that contain files where you can define custom [components](#components), [models](models.md#frontend-models), and reusable util helper functions. Please note that this is all simply a recommendation: there's nothing forcing you to use this particular file structure (or any other file structure). - -The most important file here is `index.js`: everything else is just extracting classes and functions into their own files. Let's go over a typical `index.js` file structure: - -```js -import { extend, override } from 'flarum/common/extend'; - -// We provide our extension code in the form of an "initializer". -// This is a callback that will run after the core has booted. -app.initializers.add('acme-flarum-hello-world', function(app) { - // Your Extension Code Here - console.log("EXTENSION NAME is working!"); -}); -``` - -We'll go over tools available for extensions below. - -### 导入 - -You should familiarize yourself with proper syntax for [importing js modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), as most extensions larger than a few lines will split their js into multiple files. - -Pretty much every Flarum extension will need to import *something* from Flarum Core. Like most extensions, core's JS source code is split up into `admin`, `common`, and `forum` folders. You can import the file by prefixing its path in the Flarum core source code with `flarum`. So `admin/components/AdminLinkButton` is available as `flarum/admin/components/AdminLinkButton`, `common/Component` is available as `flarum/common/Component`, and `forum/states/PostStreamState` is available as `flarum/forum/states/PostStreamState`. - -In some cases, an extension may want to extend code from another flarum extension. This is only possible for extensions which explicitly export their contents. - -* `flarum/tags` and `flarum/flags` are currently the only bundled extensions that allow extending their JS. You can import their contents from `flarum/{EXT_NAME}/PATH` (e.g. `flarum/tags/components/TagHero`). -* The process for extending each community extension is different; you should consult documentation for each individual extension. - -### 转译 - -OK, time to fire up the transpiler. Run the following commands in the `js` directory: - -```bash -npm install -npm run dev -``` - -This will compile your browser-ready JavaScript code into the `js/dist/forum.js` file, and keep watching for changes to the source files. Nifty! - -When you've finished developing your extension (or before a new release), you'll want to run `npm run build` instead of `npm run dev`: this builds the extension in production mode, which makes the source code smaller and faster. - -## Asset Registration - -### JavaScript - -In order for your extension's JavaScript to be loaded into the frontend, we need to tell Flarum where to find it. We can do this using the `Frontend` extender's `js` method. Add it to your extension's `extend.php` file: - -```php -js(__DIR__.'/js/dist/forum.js') -]; -``` - -Flarum will make anything you `export` from `forum.js` available in the global `flarum.extensions['acme-hello-world']` object. Thus, you may choose to expose your own public API for other extensions to interact with. - -:::tip External Libraries - -Only one main JavaScript file per extension is permitted. If you need to include any external JavaScript libraries, either install them with NPM and `import` them so they are compiled into your JavaScript file, or see [Routes and Content](/extend/routes.md) to learn how to add extra `'; - }) -]; -``` - -You can also add content onto your frontend route registrations: - -```php -return [ - (new Extend\Frontend('forum')) - ->route('/users', 'acme.users', function (Document $document, Request $request) { - $document->title = 'Users'; - }) -]; -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/search.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/search.md deleted file mode 100644 index 9da3f70b3..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/search.md +++ /dev/null @@ -1,202 +0,0 @@ -# 搜索 - -Flarum treats searching and filtering as parallel but distinct processes. Which process is used to handle a request to a [`List` API endpoint](/extend/api.md#api-endpoints) depends on the query parameters: - -- Filtering is applied when the `filter[q]` query param is omitted. Filters represent **structured** queries: for instance, you might want to only retrieve discussions in a certain category, or users who registered before a certain date. Filtering computes results based entirely on `filter[KEY] = VALUE` query parameters. -- Searching is applied when the `filter[q]` query param is included. Searches represent **unstructured** queries: the user submits an arbitrary string, and data records that "match" it are returned. For instance, you might want to search discussions based on the content of their posts, or users based on their username. Searching computes results based solely on parsing the `filter[q]` query param: all other `filter[KEY] = VALUE` params are ignored when searching. It's important to note that searches aren't entirely unstructured: the dataset being searched can be constrained by gambits (which are very similar to filters, and will be explained later). - -This distinction is important because searches and filters have very different use cases: filters represent *browsing*: that is, the user is passively looking through some category of content. In contrast, searches represent, well, *searching*: the user is actively looking for content based on some criteria. - -Flarum implements searching and filtering via per-model `Searcher` and `Filterer` classes (discussed in more detail below). Both classes accept a [`Flarum\Query\QueryCriteria`](https://api.docs.flarum.org/php/master/flarum/query/querycriteria) instance (a wrapper around the user and query params), and return a [`Flarum\Query\QueryResults`](https://api.docs.flarum.org/php/master/flarum/query/queryresults) instance (a wrapper around an Eloquent model collection). This common interface means that adding search/filter support to models is quite easy. - -One key advantage of this split is that it allows searching to be implemented via an external service, such as ElasticSearch. For larger communities, this can be significantly more performant and accurate. There isn't a dedicated extender for this yet, so for now, replacing the default Flarum search driver requires overriding the container bindings of `Searcher` classes. This is a highly advanced use case; if you're interested in doing this, please reach out on our [community forums](https://discuss.flarum.org/). - -Remember that the [JSON:API schema](https://jsonapi.org/format) is used for all API requests. - -:::tip Reuse Code - -Often, you might want to use the same class as both a `Filter` and a `Gambit` (both explained below). Your classes can implement both interface; see Flarum core's [`UnreadFilterGambit`](https://github.com/flarum/framework/blob/main/framework/core/src/Discussion/Query/UnreadFilterGambit.php) for an example. - -::: - -:::tip Query Builder vs Eloquent Builder - -`Filter`s, `Gambit`s, filter mutators, and gambit mutators (all explained below) receive a "state" parameter, which wraps - -::: - -## Filtering - -Filtering constrains queries based on `Filters` (highlighted in code to avoid confusion with the process of filtering), which are classes that implement `Flarum\Filter\FilterInterface` and run depending on query parameters. After filtering is complete, a set of callbacks called "filter mutators" run for every filter request. - -When the `filter` method on a `Filterer` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Filter/AbstractFilterer.php#L50-L93)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Filterer` class's `getQuery()` method. -2. We loop through all `filter[KEY] = VALUE` query params. For each of these, any `Filter`s registered to the model whose `getFilterKey()` method matches the query param `KEY` is applied. `Filter`s can be negated by providing the query param as `filter[-KEY] = VALUE`. Whether or not a `Filter` is negated is passed to it as an argument: implementing negation is up to the `Filter`s. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "filter mutators" are applied. These are callbacks that receive the filter state (a wrapper around the query builder and current user) and filter criteria, and perform some arbitrary changes. All "filter mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Filtering for an Existing Model - -Let's say you've added a `country` column to the User model, and would like to filter users by country. We'll need to define a custom `Filter`: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -Note that `FilterState` is a wrapper around the Eloquent builder's underlying Query builder and the current user. - -Also, let's pretend that for some reason, we want to omit any users that have a different country from the current user on ANY filter. We can use a "filter mutator" for this: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -Now, all we need to do is register these via the Filter extender: - -```php - // Other extenders - (new Extend\Filter(UserFilterer::class)) - ->addFilter(CountryFilter::class) - ->addFilterMutator(OnlySameCountryFilterMutator::class), - // Other extenders -``` - -### Add Filtering to a New Model - -To filter a model that doesn't support filtering, you'll need to create a subclass of `Flarum/Filter/AbstractFilterer` for that model. For an example, see core's [UserFilterer](https://github.com/flarum/framework/blob/main/framework/core/src/User/Filter/UserFilterer.php). - -Then, you'll need to use that filterer in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -## Searching - -Searching constrains queries by applying `Gambit`s, which are classes that implement `Flarum\Search\GambitInterface`, based on the `filter[q]` query param. After searching is complete, a set of callbacks called "search mutators" run for every search request. - -When the `search` method on a `Searcher` class is called, the following process takes place ([relevant code](https://github.com/flarum/framework/blob/main/framework/core/src/Search/AbstractSearcher.php#L55-L79)): - -1. An Eloquent query builder instance for the model is obtained. This is provided by the per-model `{MODEL_NAME}Searcher` class's `getQuery()` method. -2. The `filter[q]` param is split by spaces into "tokens". Each token is matched against the model's registered `Gambit`s (each gambit has a `match` method). For any tokens that match a gambit, that gambit is applied, and the token is removed from the query string. Once all regular `Gambit`s have ran, all remaining unmatched tokens are passed to the model's `FullTextGambit`, which implements the actual searching logic. For example if searching discussions, in the `filter[q]` string `'author:1 hello is:hidden' world`, `author:1` and `is:hidden` would get matched by core's Author and Hidden gambits, and `'hello world'` (the remaining tokens) would be passed to the `DiscussionFulltextGambit`. -3. [Sorting](https://jsonapi.org/format/#fetching-sorting), [pagination](https://jsonapi.org/format/#fetching-pagination) are applied. -4. Any "search mutators" are applied. These are callbacks that receive the search state (a wrapper around the query builder and current user) and criteria, and perform some arbitrary changes. All "search mutators" run on any request. -5. We calculate if there are additional matching model instances beyond the query set we're returning for this request, and return this value along with the actual model data, wrapped in a `Flarum\Query\QueryResults` object. - -### Modify Searching for an Existing Model - -Let's reuse the "country" examples we used above, and see how we'd implement the same things for searching: - -```php -getQuery()->where('users.country', $negate ? '!=' : '=', $country); - } -} -``` - -:::warning No Spaces in Gambit Patterns! - -Flarum splits the `filter[q]` string into tokens by splitting it at spaces. This means that your custom gambits can NOT use spaces as part of their pattern. - -::: - -:::tip AbstractRegexGambit - -All a gambit needs to do is implement `Flarum\Search\GambitInterface`, which receives the search state and a token. It should return if this gambit applies for the given token, and if so, make whatever mutations are necessary to the query builder accessible as `$searchState->getQuery()`. - -However, for most gambits, the `AbstractRegexGambit` abstract class (used above) should be used as a base class. This makes it a lot simpler to match and apply gambits. - -::: - -Similarly, the search mutator we need is almost identical to the filter mutator from before: - -```php -getQuery()->where('users.country', $filterState->getActor()->country); - } -} -``` - -We can register these via the `SimpleFlarumSearch` extender (in the future, the `Search` extender will be used for registering custom search drivers): - -```php - // Other extenders - (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(CountryGambit::class) - ->addSearchMutator(OnlySameCountrySearchMutator::class), - // Other extenders -``` - -### Add Searching to a New Model - -To support searching for a model, you'll need to create a subclass of `Flarum/Search/AbstractSearcher` for that model. For an example, see core's [UserSearcher](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/UserSearcher.php). - -Then, you'll need to use that searcher in your model's `List` controller. For an example, see core's [ListUsersController](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Controller/ListUsersController.php#L93-L98). - -Every searcher **must** have a fulltext gambit (the logic that actually does the searching). Otherwise, it won't be booted by Flarum, and you'll get an error. See core's [FulltextGambit for users](https://github.com/flarum/framework/blob/main/framework/core/src/User/Search/Gambit/FulltextGambit.php) for an example. You can set (or override) the full text gambit for a searcher via the `SimpleFlarumSearch` extender's `setFullTextGambit()` method. - -### Search Drivers - -Coming soon! - -## Frontend Tools - -Coming soon! diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/service-provider.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/service-provider.md deleted file mode 100644 index 07e3e4d91..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/service-provider.md +++ /dev/null @@ -1,65 +0,0 @@ -# Service Provider - -As noted throughout this documentation, Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection. [Service Providers](https://laravel.com/docs/8.x/providers) allow low-level configuration and modification of the Flarum backend. The most common use case for service providers is to create, modify, or replace container bindings. That being said, service providers allow you full access to run whatever logic you need during application boot with access to the container. - -:::caution Advanced Use Only!!! - -Unlike with other extenders, the Service Provider layer is NOT use-case driven, and is NOT considered public API. It is subject to change at any time, without notice or deprecation. This should only be used if you know what you're doing, and the other extenders don't satisfy your use case. - -::: - -## Flarum Boot Process - -To understand service providers, you must first understand the order in which Flarum boots. Most of this happens in [Flarum\Foundation\InstalledSite](https://github.com/flarum/framework/blob/main/framework/core/src/Foundation/InstalledSite.php) - -1. The container and application are initialized, and essential bindings (config, environment, logger) are registered -2. The `register` methods of all core service providers are run. -3. The `extend` methods of all extenders used by all enabled extensions are run. -4. The `extend` methods of all extenders used in the Flarum site's local `extend.php` are run. -5. The `boot` methods of all core service providers are run. - -## Custom Service Providers - -A custom service provider should extend `Flarum\Foundation\AbstractServiceProvider`, and can have a `boot` and a `register` method. For example: - -```php -container->resolving(SomeClass::class, function ($container) { - return new SomeClass($container->make('some.binding')); - }); - } - - public function boot(Container $container) - { - // custom logic here - } -} -``` - -The `register` method will run during step (3) above, and the `boot` method will run during step (5) above. In the `register` method, the container is available via `$this->container`. In the `boot` method, the container (or any other arguments), should be injected via typehinted method arguments. - -Flarum does not currently support Laravel Octane, but some [best practices](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane), like using the `$container` argument inside `bind`, `singleton`, and `resolving` callbacks instead of `$this->container` should be used. See the [Octane documentation](https://laravel.com/docs/8.x/octane#dependency-injection-and-octane) for more information. - -To actually register your custom service provider, you can use the `ServiceProvider` extender in `extend.php`: - -```php -register(CustomServiceProvider::class), - // Other extenders -]; -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/settings.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/settings.md deleted file mode 100644 index ffefdcde5..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/settings.md +++ /dev/null @@ -1,90 +0,0 @@ -# Settings - -At some point while making an extension, you might want to read some of the forum's settings or store certain settings specific to your extension. Thankfully, Flarum makes this very easy. - -## The Settings Repository - -Reading or changing settings can be done using an implementation of the `SettingsRepositoryInterface`. Because Flarum uses [Laravel's service container](https://laravel.com/docs/8.x/container) (or IoC container) for dependency injection, you don't need to worry about where to obtain such a repository, or how to instantiate one. Instead, you can rely on the container to instantiate your class and inject the correct dependencies. - -```php -settings = $settings; - } -} -``` - -Great! Now the `SettingsRepositoryInterface` is available through `$this->settings` to our class. - -### Reading Settings - -To read settings, all we have to do is use the repository's `get()` function: - -`$this->settings->get('forum_title')` - -The `get()` function accepts two arguments: - -1. The name of the setting you are trying to read. -2. (Optional) A default value if no value has been stored for such a setting. By default, this will be `null`. - -### Storing Settings - -Storing settings ist just as easy, use the `set()` function: - -`$this->settings->set('forum_title', 'Super Awesome Forum')` - -The `set` function also accepts two arguments: - -1. The name of the setting you are trying to change. -2. The value you want to store for this setting. - -### Other Functions - -The `all()` function returns an array of all known settings. - -The `delete($name)` function lets you remove a named setting. - -## Settings in the Frontend - -### Editing Settings - -To learn more about adding settings through the admin dashboard, see the [relevant documentation](admin.md). -### Accessing Settings - -All settings are available in the `admin` frontend via the `app.data.settings` global. However, this is not done in the `forum` frontend, as anyone can access it, and you wouldn't want to leak all your settings! (Seriously, that could be a very problematic data breach). - -Instead, if we want to use settings in the `forum` frontend, we'll need to serialize them and send them alongside the initial forum data payload. - -This can be done via the `Settings` extender. For example: - -**extend.php** - -```php -use Flarum\Extend; - -return [ - (new Extend\Settings) - ->serializeToForum('myCoolSetting', 'my.cool.setting.key') - ->serializeToForum('myCoolSettingModified', 'my.cool.setting.key', function ($retrievedValue) { - // This third argument is optional, and allows us to pass the retrieved setting through some custom logic. - // In this example, we'll append a string to it. - - return "My Cool Setting: $retrievedValue"; - }, "default value!"), -] -``` - -Now, the `my.cool.setting.key` setting will be accessible in the frontend as `app.forum.attribute("myCoolSetting")`, and our modified value will be accessible via `app.forum.attribute("myCoolSettingModified")`. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/slugging.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/slugging.md deleted file mode 100644 index 3dc39416b..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/slugging.md +++ /dev/null @@ -1 +0,0 @@ -# Model Slugging diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/start.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/start.md deleted file mode 100644 index ade6691da..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/start.md +++ /dev/null @@ -1,153 +0,0 @@ -# 开始 - -想打造一个 Flarum 扩展? 来对地方了! 本文档将带您了解一些基本概念,之后您将从头开始打造您的第一个 Flarum 扩展。 - -## 架构 - -为了理解如何扩展 Flarum,我们需要先明白 Flarum 是如何构建的。 - -要知道,Flarum 使用了一些 _现代_ 语言和工具。 如果您以前只构建过 WordPress 的插件,您可能会觉得有点力不从心。 没有关系 —— 这是一个学习新事物和扩展技能的好机会。 不过我们建议您在开始之前先熟悉一下下面描述的技术。 - -Flarum 的构成有三层: - -* 第一层,**后端**。 后端用 [面向对象的 PHP 语言](https://laracasts.com/series/object-oriented-bootcamp-in-php)编写,并通过 [Composer](https://getcomposer.org/) 使用了大量的 [Laravel](https://laravel.com/) 组件和其他资源包。 您还需要熟悉 [依赖项注入](https://laravel.com/docs/6.x/container) 的概念,它在整个后端中都有使用。 - -* 第二层,后端开放的一个 **公共 API**,允许前端客户端与论坛数据进行交互。 该接口根据 [JSON:API 规范](https://jsonapi.org/) 构建。 - -* 第三层,默认的 Web 界面,俗称 **前端**。 这是一个使用 API 的 [单页应用](https://en.wikipedia.org/wiki/Single-page_application), 由一个简单的类 React 框架 [Mithril.js](https://mithril.js.org/) 构建。 - -扩展程序通常需要与这三层都进行交互才能有所为。 例如,如果您想创建一个可以在用户资料中添加新属性的扩展,则需要在 **后端** 中添加相应的数据库结构,通过 **公共 API** 调用该数据,然后在 **前端** 显示这个数据并允许用户修改它。 - -那…… 如何扩展这些层呢? - -## 扩展器 - -为了扩展 Flarum,我们需要用到 **扩展器**,让我们先了解一下它的概念。 扩展器其实就是 *声明性* 对象,您可以通过简单的方式描述想要实现的内容(比如向论坛添加新的路由,或者在创建新主题帖时执行某些代码)。 - -每个扩展器都是不同的, 但是大体上长这样: - -```php -// 注册要交付给前端的 JavaScript 和 CSS 文件 -(new Extend\Frontend('forum')) - ->js(__DIR__.'/forum-scripts.js') - ->css(__DIR__.'/forum-styles.css') -``` - -您首先创建一个扩展器实例,然后调用方法以对其进行进一步配置。 所有方法都将返回结果到该扩展器本身,因此您只需要通过链式方法调用就可以实现您的整个配置。 - -为了保持一致,我们在后端(PHP)和前端(JavaScript)都使用了扩展器的概念。 您在扩展中做的 _每一件事_ 都应当通过扩展器来完成,因为扩展器是我们给予您的 **保证** —— 保证 Flarum 小版本更新绝对不破坏您的扩展。 - -所有 Flarum 核心提供的可用扩展器都可以在 [`Extend` 命名空间](https://github.com/flarum/framework/blob/main/framework/core/src/Extend)[(PHP API 文档)](https://api.docs.flarum.org/php/master/flarum/extend)中找到。扩展程序亦有可能提供他们[自有的扩展器](extensibility.md#custom-extenders)。 - -## 世界你好 - -想亲眼看看一个扩展器的执行? Flarum 安装根目录中的 `extend.php` 是为您的站点注册扩展器的最简单的途径,它应该会返回一个扩展器对象的数组。 它应该会返回一个扩展器对象的数组。 打开该文件并添加以下内容: - -```php -content(function (Document $document) { - $document->head[] = ''; - }) -]; -``` - -现在,访问您的论坛,接受真挚的问候(尽管很突兀)。 👋 - -对于简单的网站定制,比如添加一些自定义的 CSS 或 JavaScript,或者整合您网站的认证系统,论坛根目录下的 `extend.php` 文件是非常好用的。 但是在某些时候,您的自定义可能会超出它的限制范围。 或者您想建立一个扩展程序,并分享到社区。 那么是时候建立一个扩展程序了! - -## 打包扩展程序 - -[Composer](https://getcomposer.org) 是 PHP 的一个依赖管理工具。 它允许应用程序轻松地拉取外部代码库,并保持他们是最新的,以便及时应用安全补丁和错误修复。 - -如上所述,每个 Flarum 扩展程序也是一个 Composer 包。 这意味着一个人可以「require」某个扩展程序,Composer 会把它拉取给 Flarum,同时使扩展程序保持最新版本。 Nice! - -在开发过程中,您可以在本地处理您的扩展程序,并建立一个 [Composer 本地路径仓库](https://getcomposer.org/doc/05-repositories.md#path) 以安装您的本地副本。 在 Flarum 安装根目录下创建一个新的 `packages` 文件夹,然后运行这个命令来告诉 Composer 它可以在这里找到软件包: - -```bash -composer config repositories.0 path "packages/*" -``` - -现在,来构建我们的第一个扩展程序吧。 在 `packages` 里面为您的扩展程序建立一个新的文件夹,命名为 `hello-world`。 我们会在里面放两个文件:`extend.php` 和 `composer.json`。 这些文件是扩展程序的心脏和灵魂。 - -### extend.php - -扩展程序的 `extend.php` 跟您站点根目录下的那个是一模一样的。 它会返回一个扩展器对象数组,并告诉 Flarum 您想要做什么。 现在,将前面我们操作的 `Frontend` 扩展器移动到这里。 - -### composer.json - -我们需要告诉 Composer 一些您的软件包的信息,创建 `composer.json` 文件已写入这些信息: - -```json -{ - "name": "acme/flarum-hello-world", - "description": "向世界问好!", - "type": "flarum-extension", - "require": { - "flarum/core": ">=0.1.0-beta.16 <=0.1.0" - }, - "autoload": { - "psr-4": {"Acme\\HelloWorld\\": "src/"} - }, - "extra": { - "flarum-extension": { - "title": "Hello World", - "icon": { - "name": "fas fa-smile", - "backgroundColor": "#238c59", - "color": "#fff" - } - } - } -} -``` - -* **name**,名字。 是 Composer 软件包的名字。 格式是 `供应商/包名`。 - * 您需要起一个全世界独一无二的供应商名,或者可以直接沿用 GitHub 的用户名。 以本教程为例,这里我们假设 `acme` 是您的供应商名。 - * 您应该给包 `包名` 加上 `flarum-` 前缀,以指明此包是专门给 Flarum 用的。 - -* **description**,描述。 用一句话描述这个扩展程序的作用是什么。 - -* **type**,类型。 只能是 `flarum-extension`。 这确保了当别人「require」您的扩展程序时,能被正确识别。 - -* **require**,依赖。 描述您的扩展程序自身的依赖关系。 - * 您需要在这里指定您的扩展程序所兼容的 Flarum 版本。 - * 这里也是列出您的代码需要使用的 Composer 外部工具库的地方。 - -* **autoload**,定义一个从命名空间到目录的映射,告诉 Composer 在哪里可以找到扩展程序的类。 此处的命名空间应以 驼峰写法 反映扩展程序的供应商和包名. - -* **extra.flarum-extension**,包含一些 Flarum 特有的信息,比如您扩展程序在论坛的显示名称以及图标。 - * **title** 您的扩展程序的显示名称。 - * **icon** 是一个定义您扩展程序图标的对象。 **name** 属性是 [Font Awesome 图标名](https://fontawesome.com/icons)。 剩下的都被用作图标的 `style` 属性。 - -请参阅 [composer.json 模式](https://getcomposer.org/doc/04-schema.md) 文档,以获取有关可以添加到 `composer.json` 中的其他属性的信息。 - -:::info [Flarum CLI](https://github.com/flarum/cli) - -使用 [FoF 扩展生成器](https://github.com/FriendsOfFlarum/extension-generator) 自动创建扩展程序的基架。 -```bash -$ flarum-cli init -``` - -::: - -### 安装您的扩展 - -最后一步就是安装您的扩展。 进入 Flarum 安装根目录,执行以下命令: - -```bash -composer require acme/flarum-hello-world *@dev -``` - -执行完成后,前往您论坛后台管理面板启用插件,最后回到您的论坛。 - -*啾,咻,铮铛* - -哇! 你好,扩展! - -很好,我们取得了一些进展。 我们学习了如何设置扩展和使用扩展,打开了新世界的大门。 继续阅读以了解如何扩展 Flarum 的前端。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md deleted file mode 100644 index 28e6c4aa7..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/static-code-analysis.md +++ /dev/null @@ -1,86 +0,0 @@ -# Static Code Analysis - -Static code analysis is the process of analyzing the source code against a set of rules to find bugs, code smells, and security vulnerabilities. This is a great way to improve the quality of your code and to find potential issues before they are deployed to production. An example is validating the typings of a function to ensure that the function is called with the correct arguments. - -Flarum provides a static code analysis package based on [PHPStan](https://phpstan.org/) that can be added to your extension. In this guide, we will show you how to add the package to your extension and how to run the analysis. - -## Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update the infrastructure for phpstan to your code: - -```bash -$ flarum-cli infra phpstan -``` - -::: - -First you need to require the `flarum/phpstan` package in your extension. You can do this by running the following command in the root of our extension: - -```bash -composer require --dev flarum/phpstan:^1.0 -``` - -Next, you need to create a `phpstan.neon` file in the root of your extension. This file contains [the configuration for PHPStan](https://phpstan.org/config-reference). You can copy the following configuration into the file: - -```neon -includes: - - vendor/flarum/phpstan/extension.neon - -parameters: - # The level will be increased in Flarum 2.0 - level: 5 - paths: - - src - - extend.php - excludePaths: - - *.blade.php - checkMissingIterableValueType: false - databaseMigrationsPath: ['migrations'] -``` - -Finally, you need to add the following script to your `composer.json` file: - -```json -{ - "scripts": { - "analyse:phpstan": "phpstan analyse", - "clear-cache:phpstan": "phpstan clear-result-cache" - }, - "scripts-descriptions": { - "analyse:phpstan": "Run static analysis" - } -} -``` - -## Running the analysis - -To run the analysis, you can run the following command in the root of your extension: - -```bash -composer analyse:phpstan -``` - -If you want to clear the cache before running the analysis, you can run the following command: - -```bash -composer clear-cache:phpstan && composer analyse:phpstan -``` - -## GitHub Actions - -You can also run the analysis using GitHub Actions. Checkout the page on [GitHub Actions](github-actions.md) for more information. - -## Tips - -### Extended model attribute types - -PHPStan needs to be able to determine the type of an attribute added to an existing model. To do this you can use the `Extend\Model(...)->cast(...)` method. - -For example, if your extension were to add a `is_cool` attribute to the `User` model, you can use [attribute casting](https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting) to explicitly define the attribute as boolean. The `flarum/phpstan` package will automatically detect this and communicate it to PHPStan. - -```php -(new Extend\Model(User::class)) - ->cast('is_cool', 'bool'), -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/testing.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/testing.md deleted file mode 100644 index b1342ede0..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/testing.md +++ /dev/null @@ -1,565 +0,0 @@ -# 测试 - -Automated testing ensures that your extension performs as you expect it to, helps avoid introducing new bugs or regressions, and saves time on manual testing. Flarum currently provides tooling for automated backend unit and integration tests, and we plan to release support for frontend unit testing and E2E testing in the future. - -## Backend Tests - -The `flarum/testing` library is used by core and some bundled extensions for automated unit and integration tests. It is essentially a collection of utils that allow testing Flarum core and extensions with PHPUnit. - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update backend testing infrastructure to your code: - -```bash -$ flarum-cli infra backendTesting -``` - -::: - -```bash -composer require --dev flarum/testing:^1.0 -``` - -Then, you will need to set up a file structure for tests, and add PHPUnit configuration: - -``` -tests -├── fixtures (put any files needed by your tests here (blade templates, images, etc)) -├── integration -│ ├── setup.php (code below) -│ └── PUT INTEGRATION TESTS HERE (organizing into folder is generally a good idea) -├── unit -│ ├── PUT UNIT TESTS HERE -├── phpunit.integration.xml (code below) -└── phpunit.unit.xml (code below) -``` - -#### phpunit.integration.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for integration tests. You can tweak this as needed, but keep `backupGlobals`, `backupStaticAttributes`, and `processIsolation` unchanged. - -```xml - - - - - - - ./integration - - - -``` - -#### phpunit.unit.xml - -This is just an example [phpunit config file](https://phpunit.readthedocs.io/en/9.3/configuration.html) for unit tests. You can tweak this as needed. - -```xml - - - - - - - ./unit - - - - - - -``` - -#### setup.php - -This script will be run to set up a testing database / file structure. - -```php -run(); -``` - -#### composer.json Modifications - -We will also want to add scripts to our `composer.json`, so that we can run our test suite via `composer test`. Add some variant of the following to your `composer.json`: - -```json -"scripts": { - "test": [ - "@test:unit", - "@test:integration" - ], - "test:unit": "phpunit -c tests/phpunit.unit.xml", - "test:integration": "phpunit -c tests/phpunit.integration.xml", - "test:setup": "@php tests/integration/setup.php" -}, -"scripts-descriptions": { - "test": "Runs all tests.", - "test:unit": "Runs all unit tests.", - "test:integration": "Runs all integration tests.", - "test:setup": "Sets up a database for use with integration tests. Execute this only once." -} -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - ---- - -Now that we have everything in place, we need to set up our testing site for integration tests. For this, we will need a MySQL or MariaDb instance, and a place to store testing files. - -Testing database information is configured via the `DB_HOST` (defaults to `localhost`), `DB_PORT` (defaults to `3306`), `DB_DATABASE` (defaults to `flarum_test`), `DB_USERNAME` (defaults to `root`), `DB_PASSWORD` (defaults to `root`), and `DB_PREFIX` (defaults to `''`) environmental variables. The testing tmp directory path is configured via the `FLARUM_TEST_TMP_DIR_LOCAL` or `FLARUM_TEST_TMP_DIR` environmental variables, with the former taking precedence over the latter. If neither are provided, a `tmp` directory will be created in the `vendor` folder of your extension's local install. - -Now that we've provided the needed information, all we need to do is run `composer test:setup` in our extension's root directory, and we have our testing environment ready to go! - -Since [(almost)](https://github.com/flarum/framework/blob/4ecd9a9b2ff0e9ba42bb158f3f83bb3ddfc10853/framework/core/tests/integration/api/discussions/ListWithFulltextSearchTest.php#L29-L45) all database operations in integration tests are run in transactions, developers working on multiple extensions will generally find it more convenient to use one shared database and tmp directory for testing all their extensions. To do this, set the database config and `FLARUM_TEST_TMP_DIR` environmental variables in your `.bashrc` or `.bash_profile` to the path you want to use, and run the setup script for any one extension (you'll still want to include the setup file in every repo for CI testing via GitHub Actions). You should then be good to go for any Flarum extension (or core). - -### Using Integration Tests - -Flarum's integration test utils are contained in the `Flarum\Testing\integration\TestCase` class. It: - -- Boots (and makes available) an instance of the Flarum application. -- Allows pre-populating the database, enabling extensions, and adding extenders. -- Runs all database changes in transactions, so your test database retains the default post-installation state. -- Allows sending requests through the middleware stack to test HTTP endpoints. - -Your testcase classes should extend this class. - -#### Test Case Setup - -There are several important utilities available for your test cases: - -- The `setting($key, $value)` method allows you to override settings before the app has booted. This is useful if your boot process has logic depending on settings (e.g. which driver to use for some system). -- Similarly, the `config($key, $value)` method allows you to override config.php values before the app has booted. You can use dot-delimited keys to set deep-nested values in the config array. -- The `extension($extensionId)` method will take Flarum IDs of extensions to enable as arguments. Your extension should always call this with your extension's ID at the start of test cases, unless the goal of the test case in question is to confirm some behavior present without your extension, and compare that to behavior when your extension is enabled. If your extension is dependent on other extensions, make sure they are included in the composer.json `require` field (or `require-dev` for [optional dependencies](extending-extensions.md)), and also list their composer package names when calling `extension()`. Note that you must list them in a valid order. -- The `extend($extender)` method takes instances of extenders as arguments, and is useful for testing extenders introduced by your extension for other extensions to use. -- The `prepareDatabase()` method allow you to pre-populate your database. This could include adding users, discussions, posts, configuring permissions, etc. Its argument is an associative array that maps table names to arrays of [record arrays](https://laravel.com/docs/8.x/queries#insert-statements). - -If your test case needs users beyond the default admin user, you can use the `$this->normalUser()` method of the `Flarum\Testing\integration\RetrievesAuthorizedUsers` trait. - -:::warning - -The `TestCase` class will boot a Flarum instance the first time its `app()` method is called. Any uses of `prepareDatabase`, `extend`, or `extension` after this happens will have no effect. Make sure you have done all the setup you need in your test case before calling `app()`, or `database()`, `server()`, or `send()`, which call `app()` implicitly. If you need to make database modifications after the app has booted, you can use the regular Eloquent save method, or the `Illuminate\Database\ConnectionInterface` instance obtained via calling the `database()` method. - -::: - -Of course, since this is all based on PHPUnit, you can use the `setUp()` methods of your test classes for common setup tasks. - -For example: - -```php -setting('my.custom.setting', true); - - // Let's assume our extension depends on tags. - // Note that tags will need to be in your extension's composer.json's `require-dev`. - // Also, make sure you include the ID of the extension currently being tested, unless you're - // testing the baseline without your extension. - $this->extension('flarum-tags', 'my-cool-extension'); - - // Note that this input isn't validated: make sure you're populating with valid, representative data. - $this->prepareDatabase([ - 'users' => [ - $this->normalUser() // Available for convenience. - ], - 'discussions' => [ - ['id' => 1, 'title' => 'some title', 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 1] - ], - 'posts' => [ - ['id' => 1, 'number' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now(), 'user_id' => 1, 'type' => 'comment', 'content' => '

something

'] - ] - ]); - - // Most test cases won't need to test extenders, but if you want to, you can. - $this->extend((new CoolExtensionExtender)->doSomething('hello world')); - } - - /** - * @test - */ - public function some_phpunit_test_case() - { - // ... - } - - // ... -} -``` - -#### Sending Requests - -A common application of automated testing is pinging various HTTP endpoints with various data, authenticated as different users. You can use this to ensure that: - -- Users can't access content they're not supported to access. -- Permission-based create/edit/delete operations perform as expected. -- The type and schema of data returned is correct. -- Some desired side effect is applied when pinging an API. -- The basic API operations needed by your extension aren't erroring, and don't break when you make changes. - -`TestCase` provides several utilities: - -- The `request()` method constructs a `Psr\Http\Message\ServerRequestInterface` implementing object from a path, a method, and some options, which can be used for authentication, attaching cookies, or configuring the JSON request body. See the [method docblock](https://github.com/flarum/testing/blob/main/src/integration/TestCase.php) for more information on available options. -- Once you've created a request instance, you can send it (and get a response object back) via the `send()` method. - -For example: - -```php -send( - $this->request('GET', '/api/users', ['authenticatedAs' => 1]) - ->withQueryParams(['filter' => ['q' => 'john group:1'], 'sort' => 'username']) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * @test - */ - public function can_create_user() - { - $response = $this->send( - $this->request( - 'POST', - '/api/users', - [ - 'authenticatedAs' => 1, - 'json' => [ - 'data' => [ - 'attributes' => [ - 'username' => 'test', - 'password' => 'too-obscure', - 'email' => 'test@machine.local' - ] - ] - ] - ] - ) - ); - - $this->assertEquals(200, $response->getStatusCode()); - } - - // ... -} -``` - -:::caution - -If you want to send query parameters in a GET request, you can't include them in the path; you'll need to add them afterwards with the `withQueryParams` method. - -::: - -:::caution - -This is an extreme edge case, but note that MySQL does not update the fulltext index in transactions, so the standard approach won't work if you're trying to test a modified fulltext query. See [core's approach](https://github.com/flarum/framework/blob/main/framework/core/tests/integration/extenders/SimpleFlarumSearchTest.php) for an example of a workaround. - -::: - -#### Console Tests - -If you want to test custom console commands, you can extend `Flarum\Testing\integration\ConsoleTestCase` (which itself extends the regular `Flarum\Testing\integration\TestCase`). It provides 2 useful methods: - -- `$this->console()` returns an instance of `Symfony\Component\Console\Application` -- `$this->runCommand()` takes an array that will be wrapped in `Symfony\Component\Console\Input\ArrayInput`, and run. See the [Symfony code docblock](https://github.com/symfony/console/blob/5.x/Input/ArrayInput.php#L22) for more information. - -For example: - -```php - 'some:command', // The command name, equivalent of `php flarum some:command` - 'foo' => 'bar', // arguments - '--lorem' => 'ipsum' // options - ]; - - $this->assertEquals('Some Output.', $this->runCommand($input)); - } -} -``` - -### Using Unit Tests - -Unit testing in Flarum uses [PHPUnit](https://phpunit.de/getting-started/phpunit-9.html) and so unit testing in flarum is much like any other PHP application. You can find [general tutorials on testing](https://www.youtube.com/watch?v=9-X_b_fxmRM) if you're also new to php. - -When writing unit tests in Flarum, here are some helpful tips. - -#### Mocking Flarum Services - -Unlike the running app, or even integration tests, there is no app/container/etc to inject service instances into our classes. Now all the useful settings, or helpers your extension use require a _mock_ . We want to limit mocking to just the key services, supporting only the minimum interactions needed to test the contract of our individual functions. - -```php - public function setUp(): void - { - parent::setUp(); - // example - if our setting needs settings, we can mock the settings repository - $settingsRepo = m::mock(SettingsRepositoryInterface::class); - // and then control specific return values for each setting key - $settingsRepo->shouldReceive('get')->with('some-plugin-key')->andReturn('some-value-useful-for-testing'); - // construct your class under test, passing mocked services as needed - $this->serializer = new YourClassUnderTest($settingsRepo); - } -``` - -Some aspects require more mocks. If you're validating authorization interactions for instance you might need to mock your users `User::class` and the request's method that provides them as well! - -``` - $this->actor = m::mock(User::class); - $request = m::mock(Request::class)->makePartial(); - $request->shouldReceive('getAttribute->getActor')->andReturn($this->actor); - $this->actor->shouldReceive('SOME PERMISSION')->andReturn(true/false); -``` - -NOTE: If you find your extension needs _lots and lots_ of mocks, or mocks that feel unrelated, it might be an opportunity to simplify your code, perhaps moving key logic into their own smaller functions (that dont require mocks). - -## Frontend Tests - -### Setup - -:::tip [Flarum CLI](https://github.com/flarum/cli) - -You can use the CLI to automatically add and update frontend testing infrastructure to your code: - -```bash -$ flarum-cli infra frontendTesting -``` - -::: - -First, you need to install the Jest config dev dependency: - -```bash -$ yarn add --dev @flarum/jest-config -``` - -Then, add the following to your `package.json`: - -```json -{ - "type": "module", - "scripts": { - ..., - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" - } -} -``` - -Rename `webpack.config.js` to `webpack.config.cjs`. This is necessary because Jest doesn't support ESM yet. - -Create a `jest.config.cjs` file in the root of your extension: - -```js -module.exports = require('@flarum/jest-config')(); -``` - -If you are using TypeScript, create tsconfig.test.json with the following content: - -```json -{ - "extends": "./tsconfig.json", - "include": ["tests/**/*"], - "files": ["../../../node_modules/@flarum/jest-config/shims.d.ts"] -} -``` - -Then, you will need to set up a file structure for tests: - -``` -js -├── dist -├── src -├── tests -│ ├── unit -│ │ └── functionTest.test.js -│ ├── integration -│ │ └── componentTest.test.js -├── package.json -├── tsconfig.json -├── tsconfig.test.json -├── jest.config.cjs -└── webpack.config.cjs -``` - -#### GitHub Testing Workflow - -To run tests on every commit and pull request, check out the [GitHub Actions](github-actions.md) page. - -### Using Unit Tests - -Like any other JS project, you can use Jest to write unit tests for your frontend code. Checkout the [Jest docs](https://jestjs.io/docs/using-matchers) for more information on how to write tests. - -Here's a simple example of a unit test fo core's `abbreviateNumber` function: - -```ts -import abbreviateNumber from '../../../../src/common/utils/abbreviateNumber'; - -test('does not change small numbers', () => { - expect(abbreviateNumber(1)).toBe('1'); -}); - -test('abbreviates large numbers', () => { - expect(abbreviateNumber(1000000)).toBe('1M'); - expect(abbreviateNumber(100500)).toBe('100.5K'); -}); - -test('abbreviates large numbers with decimal places', () => { - expect(abbreviateNumber(100500)).toBe('100.5K'); - expect(abbreviateNumber(13234)).toBe('13.2K'); -}); -``` - -### Using Integration Tests - -Integration tests are used to test the components of your frontend code and the interaction between different components. For example, you might test that a page component renders the correct content based on certain parameters. - -Here's a simple example of an integration test for core's `Alert` component: - -```ts -import Alert from '../../../../src/common/components/Alert'; -import m from 'mithril'; -import mq from 'mithril-query'; -import { jest } from '@jest/globals'; - -describe('Alert displays as expected', () => { - it('should display alert messages with an icon', () => { - const alert = mq(m(Alert, { type: 'error' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toHaveElement('i.icon'); - }); - - it('should display alert messages with a custom icon when using a title', () => { - const alert = mq(Alert, { type: 'error', icon: 'fas fa-users', title: 'Woops..' }); - expect(alert).toContainRaw('Woops..'); - expect(alert).toHaveElement('i.fas.fa-users'); - }); - - it('should display alert messages with a title', () => { - const alert = mq(m(Alert, { type: 'error', title: 'Error Title' }, 'Shoot!')); - expect(alert).toContainRaw('Shoot!'); - expect(alert).toContainRaw('Error Title'); - expect(alert).toHaveElement('.Alert-title'); - }); - - it('should display alert messages with custom controls', () => { - const alert = mq(Alert, { type: 'error', controls: [m('button', { className: 'Button--test' }, 'Click me!')] }); - expect(alert).toHaveElement('button.Button--test'); - }); -}); - -describe('Alert is dismissible', () => { - it('should show dismiss button', function () { - const alert = mq(m(Alert, { dismissible: true }, 'Shoot!')); - expect(alert).toHaveElement('button.Alert-dismiss'); - }); - - it('should call ondismiss when dismiss button is clicked', function () { - const ondismiss = jest.fn(); - const alert = mq(Alert, { dismissible: true, ondismiss }); - alert.click('.Alert-dismiss'); - expect(ondismiss).toHaveBeenCalled(); - }); - - it('should not be dismissible if not chosen', function () { - const alert = mq(Alert, { type: 'error', dismissible: false }); - expect(alert).not.toHaveElement('button.Alert-dismiss'); - }); -}); -``` - -#### Methods - -These are the custom methods that are available for mithril component tests: -* **`toHaveElement(selector)`** - Checks if the component has an element that matches the given selector. -* **`toContainRaw(content)`** - Checks if the component HTML contains the given content. - -To negate any of these methods, simply prefix them with `not.`. For example, `expect(alert).not.toHaveElement('button.Alert-dismiss');`. For more information, check out the [Jest docs](https://jestjs.io/docs/using-matchers). For example you may need to check how to [mock functions](https://jestjs.io/docs/mock-functions), or how to use `beforeEach` and `afterEach` to set up and tear down tests. - - - -## E2E Tests - -Coming Soon! diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/theme.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/theme.md deleted file mode 100644 index 7890be47f..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/theme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Themes - -Flarum "themes" are just extensions. Typically, you'll want to use the `Frontend` extender to register custom [Less](https://lesscss.org/#overview) and JS. Of course, you can use other extenders too: for example, you might want to support settings to allow configuring your theme. - -You can indicate that your extension is a theme by setting the "extra.flarum-extension.category" key to "theme". For example: - -```json -{ - // other fields - "extra": { - "flarum-extension": { - "category": "theme" - } - } - // other fields -} -``` - -All this will do is show your extension in the "theme" section in the admin dashboard extension list. - -## Less Variable Customization - -You can define new Less variables in your extension's Less files. There currently isn't an extender to modify Less variable values in the PHP layer, but this is planned for future releases. - -## Switching Between Themes - -Flarum doesn't currently have a comprehensive system that would support switching between themes. This is planned for future releases. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_0.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_0.md deleted file mode 100644 index 7ba6adcbf..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_0.md +++ /dev/null @@ -1,257 +0,0 @@ -# Updating For 1.0 - -Flarum version 1.0 is the long-awaited stable release! This release brings a number of refactors, cleanup, and small improvements that should make your Flarum experience just a bit better! - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Full Stack - -### Translations and transChoice - -#### Background - -Historically, Flarum has used Symfony for backend translations, and a port for frontend translations to keep format consistent. There are a few limitations to this approach though: - -- Developers need to decide between using `trans` or `transChoice` for pluralization -- The pluralization format is proprietary to Symfony -- We have to maintain the JS port ourselves -- Keys for values provided to backend translations need to be wrapped in curly braces. (e.g. `$this->translator->trans('some.translation', ['{username}' => 'Some Username!'])`). -- There's no support for complex applications (nested pluralization, non-number-based selection) -- As a result of the previous point, genderization is impossible. And that's kinda important for a lot of languages. - -### New System - -In v5, Symfony dropped their proprietary `transChoice` system in favor of the more-or-less standard [ICU MessageFormat](https://symfony.com/doc/5.2/translation/message_format.html). This solves pretty much every single one of the aforementioned issues. In this release, Flarum will be fully switching to ICU MessageFormat as well. What does this mean for extensions? - -- `transChoice` should not be used at all; instead, the variable passed for pluralization should be included in the data. -- Keys for backend translations no longer need to be surrounded by curly braces. -- Translations can now use the [`select` and `plural`](https://symfony.com/doc/5.2/translation/message_format.html) formatter syntaxes. For the `plural` formatter, the `offset` parameter and `#` magic variables are supported. -- These `select` and `plural` syntaxes can be nested to arbitrary depth. This is often a bad idea though (beyond, say, 2 levels), as things can get unnecessarily complex. - -No change to translation file naming is necessary (Symfony docs say that an `+intl-icu` suffix is necessary, but Flarum will now interpret all translation files as internationalized). - -#### Future Changes - -In the future, this will serve as a basis for additional features: - -- Translator preprocessors will allow extensions to modify arguments passed to translations. This will enable genderization (extensions could automatically extract a gender field from any objects of type "user" passed in). -- We could support internationalized "magic variables" for numbers: currently, `one` is supported, but others (`few`, `many`, etc) currently aren't. -- We could support ordinal formatting in additional to just plural formatting. - -#### Changes Needed in Extensions - -The `transChoice` methods in the frontend and backend have been removed. The `trans` method should always be used for translating, regardless of pluralization. If a translation requires pluralization, make sure you pass in the controlling variable as one of the arguments. - -In the frontend, code that looked like this: - -```js -app.translator.transChoice('some-translation', guestCount, {host: hostName}); -``` - -should be changed to: - -```js -// This uses ES6 key-property shorthand notation. {guestCount: guestCount} is equivalent to {guestCount} -app.translator.trans('some-translation', {host: hostName, guestCount }); -``` - -Similarly, in the backend, - -```php -$translator->transChoice('some-translation', $guestCount, ['{host}' => $hostName]); -``` - -should be changed to: - -```php -$translator->trans('some-translation', ['host' => $hostName, 'guestCount' => $guestCount]); -``` - -Note that in the backend, translation keys were previously wrapped in curly braces. This is no longer needed. - -#### Changes Needed in Translations - -Translations that aren't using pluralization don't need any changes. - -Pluralized translations should be changed as follows: - -`For {count} minute|For {count} minutes` - -to - -`{count, plural, one {For # minute} other {For # minutes}}` - -Note that in this example, `count` is the variable that controls pluralization. If a different variable were used (such as guestCount in the example above), this would look like: - -`{guestCount, plural, one {For # minute} other {For # minutes}}` - -See [our i18n docs](i18n.md) for more information. - -### Permissions Changes - -For a long time, the `viewDiscussions` and `viewUserList` permissions have been confusing. Despite their names: - -- `viewDiscussions` controls viewing both discussions and users. -- `viewUserList` controls searching users, not viewing user profiles. - -To clear this up, in v1.0, these permissions have been renamed to `viewForum` and `searchUsers` respectively. A migration in core will automatically adjust all permissions in the database to use the new naming. However, any extension code using the old name must switch to the new ones immediately to avoid security issues. To help the transfer, a warning will be thrown if the old permissions are referenced. - -We have also slightly improved tag scoping for permissions. Currently, permissions can be applied to tags if: - -- The permission is `viewForum` -- The permission is `startDiscussion` -- The permission starts with `discussion.` - -However, this doesn't work for namespaced permissions (`flarum-acme.discussion.bookmark`), or permissions that don't really have anything to do with discussions, but should still be scoped (e.g. `viewTag`). To counter this, a `tagScoped` attribute can be used on the object passed to [`registerPermission`](admin.md) to explicitly indicate whether the permission should be tag scopable. If this attribute is not provided, the current rules will be used to determine whether the permission should be tag scopable. - -## Frontend - -### Tooltip Changes - -The `flarum/common/components/Tooltip` component has been introduced as a simpler and less framework-dependent way to add tooltips. If your code is creating tooltips directly (e.g. via `$.tooltip()` in `oncreate` methods), you should wrap your components in the `Tooltip` component instead. For example: - -```tsx - - - -``` - -See [the source code](https://github.com/flarum/core/blob/master/js/src/common/components/Tooltip.tsx) for more examples and instructions. - -See [the PR](https://github.com/flarum/core/pull/2843/files) for examples of how to change existing code to use tooltips. - -### PaginatedListState - -The `flarum/common/states/PaginatedListState` state class has been introduced to abstract away most of the logic of `DiscussionListState` and `NotificationListState`. It provides support for loading and displaying paginated lists of JSON:API resources (usually models). In future releases, we will also provide an `PaginatedList` (or `InfiniteScroll`) component that can be used as a base class for these paginated lists. - -Please see [the source code](https://github.com/flarum/core/blob/master/js/src/common/states/PaginatedListState.ts) for a list of methods. - -Note that `flarum/forum/states/DiscussionListState`'s `empty` and `hasDiscussions` methods have been removed, and replaced with `isEmpty` and `hasItems` respectively. This is a breaking change. - -### New Loading Spinner - -The old `spin.js` based loading indicator has been replaced with a CSS-based solution. For the most part, no changes should be needed in extensions, but in some cases, you might need to update your spinner. This change also makes it easier to customize the spinner. - -See [this discussion](https://discuss.flarum.org/d/26994-beta16-using-the-new-loading-spinner) for more information. - -### classList util - -Ever wrote messy code trying to put together a list of classes for some component? Well, no longer! The [clsx library](https://www.npmjs.com/package/clsx) is now available as the `flarum/common/utils/classList` util. - -### User List - -An extensible user list has been added to the admin dashboard. In future releases, we hope to extract a generic model table component that can be used to list any model in the admin dashboard. - -See [the source code](https://github.com/flarum/core/blob/master/js/src/admin/components/UserListPage.tsx#L41) for a list of methods to extend, and examples of how columns should look like (can be added by extending the `columns` method and adding items to the [ItemList](frontend.md)). - -### Miscellaneous - -- Components should now call `super` for ALL Mithril lifecycle methods they define. Before, this was only needed for `oninit`, `onbeforeupdate`, and `oncreate`. Now, it is also needed in `onupdate`, `onbeforeremove`, and `onremove`. See [this GitHub issue](https://github.com/flarum/core/issues/2446) for information on why this change was made. -- The `flarum/common/utils/insertText` and `flarum/common/utils/styleSelectedText` utils have been moved to core from `flarum/markdown`. See `flarum/markdown` for an example of usage. -- The `extend` and `override` utils can now modify several methods at once by passing in an array of method names instead of a single method name string as the second argument. This is useful for extending the `oncreate` and `onupdate` methods at once. -- The `EditUserModal` component is no longer available through the `flarum/forum` namespace, it has been moved to `flarum/common`. Imports should be adjusted. -- The `Model` and `Route` JS extenders have been removed for now. There aren't currently used in any extensions that we know of. We will be reintroducing JS extenders during v1.x releases. -- The `Search` component can now be used with the `SearchState` state class. Previously, `SearchState` was missing the `getInitialSearch` method expected by the `Search` component. - -## Backend - -### Filesystem Extenders - -In this release, we refactored our use of the filesystem to more consistently use [Laravel's filesystem API](https://laravel.com/docs/8.x/filesystem). Extensions can now declare new disks, more easily use core's `flarum-assets` and `flarum-avatars` disks, and create their own storage drivers, enabling CDN and cloud storage support. - -### Compat and Closure Extenders - -In early Flarum versions, the `extend.php` file allowed arbitrary functions that allowed execution of arbitrary code one extension boot. For example: - -```php -return [ - // other extenders - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - } -]; -``` - -This approach was difficult to maintain and provide a well-tested public API for, frequently resolved classes early (breaking all sorts of things), and was not very descriptive. With the extender API completed in beta 16, this approach is no longer necessary. Support for these closures has been removed in this stable version. - -One type of functionality for which the extender replacement isn't obvious is container bindings ([e.g. flarum/pusher](https://github.com/flarum/pusher/blob/v0.1.0-beta.14/extend.php#L33-L49)). This can be done with via the service provider extender (e.g. [a newer version of flarum/pusher](https://github.com/flarum/pusher/blob/master/extend.php#L40-L41)). - -If you are unsure about which extenders should be used to replace your use of callbacks in `extend.php`, or are not sure that such an extender exists, please comment so below or reach out! We're in the final stages of finishing up the extender API, so now is the time to comment. - -### Scheduled Commands - -The [fof/console](https://github.com/FriendsOfFlarum/console) library has been a popular way to schedule commands (e.g. for publishing scheduled posts, running DB-heavy operations, etc) for several release. In Flarum 1.0, this functionality has been brought into core's `Console` extender. See our [console extension documentation](console.md) for more information on how to create schedule commands, and our [console user documentation](../console.md) for more information on how to run scheduled commands. - -### Eager Loading Extender - -As part of solving [N+1 Query issues](https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/) in some [Flarum API endpoints](https://github.com/flarum/core/issues/2637), we have introduced a `load` method on the `ApiController` extender that allows you to indicate relations that should be eager loaded. - -This should be done if you know a relation will always be included, or will always be referenced by controller / permission logic. For example, we will always need the tags of a discussion to check what permissions a user has on that discussion, so we should eager load the discussion's `tags` relationship. For example: - -```php -return [ - // other extenders - (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) - ->addInclude(['tags', 'tags.state', 'tags.parent']) - ->load('tags'), -]; -``` - -### RequestUtil - -The `Flarum\Http\RequestUtil`'s `getActor` and `withActor` should be used for getting/setting the actor (user) on requests. `$request->getAttribute('actor')` and `$request->withAttribute('actor')` are deprecated, and will be removed in v2.0. - -### Miscellaneous - -- The `Formatter` extender now has an `unparse` method that allows modifying XML before unparsing content. -- All route names must now be unique. In beta 16, uniqueness was enforced per-method; now, it is mandatory for all routes. -- API requests sent through `Flarum\Api\Client` now run through middleware, including `ThrottleApi`. This means that it is now possible to throttle login/registration calls. -- In beta 16, registering custom [searchers](search.md) was broken. It has been fixed in stable. -- The `post_likes` table in the [flarum/likes](https://github.com/flarum/likes) extension now logs the timestamp when likes were created. This isn't used in the extension, but could be used in other extensions for analytics. -- The `help` attribute of [admin settings](admin.md) no longer disappears on click. -- The `generate:migration` console command has been removed. The [Flarum CLI](https://discuss.flarum.org/d/26525-rfc-flarum-cli-alpha) should be used instead. -- The `GambitManager` util class is now considered internal API, and should not be used directly by extensions. -- The `session` attribute is no longer available on the `User` class. This caused issues with queue drivers, and was not conceptually correct (a user can have multiple sessions). The current session is still available via the `$request` instance. -- The `app`, `base_path`, `public_path`, `storage_path`, and `event` global helpers have been restored, but deprecated perpetually. These exist in case Laravel packages need them; they **should not** be used directly by Flarum extension code. The `flarum/laravel-helpers` package has been abandoned. -- The following deprecated features from beta 16 have been removed: - - The `TextEditor`, `TextEditorButton`, and `SuperTextarea` components are no longer exported through the `flarum/forum` namespace, but through `flarum/common` (with the exception of `SuperTextarea`, which has been replaced with `flarum/common/utils/BasicEditorDriver`). - - Support for `Symfony\Component\Translation\TranslatorInterface` has been removed, `Symfony\Contracts\Translation\TranslatorInterface` should be used instead. - - All backwards compatibility layers for the [beta 16 access token refactors](update-b16.md#access-token-and-authentication-changes) have been removed - - The `GetModelIsPrivate` event has been removed. The `ModelPrivate` extender should be used instead. - - The `Searching` (for both `User` and `Discussion` models), `ConfigureAbstractGambits`, `ConfigureDiscussionGambits`, and `ConfigureUserGambits` events have been removed. The `SimpleFlarumSearch` extender should be used instead. - - The `ConfigurePostsQuery` event has been removed. The `Filter` extender should be used instead. - - The `ApiSerializer` extender's `mutate` method has been removed. The same class's `attributes` method should be used instead. - - The `SearchCriteria` and `SearchResults` util classes have been removed. `Flarum\Query\QueryCriteria` and `Flarum\Query\QueryResults` should be used instead. - - The `pattern` property of `AbstractRegexGambit` has been removed; the `getGambitPattern` method is now a required abstract method. - - The `AbstractSearch` util class has been removed. `Flarum\Search\SearchState` and `Flarum\Filter\FilterState` should be used instead. - - The `CheckingPassword` event has been removed, the `Auth` extender should be used instead. - -## Tags Extension Changes - -As mentioned above, [tag scopable permissions](#permissions-changes) can now be explicitly declared. - -We've also made several big refactors to significantly improve tags performance. - -Firstly, the [Tag](https://github.com/flarum/tags/blob/d093ca777ba81f826157522c96680717d3a90e24/src/Tag.php#L38-L38) model's static `getIdsWhereCan` and `getIdsWhereCannot` methods have been removed. These methods scaled horribly on forums with many tags, sometimes adding several seconds to response time. - -These methods have been replaced with a `whereHasPermission` [Eloquent dynamic scope](https://laravel.com/docs/8.x/eloquent#dynamic-scopes) that returns a query. For example: - -`Tag::whereHasPermission($actor, 'viewDiscussions)`. - -That query can then be used in other DB queries, or further constricted to retrieve individual tags. - -Secondly, we no longer load in all tags as part of the initial payload. The initial payload contains all top-level primary tags, and the top 3 secondary tags. Other tags are loaded in as needed. Future releases will paginate secondary tags. This should enable forums to have thousands of secondary tags without significant performance impacts. These changes mean that extensions should not assume that all tags are available in the model store. - -## Testing Library Changes - -- Bundled extensions will not be automatically enabled; all enabled extensions must be specified in that test case. -- `setting` and `config` methods have been added that allow configuring settings and config.php values before the tested application boots. See [the testing docs](testing.md) for more information. -- The `php flarum test:setup` command will now drop the existing test DB tables before creating the database. This means that you can run `php flarum test:setup` to ensure a clean database without needing to go into the database and drop tables manually. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_x.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_x.md deleted file mode 100644 index ed17364ed..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-1_x.md +++ /dev/null @@ -1,139 +0,0 @@ -# Updating For 1.x - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## 1.7 - -### Frontend - -- Frontend extenders similar to the backend have been added, we highly recommend using them instead of the old method (https://docs.flarum.org/extend/models#adding-new-models-1), (https://docs.flarum.org/extend/routes#frontend-routes). -- There is a new tag selection component (https://github.com/flarum/framework/blob/360a2ba1d886df3fc6d326be932c5431ee9df8cf/extensions/tags/js/src/common/components/TagSelectionModal.tsx). - -### Backend - -- Support for php 8.2, deprecations are still thrown by some packages, the testing workflow has been updated to ignore deprecations on 8.2 -- The `/api` endpoint now contains the actor as an included relationship. -- The `Model::dateAttribute($attribute)` extender is deprecated, use `Model::cast($attribute, 'datetime')` instead. - -### Tooling - -- New `phpstan` package to run static code analysis on your extensions for code safety (https://docs.flarum.org/extend/static-code-analysis). -- New `jest-config` package to run frontend unit and component tests (https://docs.flarum.org/extend/testing). - -## 1.6 Changes - -### Backend - -- Added customizable session drivers through the `Session` extender. - -## 1.5 Changes - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Modals can be used in stacks, allowing for multiple modals to be open at once. This is useful for modals that open other modals: `app.modal.show(ModalComponent, { attrs }, true)`. - -### Backend - -- There is a new `createTableIfNotExists` migration helper, which can be used to create tables only if they don't already exist. - -## 1.4 Changes - -No developer-facing changes were made in Flarum v1.4. - -## 1.3 Changes - -Flarum v1.3 included mostly QoL improvements. Below are listed note worthy changes for extension developers: - -### Frontend - -- More portions of the frontend are now written in TypeScript, providing a better extension development experience. -- Frontend errors will no longer cause the forum to crash into a NoJs page. The extension will fail to execute its frontend code (initializer) and display an error to the admin through an alert, and to all users through the console. The frontend will continue to execute without the extension's frontend changes. -- The markdown toolbar can now be used on the admin side. - -### Backend - -- Calculation of the `number` attribute on `posts` has changed and no longer relies on the discussion model's `post_number_index` attribute which is now deprecated and will be removed in 2.0 -- Extension event listeners are now added after core even listeners, this should generally cause no changes in behavior. - -### Tooling - -- The backend tests workflow now automatically fails tests if there are any PHP warnings and notices. - -## 1.2 Changes - -Flarum v1.2 included quite a few bugfixes, internal refactors, and new features. The following recaps the most important changes for extension developers: - -### Frontend - -- Flarum core now passes TypeScript type checking (on the portion written in TypeScript). Additionally, major portions of the frontend (models, the application instance, and others) are now written in TypeScript. These changes should make it much easier and more fruitful to write extensions in TypeScript. -- Instead of directly using Less variables in CSS code, core now uses CSS variables. For the most part, we've just created CSS variables and set their values to the Less variables. This should make theming and customizing CSS a lot easier. https://github.com/flarum/core/pull/3146. -- Dropdowns can now be lazy-drawn to improve performance. You can do this by setting the lazy draw attr to "true". https://github.com/flarum/core/pull/2925. -- [Textarea-type settings](https://github.com/flarum/core/pull/3141) are now supported through the `app.extensionData.registerSetting` util. -- You can now use Webpack 5 to bundle your extension's code. This will offer minor bundle size improvements. -- A new `flarum/common/components/ColorPreviewInput` component [has been added](https://github.com/flarum/core/pull/3140). It can be used directly, or through the `color-preview` type when registered via `app.extensionData.registerSetting`. -- Extensions can now [modify the minimum search length](https://github.com/flarum/core/pull/3130) of the `Search` component. -- The following components are now extensible: - - The "colors" part of the Appearance page in the admin dashboard: https://github.com/flarum/core/pull/3186 - - The `StatusWidget` dropdown in the admin dashboard: https://github.com/flarum/core/pull/3189 - - `primaryControls` in the notification list: https://github.com/flarum/core/pull/3204 -- Extensions now have finer control over positioning when adding elements to the DiscussionPage sidebar items: https://github.com/flarum/core/pull/3165 -- - -### Backend - -- An [extender for settings defaults](https://github.com/flarum/core/pull/3127) has been added. This should be used instead of the `addSettings` migration helper, which has been deprecated. -- You can now [generate Less variables from setting values](https://github.com/flarum/core/pull/3011) via the `Settings` extender. -- Extensions can now [override/supplement blade template namespaces](https://github.com/flarum/core/pull/3167) through the `View` extender, meaning custom blade templates can be used instead of the default ones added by core or extensions. -- You can now define [custom Less functions through PHP](https://github.com/flarum/core/pull/3190), allowing you to use some backend logic in your Less theming. -- Extensions can now create [custom page title drivers](https://github.com/flarum/core/pull/3109/files) for titles in server-returned HTML. -- Custom logic can now be used when [deciding which relations to eager-load](https://github.com/flarum/core/pull/3116). -- Events [are now dispatched](https://github.com/flarum/core/pull/3203) for the `Notification\Read` and `Notification\ReadAll` events. -- An `ImageManager` instance is now [bound into the container](https://github.com/flarum/core/pull/3195), and can be configured to use either the `gd` or `imagick` backing drivers via the `"intervention.driver"` key in `config.php`. -- User IP addresses are now passed to the [API Client](https://github.com/flarum/core/pull/3124). -- A custom revision versioner implentation [can be set via container bindings](https://github.com/flarum/core/pull/3183) to customize how asset versions are named. -- A SlugManager instance [is now available](https://github.com/flarum/core/pull/3194) in blade templates via the `slugManager` variable. - -### Misc - -- Translations now support the `zero`, `one`, `two`, `few`, and `many` localized plural rules for `plural` ICU MessageFormat translations. This was done through the [`Intl.PluralRules` helper](https://github.com/flarum/core/issues/3072). -- Translations are now used for page titles, so that the format can be customized via language packs or [Linguist](https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease): https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228 -- API endpoints for retrieving single groups, as well as support for filtering groups on the plural get endpoint, [have been added](https://github.com/flarum/core/pull/3084). - - -### Tooling - - -- The `flarum-cli infra` command can now be used to update or enable various infrastructure features. You can now add the following to your extension in just one command: - - TypeScript - - Prettier for JS/TS formatting - - Backend testing with PHPUnit - - Code formatting with StyleCI - - EditorConfig support - - GitHub actions for automating testing, linting, type checking, and building. -- You can also exclude any files from these updates by adding their relative path to the "extra.flarum-cli" key's array in your extension's `composer.json` file. For example, if you wanted to exclude your tsconfig file from any updates by the infra system, the "extra.flarum-cli" key's value should be `["js/tsconfig.json"]`. -- The `flarum-cli audit infra` can be used to check that all infra modules your extension uses are up to date. The `--fix` flag can be used to automatically fix any issues, which has essentially the same effect as running `flarum-cli infra` for each outdated module. -- All `flarum-cli` commands can now be run with a `--no-interaction` flag to prevent prompts. Defaults will be used when possible, and errors will be thrown if a prompt is needed and there is no default. -- Frontend GH actions now support type-checking, as well as type coverage reports. - -## 1.1 Changes - -Flarum version 1.1 mostly focuses on bugfixes and quality-of-life improvements following our stable release earlier this year. These are mainly user-facing and internal infrastructure changes, so extensions are not significantly affected. - -### Frontend - -- Flarum now has an organization-wide prettier config package under [`@flarum/prettier-config`](https://github.com/flarum/prettier-config). -- Most custom (setting or data based) coloring in core is now done via [CSS custom properties](https://github.com/flarum/core/pull/3001). -- Typehinting for Flarum's globals are now [supported in extensions](https://github.com/flarum/core/pull/2992). -- You can now pass extra attrs to the `Select` component, and they will be [passed through to the DOM](https://github.com/flarum/core/pull/2959). -- The `DiscussionPage` component is now organized [as an item list](https://github.com/flarum/core/pull/3004), so it's easier for extensions to change its content. -- Extensions [can now edit](https://github.com/flarum/core/pull/2935) the `page` parameter of `PaginatedListState`. - -### Backend - -- Flarum now comes with a [Preload extender](https://github.com/flarum/core/pull/3057) for preloading any custom frontend assets. -- A new [Theme](https://github.com/flarum/core/pull/3008) extender now allows overriding Less files and internal imports. This allows themes to more easily completely replace Less modules. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b10.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b10.md deleted file mode 100644 index aaa98a2a5..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b10.md +++ /dev/null @@ -1,53 +0,0 @@ -# Updating For Beta 10 - -Beta 10 further solidifies the core architecture, offering new extenders as a stable, use-case-driven API for extending Flarum's core. A few small changes may necessitate updates to your extensions to make them compatible with Beta 10. These are detailed below. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- The `Flarum\Event\GetDisplayName` class has been moved to `Flarum\User\Event\GetDisplayName`. -- The `Flarum\Http\Exception\ForbiddenException` has been removed. Use `Flarum\User\Exception\PermissionDeniedException` instead. -- The `assertGuest()` method of the `Flarum\User\AssertPermissionTrait` has been removed without replacement. -- Old error handling middleware and exception handler classes were removed (see "New Features" for more details): - - `Flarum\Api\Middleware\HandleErrors` - - `Flarum\Http\Middleware\HandleErrorsWithView` - - `Flarum\Http\Middleware\HandleErrorsWithWhoops` - - `Flarum\Api\ErrorHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FloodingExceptionHandler` - - `Flarum\Api\ExceptionHandler\IlluminateValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidAccessTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\InvalidConfirmationTokenExceptionHandler` - - `Flarum\Api\ExceptionHandler\MethodNotAllowedExceptionHandler` - - `Flarum\Api\ExceptionHandler\ModelNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\PermissionDeniedExceptionHandler` - - `Flarum\Api\ExceptionHandler\RouteNotFoundExceptionHandler` - - `Flarum\Api\ExceptionHandler\TokenMismatchExceptionHandler` - - `Flarum\Api\ExceptionHandler\ValidationExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - - `Flarum\Api\ExceptionHandler\FallbackExceptionHandler` - -## Recommendations - -- We tweaked the [recommended flarum/core version constraints for extensions](start.md#composer-json). We now recommend you mark your extension as compatible with the current and the upcoming beta release. (For beta.10, that would be any beta.10.x and beta.11.x version.) The core team will strive to make this work well by deprecating features before removing them. More details on this change in [this pull request](https://github.com/flarum/docs/pull/75). - -## New Features - -- New, extensible **error handling** stack in the `Flarum\Foundation\ErrorHandling` namespace: The `Registry` maps exceptions to "types" and HTTP status codes, `HttpFormatter` instances turn them into HTTP responses. Finally, `Reporter` instances are notified about unknown exceptions. - - You can build custom exception classes that will abort the current request (or console command). If they have semantic meaning to your application, they should implement the `Flarum\Foundation\KnownError` interface, which exposes a "type" that is used to render pretty error pages or dedicated error messages. - - More consistent use of HTTP 401 and 403 status codes. HTTP 401 should be used when logging in (i.e. authenticating) could make a difference; HTTP 403 is reserved for requests that fail because the already authenticated user is lacking permissions to do something. - - The `assertRegistered()` and `assertPermission()` methods of the `Flarum\User\AssertPermissionTrait` trait have been changed to match above semantics. See [this pull request](https://github.com/flarum/core/pull/1854) for more details. - - Error views are now determined based on error "type", not on status code (see [bdac88b](https://github.com/flarum/core/commit/bdac88b5733643b9c5dabae9e09a64d9f6e41d58)) -- **Queue support**: This release incorporates Laravel's illuminate/queue package, which allows offloading long-running tasks (such as email sending or regular cleanup jobs) onto a dedicated worker process. These changes are mostly under the hood, the next release(s) will start using the queue system for sending emails. By default, Flarum will use the "sync" queue driver, which executes queued tasks immediately. This is far from ideal and mostly guarantees a hassle-free setups. Production-grade Flarum installs are expected to upgrade to a more full-featured queue adapter. -- The `Flarum\Extend\LanguagePack` now accepts an optional path in its constructor. That way, language packs can store their locales in a different directory if they want to. -- The `formatContent()` method of `Flarum\Post\CommentPost` can now be called without an HTTP request instance, e.g. when rendering a post in an email template. - -## Deprecations - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- Laravel's global string and array helpers (e.g. `str_contains()` and `array_only()`) are deprecated in favor of their class based alternatives (`Illuminate\Support\Str::contains()` and `Illuminate\Support\Arr::only()`). See the [announcement](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers) and [pull request](https://github.com/laravel/framework/pull/26898) for more information. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b12.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b12.md deleted file mode 100644 index ce6b1aca2..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b12.md +++ /dev/null @@ -1,34 +0,0 @@ -# Updating For Beta 12 - -Beta 12 packs several new features for extension developers, but also continues our cleanup efforts which results in a few changes, so please read this guide carefully to find out whether your extensions are affected. We invested extra effort to introduce new functionality in a backward-compatible manner or first deprecate functionality before it will be removed in the next release, in line with our [versioning recommendations](start.md#composer-json). - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Deprecations / Upcoming breaking changes - -- **Reminder**: In previous versions of Flarum, an extensions' main file was named `bootstrap.php`. This name will no longer be supported in the stable 0.1 release. Make sure your extension uses the name `extend.php`. -- PHP 7.1 support will be dropped in beta.13. -- Using library classes from the `Zend` namespace is now deprecated and will be removed in beta.13. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been deprecated. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been deprecated. We finally have a [proper replacement](middleware.md) - see "New Features" below. Therefore, it will be removed in beta.13. -- If you implement the `Flarum\Mail\DriverInterface`: - - Returning a plain array of field names from the `availableSettings()` method is deprecated, but still supported. It must now return an array of field names mapping to their type. See [the inline documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L25-L32) for more details. - - Implement the `validate()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L34-L48). - - Implement the `canSend()` method that will be required in beta.13. See [its documentation](https://github.com/flarum/core/blob/08e40bc693cce7be02d4fb24633553c7eaf2738d/src/Mail/DriverInterface.php#L50-L54). - -## New Features - -- New **PHP extenders**: - - `Flarum\Extend\Middleware` offers methods for adding, removing or replacing middleware in our three middleware stacks (api, forum, admin). We also added [documentation](middleware.md) for this feature. - - `Flarum\Extend\ErrorHandling` lets you configure status codes and other aspects of our error handling stack depending on error types or exception classes. -- **JavaScript**: - - The `flarum/components/Select` component now supports a `disabled` prop. See [PR #1978](https://github.com/flarum/core/pull/1978). - -## Other changes / Recommendations - -- The `TextFormatter` library has been updated to (at least) version 2.3.6. If you are using it (likely through our own `Flarum\Formatter\Formatter` class), we recommend scanning [the library's changelog](https://github.com/s9e/TextFormatter/blob/2.3.6/CHANGELOG.md). -- The JS `slug()` helper from the `flarum/utils/string` module should only be used to *suggest* slugs to users, not enforce them. It does not employ any sophisticated transliteration logic like its PHP counterpart. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b13.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b13.md deleted file mode 100644 index 1b19a9714..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b13.md +++ /dev/null @@ -1,40 +0,0 @@ -# Updating For Beta 13 - -Beta 13 ships with several new extenders to simplify building and maintaining extensions. We do our best to create backward compatibility changes. We recommend changing to new Extenders as soon as they are available. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Breaking Changes - -- Dropped support for PHP 7.1. -- Classes from the `Zend` namespace are now removed. Use the `Laminas` namespace instead. See [PR #1963](https://github.com/flarum/core/pull/1963). -- The `Flarum\Util\Str::slug()` method has been removed including the class. Use `Illuminate\Support\Str::slug()` instead. -- The `Flarum\Event\ConfigureMiddleware` has been removed. Use the [proper replacement](middleware.md). -- Several events used in Event Listeners have been removed, use their [replacement extender](start.md#extenders) instead. -- The LanguagePack extender only loads keys from extensions that are enabled. The translations loaded are based on the yaml files matching the [i18n namespace](i18n.md#appendix-a-standard-key-format). -- All notifications are now sent through the queue; without a queue driver they will run as usual. -- The implementation of avatar upload changed, we're [no longer storing files temporarily on disk](https://github.com/flarum/core/pull/2117). -- The SES mail driver [has been removed](https://github.com/flarum/core/pull/2011). -- Mail driver backward compatibility from beta 12 has been removed, use the new Mail extender or implement the [modified interface](https://github.com/flarum/core/blob/master/src/Mail/DriverInterface.php). - -## Recommendations - -- Beta 14 will ship with a rewrite in the frontend (javascript). If you're building for that release, make sure to follow our [progress](https://github.com/flarum/core/pull/2126). - -## New Features - -- A ton of new extenders: - - [Middleware extender](https://github.com/flarum/core/pull/2017) - - [Console extender](https://github.com/flarum/core/pull/2057) - - [CSRF extender](https://github.com/flarum/core/pull/2095) - - [Event extender](https://github.com/flarum/core/pull/2097) - - [Mail extender](https://github.com/flarum/core/pull/2012) - - [Model extender](https://github.com/flarum/core/pull/2100) - -## Deprecations - -- Several events [have been marked deprecated](https://github.com/flarum/core/commit/4efdd2a4f2458c8703aae654f95c6958e3f7b60b) to be removed in beta 14. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b14.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b14.md deleted file mode 100644 index deafdc960..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b14.md +++ /dev/null @@ -1,757 +0,0 @@ -# Updating For Beta 14 - -This release brings a large chunk of breaking changes - hopefully the last chunk of this size before our stable release. In order to prepare the codebase for the upcoming stable release, we decided it was time to modernize / upgrade / exchange some of the underlying JavaScript libraries that are used in the frontend. Due to the nature and size of these upgrades, we have to pass on some of the breaking changes to you, our extension developers. - -On the bright side, this overdue upgrade brings us closer to the conventions of best practices of [Mithril.js](https://mithril.js.org/), the mini-framework used for Flarum's UI. Mithril's 2.0 release sports a more consistent component interface, which should be a solid foundation for years to come. Where possible, we replicated old APIs, to ease the upgrade and give you time to do the full transition. Quite a few breaking changes remain, though - read more below. - -:::tip - -If you need help with the upgrade, our friendly community will gladly help you out either [on the forum](https://discuss.flarum.org/t/extensibility) or [in chat](https://flarum.org/chat/). - -::: - -To ease the process, we've clearly separated the changes to the [frontend (JS)](#frontend-javascript) from those in the [backend (PHP)](#backend-php) below. If your extension does not change the UI, consider yourself lucky. :-) - -A [summary of the frontend changes](#required-frontend-changes-recap) is available towards the end of this guide. - -## Frontend (JavaScript) - -### Mithril 2.0: Concepts - -Most breaking changes required by beta 14 are prompted by changes in Mithril 2. [Mithril's upgrade guide](https://mithril.js.org/migration-v02x.html) is an extremely useful resource, and should be consulted for more detailed information. A few key changes are explained below: - -#### props -> attrs; initProps -> initAttrs - -Props passed into component are now referred to as `attrs`, and can be accessed via `this.attrs` where you would prior use `this.props`. This was done to be closer to Mithril's preferred terminology. We have provided a temporary backwards compatibility layer for `this.props`, but recommend using `this.attrs`. - -Accordingly, `initProps` has been replaced with `initAttrs`, with a similar BC layer. - -#### m.prop -> `flarum/utils/Stream` - -Mithril streams, which were available via `m.prop` in Mithril 0.2, are now available via `flarum/utils/Stream`. `m.prop` will still work for now due to a temporary BC layer. - -#### m.withAttr -> withAttr - -The `m.withAttr` util has been removed from Mithril. We have provided `flarum/utils/withAttr`, which does the same thing. A temporary BC layer has been added for `m.withAttr`. - -#### Lifecycle Hooks - -In mithril 0.2, we had 2 "lifecycle hooks": - -`init`, an unofficial hook which ran when the component instance was initialized. - -`config`, which ran when components were created, and on every redraw. - - -Mithril 2 has the following hooks; each of which take `vnode` as an argument: - -- `oninit` -- `oncreate` -- `onbeforeupdate` -- `onupdate` -- `onbeforeremove` -- `onremove` - -Please note that if your component is extending Flarum's helper `Component` class, you must call `super.METHOD(vnode)` if using `oninit`, `oncreate`, and `onbeforeupdate`. - -More information about what each of these do can be found [in Mithril's documentation](https://mithril.js.org/lifecycle-methods.html). - -A trivial example of how the old methods map to the new is: - -```js -class OldMithrilComponent extends Component { - init() { - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - config(element, isInitialized) { - console.log('Code to run on every redraw AND when the element is first attached'); - - if (isInitialized) return; - - console.log('Code to execute only once when components are first created and attached to the DOM'); - - context.onunload = () => { - console.log('Code to run when the component is removed from the DOM'); - } - } - - view() { - // In mithril 0, you could skip redrawing a component (or part of a component) by returning a subtree retain directive. - // See https://mithril.js.org/archive/v0.2.5/mithril.render.html#subtree-directives - // dontRedraw is a substitute for logic; usually, this is used together with SubtreeRetainer. - if (dontRedraw()) return { subtree: 'retain' }; - - return

Hello World!

; - } -} - -class NewMithrilComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - console.log('Code to run when component instance created, but before attached to the DOM.'); - } - - oncreate(vnode) { - super.oncreate(vnode); - - console.log('Code to run when components are first created and attached to the DOM'); - } - - onbeforeupdate(vnode, oldVnode) { - super.onbeforeupdate(vnode); - - console.log('Code to run BEFORE diffing / redrawing components on every redraw'); - - // In mithril 2, if we want to skip diffing / redrawing a component, we return "false" in its onbeforeupdate lifecycle hook. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeupdate - // This is also typically used with SubtreeRetainer. - if (dontRedraw()) return false; - } - - onupdate(vnode) { - // Unlike config, this does NOT run when components are first attached. - // Some code might need to be replicated between oncreate and onupdate. - console.log('Code to run on every redraw AFTER the DOM is updated.'); - } - - onbeforeremove(vnode) { - // This is run before components are removed from the DOM. - // If a promise is returned, the DOM element will only be removed when the - // promise completes. It is only called on the top-level component that has - // been removed. It has no equivalent in Mithril 0.2. - // See https://mithril.js.org/lifecycle-methods.html#onbeforeremove - return Promise.resolve(); - } - - onremove(vnode) { - console.log('Code to run when the component is removed from the DOM'); - } -} -``` - -#### Children vs Text Nodes - -In Mithril 0.2, every child of a vnode is another vnode, stored in `vnode.children`. For Mithril 2, as a performance optimization, vnodes with a single text child now store that text directly in `vnode.text`. For developers, that means that `vnode.children` might not always contain the results needed. Luckily, text being stored in `vnode.text` vs `vnode.children` will be the same each time for a given component, but developers should be aware that at times, they might need to use `vnode.text` and not `vnode.children`. - -Please see [the mithril documentation](https://mithril.js.org/vnodes.html#structure) for more information on vnode structure. - -#### Routing API - -Mithril 2 introduces a few changes in the routing API. Most of these are quite simple: - -- `m.route()` to get the current route has been replaced by `m.route.get()` -- `m.route(NEW_ROUTE)` to set a new route has been replaced by `m.route.set(NEW_ROUTE)` -- When registering new routes, a component class should be provided, not a component instance. - -For example: - -```js -// Mithril 0.2 -app.routes.new_page = { path: '/new', component: NewPage.component() } - -// Mithril 2.0 -app.routes.new_page = { path: '/new', component: NewPage } -``` - -Additionally, the preferred way of defining an internal (doesn't refresh the page when clicked) link has been changed. The `Link` component should be used instead. - -```js -// Mithril 0.2 -
Link Content - -// Mithril 2 -import Link from 'flarum/components/Link'; - -Link Content -``` - -You can also use `Link` to define external links, which will just render as plain `Children` html links. - -For a full list of routing-related changes, please see [the mithril documentation](https://mithril.js.org/migration-v02x.html). - -#### Redraw API - -Mithril 2 introduces a few changes in the redraw API. Most of these are quite simple: - -- Instead of `m.redraw(true)` for synchronous redraws, use `m.redraw.sync()` -- Instead of `m.lazyRedraw()`, use `m.redraw()` - -Remember that Mithril automatically triggers a redraw after DOM event handlers. The API for preventing a redraw has also changed: - -```js -// Mithril 0.2 - - -// Mithril 2 - -``` - -#### AJAX - -The `data` parameter of `m.request({...})` has been split up into `body` and `params`. - -For examples and other AJAX changes, see [the mithril documentation](https://mithril.js.org/migration-v02x.html#mrequest). - -#### Promises - -`m.deferred` has been removed, native promises should be used instead. For instance: - -```js -// Mithril 0.2 -const deferred = m.deferred(); - -app.store.find('posts').then(result => deferred.resolve(result)); - -return deferred.promise; - -// Mithril 2 -return app.store.find('posts'); -``` - -#### Component instances should not be stored - -Due to optimizations in Mithril's redrawing algorithms, [component instances should not be stored](https://mithril.js.org/components.html#define-components-statically,-call-them-dynamically). - -So whereas before, you might have done something like: - -```js -class ChildComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return

{this.counter}

; - } -} -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.child = new ChildComponent(); - } - - view() { - return ( -
- - {this.child.render()} -
- ) - } -} -``` - -That will no longer work. In fact; the Component class no longer has a render method. - -Instead, any data needed by a child component that is modified by a parent component should be passed in as an attr. For instance: - -```js -class ChildComponent extends Component { - view() { - return

{this.attrs.counter}

; - } -} - -class ParentComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - this.counter = 0; - } - - view() { - return ( -
- - -
- ) - } -} -``` - -For more complex components, this might require some reorganization of code. For instance, let's say you have data that can be modified by several unrelated components. In this case, it might be preferable to create a POJO "state instance' for this data. These states are similar to "service" singletons used in Angular and Ember. For instance: - -```js -class Counter { - constructor() { - this._counter = 0; - } - - increaseCounter() { - this._counter += 1; - } - - getCount() { - return this._counter; - } -} - -app.counter = new Counter(); - -extend(HeaderSecondary.prototype, 'items', function(items) { - items.add('counterDisplay', -
-

Counter: {app.counter.getCount()}

-
- ); -}) - -extend(HeaderPrimary.prototype, 'items', function(items) { - items.add('counterButton', -
- -
- ); -}) -``` - -This "state pattern" can be found throughout core. Some non-trivial examples are: - -- PageState -- SearchState and GlobalSearchState -- NotificationListState -- DiscussionListState - -### Changes in Core - -#### Modals - -Previously, modals could be opened by providing a `Modal` component instance: - -```js -app.modal.show(new LoginModal(identification: 'prefilledUsername')); -``` - -Since we don't store component instances anymore, we pass in the component class and any attrs separately. - -```js -app.modal.show(LoginModal, {identification: 'prefilledUsername'}); -``` - -The `show` and `close` methods are still available through `app.modal`, but `app.modal` now points to an instance of `ModalManagerState`, not of the `ModalManager` component. Any modifications by extensions should accordingly be done to `ModalManagerState`. - -#### Alerts - -Previously, alerts could be opened by providing an `Alert` component instance: - -```js -app.alerts.show(new Alert(type: 'success', children: 'Hello, this is a success alert!')); -``` - -Since we don't store component instances anymore, we pass in a component class, attrs, children separately. The `show` method has 3 overloads: - -```js -app.alerts.show('Hello, this is a success alert!'); -app.alerts.show({type: 'success'}, 'Hello, this is a success alert!'); -app.alerts.show(Alert, {type: 'success'}, 'Hello, this is a success alert!'); -``` - -Additionally, the `show` method now returns a unique key, which can then be passed into the `dismiss` method to dismiss that particular alert. This replaces the old method of passing the alert instance itself to `dismiss`. - -The `show`, `dismiss`, and `clear` methods are still available through `app.alerts`, but `app.alerts` now points to an instance of `AlertManagerState`, not of the `AlertManager` component. Any modifications by extensions should accordingly be done to `AlertManagerState`. - -#### Composer - -Since we don't store a component instances anymore, a number of util methods from `Composer`, `ComposerBody` (and it's subclasses), and `TextEditor` have been moved onto `ComposerState`. - -For `forum/components/Composer`, `isFullScreen`, `load`, `clear`, `show`, `hide`, `close`, `minimize`, `fullScreen`, and `exitFullScreen` have been moved to `forum/states/ComposerState`. They all remain accessible via `app.composer.METHOD` - -A `bodyMatches` method has been added to `forum/states/ComposerState`, letting you check whether a certain subclass of `ComposerBody` is currently open. - -Various input fields are now stored as [Mithril Streams](https://mithril.js.org/stream.html) in `app.composer.fields`. For instance, to get the current composer content, you could use `app.composer.fields.content()`. Previously, it was available on `app.composer.component.content()`. **This is a convention that `ComposerBody` subclasses that add inputs should follow.** - -`app.composer.component` is no longer available. - -- Instead of `app.composer.component instanceof X`, use `app.composer.bodyMatches(X)`. -- Instead of `app.composer.component.props`, use `app.composer.body.attrs`. -- Instead of `app.composer.component.editor`, use `app.composer.editor`. - -For `forum/components/TextEditor`, the `setValue`, `moveCursorTo`, `getSelectionRange`, `insertAtCursor`, `insertAt`, `insertBetween`, `replaceBeforeCursor`, `insertBetween` methods have been moved to `forum/components/SuperTextarea`. - -Also for `forum/components/TextEditor`, `this.disabled` is no longer used; `disabled` is passed in as an attr instead. It may be accessed externally via `app.composer.body.attrs.disabled`. - -Similarly to Modals and Alerts, `app.composer.load` no longer accepts a component instance. Instead, pass in the body class and any attrs. For instance, - -```js -// Mithril 0.2 -app.composer.load(new DiscussionComposer({user: app.session.user})); - -// Mithril 2 -app.composer.load(DiscussionComposer, {user: app.session.user}) -``` - -Finally, functionality for confirming before unloading a page with an active composer has been moved into the `common/components/ConfirmDocumentUnload` component. - -#### Widget and DashboardWidget - -The redundant `admin/components/Widget` component has been removed. `admin/components/DashboardWidget` should be used instead. - -#### NotificationList - -For `forum/components/NotificationList`, the `clear`, `load`, `loadMore`, `parseResults`, and `markAllAsRead` methods have been moved to `forum/states/NotificationListState`. - -Methods for `isLoading` and `hasMoreResults` have been added to `forum/states/NotificationListState`. - -`app.cache.notifications` is no longer available; `app.notifications` (which points to an instance of `NotificationListState`) should be used instead. - -#### Checkbox - -Loading state in the `common/components/Checkbox` component is no longer managed through `this.loading`; it is now passed in as a prop (`this.attrs.loading`). - -#### Preference Saver - -The `preferenceSaver` method of `forum/components/SettingsPage` has been removed without replacement. This is done to avoid saving component instances. Instead, preferences should be directly saved. For instance: - -```js -// Old way -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value, component) => { - this.user.pushAttributes({ lastSeenAt: null }); - this.preferenceSaver('discloseOnline')(value, component); - }, -}) - -// Without preferenceSaver -Switch.component({ - children: app.translator.trans('core.forum.settings.privacy_disclose_online_label'), - state: this.user.preferences().discloseOnline, - onchange: (value) => { - this.discloseOnlineLoading = true; - - this.user.savePreferences({ discloseOnline: value }).then(() => { - this.discloseOnlineLoading = false; - m.redraw(); - }); - }, - loading: this.discloseOnlineLoading, -}) -``` - -A replacement will eventually be introduced. - -#### DiscussionListState - -For `forum/components/DiscussionList`, the `requestParams`, `sortMap`, `refresh`, `loadResults`, `loadMore`, `parseResults`, `removeDiscussion`, and `addDiscussion` methods have been moved to `forum/states/DiscussionListState`. - -Methods for `hasDiscussions`, `isLoading`, `isSearchResults`, and `empty` have been added to `forum/states/DiscussionListState`. - -`app.cache.discussions` is no longer available; `app.discussions` (which points to an instance of `DiscussionListState`) should be used instead. - -#### PageState - -`app.current` and `app.previous` no longer represent component instances, they are now instances of the `common/states/PageState` class. This means that: - -- Instead of `app.current instanceof X`, use `app.current.matches(X)` -- Instead of `app.current.PROPERTY`, use `app.current.get('PROPERTY')`. Please note that all properties must be exposed EXPLICITLY via `app.current.set('PROPERTY', VALUE)`. - -#### PostStream - -Logic from `forum/components/PostStreamScrubber`'s `update` method has been moved to `forum/components/PostStream`'s `updateScrubber` method. - -For `forum/components/PostStream`, the `update`, `goToFirst`, `goToLast`, `goToNumber`, `goToIndex`, `loadNearNumber`, `loadNearIndex`, `loadNext`, `loadPrevious`, `loadPage`, `loadRange`, `show`, `posts`, `reset`, `count`, and `sanitizeIndex` methods have been moved to `forum/states/PostStreamState`. - -Methods for `disabled` and `viewingEnd` have been added to `forum/states/PostStreamState`. - -#### SearchState and GlobalSearchState - -As with other components, we no longer store instances of `forum/components/Search`. As such, every `Search` component instance should be paired with a `forum/states/SearchState` instance. - -At the minimum, `SearchState` contains the following methods: - -- getValue -- setValue -- clear -- cache (adds a searched value to cache, meaning that we don't need to search for its results again) -- isCached (checks if a value has been searched for before) - -All of these methods have been moved from `Search` to `SearchState`. Additionally, Search's `stickyParams`, `params`, `changeSort`, `getInitialSearch`, and `clearInitialSearch` methods have been moved to `forum/states/GlobalSearchState`, which is now available via `app.search`. - -To use a custom search, you'll want to: - -1. Possibly create a custom subclass of `SearchState` -2. Create a custom subclass of `Search`, which overrides the `selectResult` method to handle selecting results as needed by your use case, and modify the `sourceItems` methods to contain the search sources you need. - -#### moment -> dayjs - -The `moment` library has been removed, and replaced by the `dayjs` library. The global `moment` can still be used for now, but is deprecated. `moment` and `dayjs` have very similar APIs, so very few changes will be needed. Please see the dayjs documentation [for more information](https://day.js.org/en/) on how to use it. - -#### Subtree Retainer - -`SubtreeRetainer` is a util class that makes it easier to avoid unnecessary redraws by keeping track of some pieces of data. When called, it checks if any of the data has changed; if not, it indicates that a redraw is not necessary. - -In mithril 0.2, its `retain` method returned a [subtree retain directive](https://mithril.js.org/archive/v0.1.25/mithril.render.html#subtree-directives) if no redraw was necessary. - -In mithril 2, we use its `needsRebuild` method in combination with `onbeforeupdate`. For instance: - -```js -class CustomComponent extends Component { - oninit(vnode) { - super.oninit(vnode); - - this.showContent = false; - - this.subtree = new SubtreeRetainer( - () => this.showContent, - ) - } - - onbeforeupdate() { - // If needsRebuild returns true, mithril will diff and redraw the vnode as usual. Otherwise, it will skip this redraw cycle. - // In this example, this means that this component and its children will only be redrawn when extra content is toggled. - return this.subtree.needsRebuild(); - } - - view(vnode) { - return
- -

Hello World!{this.showContent ? ' Extra Content!' : ''}

-
; - } -} -``` - -#### attrs() method - -Previously, some components would have an attrs() method, which provided an extensible way to provide attrs to the top-level child vnode returned by `view()`. For instance, - -```js -class CustomComponent extends Component { - view() { - return

Hello World!

; - } - - attrs() { - return { - className: 'SomeClass', - onclick: () => console.log('click'), - }; - } -} -``` - -Since `this.attrs` is now used for attrs passed in from parent components, `attrs` methods have been renamed to `elementAttrs`. - -#### Children and .component - -Previously, an element could be created with child elements by passing those in as the `children` prop: - -```js -Button.component({ - className: 'Button Button--primary', - children: 'Button Text' -}); -``` - -This will no longer work, and will actually result in errors. Instead, the 2nd argument of the `component` method should be used: - -```js -Button.component({ - className: 'Button Button--primary' -}, 'Button Text'); -``` - -Children can still be passed in through JSX: - -```js - -``` - -#### Tag attr - -Because mithril uses 'tag' to indicate the actual html tag (or component class) used for a vnode, you can no longer pass `tag` as an attr to components extending Flarum's `Component` helper class. The best workaround here is to just use another name for this attr. - -#### affixSidebar - -The `affixSidebar` util has been removed. Instead, if you want to affix a sidebar, wrap the sidebar code in an `AffixedSidebar` component. For instance, - -```js -class OldWay extends Component { - view() { - return
-
-
- -
Actual Page Content
-
-
-
; - } -} - -class NewWay extends Component { - view() { - return
-
-
- - - -
Actual Page Content
-
-
-
; - } -} -``` - -#### Fragment - -**Warning: For Advanced Use Only** - -In some rare cases, we want to have extremely fine grained control over the rendering and display of some significant chunks of the DOM. These are attached with `m.render`, and do not experience automated redraws. Current use cases in core and bundled extensions are: - -- The "Reply" button that shows up when selecting text in a post -- The mentions autocomplete menu that shows up when typing -- The emoji autocomplete menu that shows up when typing - -For this purpose, we provide a helper class (`common/Fragment`), of which you can create an instance, call methods, and render via `m.render(DOM_ROOT, fragmentInstance.render())`. The main benefit of using the helper class is that it allows you to use lifecycle methods, and to access the underlying DOM via `this.$()`, like you would be able to do with a component. - -This should only be used when absolutely necessary. If you are unsure, you probably don't need it. If the goal is to not store component instances, the "state pattern" as described above is preferable. - -### Required Frontend Changes Recap - -Each of these changes has been explained above, this is just a recap of major changes for your convenience. - -- Component Methods: - - `view()` -> `view(vnode)` - - Lifecycle - - `init()` -> `oninit(vnode)` - - `config()` -> Lifecycle hooks `oncreate(vnode)` / `onupdate(vnode)` - - `context.onunload()` -> `onremove()` - - `SubtreeRetainer` -> `onbeforeupdate()` - - if present, `attrs()` method needs to be renamed -> convention `elementAttrs()` - - building component with `MyComponent.component()` -> `children` is now second parameter instead of a named prop/attr (first argument) -> JSX preferred -- Routing - - `m.route()` -> `m.route.get()` - - `m.route(name)` -> `m.route.set(name)` - - register routes with page class, not instance - - special case when passing props - - `` -> `` -- AJAX - - `m.request({...})` -> `data:` key split up into `body:` and `params:` - - `m.deferred` -> native `Promise` -- Redrawing - - `m.redraw(true)` -> `m.redraw.sync()` - - `m.redraw.strategy('none')` -> `e.redraw = false` in event handler - - `m.lazyRedraw()` -> `m.redraw()` - -#### Deprecated changes - -For the following changes, we currently provide a backwards-compatibility layer. This will be removed in time for the stable release. The idea is to let you release a new version that's compatible with Beta 14 to your users as quickly as possible. When you have taken care of the changes above, you should be good to go. For the following changes, we have bought you time until the stable release. Considering you have to make changes anyway, why not do them now? - -- `this.props` -> `this.attrs` -- static `initProps()` -> static `initAttrs()` -- `m.prop` -> `flarum/utils/Stream` -- `m.withAttr` -> `flarum/utils/withAttr` -- `moment` -> `dayjs` - -## Backend (PHP) - -### New Features - -#### Extension Dependencies - -Some extensions are based on, or add features to, other extensions. Prior to this release, there was no way to ensure that those dependencies were enabled before the extension that builds on them. Now, you cannot enable an extension unless all of its dependencies are enabled, and you cannot disable an extension if there are other enabled extensions depending on it. - -So, how do we specify dependencies for an extension? Well, all you need to do is add them as composer dependencies to your extension's `composer.json`! For instance, if we have an extension that depends on Tags and Mentions, our `composer.json` will look like this: - -```json -{ - "name": "my/extension", - "description": "Cool New Extension", - "type": "flarum-extension", - "license": "MIT", - "require": { - "flarum/core": "^0.1.0-beta.14", - "flarum/tags": "^0.1.0-beta.14", // Will mark tags as a dependency - "flarum/mentions": "^0.1.0-beta.14", // Will mark mentions as a dependency - } - // other config -} -``` - -#### View Extender - -Previously, when extensions needed to register Laravel Blade views, they could inject a view factory in `extend.php` and call it's `addNamespace` method. For instance, - -```php -// extend.php -use Illuminate\Contracts\View\Factory; - -return [ - function (Factory $view) { - $view->addNamespace(NAME, RELATIVE PATH); - } -] -``` - -This should NOT be used, as it will break views for all extensions that boot after yours. Instead, the `View` extender should be used: - -```php -// extend.php -use Flarum\Extend\View; - -return [ - (new View)->namespace(NAME, RELATIVE PATH); -] -``` - -#### Application and Container - -Although Flarum uses multiple components of the Laravel framework, it is not a pure Laravel system. In beta 14, the `Flarum\Foundation\Application` class no longer implements `Illuminate\Contracts\Foundation\Application`, and no longer inherits `Illuminate\Container\Container`. Several things to note: - -- The `app` helper now points to an instance of `Illuminate\Container\Container`, not `Flarum\Foundation\Application`. You might need to resolve things through the container before using them: for instance, `app()->url()` will no longer work; you'll need to resolve or inject an instance of `Flarum\Foundation\Config` and use that. -- Injected or resolved instances of `Flarum\Foundation\Application` can no longer resolve things through container methods. `Illuminate\Container\Container` should be used instead. -- Not all public members of `Illuminate\Contracts\Foundation\Application` are available through `Flarum\Foundation\Application`. Please refer to our [API docs on `Flarum\Foundation\Application`](https://api.docs.flarum.org/php/master/flarum/foundation/application) for more information. - -#### Other Changes - -- We are now using Laravel 6. Please see [Laravel's upgrade guide](https://laravel.com/docs/6.x/upgrade) for more information. Please note that we do not use all of Laravel. -- Optional params in url generator now work. For instance, the url generator can now properly generate links to posts in discussions. -- A User Extender has been added, which replaces the deprecated `PrepareUserGroups` and `GetDisplayName` events. -- Error handler middleware can now be manipulated by the middleware extender through the `add`, `remove`, `replace`, etc methods, just like any other middleware. -- `Flarum/Foundation/Config` and `Flarum/Foundation/Paths` can now be injected where needed; previously their data was accessible through `Flarum/Foundation/Application`. - -### Deprecations - -- `url` provided in `config.php` is now an array, accessible via `$config->url()`, for an instance of `Config` - [PR](https://github.com/flarum/core/pull/2271#discussion_r475930358) -- AssertPermissionTrait has been deprecated - [Issue](https://github.com/flarum/core/issues/1320) -- Global path helpers and path methods of `Application` have been deprecated, the injectable `Paths` class should be used instead - [PR](https://github.com/flarum/core/pull/2155) -- `Flarum\User\Event\GetDisplayName` has been deprecated, the `displayNameDriver` method of the `User` extender should be used instead - [PR](https://github.com/flarum/core/pull/2174) - -### Removals - -- Do NOT use the old closure notation for configuring view namespaces. This will break all extensions that boot after your extension. The `View` extender MUST be used instead. -- app()->url() will no longer work: [`Flarum\Http\UrlGenerator`](routes.md) should be injected and used instead. An instance of `Flarum\Http\UrlGenerator` is available in `blade.php` templates via `$url`. -- As a part of the Laravel 6 upgrade, the [`array_` and `str_` helpers](https://laravel.com/docs/6.x/upgrade#helpers) have been removed. -- The Laravel translator interface has been removed; the Symfony translator interface should be used instead: `Symfony\Component\Translation\TranslatorInterface` -- The Mandrill mail driver is no longer provided in Laravel 6, and has been removed. -- The following events deprecated in Beta 13 [have been removed](https://github.com/flarum/core/commit/7d1ef9d89161363d1c8dea19cf8aebb30136e9e3#diff-238957b67e42d4e977398cd048c51c73): - - `AbstractConfigureRoutes` - - `ConfigureApiRoutes` - Use the `Routes` extender instead - - `ConfigureForumRoutes` - Use the `Frontend` or `Routes` extenders instead - - `ConfigureLocales` - Use the `LanguagePack` extender instead - - `ConfigureModelDates` - Use the `Model` extender instead - - `ConfigureModelDefaultAttributes` - Use the `Model` extender instead - - `GetModelRelationship` - Use the `Model` extender instead - - `Console\Event\Configuring` - Use the `Console` extender instead - - `BioChanged` - User bio has not been a core feature for several releases diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b15.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b15.md deleted file mode 100644 index 313f78557..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b15.md +++ /dev/null @@ -1,60 +0,0 @@ -# Updating For Beta 15 - -Beta 15 features multiple new extenders, a total redesign of the admin dashboard, and several other interesting new features for extensions. As before, we have done our best to provide backwards compatibility layers, and we recommend switching away from deprecated systems as soon as possible to make your extensions more stable. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## New Features / Deprecations - -### 扩展器 - -- `Flarum\Api\Event\WillGetData` and `Flarum\Api\Event\WillSerializeData` have been deprecated, the `ApiController` extender should be used instead -- `Flarum\Api\Event\Serializing` and `Flarum\Event\GetApiRelationship` have been deprecated, the `ApiSerializer` extender should be used instead -- `Flarum\Formatter\Event\Parsing` has been deprecated, the `parse` method of the `Formatter` extender should be used instead -- `Flarum\Formatter\Event\Rendering` has been deprecated, the `render` method of the `Formatter` extender should be used instead -- `Flarum\Notification\Event\Sending` has been deprecated, the `driver` method of the `Notification` extender should be used instead - - Please note that the new notification driver system is not an exact analogue of the old `Sending` event, as it can only add new drivers, not change the functionality of the default notification bell alert driver. If your extension needs to modify **how** or **to whom** notifications are sent, you may need to replace `Flarum\Notification\NotificationSyncer` on the service provider level -- `Flarum\Event\ConfigureNotificationTypes` has been deprecated, the `type` method of the `Notification` extender should be used instead -- `Flarum\Event\ConfigurePostTypes` has been deprecated, the `type` method of the `Post` extender should be used instead -- `Flarum\Post\Event\CheckingForFlooding` has been deprecated, as well as `Flarum\Post\Floodgate`. They have been replaced with a middleware-based throttling system that applies to ALL requests to /api/*, and can be configured via the `ThrottleApi` extender. Please see our [api-throttling](api-throttling.md) documentation for more information. -- `Flarum\Event\ConfigureUserPreferences` has been deprecated, the `registerPreference` method of the `User` extender should be used instead -- `Flarum\Foundation\Event\Validating` has been deprecated, the `configure` method of the `Validator` extender should be used instead - -- The Policy system has been reworked a bit to be more intuitive. Previously, policies contained both actual policies, which determine whether a user can perform some ability, and model visibility scopers, which allowed efficient restriction of queries to only items that users have access to. See the [authorization documentation](authorization.md) for more information on how to use the new systems. Now: - - `Flarum\Event\ScopeModelVisibility` has been deprecated. New scopers can be registered via the `ModelVisibility` extender, and any `Eloquent\Builder` query can be scoped by calling the `whereVisibleTo` method on it, with the ability in question as an optional 2nd argument (defaults to `view`). - - `Flarum\Event\GetPermission` has been deprecated. Policies can be registered via the `Policy` extender. `Flarum\User\User::can` has not changed. Please note that the new policies must return one of `$this->allow()`, `$this->deny()`, `$this->forceAllow()`, `$this->forceDeny()`, not a boolean. - -- A `ModelUrl` extender has been added, allowing new slug drivers to be registered. This accompanies Flarum's new slug driving system, which allows for extensions to define custom slugging strategies for sluggable models. The extender supports sluggable models outside of Flarum core. Please see our [model slugging](slugging.md) documentation for more information. -- A `Settings` extender has been added, whose `serializeToForum` method makes it easy to serialize a setting to the forum. -- A `ServiceProvider` extender has been added. This should be used with extreme caution for advanced use cases only, where there is no alternative. Please note that the service provider layer is not considered public API, and is liable to change at any time, without notice. - -### Admin UX Redesign - -The admin dashboard has been completely redesigned, with a focus on providing navbar pages for each extension. The API for extensions to register settings, permissions, and custom pages has also been greatly simplified. You can also now update your extension's `composer.json` to provide links for funding, support, website, etc that will show up on your extension's admin page. Please see [our Admin JS documentation](admin.md) for more information on how to use the new system. - -### Other New Features - -- On the backend, the route name is now available via `$request->getAttribute('routeName')` for controllers, and for middleware that run after `Flarum\Http\Middleware\ResolveRoute.php`. -- `Flarum\Api\Controller\UploadImageController.php` can now be used as a base class for controllers that upload images (like for the logo and favicon). -- Automatic browser scroll restoration can now be disabled for individual pages [see our frontend page documentation for more info](frontend-pages.md). - -## Breaking Changes - -- The following deprecated frontend BC layers were removed: - - `momentjs` no longer works as an alias for `dayjs` - - `this.props` and `this.initProps` no longer alias `this.attrs` and `this.initAttrs` for the `Component` base class - - `m.withAttr` and `m.stream` no longer alias `flarum/utils/withAttr` and `flarum/utils/Stream` - - `app.cache.discussionList` has been removed - - `this.content` and `this.editor` have been removed from `ComposerBody` - - `this.component`, `this.content`, and `this.value` have been removed from `ComposerState` -- The following deprecated backend BC layers were removed: - - The `publicPath`, `storagePath`, and `vendorPath` methods of `Flarum\Foundation\Application` have been removed - - The `base_path`, `public_path`, and `storage_path` global helpers have been removed - - The `getEmailSubject` method of `Flarum\Notification\MailableInterface` MUST now take a translator instance as an argument - - `Flarum\User\AssertPermissionTrait` has been removed, the analogous methods on `Flarum\User\User` should be used instead - - The `Flarum\Event\PrepareUserGroups` event has been removed, use the `User` extender instead - - The `Flarum\User\Event\GetDisplayName` event has been removed, use the display name driver feature of the `User` extender instead diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b16.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b16.md deleted file mode 100644 index e99c0536a..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b16.md +++ /dev/null @@ -1,138 +0,0 @@ -# Updating For Beta 16 - -Beta 16 finalizes the PHP extender API, introduces a testing library and JS typings, switches to using namespaces for JS imports, increases extension dependency robustness, and allows overriding routes, among other features. - -:::tip - -If you need help applying these changes or using new features, please start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## Frontend - -- A new editor driver abstraction has been introduced, which allows extensions to override the default textarea-based editor with more advanced solutions. -- The `TextEditor` and `TextEditorButton` components, as well as the `BasicEditorDriver` util (which replaces `SuperTextarea`) have been moved from `forum` to `common`. -- The `forum`, `admin`, and `common` namespaces should be used when importing. So instead of `import Component from 'flarum/Component'`, use `import Component from 'flarum/common/Component`. Support for the old import styles will be deprecated through the stable release, and removed with Flarum 2.0. -- A typing library has been released to support editor autocomplete for frontend development, and can be installed in your dev environment via `npm install --save-dev flarum@0.1.0-beta.16`. -- Extension categories have been simplified down to `feature`, `theme`, and `language`. - -## Backend - -### 扩展器 - -- All extenders that support callbacks/closures now support global functions like `'boolval'` and array-type functions like `[ClassName::class, 'methodName']`. -- The `Settings` extender's `serializeToFrontend` method now supports a default value as the 4th argument. -- The `Event` extender now supports registering subscribers for multiple events at once via a `subscribe` method. -- The `Notification` extender now has a `beforeSending` method, which allows you to adjust the list of recipients before a notification is sent. -- The `mutate` method of `ApiSerializer` has been deprecated, and renamed to `attributes`. -- `remove` methods on the `Route` and `Frontend` extenders can be used to remove (and then replace) routes. -- A `ModelPrivate` extender replaces the `GetModelIsPrivate` event, which has been deprecated. -- Methods on the `Auth` extender replace the `CheckingPassword` event, which has been deprecated. -- All search-related events are now deprecated in favor of the `SimpleFlarumSearch` and `Filter` extenders; this is explained in more detail below. - -### Laravel and Symfony - -Beta 16 upgrades from v6.x to v8.x of Laravel components and v4 to v5 of Symfony components. Please see the respective upgrade guides of each for changes you might need to make to your extensions. The most applicable change is the deprecation of `Symfony\Component\Translation\TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface`. The former will be removed in beta 17. - -### Helper Functions - -The remaining `app` and `event` global helper functions have been deprecated. `app` has been replaced with `resolve`, which takes the name of a container binding and resolves it through the container. - -Since some Flarum extensions use Laravel libraries that assume some global helpers exist, we've recreated some commonly used helpers in the [flarum/laravel-helpers](https://github.com/flarum/laravel-helpers) package. These helpers should NOT be used directly in Flarum extension code; they are available so that Laravel-based libraries that expect them to exist don't malfunction. - -### Search Changes - -As part of our ongoing efforts to make Flarum's search system more flexible, we've made several refactors in beta 16. Most notably, filtering and searching are now treated as different mechanisms, and have separate pipelines and extenders. Essentially, if a query has a `filter[q]` query param, it will be treated as a search, and all other filter params will be ignored. Otherwise, it will be handled by the filtering system. This will eventually allow searches to be handled by alternative drivers (provided by extensions), such as ElasticSearch, without impacting filtering (e.g. loading recent discussions). Classes common to both systems have been moved to a `Query` namespace. - -Core's filtering and default search (named SimpleFlarumSearch) implementations are quite similar, as both are powered by the database. `List` API controllers call the `search` / `filter` methods on a resource-specific subclass of `Flarum\Search\AbstractSearcher` or `Flarum\Filter\AbstractFilterer`. Arguments are an instance of `Flarum\Query\QueryCriteria`, as well as sort, offset, and limit information. Both systems return an instance of `Flarum\Query\QueryResults`, which is effectively a wrapper around a collection of Eloquent models. - -The default systems are also somewhat similar in their implementation. `Filterer`s apply Filters (implementing `Flarum\Filter\FilterInterface`) based on query params in the form `filter[FILTER_KEY] = FILTER_VALUE` (or `filter[-FILTER_KEY] = FILTER_VALUE` for negated filters). SimpleFlarumSearch's `Searcher`s split the `filter[q]` param by spaces into "terms", apply Gambits (implementing `Flarum\Search\GambitInterface`) that match the terms, and then apply a "Fulltext Gambit" to search based on any "terms" that don't match an auxiliary gambit. Both systems then apply sorting, an offset, and a result count limit, and allow extensions to modify the query result via `searchMutators` or `filterMutators`. - -Extensions add gambits and search mutators and set fulltext gambits for `Searcher` classes via the `SimpleFlarumSearch` extender. They can add filters and filter mutators to `Filterer` classes via the `Filter` extender. - -With regards to upgrading, please note the following: - -- Search mutations registered by listening to the `Searching` events for discussions and users will be applied as to searches during the search mutation step via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Search gambits registered by listening to the `ConfigureUserGambits` and `ConfigureDiscussionGambits` events will be applied to searcher via a temporary BC layer. They WILL NOT be applied to filters. This is a breaking change. These events have been deprecated. -- Post filters registered by listening to the `ConfigurePostsQuery` events will be applied to post filters via a temporary BC layer. That event has been deprecated. - -### Testing Library - -The `flarum/testing` package provides utils for PHPUnit-powered automated backend tests. See the [testing documentation](testing.md) for more info. - -### Optional Dependencies - -Beta 15 introduced "extension dependencies", which require any extensions listed in your extension's `composer.json`'s `require` section to be enabled before your extension can be enabled. - -With beta 16, you can specify "optional dependencies" by listing their composer package names as an array in your extension's `extra.flarum-extension.optional-dependencies`. Any enabled optional dependencies will be booted before your extension, but aren't required for your extension to be enabled. - -### Access Token and Authentication Changes - -#### Extension API changes - -The signature to various method related to authentication have been changed to take `$token` as parameter instead of `$userId`. Other changes are the result of the move from `$lifetime` to `$type` - -- `Flarum\Http\AccessToken::generate($userId)` no longer accepts `$lifetime` as a second parameter. Parameter has been kept for backward compatibility but has no effect. It will be removed in beta 17. -- `Flarum\Http\RememberAccessToken::generate($userId)` should be used to create remember access tokens. -- `Flarum\Http\DeveloperAccessToken::generate($userId)` should be used to create developer access tokens (don't expire). -- `Flarum\Http\SessionAccessToken::generate()` can be used as an alias to `Flarum\Http\AccessToken::generate()`. We might deprecate `AccessToken::generate()` in the future. -- `Flarum\Http\Rememberer::remember(ResponseInterface $response, AccessToken $token)`: passing an `AccessToken` has been deprecated. Pass an instance of `RememberAccessToken` instead. As a temporary compatibility layer, passing any other type of token will convert it into a remember token. In beta 17 the method signature will change to accept only `RememberAccessToken`. -- `Flarum\Http\Rememberer::rememberUser()` has been deprecated. Instead you should create/retrieve a token manually with `RememberAccessToken::generate()` and pass it to `Rememberer::remember()` -- `Flarum\Http\SessionAuthenticator::logIn(Session $session, $userId)` second parameter has been deprecated and is replaced with `$token`. Backward compatibility is kept. In beta 17, the second parameter method signature will change to `AccessToken $token`. -- `AccessToken::generate()` now saves the model to the database before returning it. -- `AccessToken::find($id)` or `::findOrFail($id)` can no longer be used to find a token, because the primary key was changed from `token` to `id`. Instead you can use `AccessToken::findValid($tokenString)` -- It's recommended to use `AccessToken::findValid($tokenString): AccessToken` or `AccessToken::whereValid(): Illuminate\Database\Eloquent\Builder` to find a token. This will automatically scope the request to only return valid tokens. On forums with low activity this increases the security since the automatic deletion of outdated tokens only happens every 50 requests on average. - -#### Symfony session changes - -If you are directly accessing or manipulating the Symfony session object, the following changes have been made: - -- `user_id` attribute is no longer used. `access_token` has been added as a replacement. It's a string that maps to the `token` column of the `access_tokens` database table. - -To retrieve the current user from inside a Flarum extension, the ideal solution which was already present in Flarum is to use `$request->getAttribute('actor')` which returns a `User` instance (which might be `Guest`) - -To retrieve the token instance from Flarum, you can use `Flarum\Http\AccessToken::findValid($tokenString)` - -To retrieve the user data from a non-Flarum application, you'll need to make an additional database request to retrieve the token. The user ID is present as `user_id` on the `access_tokens` table. - -#### Token creation changes - -The `lifetime` property of access tokens has been removed. Tokens are now either `session` tokens with 1h lifetime after last activity, or `session_remember` tokens with 5 years lifetime after last activity. - -The `remember` parameter that was previously available on the `POST /login` endpoint has been made available on `POST /api/token`. It doesn't return the remember cookie itself, but the token returned can be used as a remember cookie. - -The `lifetime` parameter of `POST /api/token` has been deprecated and will be removed in Flarum beta 17. Partial backward compatibility has been provided where a `lifetime` value longer than 3600 seconds is interpreted like `remember=1`. Values lower than 3600 seconds result in a normal non-remember token. - -New `developer` tokens that don't expire have been introduced, however they cannot be currently created through the REST API. Developers can create developer tokens from an extension using `Flarum\Http\DeveloperAccessToken::generate($userId)`. - -If you manually created tokens in the database from outside Flarum, the `type` column is now required and must contain `session`, `session_remember` or `developer`. Tokens of unrecognized type cannot be used to authenticate, but won't be deleted by the garbage collector either. In a future version extensions will be able to register custom access token types. - -#### Token usage changes - -A [security issue in Flarum](https://github.com/flarum/core/issues/2075) previously caused all tokens to never expire. This had limited security impact due to tokens being long unique characters. However custom integrations that saved a token in an external database for later use might find the tokens no longer working if they were not used recently. - -If you use short-lived access tokens for any purpose, take note of the expiration time of 1h. The expiration is based on the time of last usage, so it will remain valid as long as it continues to be used. - -Due to the large amount of expired tokens accumulated in the database and the fact most tokens weren't ever used more than once during the login process, we have made the choice to delete all access tokens a lifetime of 3600 seconds as part of the migration, All remaining tokens have been converted to `session_remember` tokens. - -#### Remember cookie - -The remember cookie still works like before, but a few changes have been made that could break unusual implementations. - -Now only access tokens created with `remember` option can be used as remember cookie. Any other type of token will be ignored. This means if you create a token with `POST /api/token` and then place it in the cookie manually, make sure you set `remember=1` when creating the token. - -#### Web session expiration - -In previous versions of Flarum, a session could be kept alive forever until the Symfony session files were deleted from disk. - -Now sessions are linked to access tokens. A token being deleted or expiring will automatically end the linked web session. - -A token linked to a web session will now be automatically deleted from the database when the user clicks logout. This prevents any stolen token from being re-used, but it could break custom integration that previously used a single access token in both a web session and something else. - -### Miscellaneous - -- The IP address is now available in requests via `$request->getAttribute('ipAddress')` -- Policies can now return `true` and `false` as aliases for `$this->allow()` and `$this->deny()`, respectively. -- The `user.edit` permission has been split into `user.editGroups`, `user.editCredentials` (for email, username, and password), and `user.edit` (for other attributes). -- There are now permissions (`bypassTagCounts`) that allow users to bypass tag count requirements. -- Flarum now supports PHP 7.3 - PHP 8.0, with support for PHP 7.2 officially dropped. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b8.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b8.md deleted file mode 100644 index f2debf5e5..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/update-b8.md +++ /dev/null @@ -1,114 +0,0 @@ -# Updating For Beta 8 - -All extensions will need to be refactored in order to work with beta 8. Here are the main things you will need to do in order to make your extension compatible. - -:::caution - -This guide is not comprehensive. You may encounter some changes we haven't documented. If you need help, start a discussion on the [community forum](https://discuss.flarum.org/t/extensibility) or [Discord chat](https://flarum.org/discord/). - -::: - -## PHP Namespaces - -Beta 8 comes with large changes to the overall structure of the PHP backend. You will need to look through [this list](https://discuss.flarum.org/d/6572-help-us-namespace-changes) of namespace changes and make changes to your extension accordingly. - -[This script](https://gist.github.com/tobyzerner/55e7c05c95404e5efab3a9e43799d375) can help you to automate most of the namespace changes. Of course, you should still test your extension after running the script as it may miss something. - -## Database Naming - -Many database columns and JSON:API attributes have been renamed to conform to a [convention](/contributing.md#database). You will need to update any instances where your extension interacts with core data. You can see the changes in [#1344](https://github.com/flarum/core/pull/1344/files). - -## 扩展器 - -Beta 8 introduces a new concept called **extenders** that replace the most common event listeners. You can learn more about how they work in the [updated extension docs](start.md#extenders). - -`bootstrap.php` has been renamed to `extend.php` and returns an array of extender instances and functions: - -```php -use Flarum\Extend; - -return [ - (new Extend\Frontend('forum')) - ->js(__DIR__.'/js/dist/forum.js') - ->css(__DIR__.'/less/forum.less') - ->route('/t/{slug}', 'tag') - ->route('/tags', 'tags'), - - function (Dispatcher $events) { - $events->subscribe(Listener\AddForumTagsRelationship::class); - } -] -``` - -If you're listening for any of the following events, you'll need to update your code to use an extender instead. See the relevant docs for more information. - -| Event | Extender | -| ------------------------------------- | --------------------------- | -| `Flarum\Event\ConfigureFormatter`* | `Flarum\Extend\Formatter` | -| `Flarum\Event\ConfigureWebApp`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureClientView`* | `Flarum\Extend\Frontend` | -| `Flarum\Event\ConfigureLocales` | `Flarum\Extend\Locales` | -| `Flarum\Event\ConfigureApiRoutes` | `Flarum\Extend\Routes` | -| `Flarum\Event\ConfigureForumRoutes` | `Flarum\Extend\Routes` | - -_\* class no longer exists_ - -## JavaScript Tooling - -Previously Flarum and its extensions used a custom Gulp workflow to compile ES6 source code into something that browsers could understand. Beta 8 switches to a more conventional approach with Webpack. - -You will need to tweak the structure of your extension's `js` directory. Currently, your JS file hierarchy looks something like the following: - -``` -js -├── admin -│ ├── src -│ │ └── main.js -│ ├── dist -│ │ └── extension.js -│ ├── Gulpfile.js -│ └── package.json -└── forum - ├── src - │ └── main.js - ├── dist - │ └── extension.js - ├── Gulpfile.js - └── package.json -``` - -You'll need to make the following changes: - -1. Update `package.json` and create `webpack.config.js`, `forum.js`, and `admin.js` files using [these templates](frontend.md#transpilation). - -2. Inside your `admin` and `forum` *folders*, delete `Gulpfile.js`, `package.json`, and `dist`. Then inside each `src` folder, rename `main.js` to `index.js`. Now move all of the `src` files outside of `src` folder and delete it. - -3. In the root `js` folder create a folder called `src` and move your `admin` and `forum` *folders* into it. - -4. While still in your root `js` folder, run `npm install` and then `npm run build` to build the new JS dist files. - -If everything went right, your folder structure should look something like this: - -``` -js -├── src -│ ├── admin -│ │ └── index.js -│ └── forum -│ └── index.js -├── dist -│ ├── admin.js -│ ├── admin.js.map -│ ├── forum.js -│ └── forum.js.map -├── admin.js -├── forum.js -├── package.json -└── webpack.config.js -``` - -Take a look at the [bundled extensions](https://github.com/flarum) for more examples. - -## Font Awesome Icons - -Beta 8 upgrades to Font Awesome 5, in which icon class names have changed. The `flarum/helpers/icon` helper now requires the **full Font Awesome icon class names** to be passed, eg. `fas fa-bolt`. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extend/views.md b/i18n/zh/docusaurus-plugin-content-docs/current/extend/views.md deleted file mode 100644 index fc4a75a86..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extend/views.md +++ /dev/null @@ -1,63 +0,0 @@ -# Views and Blade - -Although the Flarum UI you know and love is powered by our [Mithril frontend](frontend), server-side generated templates are still used throughout Flarum. Most notably, the HTML skeleton of the forum, which includes various SEO meta tags, as well as the no-js view of the forum, is implemented through the Views and Blade systems. - -[Blade](https://laravel.com/docs/8.x/blade) is Laravel's templating engine, which allows you to conveniently generate HTML (or other static content) from PHP. It's the same idea as [Jinja](https://jinja.palletsprojects.com/en/3.0.x/) or [EJS](https://ejs.co/). [Views](https://laravel.com/docs/8.x/views) are Laravel's system for organizing/registering Blade templates, and also includes utilities for rendering them and providing them with variables. - -For our purposes, views are directories containing `.blade.php` template files (possibly contained in subdirectories). - -## Adding Views - -You will need to tell the view factory where it can find your extension's view files by adding a `View` extender to `extend.php`: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->namespace('acme.hello-world', __DIR__.'/views'), -]; -``` - - -## Blade Templates - -To learn about the syntax for Blade templates, read [Laravel's documentation](https://laravel.com/docs/8.x/blade). - -Once you've set up your views, you can render them to strings: - -```php -// Here, $view is of type `Illuminate\Contracts\View\Factory` -$renderedString = $view->make('acme.hello-world::greeting')->render(); - -// You can also pass variables to the view: -$renderedString = $view->make('acme.hello-world::greeting', ['varName' => true])->render(); -``` - -You can obtain the view factory instance through dependency injection. - -The format is `"VIEW_NAMESPACE::VIEW_NAME"`. If the view folder is organized as subdirectories, replace `/` with `.` in the pack. So if you have a file at `"forum/error.blade.php"` in a namespace called `"custom-views"`, you would use `"custom-views::forum.error"`. - -Note that all Blade templates rendered this way automatically have access to the following variables: - -- `$url`: a [URL generator](routes#generating-urls) instance. -- `$translator`: a [Translator](i18n#server-side-translation) instance. -- `$settings`: a [SettingsInterface](settings) instance. -- `$slugManager`: a [SlugManager](slugging) instance. - -Additionally, templates used by [content logic](routes#content) have access to `$forum`, which represents the [Forum API Document's attributes](https://github.com/flarum/framework/blob/main/framework/core/src/Api/Serializer/ForumSerializer.php#L19). - -## Overriding Views - -If you want to override templates added by core or extensions, set up a view folder structure matching the one you are trying to override, containing just the files you are trying to override. Then use the `View` extender's `extendNamespace` method: - -```php -use Flarum\Extend; -use Illuminate\Contracts\View\Factory; - -return [ - (new Extend\View) - ->extendNamespace('acme.hello-world', __DIR__.'/override_views'); -]; -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extenders.md b/i18n/zh/docusaurus-plugin-content-docs/current/extenders.md deleted file mode 100644 index 68f335602..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extenders.md +++ /dev/null @@ -1,23 +0,0 @@ -# 本地扩展 - -如果您想要在没有分发整个扩展的情况下自定义您的站点, 您可以通过使用 **本地扩展** 来做到这一点。 Each Flarum installation comes with an `extend.php` file where you can add extender instances, just like in a full extension. - -See our [extension documentation](extend/start.md) for more information about extenders (and even an [example of a local extender](extend/start.md#hello-world)). - -If you need to create new files (when adding a custom class to be imported for extenders), you'll need to adjust your composer.json a bit. Add the following: - -```json -"autoload": { - "psr-4": { - "App\\": "app/" - } -}, -``` - -Now you can create new PHP files in an `app` subdirectory using the `App\...` namespace. - -:::tip Local Extenders vs Extensions - -Local extenders can be good for small tweaks, but if you need large customizations, an extension might be a better choice: a separate codebase, cleaner handling of many files, developer tooling, and the ability to easily open source are big benefits. - -::: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/extensions.md b/i18n/zh/docusaurus-plugin-content-docs/current/extensions.md deleted file mode 100644 index e313c9549..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/extensions.md +++ /dev/null @@ -1,118 +0,0 @@ -# 扩展程序 - -Flarum 是简约的,同时也是高度可扩展的。 实际上,Flarum 附带的大部分功能都是扩展程序。 - -这种方法使得 Flarum 具有极高的可定制性。 您可以禁用任何您不需要的功能,并安装其他扩展,打造更适合您的社区。 - -如果您想了解更多关于 Flarum 的理念,我们在核心中包含了哪些功能,或者您想制作自己的扩展,请查看我们的 [扩展文档](extend/README.md)。 本文将重点讨论从论坛管理员的角度管理扩展。 - -## Extension Manager - -The extension manager is an extension that comes bundled with Flarum when installed via an archive. It provides a graphical interface for installing and updating both extensions and Flarum itself. - -If you do not have the extension manager installed and you wish to install it, you can do so by running the following command in your Flarum directory: - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -![extension manager admin page](https://github.com/flarum/docs/assets/20267363/d0e1f7a5-e194-4acd-af63-7b8ddd95c26b) - - -## 寻找扩展 - -Flarum 有一个广泛的扩展生态系统,其中大部分是开源和免费的。 要想找到新的超棒的扩展,请访问 Flarum 社区论坛上的 [扩展](https://discuss.flarum.org/t/extensions) 标签。 非官方的 [Extiverse 扩展数据库](https://extiverse.com/) 也是一个好地方。 - -## 安装扩展 - -### Through the interface - -Using the extension manager extension, you can install extensions directly from the admin dashboard. Once you have browsed the list of available extensions from the links above, and found one you want to install, you can install it by entering the extension's composer package name into the extension manager's installation input. - -![Installing an extension](/en/img/install-extension.png) - -### Through the command line - -与 Flarum 一样,扩展是使用 SSH 通过 [Composer](https://getcomposer.org) 安装的。 要安装一个典型的扩展: - -1. `cd` to your Flarum directory. `cd` 到 `composer.json` 所在文件夹。 您可以通过 `ls -la` 查看目录下的文件。 -2. 运行 `composer require COMPOSER_PACKAGE_NAME:*`. 具体安装命令一般可在扩展的文档中找到。 - -## 管理扩展 - -### Through the interface - -Using the extension manager extension, you can update extensions directly from the admin dashboard. You can run a check for updates by clicking the "Check for updates" button in the extension manager. If there are updates available, you can update all extensions by clicking the "Global update" button. Or, you can update individual extensions by clicking the "Update" button next to the extension you want to update. - -![Updating an extension](/en/img/update-extension.png) - -### Through the command line - -按照扩展开发者提供的说明操作。 如果你使用 `*` 作为扩展的版本字符串([如推荐所示](composer.md)),运行[Flarum升级指南](update.md)中列出的命令应该会更新你的所有扩展。 - -## 卸载扩展 - -### Through the interface - -Using the extension manager extension, you can uninstall extensions directly from the admin dashboard. You can uninstall an extension by clicking the "Uninstall" button next to the extension you want to uninstall inside the extension's page. - -![Uninstalling an extension](/en/img/uninstall-extension.png) - -### Through the command line - -类似安装的步骤,若要移除扩展: - -0. 如果你想移除由扩展创建的所有数据库表,请在管理员仪表板中点击"重置"按钮。 更多信息[见下](#managing-extensions)。 -1. `cd` to your Flarum directory. -2. 运行 `composer require COMPOSER_包名`。 具体安装命令一般可在扩展的文档中找到。 - -## 管理扩展 - -Each individual extension page of the admin dashboard provides a convenient way to manage the extension. 您可以: - -- Enable or disable the extension. -- See the settings provided by the extension, and change them. -- 回滚一个扩展的迁移,以删除它所做的任何数据库修改(这可以通过重置按钮来完成)。 这将删除与该扩展相关的所有数据,并且是不可逆的。 只有当你要删除一个扩展程序,并且不打算再次安装它时,才应该这样做。 当然这不是非要做的事情,选择权在您手中。 -- See the extension's README, if it has one. -- See the extension's version. -- Uninstall the extension if the extension manager is installed. - -## Configuring additional extension repository sources - -The extension manager uses `composer` under the hood, and as such, it looks for extension packages in the same places as `composer`. By default, this is [Packagist](https://packagist.org/). However, you can configure additional sources for the extension manager to look for extensions in. This is useful if you want to install an extension that is not available on Packagist. - -In the admin page of the extension manager, clicking the **Add Repository** button will open a modal where you can enter the name and URL of the repository you want to add. The name is just a label for the repository, and can be anything you want. The URL should be the URL of the repository which depends on the type of repository you want to add. - -### Adding a repository from a VCS - -If you want to add a repository from a VCS (e.g. GitHub, GitLab, BitBucket, etc), the URL should be the URL of the repository's VCS. For example, if you had a private GitHub repository at `https://github.com/acme/flarum-extension`, you would enter that URL into the URL field. If it is a private source, you will need to enter an authentication method through the **New authentication method** button. The token can be generated from your VCS provider's website, and the host should be the domain of the VCS provider (e.g. `github.com`). - -### Adding a composer repository - -Extiverse provides access to premium extensions. It is a good example of a composer repository. You would specify the URL as `https://flarum.org/composer/` and the name as `premium`. You would also need to enter an authentication method through the **New authentication method** button. The token can be generated from your Flarum account's [subscriptions](https://flarum.org/dashboard/subscriptions) page with the Instructions button. - -* Type: `HTTP Bearer` -* Host: `flarum.org` - -![Configure repositories](/en/img/config-repositories.png) - -:::info - -The configured repositories and auth methods will be active for both the command line and the admin dashboard. If you configure them from the command line however, you must not include the flag `--global`. - -::: - -## Installing Non-stable extensions - -If for whatever reason you want to install a non-stable extension (e.g. a beta, alpha or RC version) you must first update the **Minimum stability** setting to the wanted stability. - -* If you set it to Alpha, you will be able to install alpha, beta, RC (Release Candidate) and stable versions. -* If you set it to Beta, you will be able to install beta, RC and stable versions. -* If you set it to RC, you will be able to install RC and stable versions. -* If you set it to Stable, you will only be able to install stable versions. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq.md deleted file mode 100644 index 248cfeea8..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq.md +++ /dev/null @@ -1,35 +0,0 @@ -# 常见问题 - -### Flarum 现在是正式版吗? - -是的! 经过 6 年的开发之后,Flarum 1.0.0 最终来了。 - -### 展望未来,下一阶段 Flarum 会做些什么? - -相应的计划还在制定中。 不过我们已经有了很多很多想法,期待届时在社区中分享给大家。 - -### 我可以捐款以加快开发进展吗? - -衷心感谢所有的捐款。 您可以在 [Github Sponsors](https://github.com/sponsors/flarum) 或 [OpenCollective](https://opencollective.com/flarum) 上捐款。 - -但是,捐款并不会直接影响 Flarum 的开发速度。 我们也鼓励用户在其他方面做出贡献,比如 [贡献代码](contributing.md)、[开发扩展](/extend/)、编写文档、将 Flarum 翻译成其他语言,或在 [社区论坛](https://discuss.flarum.org/) 上提供帮助和支持,成为社区里的中坚力量! - -### Flarum 会有****的功能吗? 什么时候有? 为什么还没做呢? - -我们很想让 Flarum 的功能和插件应有尽有、一应俱全,但现阶段,基本功能和稳定性才是重点。 - -### 我可以将 Flarum 与 WordPress/Laravel/等等集成吗? - -同样,答案是「要事先为」。 如果我们还没有解决一个 Issue(或给它分配了一个里程碑),那是因为我们正在处理其他同样重要的事情,所以请耐心等待。 我们会尽量在新版本发布前搞定它。 如果您很着急,可以自行修复它 [并为项目做出贡献](contributing.md)! - -### 我可以将我的论坛迁移到 Flarum 上吗? - -我们目前没有提供官方的迁移工具,但是现在已有很多由社区提供的解决办法。 一旦我们有信心 Flarum 可以用于生产环境,我们将打造从其他论坛软件(例如 esoTalk、FluxBB、phpBB、Discourse等)导入数据的工具。 - -### 我如何加入 Flarum 团队? - -> “通过一个神秘而艰苦的考验,这涉及了神秘的仪式,危机生命的冒险,以及对有去无回的远方世界的探索。” ~ jordanjay29 - -好了,认真地说,我们一般都会留意社区里出类拔萃的成员,他们或许能够成为优秀的员工。 就拿我们目前的多数员工来说,他们现在做的事情与成为正式员工前没有什么两样。 - -因此,找到属于您的激情,并以您觉得最好的方式做出贡献。 然后顺其自然。 在这,没有勋章也能让您受到尊重。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/install.md b/i18n/zh/docusaurus-plugin-content-docs/current/install.md deleted file mode 100644 index 03c919e43..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/install.md +++ /dev/null @@ -1,198 +0,0 @@ -# 安装 - -:::tip 即刻测试 Flarum? - -欢迎前往我们的 [演示站点](https://discuss.flarum.org/d/21101) 试用 Flarum。 您也可以用几秒钟在 [Free Flarum](https://www.freeflarum.com)(一个免费的非官方社区托管服务)建立属于您自己的论坛。 - -::: - -## 环境要求 - -在您安装 Flarum 之前,请确保您的服务器满足以下要求, 以便顺利的安装和运行 Flarum: - -* **Apache**(需要启用 mod\_rewrite 重写模块) 或 **Nginx** -* **PHP 7.3+** 以及以下扩展:curl、dom、fileinfo、gd、json、mbstring、openssl、pdo_mysql、tokenizer、zip -* **MySQL 5.6+** 或 **MariaDB 10.0.5+** -* **SSH (命令行) 访问权限**来运行潜在必要的软件维护命令和 Composer (如果您打算使用命令行来安装和管理 Flarum 扩展) - -## 开始安装 - -### 通过解压缩归档进行安装 - -如果您没有服务器的 SSH 访问权限,或您不想使用命令行,您可以通过解压缩来安装 Flarum。 下面是可用的归档列表,请确保与您的 PHP 版本以及 public 路径偏好 (即是否有 public 路径) 相符。 - -| Flarum 版本 | PHP 版本 | Public 路径 | 格式 | 归档 | -| --------- | ---------- | --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1.x | 8.3 (推荐) | 无 | ZIP | [flarum-v1.x-no-public-dir-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.zip) | -| 1.x | 8.3 (推荐) | 有 | TAR.GZ | [flarum-v1.x-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.tar.gz) | -| 1.x | 8.3 (推荐) | 无 | TAR.GZ | [flarum-v1.x-no-public-dir-php8.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.3.tar.gz) | -| 1.x | 8.3 (推荐) | 有 | ZIP | [flarum-v1.x-php8.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.3.zip) | -| 1.x | 8.2 (推荐) | 无 | TAR.GZ | [flarum-v1.x-no-public-dir-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.tar.gz) | -| 1.x | 8.2 (推荐) | 有 | TAR.GZ | [flarum-v1.x-php8.2.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.tar.gz) | -| 1.x | 8.2 (推荐) | 无 | ZIP | [flarum-v1.x-no-public-dir-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.2.zip) | -| 1.x | 8.2 (推荐) | 有 | ZIP | [flarum-v1.x-php8.2.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.2.zip) | -| 1.x | 8.1 | 无 | TAR.GZ | [flarum-v1.x-no-public-dir-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.tar.gz) | -| 1.x | 8.1 | 有 | TAR.GZ | [flarum-v1.x-php8.1.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.tar.gz) | -| 1.x | 8.1 | 无 | ZIP | [flarum-v1.x-no-public-dir-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.1.zip) | -| 1.x | 8.1 | 有 | ZIP | [flarum-v1.x-php8.1.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.1.zip) | -| 1.x | 8.0 (结束支持) | 无 | TAR.GZ | [flarum-v1.x-no-public-dir-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.tar.gz) | -| 1.x | 8.0 (结束支持) | 有 | TAR.GZ | [flarum-v1.x-php8.0.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.tar.gz) | -| 1.x | 8.0 (结束支持) | 无 | ZIP | [flarum-v1.x-no-public-dir-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php8.0.zip) | -| 1.x | 8.0 (结束支持) | 有 | ZIP | [flarum-v1.x-php8.0.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php8.0.zip) | -| 1.x | 7.4 (结束支持) | 无 | TAR.GZ | [flarum-v1.x-no-public-dir-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.tar.gz) | -| 1.x | 7.4 (结束支持) | 有 | TAR.GZ | [flarum-v1.x-php7.4.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.tar.gz) | -| 1.x | 7.4 (结束支持) | 无 | ZIP | [flarum-v1.x-no-public-dir-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.4.zip) | -| 1.x | 7.4 (结束支持) | 有 | ZIP | [flarum-v1.x-php7.4.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.4.zip) | -| 1.x | 7.3 (结束支持) | 无 | TAR.GZ | [flarum-v1.x-no-public-dir-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.tar.gz) | -| 1.x | 7.3 (结束支持) | 有 | TAR.GZ | [flarum-v1.x-php7.3.tar.gz](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.tar.gz) | -| 1.x | 7.3 (结束支持) | 无 | ZIP | [flarum-v1.x-no-public-dir-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-no-public-dir-php7.3.zip) | -| 1.x | 7.3 (结束支持) | 有 | ZIP | [flarum-v1.x-php7.3.zip](https://github.com/flarum/installation-packages/raw/main/packages/v1.x/flarum-v1.x-php7.3.zip) | - -### 使用命令行安装 - -Flarum 使用 [Composer](https://getcomposer.org) 来管理其依赖包和扩展程序。 在安装 Flarum 之前,您需要先在机器上 [安装 Composer](https://getcomposer.org)。 然后,在要安装 Flarum 的空白目录下执行此命令: - -```bash -composer create-project flarum/flarum:^1.8.0 . -``` - -您可以在命令执行期间配置您的 Web 服务器。 请确保网站根目录(Webroot)设置为 `//public`,并按照下面的说明设置 [URL 重写](#url-rewriting)。 - -当一切就绪后,在浏览器中访问您的论坛网址,根据安装向导完成安装。 - -如果您还想从管理面板安装和升级扩展程序,您还需要安装[扩展程序管理器](extensions.md)扩展。 - -```bash -composer require flarum/extension-manager:"*" -``` - -:::warning - -The extension manager allows an admin user to install any composer package. Only install the extension manager if you trust all of your forum admins with such permissions. - -::: - -## URL 重写 - -### Apache - -Flarum 在 `public` 目录中附带了一个 `.htaccess` 文件,请确保它有正确生成。 **如果没有启用 `mod_rewrite` 模块,或禁用了 `.htaccess`,Flarum 将无法正常运行。 ** 请确认您的主机提供商(或您的 VPS)是否启用了这些功能。 如果您的服务器由您自行管理,您可能需要在您的网站配置中添加以下内容来启用 `.htaccess` 文件: - -``` - - AllowOverride All - -``` - -以上确保了覆盖 htaccess 是被允许的,因此 Flarum 可以正确地重写 URL。 - -启用 `mod_rewrite` 的方法会因操作系统的不同而不同。 在 Ubuntu 上,您可以通过运行 `sudo a2enmod rewrite` 命令来启用它。 而在 CentOS 上 `mod_rewrite` 是默认启用的。 请不要忘记在修改配置后重启 Apache! - -### Nginx - -Flarum 根目录附带了一个 `.nginx.conf` 文件,请确保它有正确生成。 假如您已经在 Nginx 中建立了一个 PHP 站点,您应当在站点配置中添加以下内容,以导入默认的重写规则: - -```nginx -include //.nginx.conf; -``` - -### Caddy - -Caddy 的配置很简单。 您需要将下方代码中的 URL 替换为自己的 URL,并将 path 替换为自己的 `public` 文件夹路径。 如果您使用的是其他版本的 PHP,您还需要修改 `fastcgi` 路径,使其指向正确的 PHP 安装 Socket 或 URL 。 - -``` -www.example.com { - root * /var/www/flarum/public - php_fastcgi unix//var/run/php/php7.4-fpm.sock - header /assets/* { - +Cache-Control "public, must-revalidate, proxy-revalidate" - +Cache-Control "max-age=25000" - Pragma "public" - } - file_server -} -``` -## 目录所有权 - -在安装过程中,Flarum 可能会要求您将某些目录设置为可写。 现代操作系统通常是多用户的,意味着您所登录的用户与Flarum所运行在的用户不同。 Flarum所运行在的用户必须拥有以下文件的读+写权限: - -- 根安装目录,以便Flarum 编辑 `config.php`。 -- `storage` 子目录,以便Flarum 编辑日志并存储缓存数据。 -- `assets` 子目录,以便Logo和头像可以被上传到文件系统。 - -扩展程序可能需要其它目录,所以你可能需要递归地授予整个Flarum 根安装目录的写权限。 - -您需要运行几个命令来设置文件权限。 请注意,如果您在执行一部分安装后没有显示警告,您无需运行其余部分。 - -首先,您需要允许写访问目录。 在 Linux 上: - -```bash -chmod 775 -R /path/to/directory -``` - -如果这还不够,您可能需要检查您的文件所属者是否为正确的群组和用户。 大多数 Linux 发行版,默认 `www-data` 为 PHP 和 Web 服务器所有者和所属组群。 您需要查看您的 distro 和 web 服务器设置的具体细节才能做出确定。 您可以运行下面这条命令来改变大多数 Linux 操作系统中文件夹的所有者。 - -```bash -chown -R www-data:www-data /path/to/directory -``` - -如果您的网页服务器使用了不同的用户/群组,请将 `www-data` 更改为对应的内容。 - -此外,您还需要确保您登录终端的 CLI 用户拥有所有权,这样您就可以通过 CLI 安装扩展并管理 Flarum 安装。 要执行此操作,请使用 `usermod -a -G www-data YOUR_USERNAME` 将当前用户(`whoami`)添加到 web 服务器组(通常为`www-data`)。 您可能需要注销并重新登录才能使此更改生效。 - -最后,如果这不起作用,您可能需要配置 [SELinux](https://www.redhat.com/en/topics/linux/what-is-selinux) 以允许 Web 服务器写入目录。 要执行此操作,请运行: - -```bash -chcon -R -t httpd_sys_rw_content_t /path/to/directory -``` - -要了解有关这些命令以及 Linux 上的文件权限和所有权的更多信息,请阅读 [本教程](https://www.thegeekdiary.com/understanding-basic-file-permissions-and-ownership-in-linux/)。 如果您在 Windows 上设置 Flarum,您可能会发现 [此Super User中的问题](https://superuser.com/questions/106181/equivalent-of-chmod-to-change-file-permissions-in-windows) 的答案有用。 - -:::caution 环境可能不同 - -您的环境可能与提供的文档不同,因此请咨询您的 Web 服务器配置或 Web 托管提供商,了解 PHP 和 Web 服务器运行所需的适当用户和组。 - -::: - -:::danger 永远不要使用 777 权限! - -您永远不应将任何文件夹或文件设置为 `777` 权限,因为此权限级别允许任何人访问文件夹和文件的内容,而无论是哪个用户或组。 - -::: - -## 自定义路径 - -默认情况下,Flarum 的目录结构包含一个 `public` 目录,其中仅包含公开可访问的文件。 这是保证安全的最佳做法,可确保所有敏感代码文件完全不能通过 Web 根路径访问。 - -但是,如果您希望在子目录中托管 Flarum(例如 `yoursite.com/forum`),或者如果您的主机没有让您控制 Web 根目录(只能使用 `public_html` 或 `htdocs` 之类的目录),您可以在没有 `public` 目录的情况下设置 Flarum。 - -如果您打算使用其中一个档案安装 Flarum, 您可以使用 `no-public-dir` (Public 路径=无) [归档](#installing-by-unpacking-an-archive)并跳过本节其余部分。 如果您正在通过 Composer 安装,您需要遵循下面的说明。 - -这种情况下,您需要将 `public` 目录中的所有文件(包括 `.htaccess`)全部移动到要安装 Flarum 的目录中。 然后编辑 `.htaccess` 并取消注释用来保护敏感文件的第 9-15 行代码。 如果是 Nginx,则取消注释 `.nginx.conf` 文件的第 8-11 行。 - -然后编辑 `index.php` 文件,修改这一行: - -```php -$site = require './site.php'; -``` - - 最后,编辑 `site.php` 并更新以下行所指的路径,以翻译新的目录结构: - -```php -'base' => __DIR__, -'public' => __DIR__, -'storage' => __DIR__.'/storage', -``` - -最后,检查 `config.php`,确保 `url` 值是正确的。 - -## 导入数据 - -如果您想用 Flarum 接续运营现有的一个社区,您可以将该论坛的数据导入到 Flarum 中。 虽然目前还没有官方的导入工具,但是社区里已经有人制作了几款非官方的导入工具: - -* [FluxBB](https://discuss.flarum.org/d/3867-fluxbb-to-flarum-migration-tool) -* [MyBB](https://discuss.flarum.org/d/5506-mybb-migrate-script) -* [phpBB](https://discuss.flarum.org/d/1117-phpbb-migrate-script-updated-for-beta-5) -* [SMF2](https://github.com/ItalianSpaceAstronauticsAssociation/smf2_to_flarum) - -这些导入器还可以用于其他论坛软件,方法是首先将它们迁移到phpBB,然后再迁移到Flarum。 需要说明的是,我们不能保证这些工具一直能正常使用,也不能为他们提供支持服务。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/internal/README.md b/i18n/zh/docusaurus-plugin-content-docs/current/internal/README.md deleted file mode 100644 index e70ba1590..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/internal/README.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -slug: '/internal' ---- - -# 团队内部文档 - -这是一个全新的部分,我们将在这里发布一些 Flarum 团队内部使用的文档。 我们开始此部分以向我们的社区提供有关 Flarum 如何运作的透明度,与帮助想要为 Flarum 贡献的人们。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md b/i18n/zh/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md deleted file mode 100644 index 2b300deec..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/internal/bundled-extensions-policy.md +++ /dev/null @@ -1,28 +0,0 @@ -# 捆绑扩展策略 - -本文件旨在协助确定“Flarum”项目小组应将哪些核心特征捆绑起来或加以维护。 - -认识到Flarum的目的是要有一个精干和高效的团队。 To guarantee a transparent workload, we intentionally have a "this could be an extension" mentality. The acronym D.O.R.C. spells out our decision-making process. - -- **Density**: prevent bloating Flarum so that it becomes a burden to install on shared hosting plans with limited space. -- **Opinionatedness**: no extensions should be bundled that is only useful by only a limited amount of communities or on specific hosting environments. -- **Responsibility**: extensions that could easily be maintained by others should be maintained by others. -- **Complexity**: extensions that are complex in terms of design, frontend or backend code should not be a responsibility of the Flarum project team. - -### Density - -To prevent the installation size of Flarum from continuously increasing we need to protect it from extensions that bloat it. We should ship extensions with Flarum that, for instance, have kilobytes in media files. - -### Opinionatedness - -Our goal is to allow installation of Flarum, in its vanilla form, by any community on any hosting environment. This includes shared hosting environment as well. - -Releasing Flarum with extensions that add functionality specific to cloud based (AWS) installations or for corporate support communities, as such, is unwanted. - -### Responsibility - -Protecting the time of the project team is key. To do so we should empower the ecosystem in building extensions that it needs. Therefor we distance ourselves from the responsibility of building every and all extensions. The responsibility of extension development is held primarily by our community. - -### Complexity - -Complex extensions require a vast amount of time, not just for development, but also documentation and support. To protect the lean and efficient principles of the team, we will not take ownership of extensions that add this complexity. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/internal/extension-manager.md b/i18n/zh/docusaurus-plugin-content-docs/current/internal/extension-manager.md deleted file mode 100644 index c6ef1c890..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/internal/extension-manager.md +++ /dev/null @@ -1,87 +0,0 @@ -# Extension Manager -This contains an explanation of how the extension manager works and what it has to offer. - -slightly outdated: see [the extensions guide for more](/extensions.md). - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the extension manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the extension manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Extension Manager Queue Table Preview](/en/img/extension-manager-queue.png) - -## TODO -- Try on shared hosting. -- Better explanation on the UI about background tasks. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/internal/merging-policy.md b/i18n/zh/docusaurus-plugin-content-docs/current/internal/merging-policy.md deleted file mode 100644 index c869da242..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/internal/merging-policy.md +++ /dev/null @@ -1,38 +0,0 @@ -# PR 合并方针 - -对 Flarum 源代码的技术性贡献需要经过审查流程。 多年来,我们依据我们的经验、我们目标明确的开发速度和可得性来调整这一流程。 - -## 什么造就了优秀的 Pull Request? - -优秀的 Pull Requests: - -- 在发起 pull request 时,完整填写 [Pull Request 模板](https://github.com/flarum/.github/blob/main/PULL_REQUEST_TEMPLATE.md)。 -- 不合并不同的更改。 不要修改无关代码的格式,即使它很有吸引力。 专注于你想贡献的单一功能或变更。 -- 有一个相关的已被核心团队认可的技术实行方案的 issue,或者该技术实行方案已经被核心团队通过官方论坛的讨论或类似于 Discord 的其他渠道同意。 -- 清楚地解释此更改的必要性并列出此 pull request 需要讨论的地方。 - -## 执行审查标准 - -- 遵循我们的公约或者可以轻松地在合并后修补,遵循适当的代码风格。 -- 是否有任何实行细节可以通过替代技术/技术办法做得更好? -- 不触及预定更改之外的任何行,例如通过格式化或编译。 -- 如果修改了公共 API 代码,是否有适当的文档部分? - -## 合并时间! - -如果符合所有模板中的检查,**任何**核心开发者都可以合并这个 PR。 如果此 PR 由一名核心开发者编写,他们可能是合并它的人。 - -- 合并: - - GitHub 提供了合并 PR 的几种方式。 在以下策略中选择: - - 当 PR 分支由单个的描述细致的提交组成,并且适合出现在版本列表中,选择 **Merge**。 - - 当积攒了大量提交时,**Squash** 是个好选择。 请务必按照 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) 规范来 squash 提交。 我们通常会在这些预制的提交信息中发现一些来自StyleCI等机器人的提交,他们的提交信息应该被删除。 - -- 在合并之后: - - 将相关的 issue(如果没有,则是 pull request 本身,但绝不是两者同时)分配给适当的里程碑。 - - 关闭所有相关 issue(它们*是否*被全部关闭)。 - - 回归应按此标明,并在合并后从项目板和里程碑中删除。 - - 检查后续任务: - - 合并相关的 PR(语言文件、扩展、文档)。 - - 更新文档。 - - 如有必要,为进一步的后续任务创建一个 issue。 - diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/internal/merging.md b/i18n/zh/docusaurus-plugin-content-docs/current/internal/merging.md deleted file mode 100644 index fc84821c5..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/internal/merging.md +++ /dev/null @@ -1,29 +0,0 @@ -# PR 合并工作流程 - - -## 执行审查标准 - -- Adheres to our conventions or can be patched up easily after merging, follows proper code style. -- Are there any implementation details that could be done better through alternate technologies/technical approaches? -- Does not touch any lines outside of the intended changes, eg through formatting or compilation. -- If the changes are to code intended as a public API, has a proper doc block been included? - -## Merge Time! - -If all of the checks in the template are met, **any** core developer may merge this PR. If the PR is authored by a core developer, they should probably be the ones to merge it. - -- 合并: - - GitHub offers several ways to merge a PR. Choose between the following strategies: - - **Merge** when the PR branch consists of atomic, well-described commits that are nice to have in the version history. - - **Squash** when lots of cleanup commits have accumulated. Please make sure to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) spec for the squash commit. - -- 合并后: - - Make sure the *issue* (if none exists, the PR - but not both) belongs to the appropriate milestone and project board. - - PRs in extensions cannot be assigned to core milestones, so create a core issue that references it and add it to the milestone. - - Close all relevant issues (*if* they are closed completely). - - Regressions should be labeled as such and removed from the project board and milestone after merging. - - Check for follow-up tasks: - - Merge related PRs (language files, extensions, documentations). - - Documentation updates. - - Create issues for further follow-up tasks, if necessary. - diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/internal/package-manager.md b/i18n/zh/docusaurus-plugin-content-docs/current/internal/package-manager.md deleted file mode 100644 index 823599db5..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/internal/package-manager.md +++ /dev/null @@ -1,89 +0,0 @@ -# Package Manager -This contains an explanation of how the package manager works and what it has to offer. - -## Contents -* Installing, Updating, and Removing Extensions. -* [Checking for Updates](#checking-for-updates). -* [Global Flarum Update](#global-flarum-updates). -* [Patch-Minor Flarum Updates](#patch-minor-flarum-updates). -* [Major Flarum Update](#major-flarum-updates). -* [Flarum Updates (global, minor, major)](#flarum-updates-global-minor-major). -* [Background Tasks](#background-tasks). - -## Requirements -There are some obstacles that need to be taken care of before this can be used. - -### File Permissions -The relevant machine web user needs to have permissions to read and write to: `vendor`, `composer.json`, `composer.lock` and `storage`. Right now a warning shows up when this is not the case, this should preferably be changed to mention only the files/dirs where permissions are lacking instead of all of them. - -![flarum lan_admin (3)](https://user-images.githubusercontent.com/20267363/135268536-f79d42ab-6e05-4e41-b2ab-d95ec7a8b021.png) - -### Path Repository -In development environments (and production in rare scenarios) there should a path repository to a directory containing (mostly dev) packages, the path to this directory must be changed to an absolute path otherwise composer will have trouble running any command. Additionally the path repository by default has higher priority, so requiring an extension that exists in that repository will probably fail, unless a `*@dev` constraint is specified, in which case the package manager should not be used for dev purposes anyway. - -There is currently now hint of any of this in the package manager UI. - -## Common Actions -Each one of the features listed above is basically a composer command or two, and there are common actions/common behaviour between them all. - -* Restricting access to the admin. -* Validating the provided package name or the extension id if given. -* Erroring out if installing an existing extension, updating or removing a non existing extension ...etc -* Running the command. This [auto logs the output](#command-output-logging). -* [Erroring out on command failure](#command-failure). -* Dispatching an event. -* If running an update: - + Clear Cache. - + Run Migrations. - + Publish Assets. - + Run an update check, and log any extensions that didn't update to their latest versions in the update process. - -### Command Output Logging -Considering this is still experimental and especially for the sake of easier support, each command output is logged to `storage/logs/composer` just like the flarum error logs, allowing to go back and see what happened during a command execution. - -### Command Failure -When a composer command fails (recognised by the exit code), an exception is thrown containing a reason guessed by the exception based on the command output text. Guessed causes render into proper explanatory alert messages on the frontend. - -## Checking for Updates -This executes the command `composer outdated -D --format json` which checks for updates of packages directly required in the root `composer.json` and outputs the results in JSON format. Only packages marked as `semver-safe-update` and `update-possible` by composer are displayed. - -The information about the last update check is saved into a JSON setting. - -![flarum lan_admin (4)](https://user-images.githubusercontent.com/20267363/135272032-9de37599-b364-4e42-b234-1113135eaa83.png) - -## Global Flarum Updates -Simply runs the command `command update --prefer-dist --no-dev -a --with-all-dependencies`, useful for updating all packages. - -## Patch-Minor Flarum Updates -This changes directly required package versions to `*` and then executes the command `command update --prefer-dist --no-dev -a --with-all-dependencies`. - -![flarum lan_admin (5)](https://user-images.githubusercontent.com/20267363/135276114-ae438c2f-4122-45bd-b32f-690de3b56e25.png) - -## Major Flarum Updates -This changes directly required package versions to `*`, changes core to the latest major version requirement and then executes the same command above. Upon failure, it can be correctly guessed that some extensions are not compatible with the new major version, the exception details will include an array of extension package names that are not compatible, and it'll be rendered in the frontend, with the ability to run a `composer why-not flarum/core 2.0` for more details. - -![major update UI](https://user-images.githubusercontent.com/20267363/143277865-8323fa9a-c80f-4015-baca-fce4d2b5d585.png) - -## Flarum Updates (global, minor, major) -Information about the last updates ran are saved in a `last_update_run` JSON setting, which can contain an array of extension package names that didn't update to their latest version in the process, this is rendered in the frontend as warning icon buttons on the extension items, clicking on them will execute a `composer why-not`, displaying the details of the failure in a modal. - -![UI with list of extensions containing warning icon buttons](https://user-images.githubusercontent.com/20267363/143278774-6fada0da-dead-474b-8dfa-feda5021134f.png) ![UI with the modal showing the details](https://user-images.githubusercontent.com/20267363/143278786-d283db62-de96-4019-954e-932d0d6eac15.png) - -## Background Tasks -To get around timeout issues, composer commands can also run on the background use the queue. Users can be pointed towards [Blomstra's Database Queue Implementation](https://discuss.flarum.org/d/28151-database-queue-the-simplest-queue-even-for-shared-hosting) as a basic queue solution. It contains instructions on how to enable the queue through a cron job. - -:::danger Cron Job PHP Process Version - -It is common for shared hosts to have a low php version used in SSH, users must be pointed to the fact that they have to make sure the php process is of a version compatible with Flarum. Either by manually checking or by asking their hosts. - -::: - -![Package Manager Queue Table Preview](/en/img/package-manager-queue.png) - -## TODO -- Try on shared hosting. -- Composer command job must not overlap. -- Code TODOs. -- Better explanation on the UI about background tasks. -- Take into consideration a scenario where we're updating an extension that isn't a root required dependency, like bundles. -- Run one background task at a time, prevent user from triggering multiple tasks. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/languages.md b/i18n/zh/docusaurus-plugin-content-docs/current/languages.md deleted file mode 100644 index a2e73079b..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/languages.md +++ /dev/null @@ -1,29 +0,0 @@ -# 多语言支持 - -为您的 Flarum 添加新的界面语言很简单。 按照下面的说明,下载并安装语言包即可。 - -在您安装并启用一个语言包后,您可以将其 [设置为您论坛的默认语言](#设置默认语言)。 当您可以 [随时禁用](#禁用语言包) 用不到的语言。 如果您有使用任何第三方扩展,请务必在开始前 [阅读社区扩展说明](#社区扩展)。 - -## 安装语言包 - -欲开始,请访问 Flarum 社区上的 [Extensions > Languages](https://discuss.flarum.org/t/languages) 标签,并找到您想要安装的语言包。 - -语言包的安装方式与 [扩展](extensions.md) 相同。 语言包安装成功后会出现在后台管理界面的 **Extensions(插件)** 页面中,您可以在该页面启用语言包。 - -完成! 您现在应该可以点击论坛顶部导航栏的语言选择器,将界面切换到新语言。 - -## 设置默认语言 - -如果安装的语言包能正常工作,您可能会想要将该语言设置为新用户和访客的默认语言。 您可以在后台管理面板的 **Basics(常规)** 页面中进行设置。 - -## 禁用语言包 - -当您不需要某种语言时,您可以选择关闭该语言。 只需在后台管理面板的 **Extensions(插件)** 页面中找到该语言包,然后将其关闭该语言包。 - -如果您的网站是单语网站,并且不希望语言选择器出现在论坛顶部的导航栏中,您可以禁用其他语言包。 当只有一种语言包处于启用状态时,语言选择器会自动隐藏。 - -## 社区扩展 - -虽然从 Flarum 社区中下载的语言包通常是包含所有 Flarum 原生捆绑扩展的翻译的,但是 _并没有规定说_ 语言包必须翻译了所有您安装的社区扩展。 是否提供、更新维护这些扩展的翻译取决于开发者的个人意愿。 - -因此,在您安装一个社区扩展前,请检查您使用的语言包是否包含了该扩展的翻译。 如果您发现了一个不支持您所需要语言的社区扩展,请直接联系开发者,让他/她添加翻译。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/mail.md b/i18n/zh/docusaurus-plugin-content-docs/current/mail.md deleted file mode 100644 index 8e9142def..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/mail.md +++ /dev/null @@ -1,29 +0,0 @@ -# 电子邮件配置 - -社区需要发送邮箱验证、密码重置、消息,以及其他与用户交流的邮件。 作为论坛管理员,您首先要做的几件事之一就是配置好论坛的邮件服务! 配置错误的话,用户在注册时会收到报错。 - -## 支持的邮件驱动 - -Flarum 默认提供以下所列驱动。 若有需要,开发者可自行开发插件添加 [自定义邮件驱动](extend/mail.md)。 - -### SMTP - -这是最常用的邮件驱动,需要您配置主机地址、端口、加密方式、用户名和密码,以使用外部 SMTP 服务。 请注意,加密方式必须为小写的 `ssl` 或 `tls`。 - -### Mail - -`mail` 会用到许多托管服务器上都有的 sendmail / postfix 邮件系统。 您必须在服务器上正确安装并配置好 sendmail 才能正常工作。 - -### Mailgun - -通过您的 [Mailgun](https://www.mailgun.com/) 来发送邮件。 您需要填写 secret key,以及您在 Mailgun 配置的域名、区域。 - -要使用 Mailgun 驱动,您需要安装 Guzzle composer 包 (一个 PHP HTTP 客户端)。 在您的 Flarum 根目录下运行 `composer require guzzlehttp/guzzle:^6.0|^7.0` 。 - -### Log - -邮件驱动 log 不会发送邮件,主要由开发者使用。 它会在在`FLARUM_ROOT_DIRECTORY/storage/logs`中的日志文件写入所有邮件的内容。 - -## 测试邮件 - -在您保存邮件配置后,您可以在后台管理面板的邮件配置页面点击「发送测试邮件」发送一封邮件以检测您的配置是否可用。 如果提示错误,或者您没有收到测试邮件,那就意味着配置有误,请检查配置然后重试。 如果没有任何报错,邮件也发送出去了,但是您在收件箱中找不到测试邮件,请去垃圾箱看看,它很可能在那边。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/permissions.md b/i18n/zh/docusaurus-plugin-content-docs/current/permissions.md deleted file mode 100644 index d6bdbde2d..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/permissions.md +++ /dev/null @@ -1,3 +0,0 @@ -# 权限 -此页面正在建设中。 -This page is under construction. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/releases.md b/i18n/zh/docusaurus-plugin-content-docs/current/releases.md deleted file mode 100644 index 7ad40e57f..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/releases.md +++ /dev/null @@ -1,15 +0,0 @@ -# 发布说明 - - - - -发布说明可以在 [Flarum 社区](https://discuss.flarum.org/t/blog?sort=newest) 找到。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/rest-api.md b/i18n/zh/docusaurus-plugin-content-docs/current/rest-api.md deleted file mode 100644 index 93e96582c..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/rest-api.md +++ /dev/null @@ -1,375 +0,0 @@ -# 使用 REST API - -Flarum 提供了 REST API,它不仅被我们的单页应用使用着,也可供外部程序调用。 - -我们的 API 采用 [JSON:API](https://jsonapi.org/) 规范定义的最佳实践。 - -:::info - -若要扩展 REST API 以实现新的应用,请查看开发者文档《[API 与数据流](extend/api.md)》。 - -::: - -## 身份验证 - -我们的单页应用使用会话 Cookies 进行 API 的身份验证。 外部程序可使用 [API 密钥](#api-keys) 或 [访问令牌](#access-tokens) 的无状态身份验证。 - -`GET` 端点无需身份验证即可使用, 但此时只会返回游客可见的内容。 为防止 [CSRF 攻击](#csrf-protection),其他端点均需身份验证方可使用。 - -### API 密钥 - -脚本、工具与集成应用和 Flarum 的交互应当采用 API 秘钥作为首选方案。 - -#### 创建 - -目前没有用于管理 API 密钥的操作界面,您只能在数据库 `api_keys` 表中手动创建。 - -以下参数可在创建时提供: - -- `key`:秘钥。您需要自行生成一个独一无二的长字符串(推荐长度 40 的字母数字组合),秘钥将作为 `Authorization` 请求头的值。 -- `user_id`:用户 ID,可选项。 如果设置了此值,秘钥会被充当为指定的用户。 - -以下属性会被自动填充,部分作为保留字段尚未使用: - -- `id`:主键。由 MySQL 自动递增填写。 -- `allowed_ips`:IP 白名单。保留字段,尚未使用。 -- `scopes`:范围。保留字段,尚未使用。 -- `created_at`:创建时间。虽然可设置任意日期值,但理应表示秘钥的创建日期。 -- `last_activity_at`:上次使用时间。秘钥被使用时自动更新。 - -#### 使用 - -发起 API 请求时,将秘钥添加到 `Authorization` 请求头即可。 如需指定扮演用户角色,可在请求头末尾添加。 - - Authorization: Token 你的_API_秘钥_值; userId=1 - -如果在数据库中为密钥设置了 `user_id` 值,请求头中的 `userId=` 将被忽略。 否则,任何有效的用户 ID 都可起作用。 - -### 访问令牌 - -访问令牌(Access Tokens)是基于用户的短效令牌。 - -这些令牌用于 Cookie 会话, 使用他们与常规会话别无二致。 用户的上次在线时间会随访问令牌的使用而更新。 - -#### 创建 - -所有用户均可创建访问令牌。 要创建令牌,请使用 `/api/token` 端点并提供用户凭证: - -``` -POST /api/token HTTP/1.1 - -{ - "identification": "张三", - "password": "张三的密码" -} - -HTTP/1.1 200 OK - -{ - "token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX", - "userId": "1" -} -``` - -我们目前存在 3 种令牌类型,其中 2 种可以通过 REST API 创建。 - -- `session` 令牌在 1 小时没有活动后即会过期。 这是默认的令牌类型。 -- `session_remember` 令牌在 5 年没有活动后即会过期。 在请求体中添加 `remember=1` 属性即可获取这种令牌。 -- `developer` 令牌永不过期。 目前只可通过数据库手动创建这种令牌。 - -**所有令牌将在用户注销时一并失效**(包括 `developer` 令牌,不过我们计划改变这种状况)。 - -#### 使用 - -发起 API 请求时,将上一步取得的 `token` 添加到 `Authorization` 请求头即可: - - Authorization: Token YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX - -### CSRF 保护 - -多数 `POST`/`PUT`/`DELETE` API 端点都有 [跨站请求伪造](https://en.wikipedia.org/wiki/Cross-site_request_forgery)(Cross-site request forgery,缩写 CSRF)保护功能。 因此,要发出无状态请求,必须进行身份验证。 - -使用 API 密钥或访问令牌时,可跳过 CSRF 保护。 - -## 端点 - -这部分文档仍在编写中。 我们正在研究如何为端点实现自动化文档。 - -每个扩展程序都可自行添加新的端点和属性,因此提供涵盖所有端点的文档。 若要查看端点,您可以使用浏览器的开发者工具检查单页应用发起的请求。 - -下面是一些常用接口的示例。 为方便阅读,部分 JSON 字段已略去。 - -### 列出全部主题帖 - - GET /api/discussions - -```json -{ - "links": { - "first": "https://flarum.tld/api/discussions", - "next": "https://flarum.tld/api/discussions?page%5Boffset%5D=20" - }, - "data": [ - { - "type": "discussions", - "id": "227", - "attributes": { - "title": "出师表", - "slug": "227-chu-shi-biao", - "commentCount": 10, - "participantCount": 3, - "createdAt": "0227-01-01T00:10:30+08:00", - "lastPostedAt": "0227-01-05T00:10:30+08:00", - "lastPostNumber": 10, - "canReply": true, - "canRename": true, - "canDelete": true, - "canHide": true, - "isHidden": true, - "hiddenAt": "0227-01-01T00:10:30+08:00", - "lastReadAt": "0227-01-01T00:10:30+08:00", - "lastReadPostNumber": 2, - "isApproved": true, - "canTag": true, - "isLocked": false, - "canLock": true, - "isSticky": false, - "canSticky": true, - "canMerge": true, - "subscription": null - }, - "relationships": { - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - "lastPostedUser": { - "data": { - "type": "users", - "id": "64" - } - }, - "tags": { - "data": [ - { - "type": "tags", - "id": "3" - } - ] - }, - "firstPost": { - "data": { - "type": "posts", - "id": "668" - } - } - } - }, - { - "type": "discussions", - "id": "234", - "attributes": { - // [...] - }, - "relationships": { - // [...] - } - }, - // [...] 更多主题 - ], - "included": [ - { - "type": "users", - "id": "1", - "attributes": { - "username": "Zhugeliang", - "displayName": "诸葛亮", - "avatarUrl": null, - "slug": "1" - } - }, - { - "type": "users", - "id": "64", - "attributes": { - "username": "Flarum", - "displayName": "Flarum", - "avatarUrl": "https://flarum.tld/assets/avatars/Z4hEncw0ndVqZ8be.png", - "slug": "64" - } - }, - { - "type": "tags", - "id": "3", - "attributes": { - "name": "欢迎", - "description": "在这里发送一些有趣的玩意儿", - "slug": "welcome", - "color": "#888", - "backgroundUrl": null, - "backgroundMode": null, - "icon": "fas fa-bullhorn", - "discussionCount": 30, - "position": 1, - "defaultSort": null, - "isChild": false, - "isHidden": false, - "lastPostedAt": "2022-01-05T10:20:30+00:00", - "canStartDiscussion": true, - "canAddToDiscussion": true, - "isRestricted": false - } - }, - { - "type": "posts", - "id": "668", - "attributes": { - "number": 1, - "createdAt": "2022-01-01T10:20:30+00:00", - "contentType": "comment", - "contentHtml": "

你好,世界!

" - } - }, - // [...] 其他包含内容 - ] -} -``` - -### 发布主题 - - POST /api/discussions - -```json -{ - "data":{ - "type": "discussions", - "attributes": { - "title": "这里是标题", - "content": "你好,世界!" - }, - "relationships": { - "tags": { - "data": [ - { - "type": "tags", - "id": "1" - } - ] - } - } - } -} -``` - -服务器响应含有新主题的 ID: - -```json -{ - "data": { - "type": "discussions", - "id": "42", - "attributes": { - "title": "这里是标题", - "slug": "42-gu-ding-lian-jie", - "commentCount": 1 - // [...] 其他属性 - }, - "relationships": { - "posts": { - "data": [ - { - "type": "posts", - "id": "58" - } - ] - }, - "user": { - "data": { - "type": "users", - "id": "1" - } - }, - // [...] 其他关联内容 - } - }, - "included":[ - { - "type": "posts", - "id": "38", - "attributes": { - "number": 1, - "contentType": "comment", - "contentHtml": "\u003Cp\u003E你好,世界!\u003C\/p\u003E" - // [...] 其他属性 - } - } - // [...] 其他包含内容 - ] -} -``` - -### 注册用户 - - POST /api/users - -```json -{ - "data": { - "attributes": { - "username": "YongHuMing", - "email": "flarum@example.com", - "password": "MiMa" - } - } -} -``` - -## 错误 - -Flarum 使用不同的 HTTP 状态码进行错误应答,所有错误表述均符合 [JSON:API 错误规范](https://jsonapi.org/format/#errors)。 - -下面是您使用 REST API 时可能遇到的一些常见错误: - -### CSRF 令牌不匹配 - -如果您收到了消息为 `csrf_token_mismatch` 的 400 HTTP 错误,这意味着 `Authorization` 请求头缺失或无效,导致 Flarum 尝试通过会话 Cookie 进行身份验证。 - -```json -{ - "errors": [ - { - "status": "400", - "code": "csrf_token_mismatch" - } - ] -} -``` - -### 验证错误 - -验证错误会返回一个 HTTP 状态码 422 的响应。 无效字段的名称会以 `pointer` 值返回。 在同一时间,单个字段可能出现多个错误。 - -```json -{ - "errors": [ - { - "status": "422", - "code": "validation_error", - "detail": "The username has already been taken.", // 用户名已被使用 - "source":{ - "pointer":"\/data\/attributes\/username" - } - }, - { - "status": "422", - "code": "validation_error", - "detail": "The email has already been taken.", // 邮箱地址已被使用 - "source": { - "pointer":"\/data\/attributes\/email" - } - } - ] -} -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/scheduler.md b/i18n/zh/docusaurus-plugin-content-docs/current/scheduler.md deleted file mode 100644 index 1a0b24913..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/scheduler.md +++ /dev/null @@ -1,55 +0,0 @@ -# 调度器 - -Flarum的调度器让扩展程序能够轻松地自动化某些任务。 在本指南中,我们将介绍如何设置它。 我们不会深入讨论cron本身的细节,但如果你想进一步了解它,我建议你查看[Wikipedia上关于cron的文章](https://en.wikipedia.org/wiki/Cron)。 - -## 为什么我要关心? - -很简单,现在有越来越多的扩展程序支持在后台自动为你处理某些功能。 想知道为什么`fof/drafts`的“定时发布”没有发布,抑或是`fof/best-answer`的“在X天后提醒用户设置最佳答案”功能没有被触发吗? 那是因为它们会自动用调度器服务来配置自己,但这一切配置的前提是一行简短的cron任务。 - -## 有什么扩展程序现在在使用调度器? - -最火的一些例子如下: - -- [FoF Best Answer](https://github.com/FriendsOfFlarum/best-answer) -- [FoF Drafts](https://github.com/FriendsOfFlarum/drafts) -- [FoF Sitemap](https://github.com/FriendsOfFlarum/sitemap) -- [FoF Open Collective](https://github.com/FriendsOfFlarum/open-collective) -- [FoF Github Sponsors](https://github.com/FriendsOfFlarum/github-sponsors) - -## 让我们配置起来! - -几乎所有(全部)Linux发行版本都自带或可以安装cron。 例如,在基于Debian和Ubuntu的系统上,你可以这样安装`cron`: - -``` -sudo apt-get update -sudo apt-get install cron -``` - -如果你使用的是基于RHEL的Linux发行版(如CentOS、AlmaLinux、Rocky Linux等),可以这样安装cron: - -``` -sudo dnf update -sudo dnf install crontabs -``` - -安装好了cron,让我们创建Flarum所需的唯一定时条目: - -``` -crontab -e -``` - -这将打开 cron 编辑器。 你或许会有其他 cron 条目,但没关系。 添加以下这行,并记住在底部留一个空行。 - -``` -* * * * * cd /path-to-your-project && php flarum schedule:run >> /dev/null 2>&1 -``` - -`* * * * *` 会告诉 cron 每分钟都来运行你的命令。 - -如果你想修改触发时间,但不确切知道 cron 表达式是如何工作的,你可以使用[cron表达式生成器](https://crontab.guru)来轻松获取所需的命令。 - -`cd /path-to-your-project && php flarum schedule:run` 这行代码将执行Flarum的调度器以触发当前所有等待运行的任务。 如果PHP不在你的系统路径中,你可能需要尝试设置PHP的完整路径。 - -最后,`>> /dev/null 2>&1` 抑制了命令的所有输出。 - -瞧! 现在任何注册了定时任务的扩展程序,从每分钟到每天、每月、每年,都将自动在你的服务器上运行。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/tags.md b/i18n/zh/docusaurus-plugin-content-docs/current/tags.md deleted file mode 100644 index cba515c89..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/tags.md +++ /dev/null @@ -1,3 +0,0 @@ -# 分类目录和标签 -此页面正在建设中。 -This page is under construction. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/themes.md b/i18n/zh/docusaurus-plugin-content-docs/current/themes.md deleted file mode 100644 index 318e55c86..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/themes.md +++ /dev/null @@ -1,29 +0,0 @@ -# 样式主题 - -尽管我们一直在努力使 Flarum 变得尽可能美丽,但每个社区可能都希望进行一些调整/修改,以适合他们所需的风格。 - -## 管理面板 - -[管理面板](admin.md) 的「外观」页面是自定义论坛的绝佳起点。 在这里,您可以: - -- 选择主题颜色 -- 切换夜间模式和彩色导航栏。 -- 上传标志和站点图标(浏览器标签中显示的图标)。 -- 在自定义页眉和页脚添加 HTML。 -- 添加 [自定义LESS/CSS](#css-主题) 来改变元素的显示方式。 - -## CSS 主题 - -CSS 是一种样式表语言,它告诉浏览器如何显示网页的元素。 它允许我们修改所有的东西,从颜色到字体到元素的大小,从定位到动画等等。 添加自定义 CSS 是修改您的 Flarum 默认主题的好方法。 - -CSS 教程不在本文档的讨论范围之内,但是有大量的优质在线资源可供您学习 CSS 的基础知识。 - -:::tip - -Flarum 其实使用了 LESS,它支持变量、条件和函数,可以让您更轻松地编写 CSS。 - -::: - -## 扩展 - -Flarum 灵活的 [扩展系统](extensions.md) 允许您添加、删除或修改 Flarum 的任何部分。 如果您想做实质性的主题修改,除了改变颜色/大小/样式之外,一个自定义的扩展绝对是您的最佳选择。 要学习如何制作扩展,请查看我们的 [扩展文档](extension/README.md)! diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/troubleshoot.md b/i18n/zh/docusaurus-plugin-content-docs/current/troubleshoot.md deleted file mode 100644 index c660d9f53..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/troubleshoot.md +++ /dev/null @@ -1,56 +0,0 @@ -# 故障排查 - -如果 Flarum 没有按照预期那样安装或工作,您 *首先应该检查* 服务器环境是否符合 [系统要求](install.md#环境要求)。 如果您缺少一些 Flarum 运行所需的东西,请先补全内容。 - -然后,请花几分钟时间搜索 [支持论坛](https://discuss.flarum.org/t/support)和 [问题跟踪器](https://github.com/flarum/core/issues),有可能该问题已被报告,并且有了解决办法。 有可能已经有人报告了该问题,而且修复方案已经可用或正在开发中。 如果您彻底搜索后,仍然没有找到任何有用的信息,那么就可以开始排查故障了。 - -## 步骤 0:开启调试模式 - -:::danger 在生产环境下跳过 - -这些调试工具非常有用,但可能会暴露不应公开的信息。 如果你在暂存或开发环境中,这些是可以的。但是如果你不知道你在做什么,那么请在生产环境中跳过这个步骤。 - -::: - -在继续前,您应当启用 Flarum 的调试模式。 用文本编辑器打开 **config.php**,将 `debug` 的值改为 `true`,然后保存文件即可。 开启后,Flarum 会显示详细的错误报告,方便您了解到底发生了什么。 - -如果上面的改动不起任何作用,并且论坛所有页面都变成空白,请试试将 **php.ini** 文件中的 `display_errors` 设置为 `On`。 - -## 步骤 1:常见问题修复 - -很多问题都可通过以下解决: - -* 清除浏览器缓存。 -* 使用 [`php flarum cache:clear`](console.md) 清除后端缓存。 -* 确保以使用 [`php flarum migrate`](console.md) 更新数据库。 -* 确保 [邮箱配置](mail.md) 可用:无效的邮箱配置将导致注册、重置密码、更换用户绑定邮箱以及发送通知时产生错误。 -* 检查 `config.php` 配置是否正确,请确保您使用了正确的 `url`。 例如,请确保正在使用正确的 `URL`(`https` 与 `http` 或大小写敏感之类的,这很重要!) -* 罪魁祸首还可能是自定义页眉、自定义页脚或自定义 LESS。 如果你的问题在前端,请尝试通过删除管理员仪表板中外观页面的设置。 - -您也得看看 [`php flarum info`](console.md) 的输出,以确保没有什么大的问题。 - -## 步骤 2:问题重现 - -请尝试让问题重现。 注意问题发生时,您在做什么? 是每次都会出现问题,还是仅偶尔出现? 尝试调整您觉得可能影响问题出现的设置或参数,或者改变您的操作顺序看看。 问题是否在某些情况下会出现,而在某些情况下又不会出现? - -如果您最近安装或更新了一个扩展程序,请暂时禁用它,然后看看问题有没有消失。 请确保您启用的所有扩展程序兼容您使用的 Flarum 版本。 过时的扩展会导致各种各样的问题。 - -在这个过程中,您可能会发现导致问题的原因,并找到了解决办法。 即便没有,您也可能会得到一些有价值的线索,您最好在报告中填写好这些信息,这将帮助我们弄清楚出了什么问题。 - -## 步骤 3:收集信息 - -如果您无法解决问题,需要他人的帮助,那么就是时候认真收集数据了。 请从这些地方搜集相关报错内容或其他与问题有关的信息: - -* 论坛页面上显示的报错 -* 浏览器控制台中显示的报错(Chrome:更多工具 -> 开发者工具 -> Console) -* 服务器错误日志中记录的内容(例如:`/var/log/nginx/error.log`) -* PHP-FPM 错误日志中记录的内容(例如:`/var/log/php7.x-fpm.log`) -* Flarum 日志记录的报错(`storage/logs/flarum.log`) - -将收集到的所有信息复制到记事本中,整理好并做一些注解,比如错误是 *何时* 发生的、当错误发生时您在 *做什么*、您探索出来的问题发生和不发生的条件。 请务必附加上你已经知道的关于问题复现条件的信息。 请尽可能详尽地提供服务器环境信息,如操作系统版本、Web 服务器版本、PHP 版本和处理程序等。 - -## 步骤 4:准备报告 - -竭尽所能收集相关问题的所有信息后,您就可以提交错误报告了。 提交时请遵循 [提交 Bug](bugs.md) 的有关说明。 - -如果您在提交报告后有发现新的情况,请添加到您的原始帖子底部。 倘若您已经自行解决了问题,也最好提交一份报告,说不定能帮助到遇到同样问题的其他用户。 如果您找到了临时的解决办法,也请告诉我们。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/update.md b/i18n/zh/docusaurus-plugin-content-docs/current/update.md deleted file mode 100644 index 713ac769f..000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/update.md +++ /dev/null @@ -1,110 +0,0 @@ -# 更新 - -## From the Admin Dashboard - -:::info - -If you have the extension manager extension installed you can simply run the update from its interface and skip this page entirely. - -::: - ---- - -您需要使用 [Composer](https://getcomposer.org) 来更新 Flarum。 如果你不熟悉它(尽管你应该是熟悉的,因为你需要它来安装Flarum),阅读 [我们的指南](composer.md) 了解它是什么以及如何设置它。 - -如果跨主要版本进行更新(如 <=0.1.0 to 1.x.x, 1.x.x 到 2.x.x.x, ... ),请确保在运行一般升级步骤之前阅读相应的“主要版本更新指南”。 - -## 一般步骤 - -**第1步:**确保你所有的扩展程序的版本与你要安装的Flarum版本兼容。 这只在主要版本之间需要(例如,如果从v1.0.0升级到v1.1.0,你可能不需要检查这个,假设你使用的扩展遵循建议的版本划分)。 你可以通过查看扩展的[讨论贴](https://discuss.flarum.org/t/extensions),在[Packagist](http://packagist.org/)上搜索它,或者查看[Extiverse](https://extiverse.com)等数据库来检查。 在更新之前,您需要删除(不仅仅禁用) 任何不兼容的扩展。 请耐心等待扩展开发者更新! - -**第2步:** 查看您的 `composer.json` 文件。 除非您有理由要求特定版本的扩展或库; 您应该将除 `flarum/core` 以外的所有版本字符串设置为 `*` (包括 `flarum/tags`, `flarum/mention`和其他捆绑的扩展)。 但请确认 `flarum/core` 未设置为 `*`。 如果你针对的是特定版本的Flarum, 请设置 `flarum/core` 为指定版本(例如, `"flarum/core": "v0.1.0-bet.16`)。 如果你只想要最新的版本,请使用 `"flarum/core": "^1.0"`。 - -**第 3步:** 如果您使用 [本地扩展](extenders.md),请确保它们更新到最新的 Flarum 中的变更。 - -**第 4 步:** 我们建议在更新之前在管理面板禁用第三方扩展。 这不是严格需要的,但如果您遇到问题,将更容易调试问题。 - -**第 5步:** 请确保您的 PHP 版本被您正在尝试升级到 Flarum 的版本所支持。 并且你正在使用Composer 2(`composer --version)` - -**步骤6:** 最后更新,运行: - -``` -composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies -php flarum migrate -php flarum cache:clear -``` - -**步骤7:** 如果可以,请重启您的 PHP 进程和opcache。 - -## 主要版本更新指南 - -### 从 Beta (<= 0.1.0) 更新到 Stable v1 (^1.0.0) - -1. 执行上文步骤1-5。 -2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. -3. Change `flarum/core`'s version string in `composer.json` from `^0.1.0` to `^1.0`. -4. Remove the `"minimum-stability": "beta",` line from your `composer.json` -5. Do steps 6 and 7 above. - -## 故障排除 - -Flarum 正处于测试阶段,有关如何更新的说明将在每次 [版本发布公告](https://discuss.flarum.org/t/blog?sort=newest)中公示。 - -### 更新时出错 - -这里我们将会处理尝试更新 Flarum 时出现的几种常见问题。 - ---- - -如果输出较短且包含: - -``` -Nothing to modify in lock file -``` - -Or does not list `flarum/core` as an updated package, and you are not on the latest flarum version: - -- Revisit step 2 above, make sure that all third party extensions have an asterisk for their version string. -- Make sure your `flarum/core` version requirement isn't locked to a specific minor version (e.g. `v0.1.0-beta.16` is locked, `^1.0.0` isn't). If you're trying to update across major versions of Flarum, follow the related major version update guide above. - ---- - -For other errors, try running `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO` - -如果输出看起来像这样: - -``` -flarum/flarum - requires flarum/core (v0.1.0-beta.15) -fof/moderator-notes 0.4.4 requires flarum/core (>=0.1.0-beta.15 <0.1.0-beta.16) -jordanjay29/flarum-ext-summaries 0.3.2 requires flarum/core (>=0.1.0-beta.14 <0.1.0-beta.16) -flarum/core v0.1.0-beta.16 requires dflydev/fig-cookies (^3.0.0) -flarum/flarum - does not require dflydev/fig-cookies (but v2.0.3 is installed) -flarum/core v0.1.0-beta.16 requires franzl/whoops-middleware (^2.0.0) -flarum/flarum - does not require franzl/whoops-middleware (but 0.4.1 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/bus (^8.0) -flarum/flarum - does not require illuminate/bus (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/cache (^8.0) -flarum/flarum - does not require illuminate/cache (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/config (^8.0) -flarum/flarum - does not require illuminate/config (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/container (^8.0) -flarum/flarum - does not require illuminate/container (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/contracts (^8.0) -flarum/flarum - does not require illuminate/contracts (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/database (^8.0) -flarum/flarum - does not require illuminate/database (but v6.20.19 is installed) -flarum/core v0.1.0-beta.16 requires illuminate/events (^8.0) -flarum/flarum - does not require illuminate/events (but v6.20.19 is installed) -... (this'll go on for a bit) -``` - -It is very likely that some of your extensions have not yet been updated. - -- Revisit step 1 again, make sure all your extensions have versions compatible with the core version you want to upgrade to. Remove any that don't. -- Make sure you're running `composer update` with all the flags specified in the update step. - -If none of this fixes your issue, feel free to reach out on our [Support forum](https://discuss.flarum.org/t/support). Make sure to include the output of `php flarum info` and `composer why-not flarum/core VERSION_YOU_WANT_TO_UPGRADE_TO`. - -### Errors After Updating - -如果您在更新后无法访问您的论坛,请遵循我们的 [故障排除说明](troubleshoot.md)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md b/i18n/zh/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md index 0ff695c4e..0a54dcd06 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md +++ b/i18n/zh/docusaurus-plugin-content-docs/version-1.x/extend/notifications.md @@ -305,7 +305,7 @@ export default class NewPostNotification extends Notification { } ``` -In the example, the icon is a star, the link will go to the new post, and the content will say that "{user} posted". +In the example, the icon is a star, the link will go to the new post, and the content will say that "`{user}` posted". Next, we need to tell Flarum that the notification you send in the backend corresponds to the frontend notification we just created. diff --git a/i18n/zh/docusaurus-plugin-content-docs/version-1.x/update.md b/i18n/zh/docusaurus-plugin-content-docs/version-1.x/update.md index 713ac769f..fc97a770c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/version-1.x/update.md +++ b/i18n/zh/docusaurus-plugin-content-docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd 您需要使用 [Composer](https://getcomposer.org) 来更新 Flarum。 如果你不熟悉它(尽管你应该是熟悉的,因为你需要它来安装Flarum),阅读 [我们的指南](composer.md) 了解它是什么以及如何设置它。 -如果跨主要版本进行更新(如 <=0.1.0 to 1.x.x, 1.x.x 到 2.x.x.x, ... ),请确保在运行一般升级步骤之前阅读相应的“主要版本更新指南”。 +如果跨主要版本进行更新(如 `<=0.1.0` to 1.x.x, 1.x.x 到 2.x.x.x, ... ),请确保在运行一般升级步骤之前阅读相应的“主要版本更新指南”。 ## 一般步骤 @@ -38,7 +38,7 @@ php flarum cache:clear ## 主要版本更新指南 -### 从 Beta (<= 0.1.0) 更新到 Stable v1 (^1.0.0) +### 从 Beta (`<= 0.1.0`) 更新到 Stable v1 (^1.0.0) 1. 执行上文步骤1-5。 2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index dc02a2d4a..000000000 --- a/package-lock.json +++ /dev/null @@ -1,15409 +0,0 @@ -{ - "name": "flarum-docs", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "flarum-docs", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "^2.3.1", - "@docusaurus/preset-classic": "^2.3.1", - "@docusaurus/theme-search-algolia": "^2.3.1", - "@mdx-js/react": "^1.6.21", - "@svgr/webpack": "^5.5.0", - "clsx": "^1.1.1", - "file-loader": "^6.2.0", - "prism-react-renderer": "^1.2.1", - "react": "^17.0.1", - "react-dom": "^17.0.1", - "url-loader": "^4.1.1" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==", - "license": "MIT" - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz", - "integrity": "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.14.3" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz", - "integrity": "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==", - "license": "MIT" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz", - "integrity": "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.14.3" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz", - "integrity": "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz", - "integrity": "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.53.0.tgz", - "integrity": "sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz", - "integrity": "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz", - "integrity": "sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.53.0", - "@algolia/requester-browser-xhr": "5.53.0", - "@algolia/requester-fetch": "5.53.0", - "@algolia/requester-node-http": "5.53.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" - }, - "node_modules/@algolia/logger-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz", - "integrity": "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==", - "license": "MIT" - }, - "node_modules/@algolia/logger-console": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz", - "integrity": "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==", - "license": "MIT", - "dependencies": { - "@algolia/logger-common": "4.14.3" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.53.0.tgz", - "integrity": "sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.53.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz", - "integrity": "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==", - "license": "MIT" - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.53.0.tgz", - "integrity": "sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.53.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.53.0.tgz", - "integrity": "sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.53.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz", - "integrity": "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/requester-common": "4.14.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz", - "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", - "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz", - "integrity": "sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", - "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-typescript": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", - "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==", - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", - "algoliasearch": "^4.0.0" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.3.1.tgz", - "integrity": "sha512-0Jd4jtizqnRAr7svWaBbbrCCN8mzBNd2xFLoT/IM7bGfFie5y58oz97KzXliwiLY3zWjqMXjQcuP1a5VgCv2JA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@babel/runtime": "^7.18.6", - "@babel/runtime-corejs3": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.7", - "babel-loader": "^8.2.5", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.0", - "cli-table3": "^0.6.2", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.23.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "del": "^6.1.1", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^2.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "html-minifier-terser": "^6.1.0", - "html-tags": "^3.2.0", - "html-webpack-plugin": "^5.5.0", - "import-fresh": "^3.3.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.1", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.0", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.3", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.3", - "rtl-detect": "^1.0.4", - "semver": "^7.3.7", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.3", - "tslib": "^2.4.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^6.0.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.3", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@docusaurus/core/node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/core/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/@docusaurus/core/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/@docusaurus/core/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@docusaurus/core/node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.3.1.tgz", - "integrity": "sha512-7mIhAROES6CY1GmCjR4CZkUfjTL6B3u6rKHK0ChQl2d1IevYXq/k/vFgvOrJfcKxiObpMnE9+X6R2Wt1KqxC6w==", - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^5.3.8", - "postcss": "^8.4.14", - "postcss-sort-media-queries": "^4.2.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/logger": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.3.1.tgz", - "integrity": "sha512-2lAV/olKKVr9qJhfHFCaqBIl8FgYjbUFwgUnX76+cULwQYss+42ZQ3grHGFvI0ocN2X55WcYe64ellQXz7suqg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.3.1.tgz", - "integrity": "sha512-Gzga7OsxQRpt3392K9lv/bW4jGppdLFJh3luKRknCKSAaZrmVkOQv2gvCn8LAOSZ3uRg5No7AgYs/vpL8K94lA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.18.8", - "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@mdx-js/mdx": "^1.6.22", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "image-size": "^1.0.1", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.2.0", - "stringify-object": "^3.3.0", - "tslib": "^2.4.0", - "unified": "^9.2.2", - "unist-util-visit": "^2.0.3", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.3.1.tgz", - "integrity": "sha512-6KkxfAVOJqIUynTRb/tphYCl+co3cP0PlHiMDbi+SzmYxMdgIrwYqH9yAnGSDoN6Jk2ZE/JY/Azs/8LPgKP48A==", - "license": "MIT", - "dependencies": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.3.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.3.1.tgz", - "integrity": "sha512-f5LjqX+9WkiLyGiQ41x/KGSJ/9bOjSD8lsVhPvYeUYHCtYpuiDKfhZE07O4EqpHkBx4NQdtQDbp+aptgHSTuiw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "tslib": "^2.4.0", - "unist-util-visit": "^2.0.3", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.3.1.tgz", - "integrity": "sha512-DxztTOBEruv7qFxqUtbsqXeNcHqcVEIEe+NQoI1oi2DBmKBhW/o0MIal8lt+9gvmpx3oYtlwmLOOGepxZgJGkw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "@types/react-router-config": "^5.0.6", - "combine-promises": "^1.1.0", - "fs-extra": "^10.1.0", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.3.1.tgz", - "integrity": "sha512-E80UL6hvKm5VVw8Ka8YaVDtO6kWWDVUK4fffGvkpQ/AJQDOg99LwOXKujPoICC22nUFTsZ2Hp70XvpezCsFQaA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "fs-extra": "^10.1.0", - "tslib": "^2.4.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.3.1.tgz", - "integrity": "sha512-Ujpml1Ppg4geB/2hyu2diWnO49az9U2bxM9Shen7b6qVcyFisNJTkVG2ocvLC7wM1efTJcUhBO6zAku2vKJGMw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "fs-extra": "^10.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.3.1.tgz", - "integrity": "sha512-OHip0GQxKOFU8n7gkt3TM4HOYTXPCFDjqKbMClDD3KaDnyTuMp/Zvd9HSr770lLEscgPWIvzhJByRAClqsUWiQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.3.1.tgz", - "integrity": "sha512-uXtDhfu4+Hm+oqWUySr3DNI5cWC/rmP6XJyAk83Heor3dFjZqDwCbkX8yWPywkRiWev3Dk/rVF8lEn0vIGVocA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.3.1.tgz", - "integrity": "sha512-Ww2BPEYSqg8q8tJdLYPFFM3FMDBCVhEM4UUqKzJaiRMx3NEoly3qqDRAoRDGdIhlC//Rf0iJV9cWAoq2m6k3sw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.3.1.tgz", - "integrity": "sha512-8Yxile/v6QGYV9vgFiYL+8d2N4z4Er3pSHsrD08c5XI8bUXxTppMwjarDUTH/TRTfgAWotRbhJ6WZLyajLpozA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "fs-extra": "^10.1.0", - "sitemap": "^7.1.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.3.1.tgz", - "integrity": "sha512-OQ5W0AHyfdUk0IldwJ3BlnZ1EqoJuu2L2BMhqLbqwNWdkmzmSUvlFLH1Pe7CZSQgB2YUUC/DnmjbPKk/qQD0lQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/plugin-debug": "2.3.1", - "@docusaurus/plugin-google-analytics": "2.3.1", - "@docusaurus/plugin-google-gtag": "2.3.1", - "@docusaurus/plugin-google-tag-manager": "2.3.1", - "@docusaurus/plugin-sitemap": "2.3.1", - "@docusaurus/theme-classic": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-search-algolia": "2.3.1", - "@docusaurus/types": "2.3.1" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.3.1.tgz", - "integrity": "sha512-SelSIDvyttb7ZYHj8vEUhqykhAqfOPKk+uP0z85jH72IMC58e7O8DIlcAeBv+CWsLbNIl9/Hcg71X0jazuxJug==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "2.3.1", - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-translations": "2.3.1", - "@docusaurus/types": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-common": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.5", - "prismjs": "^1.28.0", - "react-router-dom": "^5.3.3", - "rtlcss": "^3.5.0", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.3.1.tgz", - "integrity": "sha512-RYmYl2OR2biO+yhmW1aS5FyEvnrItPINa+0U2dMxcHpah8reSCjQ9eJGRmAgkZFchV1+aIQzXOI1K7LCW38O0g==", - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "2.3.1", - "@docusaurus/module-type-aliases": "2.3.1", - "@docusaurus/plugin-content-blog": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/plugin-content-pages": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^1.2.1", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.5", - "tslib": "^2.4.0", - "use-sync-external-store": "^1.2.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.3.1.tgz", - "integrity": "sha512-JdHaRqRuH1X++g5fEMLnq7OtULSGQdrs9AbhcWRQ428ZB8/HOiaN6mj3hzHvcD3DFgu7koIVtWPQnvnN7iwzHA==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.3.1", - "@docusaurus/logger": "2.3.1", - "@docusaurus/plugin-content-docs": "2.3.1", - "@docusaurus/theme-common": "2.3.1", - "@docusaurus/theme-translations": "2.3.1", - "@docusaurus/utils": "2.3.1", - "@docusaurus/utils-validation": "2.3.1", - "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.10.0", - "clsx": "^1.2.1", - "eta": "^2.0.0", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.3.1.tgz", - "integrity": "sha512-BsBZzAewJabVhoGG1Ij2u4pMS3MPW6gZ6sS4pc+Y7czevRpzxoFNJXRtQDVGe7mOpv/MmRmqg4owDK+lcOTCVQ==", - "license": "MIT", - "dependencies": { - "fs-extra": "^10.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.3.1.tgz", - "integrity": "sha512-PREbIRhTaNNY042qmfSE372Jb7djZt+oVTZkoqHJ8eff8vOIc2zqqDqBVc5BhOfpZGPTrE078yy/torUEZy08A==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.6.0", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0", - "webpack-merge": "^5.8.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-9WcQROCV0MmrpOQDXDGhtGMd52DHpSFbKLfkyaYumzbTstrbA5pPOtiGtxK1nqUHkiIv8UwexS54p0Vod2I1lg==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "2.3.1", - "@svgr/webpack": "^6.2.1", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "github-slugger": "^1.4.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.4.0", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.3.1.tgz", - "integrity": "sha512-pVlRpXkdNcxmKNxAaB1ya2hfCEvVsLDp2joeM6K6uv55Oc5nVIqgyYSgSNKZyMdw66NnvMfsu0RBylcwZQKo9A==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.3.1.tgz", - "integrity": "sha512-7n0208IG3k1HVTByMHlZoIDjjOFC8sbViHVXJx0r3Q+3Ezrx+VQ1RZ/zjNn6lT+QBCRCXlnlaoJ8ug4HIVgQ3w==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "2.3.1", - "@docusaurus/utils": "2.3.1", - "joi": "^17.6.0", - "js-yaml": "^4.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@docusaurus/utils/node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@docusaurus/utils/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@docusaurus/utils/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/@docusaurus/utils/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@docusaurus/utils/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/@docusaurus/utils/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@docusaurus/utils/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/@docusaurus/utils/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/@docusaurus/utils/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/@docusaurus/utils/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", - "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "license": "MIT" - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "license": "MIT", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "license": "MIT", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "license": "MIT" - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "license": "MIT", - "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "license": "MIT", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.14.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.4.tgz", - "integrity": "sha512-VhCw7I7qO2X49+jaKcAUwi3rR+hbxT5VcYF493+Z5kMLI0DL568b7JI4IDJaxWFH0D/xwmGJNoXisyX+w7GH/g==", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "license": "MIT" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "license": "MIT" - }, - "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", - "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "license": "MIT" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "license": "MIT", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "deprecated": "package has been renamed to acorn-import-attributes", - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz", - "integrity": "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==", - "license": "MIT", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.3", - "@algolia/cache-common": "4.14.3", - "@algolia/cache-in-memory": "4.14.3", - "@algolia/client-account": "4.14.3", - "@algolia/client-analytics": "4.14.3", - "@algolia/client-common": "4.14.3", - "@algolia/client-personalization": "4.14.3", - "@algolia/client-search": "4.14.3", - "@algolia/logger-common": "4.14.3", - "@algolia/logger-console": "4.14.3", - "@algolia/requester-browser-xhr": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/requester-node-http": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.3.tgz", - "integrity": "sha512-TbaEvLwiuGygHQIB8y+OsJKQQ40+JKUua5B91X66tMUHyyhbNHvqyr0lqd3wCoyKx7WybyQrC0WJvzoIeh24Aw==", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-common": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", - "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-search": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", - "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.14.3", - "@algolia/requester-common": "4.14.3", - "@algolia/transporter": "4.14.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz", - "integrity": "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.14.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz", - "integrity": "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.14.3" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "license": "MIT" - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "license": "MIT" - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.34", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", - "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", - "license": "MIT", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "license": "MIT", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/coa/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "license": "MIT" - }, - "node_modules/combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "license": "MIT" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", - "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.0.tgz", - "integrity": "sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.0.tgz", - "integrity": "sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "license": "MIT", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "license": "MIT", - "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "license": "MIT" - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "license": "MIT", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "license": "MIT", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "license": "MIT" - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "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/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "license": "MIT", - "dependencies": { - "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "license": "MIT" - }, - "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "license": "BSD-3-Clause" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.370", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.370.tgz", - "integrity": "sha512-D5tSHJReAb/Kf3Hu9F/GO4lJuSWzEWHwvQ/kKSUP7pimNgvxkSKj+gUQhHpKKACwrin7rS3byU7IxreF56rl5g==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", - "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "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.4", - "is-array-buffer": "^3.0.1", - "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.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.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-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "license": "MIT" - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT", - "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/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", - "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "license": "MIT" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "license": "MIT", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "license": "BSD-3-Clause", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "license": "MIT" - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", - "license": "BSD-3-Clause", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": 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==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", - "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "license": "MIT", - "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-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "license": "ISC" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "license": "MIT", - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "license": "MIT", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "license": "MIT", - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "license": "MIT", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/immer": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", - "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "license": "MIT", - "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-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "license": "MIT" - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", - "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.4.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", - "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.4.3", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.8.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.8.3.tgz", - "integrity": "sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "license": "MIT", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "license": "MIT", - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "license": "MIT", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "license": "CC0-1.0" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", - "license": "MIT", - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.8" - }, - "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==", - "license": "MIT", - "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/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "license": "MIT", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "license": "MIT", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "license": "MIT", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "license": "MIT", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.1.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.16" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", - "license": "MIT", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", - "license": "MIT", - "peerDependencies": { - "react": ">=0.14.9" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "license": "MIT", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", - "license": "MIT" - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "license": "MIT", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "license": "MIT" - }, - "node_modules/react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", - "license": "MIT" - }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.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==", - "license": "MIT" - }, - "node_modules/react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "license": "MIT", - "dependencies": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - }, - "peerDependencies": { - "react": "^17.0.0 || ^16.3.0 || ^15.5.4", - "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-textarea-autosize": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz", - "integrity": "sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", - "license": "MIT" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", - "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", - "license": "MIT", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "license": "MIT", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "license": "MIT", - "dependencies": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "license": "MIT", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "license": "MIT" - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remark-mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "license": "MIT", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "license": "MIT", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "license": "MIT", - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "license": "MIT", - "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", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==", - "license": "BSD-3-Clause" - }, - "node_modules/rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.3.11", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - } - }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "license": "MIT", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "license": "MIT", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", - "license": "MIT" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "MIT", - "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", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", - "license": "MIT", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "license": "MIT" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/svgo/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" - }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/svgo/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", - "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", - "deprecated": "Use String.prototype.trim() instead" - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "MIT", - "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/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "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/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "license": "MIT", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "license": "MIT", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "license": "MIT", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", - "license": "MIT", - "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", - "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "license": "MIT", - "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==", - "license": "MIT", - "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/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index 858dee13c..b520b892b 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,21 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^2.3.1", - "@docusaurus/preset-classic": "^2.3.1", - "@docusaurus/theme-search-algolia": "^2.3.1", - "@mdx-js/react": "^1.6.21", - "@svgr/webpack": "^5.5.0", - "clsx": "^1.1.1", + "@docusaurus/core": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", + "@docusaurus/theme-search-algolia": "^3.10.1", + "@mdx-js/react": "^3.0.0", + "@svgr/webpack": "^8.1.0", + "clsx": "^2.0.0", "file-loader": "^6.2.0", - "prism-react-renderer": "^1.2.1", - "react": "^17.0.1", - "react-dom": "^17.0.1", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "url-loader": "^4.1.1" }, + "engines": { + "node": ">=20.0" + }, "browserslist": { "production": [ ">0.5%", @@ -37,8 +40,5 @@ "last 1 firefox version", "last 1 safari version" ] - }, - "overrides": { - "webpack": "5.88.2" } } diff --git a/plugins/structured-data/index.js b/plugins/structured-data/index.js new file mode 100644 index 000000000..4c0024f7d --- /dev/null +++ b/plugins/structured-data/index.js @@ -0,0 +1,136 @@ +const fs = require('fs'); +const path = require('path'); + +/** + * Local Docusaurus plugin that injects per-page JSON-LD structured data + * (TechArticle + BreadcrumbList) into every generated documentation page. + * + * Docusaurus has no built-in per-page structured data, and `injectHtmlTags` + * is global rather than per-page. Instead of swizzling a theme component + * (which is marked "unsafe" and needs maintenance across major upgrades), + * this runs in the `postBuild` hook and rewrites the already-generated HTML. + * It reads the title/description/canonical that Docusaurus has already + * emitted into each page's , so it needs no access to internal APIs + * and is resilient to future Docusaurus upgrades. + */ +module.exports = function structuredDataPlugin(context) { + const { siteConfig } = context; + const siteUrl = siteConfig.url; // e.g. https://docs.flarum.org + + return { + name: 'flarum-structured-data', + + async postBuild({ routesPaths, outDir, baseUrl }) { + // In a localized build, outDir already points at e.g. build/es and + // routesPaths are prefixed with the locale baseUrl ("/es/"). Strip that + // prefix so paths resolve relative to outDir for every locale. + const prefix = (baseUrl || '/').replace(/\/$/, ''); + const publisher = { + '@type': 'Organization', + name: 'Flarum', + url: 'https://flarum.org', + logo: `${siteUrl}/img/flarum-banner.png`, + }; + + const extract = (head, re) => { + const m = head.match(re); + return m ? m[1] : null; + }; + + // Build a human label from a URL path segment: "extend" -> "Extend", + // "frontend-pages" -> "Frontend Pages". + const labelFor = (segment) => + segment + .replace(/[-_]/g, ' ') + .replace(/\b\w/g, (c) => c.toUpperCase()); + + let injected = 0; + + for (const routePath of routesPaths) { + // Map a route to its built index.html file. Strip the locale baseUrl + // prefix first (outDir is already the locale's output directory). + let rel = routePath; + if (prefix && rel.startsWith(prefix)) rel = rel.slice(prefix.length); + rel = rel.replace(/^\//, ''); + const file = path.join(outDir, rel, 'index.html'); + if (!fs.existsSync(file)) continue; + + let html = fs.readFileSync(file, 'utf8'); + + // Don't double-inject if the plugin somehow runs twice. + if (html.includes('"@type":"TechArticle"')) continue; + + const headEnd = html.indexOf(''); + if (headEnd === -1) continue; + const head = html.slice(0, headEnd); + + const canonical = extract(head, /rel="canonical"[^>]*href="([^"]+)"/); + if (!canonical) continue; // pages without a canonical aren't real doc pages + + let title = extract(head, /property="og:title"[^>]*content="([^"]+)"/); + // Strip the "| Flarum Documentation" suffix for the headline. + if (title) title = title.replace(/\s*\|\s*Flarum Documentation\s*$/, ''); + const description = extract(head, /name="description"[^>]*content="([^"]*)"/); + + const article = { + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: title || undefined, + description: description || undefined, + url: canonical, + mainEntityOfPage: canonical, + inLanguage: extract(html, /]*lang="([^"]+)"/) || 'en', + publisher, + isPartOf: { + '@type': 'WebSite', + name: 'Flarum Documentation', + url: siteUrl, + }, + }; + + // BreadcrumbList from the canonical URL path segments. We keep every + // segment in the link URLs (so they resolve), but hide locale codes + // (e.g. "es") and the version segment (e.g. "2.x") from the visible + // crumb names, since they aren't meaningful navigation steps. + const HIDDEN = new Set(['es', 'it', 'tr', 'zh', 'vi', 'de', '2.x', 'next']); + const urlPath = canonical.slice(siteUrl.length).replace(/^\/|\/$/g, ''); + const allSegments = urlPath ? urlPath.split('/') : []; + const itemListElement = [ + { + '@type': 'ListItem', + position: 1, + name: 'Docs', + item: `${siteUrl}/`, + }, + ]; + let position = 2; + allSegments.forEach((seg, i) => { + if (HIDDEN.has(seg)) return; // skip locale/version crumbs + const acc = allSegments.slice(0, i + 1).join('/'); + const isLast = i === allSegments.length - 1; + itemListElement.push({ + '@type': 'ListItem', + position: position++, + name: isLast && title ? title : labelFor(seg), + item: `${siteUrl}/${acc}`, + }); + }); + const breadcrumb = { + '@context': 'https://schema.org', + '@type': 'BreadcrumbList', + itemListElement, + }; + + const tag = + `` + + ``; + + html = html.slice(0, headEnd) + tag + html.slice(headEnd); + fs.writeFileSync(file, html); + injected++; + } + + console.log(`[flarum-structured-data] injected JSON-LD into ${injected} pages`); + }, + }; +}; diff --git a/static/img/flarum-banner.png b/static/img/flarum-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..c42e8ba853c1aa437a59a7d7b9288d1ed7afb14a GIT binary patch literal 174872 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
Ck#oN9>nPQ_Jy!Q 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

Cbq|N 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ΠSCqR#aFPyKL=AtL z?q2Rq;_0?fqE0i!*VIibu2_L*!b9qx zj_^C(GM1_>ue|$hNVl?BI*`@a^_g%1|aH=b^VxF>5O+)hU9E#MPe|H1kT{(xqP3$?fpq@~V)8d=?1t$1%h>h#Z%EdLL_-jLYG=Cq6}l=>G8 zR)n|_eIgC&`asMrB1@TqJRjd=)k!#YnUg?=k2(Hq)ba=H%d&x8>qHbA#Xpy&)~0N8 zOJc0ne?z;g42*w%dcCZrnDx7V*202504edS0wJYby1-7<9wBRX$jZDk6hUaZGSiz&OQf-shAAwE_GoT$x%0bZwTf z&TWYNm9F)1v7oB-U(w3y*(Db97xx_z!^)-6i7*a}5`mBRDr$J9B&Y6=?YLYgET*iM=>9H`vIZJ3cdbgwIQqHAB(e zY4llp#9y7ZcOc~IQOa8&PtFKkUr7Lc_+%dQ}s`8*rf?sO$s#z!dDiQ1kX# z3Q}#I)X7?FV~ZNP_1}IrtGPGGXtwr6;jUw10U3Aq34G5L(-j>Qz+tv^&1(x&zML%4 z5qgz7=lZMXxWjqa*hOv;Gr;+>W7n2?v36SNMH(vX!9N&Y&0f=X)lQo{!V zIU&Ul5^053)t3z@{*aNxrxh_x_kr#F3u3H58-^9=^7?P9a(2C^W6zp&V)fxO+`%)B zorDeclU)HdCCX_YDNm0Ovpv_EU zZH754Gt6&C5Mj({%*dJiE~~TI@@+Zddb&G80^EF=Ze-+X{I#Z4TPW){2s zP{d1o(^`Wgt-$1AZy;7~e(hXsSQ~1cIx8dZ^5#$(`oe8a^h>JVJzM0!54-1|*B+^F zG8TSEb`tCj7X}}G;?9%YV|Wqx25=t;7{231j3sfAwEDvBOHuW$@=*`VOJ{`}RT((V zJyuVbqPe5&+xWKV`xYfGK8?eJ7qWofwA^AwS_(EuJp(%nX_+vhew^hx_nBwOI%@}U z*9s&dVvsM@K6=VLwh)@wT{fU!Vg=qxmQGYA62_fqT->7t>rQ0Jd80Y$bFcPoK8>ZL zhy#UPNugR$B3lXdgSy5ms?XyHT4vikN%vPJt1rE}D?>WIA&6@HsWxo~#KU^0j-JG* zH47kv@7-J)$`kf^T8^Ro-f=qr*HD3t`I?eCTipC1Bn2u0OeB24Z0K;s)4NrZAg7hb ziVegSE+=ryhH&D}E#SDx81f&ml-fsBn3rO-@;Syx)W3mt61f%9#fv)N(>oAPEQhL6 z2v>Oy_Z2C4Z`?Oa9nk%8YiYIHQvb!`D`kyMXD!9caHt_zljC2->IHe#6m?AS*|ZK= z15tt1vYZ3?UzKHsgg&mQI_R}rec-8fn3CMP{g(32O~l|v_sWuRj@C1=rAD0{40g~% zvf|~zv$9`Lz}e2ABtD|pj!KLw5T}f6#0~bVLCet+h_#%_Zx}p+XaR2(Ky9bQ^non` z^7l_r@QN9~2!FMHlJ{I#f?bYfaQY}Nc$J^$(Wwwn(e-9)KrBiTEe{0X& zzpRB_5~(>D^W>aefv()FMCaI3UD%*zk!gz)X_leBP-&r+xoA%7{P}qzobmyEjBQ!{ zqoxYuLMQ^?!r~3?EGY)7_xSDLr9CmbEAv+o2-%JaeaoCi&K9U)P_)4YaIc>eaUiHA z?QMxn9a>>*kB!+hl1ls-;VOaRDpN_sIe4Qhjr88{J(z^laIKuNe5>KVgB<^tUJKX) zwzHmyPQL|@fy$u5y{Zq;jKr6yGCTwMZ3tbrcDH}otpp7*lUx`2>v83jbU~-M2d{}_ z+atxjpgV`SUq8}ZoNizbkKK{^?3#+~Z(qc87VV^w*6qIX^BNU>?3d`St?mo~8nzlvN6Z=TP2I=hL{?ry1ovwFJ`}`BkhC_W51KW@+P38Or>4yydzb2Ey?F5QISCoYb^7))LtVJXY1_u&`bn1?h%Vp<3& zdE4Yx?HZThI^G(qnMjid?P!g=SpgGo*k@f^~9B@vS2O^^xT!RpU8q7`_V=O`Lx zU8wj+} zQT;zJ>r`;xv%zvUSZ`_m1{^0ab76OszDb5wgd_Iywt0AjDwka7Gz_V3TDSux;Lv`2 zIoBD1FK8MZ)%UtOVt6MLf-iOuh-b-W;ea;TxRqis;PO1e?i0(CBaVr9t35e&VdAtj zgu|3U#u1kspo8S^lHVucK^PpXxPR#z1 z16?>POoZPIo0((Hd9hQl@zOURIDHj)udt$mqjts8LVEm&gM@~CM#WN$UpCUuUc8B!E zDPWCB!?VB&ut-*ShRSXHEw?BQeL-dq3zvqnYjJ^1WkcWolF{@LAc4qXRLGJ&(d2F}$(0?!**nDS0>taQi(z?=aP zHXs=~E66?HL^xCNWjs3I*)$HzKh0*hF)urX{Zhe}NsaH}&g6LEapB?nw+-c233x7r zwQUJs^bg3QjAUEleXGpC(gJtSRC~%q(VaWxFRafH z_MjLyx~}$$>pQKsnzvu-7Z}}XL<2W#&N7-j24?@VR011Mx9r3oSJ45B255mN{(~4i zoxkgY8{DDQK;SlP>MO+^v9#w_%n7T3l@m_HHk z<8aFY&5%-|^qDjR=~~3S`_!Nj$9>ERcMMdb;8VbWuZ~8oEb)j~Mu@OJg@n1AQ82?L zu!Y@w$j-q9bg8sGFOjocq_HXmTs{6ILu35Z%E@&uw*WGe!PjjD18wG{mXltDX;}N4 zDxJIHP~vE^exb(C;gN7eH6q`A_m)MKl+pGuY3;>Os?oL=$CYCDy3&4WF4o^2UC+jl z?>*a4v}!UtWeWbt5bgSdh8KZUumMX$Idx`gM!9wCF+5nhEP}zwFMyhc0RtO6p{q-9 z>pXK1GEC|drK#`;!oh@3)w9) zc?t+Vp@6eep+k}E8UN*0nzsm#v7^lR#xLN67xKWZTGyv<>v0hYX9InQX1+QiWYvY2 zi<}Jd@Mt+wUPKY!=uaOxl=z&y_%&F;l>C(^ol=l+9*0%b{{hXkFLBQZ-C_3qY!I_O zh~I!BhvFP2w-tBUyr5sD@)J5i~o&%L8L%^DW^LoM?^TN#xd{g2*M$0~)DfvCr1j z`QE&@=I*y$_}8z>k2?|R;kp z9v#n1ZLt*;`!}uovi9&<#)Oe=EH|>H0KRlY2?{v|^*don45X2D|oSv3Cuz^6+id`ZYR@o#syD+-=qK%3@;k zjjCCpP2>4nYUh?-6OMrRu1;KW9$#>O8vegRk1@IMvGubxgdyO((qBLvARD- zRT>jc{_Z&mNGCB2P6##-5Qt(3m3}Z1&mE#tc=HPT$JaJ&W;t(r*);Nv*u)`zX6V^E zX~4bCM8-p$%_N{xPsbG(4H;k->4@8{XVtj}56=}XHqQQCtBT?h`Ki(cj>!#bhPTjM zV+nr0Mm#)|k6!v=kh8?*<*+XHfn6b2l%ercGYWRD>ttvx(3O*@{Dx7A?u?m!CiStt z0i2;9>FL=6GVc)lN(6Uxm!fFJ(hthpCg~?RoY`>hRrI8~C4q{vrw;cjEpt8yaJFIc zQ;ljNXZ>m9-o=3K#}MdZTgys)`_KY0j{^PRtlqKZWxAj6F$4EB!iK6B#}bB;wSWDT zKIStXtKyG-+*FNz9O_tHa$R1sQSIcqH8b;Sn%ph&&zu|rn<=yIEX+oL5*`^*H=kjp6KWxm;Vs!_6*^YXm7^t?d<9<)WQr zmADSUX}X2&;!}0E5-YV2jyh~QAJ^?t^GbQ~3B8NrLDuU=ur}=jS8fz_4}5K`c}tiy z)pkm`r_z41NsWN6a2-TZDaO`Faozb3&DF(dyTuvIoIXqG{3pkae@{P^Cov4~4fI<^ zLKD@|pC%RjjZS>P$?iCOQ+QIu|6}u_|Gl|uZ^Xy<>@fb^W5XjSt;n-;W0xeuyT#gz zs&f07zc`T3i>Wapc-Hq8(i(|2kV=+ca3gyN)^C?5guqGhk+4NyuJAh^VOs(ii|BO? z(+d`jDEHj^C26hzoYsa3L)q0WQ#=o^vB*Ywd?Q{PX4XsQ?Mzz0G~)GN4fE2GUtAyt z2cATSMIb5Mm}#;87)ZnkbIHd66C9I=vnRBsqmwPgtu!YOaJu(SFLfInnXOJid493n z$o)Rud6WGl^gB4ohbhJ*I0~f`%s{TOYkjaiMS+{Ni??`~OS#GE7$j;;3lI6>hu|L) z^=I@z#1e#>%IPJGyAdgG;Oi>oFVWqeMe1C(DU@Pz`@mogz6L)RggZ9lYq-o&;W++0 zn!)~o%hSyv%nqZvRz>eh0;8HZzQbtf?=Ji@dCL#@8~UNN6Xs8eiZYENcTte@N#|2b z1vJO0-YCr>VndMg#8)jYYx2aKv2fuPz89FnCwwZvpu~o|Jdxih)-&>r;MU`Lazdm7 zkUqe0gR0$;g~RTFoA(*94y4pHENt+mVHdvX+wzWHdv8iG9o4Dq%)_7oR{MAP6gdpr z2#;PJMUP(m5u#4?OwaV3PhxZfSJt`TN$T9p=$Y7-l$c!e1YANqmqCEJOu}+H>23+v zXQnouNm6&OA8$6clC`D#=?f}tX)qnnhX?9bbcN#DZm#YS=V`ou_~ufA#3}At5>fNf zdePv}W>GEGkq317J%hCBf#5rn6uj)Ce z)nJ~6Ps3+0%SmIpZNnB5^dr^PNVgLoS-Va170`UaLgg?Nu<&uy`xtU7Mi@E@t#vYX z)Vq51te%$PRg@#^RNHm*!5d%oKuQ*&)v2kIE7ra04eKo>aI9g~502ZjwBo}BYiGO` zt6NOeAJVBMKl8Z0-F^FGQTTqg@uc3fY~SOjxN3mS*V+af}QPSp#%Qlo!*t z{eJ0j6&+W5s$b1?cxAgSvsl?td~=qwW`~ZJ2TKCCNZKr?R-b#CuxuI9lTSb{LGFqK$qZ zX%Mk1_ic6Zej;OuUL@+x#p&w{KY%UOwj+PmDNS!;v+;H6KWd`95{nJBHhvpd$6L`^ zx09_x;0C`YPvIi(9^#!GmSZfENzwP;0~b(^8QlqU59(qo6l%!vF7WKjnwR71MnE{C z^73hcrvLN>9)nk|xEjA>y+ur=86X5u$o}12V^H|O)F}<=6?8n~e6)=Mf!>1y*LL$W z0_D_zu86)){NAr4(--*k1S3k~0)Z^Vqx%U4$uNZQ6NRcXETx`4fLhweMC1)~qs7*@pjl=FAMOepy43M01!#*8E$Y&z^}4%H`ljx>zf z4v~|TaEtgw;i~EB=|uhzj8qD?&b0-39o#QkTwRohVVT#-A?rc`(P{`jytYa-L@9Q* zDh7NqTN~d@tx8=`h6ItKAVNk*)xeW6=iZ%}X_q5u_K{T_&!QBFjl`AZ&nuquB2Ak2 zmo$nCD<5p=&_&W`bt)c|DF^ach#jhaiCFDRNpqRKRPy(5C=&7Xh7`OenxBW*$qdx_ z>B7S|cptewPrte8b7Ri#bAtLlTI%YtPRW+U^5PCbshp~g;aE=4SxD3NRM=8AQ}gi7)Kh z>YqXf`wrw^H>@;=4p+(H{Mpiaf#z($rpn8?X?mru#hW1~UpDdcypc6&H+= z0*u#pd;S~LF~$LM!%>>$yM@h|y>^Xe#b#sgWHFpP3-G8$>Frt~S?&O^m|&6i?!Ulq zeMe&F)>=D0Y%s@0B_GEyP2byJ$BxkN3ZBAq!5|35x9k5>;hb_!8tgvgTJlL7&Aj$( zRPR4`0Joesi(fgXz{7Es{2jic`5PjN94%)5&?YDY-B!4nKlt*mv_CTwt}!5a>)w)I zMD!e|I7~A)RCX#KGWO~H;uPao&Xdv*Yyl};_0IWNw9@m5ev$RRf0f-(I#$$)^SRe= z^`WhR(fYA9FZQJ?@7fpFgXG$_ypJzQn_q(Jf7Ds$PnQ#p0UDbkUUnkkCCLSx9`m)8 zS6>WXNC8Cy(`{`xoWm(=-Ayaa3&2(?&+i^Q1)AJ?xLNttM21#1=DAMlVEQdUcZ)iy z7WE!9$vXBj@~r#ygdx(&L^I~KEWil7@E$M}Koj$AmFH7*R2rG)?;F$D2hH8DV?SNG z_(0G^<<;OvK%`}`(=RcuVx!Ulm+s2`&qoDKKp+2nY5b4QUrUt59N26oFKBWhMe8BB zhP0uBt=h7f5kNTn@1ONQf4071&wL^av)!?xGDnY`yito2Q$~J*-;Z?i*zfjeyuid{ zknkEK?6%)$Xc+qv_4s!NKao?qgCiYH${_vv7op6$=?!cNQut30tt?e($5inVeT-tF z_K#UwwCw@|z!GQyTrR*Tq-(DV;?@yf=rU$rS19IGGC8CC#8-a0<_pn-)_O)mCTE*Z zT&HTQOl=7EMR{#!=Di2Az&>(&{5$2b;hzm#-Zys6`7~<+CYb53Kf;Tdr1q~`E8*?R zxFFCnQ~dj!wA@ao-<9tBC{nnO(ho%6gl7-CWU1j7NmBNsGjQ2VCm<*Fi`nF5V54zhNU0#OI_rERmKB1~wx*KZezebs9>=<9O(<9El9swhFYnoNVU`lT= zuhu5^E`F5O?YJzdbryd6a8t?|%(JHX%*uUPs=q76_J1!m!)C_I+*gp_#XX1{zj^RJ zTreB>Q@lY#@+$8!{yug6GMZ(V(sxJHD_ z+>I%CVZelsx~RMJz~lrL25V4Hk?Zj{=G5WML@@_WpZ`RBsNT}~{)kY?xnPPreweBw z4t`|r=-$UVQCXr_9Dm(BwK(g`RL+OpDv=bJ-aRYC8yTDxS|ykGBD~7rM+ovy^8q<; zVM10B&vbSk*TZo0K`iIix%weI{Zf~i|6c3*-)sLKo&WR40UI|viN>22lehQ!U1a@v zu&IA~freS3T_{6?Nc&Y@-ZQLm18GQfyY)Uit~>at$5Uy1_;a4A^tUNdedp3ggOdc! z_Lk0e?(5<)%FJx`85Rg<(f|>%OU&sn?Ft1(UkdTO9%hu66CGyle>3CQ9tLGTrklZ> zc`(__JIsLf;JG+y)027vNOeFuZ{gKQ%<(wFsw7Z0KA&@@5#>Zm^gZ;G97KP@%SEwn zv=?z0%eP>=50JTk3|&|&LDKZP92y`CQVxEOr?+Z2D0gCPrBoE_Od-*EJf z{5px(t5&D3jxteif7JD2#_yr4r8xH`#KKkyl`Kl>1m2Y@{-Sy3n-QP_C{-jE&{R)w z^1tco<4VX;-FBYzSao{DDQj1jaL&?%mhmg`Mu&NDDzC5$Igt!H~?c)Cw3{+*V;GY z8+3k1tUIGPH&)B>{CPQtikRn7KJr(T{4s2E|87%eM6lHE#z3zhA!t@Xd29gts#$<` zc}7F|h8i44UU@DadZr_Kh|# z=$rwOKM45+yx0^-qcp)Q!pc>^jYVuM(+@@>wkomfgRC-^v|$f*0o@LHZ?L@7+b*I2 znqF$S^||KXUI5@?ty6j4AX#d@6uW=UtIWr}1ifGcOCxT72Y)P*SakD|N-*vq^hyP> zGWOhwuREb}@o4jfwiccMY^cGfB9HuweJ-fvjY+1#b(68F=skD~Z*3T>%pd~V<(xd# zP`Fy`3wu|n-?}gC9k-K350dBbL%|?W`3^`G%rVTCCZNChM%N4Q&LY>|eMMa91cRzbbHK?wyGXTLDim z9f@6DZy@+cko-|=SjpSZHR z|LO_cWE%Uev&??Npg9NcpktLYXiod2_YyM#{~UK~c!{x!ncwdh1=Bva99Qvkx2jEH zUxP65rnC%poBM(PiyA4ob<6q3PSpkiiC0@ll#%oNGV#a^<u`!H+;n#9*)cda;tq2J*AiF{|*#_gdqE2>2f*(WlG2 z13ob+uKP`O1cCd1@Am(cIPV6pt@*7l}QrZ_5>1RF!PMt3*4oQ*q7-_CFhN`19SUgFkbJ9$LP8Fo!dP2 zx2)6S(x<;w^u?jR6SKp#yilV1gPKMf27NW2%n$xk?3>4<+ryr>QZ5%;1g**RyEr){ z<0|j8{Up)xI*=^v6Qu71HB44BFWlg=fiY^&F#v(YM71+c=TWzk*V);gjL{68?aZ$k zvQCATldfV{9f>$=L(Tdo7EPs=C;`y0IbcuvX((x30&Zfj485fE+ z%&cqw(jmTj&|ln~MUns1xer1m1mq@DN~!)tPWNqHu|~9Z;9LFC9GgK(=K&^?d7iSf zN4s7hZvsuSE9l7D1LO)@C|hisq+8`FC1&oVG6&jN`EBZ zM+`=4^_NvzV1_kyShCuq@7KA>pkABn`MCOJ#S5A+=~Hh3K8R%2itf3HgTIJpt1xG7 zK&R)E;ZM?@?+OX=HQgo2qVkExoM5hx)%LObPrfID%2nV#)PJOQN%sYVsDN2l!yzGV zPWE&+CE#fRZh7@~-QGG3*ha1^a9{VIRK%FTUU4L97@cKwGu|0z|LLxR6@ZUZtFz|Meh{TaBJ~Ak_CjV7L$MUukj|d##guQ-Q0J7WAygqA-(6U zvjRE$tb`mTD6}-Bwcuus>a-blT{>08;DtG+LUGafq|64C0%n!_>6lAiL%Vx^Z^M4F zH;Lpk$eV27_5l-i=ptw9<5 zZ4!T*HSC$s)<4&OapG3FUpzU$dC9x7hTOTSJ|Ogx^Wrz6%#g?U##S_+|7s~AT*CGxt~(T362!v=Qmby$6RRO7qQo9x=Mw!@tSkG zJfbgC3=k9IF?69@9uunux*09#`=)Ha%$Zag_eZg3_sIB?!C~YIg(iZYrM1lWrR%?} z8&){2DL40{IKG9x5ARcgt}DuHGI{a0LHtC||AAE~%xnzNU`b?-wRYb+hU9SiNQnO| zR%->teKzXr8U*C)2;xksw9^KLGKLit%2eZB@B*oB=HDRk4(NglLy9g+(h5&>a_Upv}LSeD4tKb{4&srxWM z#|qYwbW{w6d>`Ec?=F%->-8!;{X5ot#=FcsHEh_>$O6T>-CcvFKNVcQxjTvZxf|5_nBzCv6kF ziv(ZqcNR4XUjN_KF~SNQ761?6dDZxqzC1`E>`J@}^jrptL(4M4vT(#hrHXCr81wBn zs0UYMTC_K#_K^RifrIfp4@l?*Bqm(I%zNooHg{6hNZ`=B-MVMZGSz-vDUA7z2V(KQIVoG##vR8@+8H({6GIj#3cMw8v zkf1Qzr3u7KC zpD={vy=O1bo5Xpo$K$9Ea>u(9ye?P0&J-$kuZ+i#afeIJpNuB#cz6J{;>c6xB4FG4 z-C@B3sN1$Rwy2 zk$7i<*m&e27i-30!flK@0Egod)zm_Ms+4ahG^)Qs+s6LDk<+jfYlBq;f_bzX!E1a5 z8vFGb8ebQgOVx}*TMfaz-vyeVdv`b5o4?TCo@l%6-}`Jm&ZHlXXH&Mq7o@0N8_IZuD1>ocIq#WAKBf%AeN|0()yY*7WWKgsUFw$%A42&~< z*nAb5Pk&$iCpcH?b{46%xT5F9@X%_nH!ymk(*}P9F2t|bRa{}roe1Ci50bE3+D`Ss zfmP?D!;)#;a2@V?m;(UnFl@9)66qHMFFAbW9VMiC7@7OGN=hW;UWN{C17$&1?;0MC_=7Ld`Clu4JSIOOfGF3SRDE3h8xRd!W+K*&j zTSNq1NGTq%$?y$)#Zl!u(X3B>BeO7>IoS#DH-vzB5oX-Ld5Ij_ot*R=4sBZ^36;z5 zOfWrP{AQgw^K9^$opdMXinsu4E4tv+pKUXC69j9F0U2<9^yjT#QNbB4CJo}2E8vNR zY!@Dd2H0za0`nnPa24P&!)BB=MzcW6E09lGF9|kRwD)41u@ZI`Kx2y%?DBL-dx-ez zp44pd7oecF)CRR~+l!^U|Fv&k;y=R3*#$trMTyMM!krk%Bz_WkWMHO?bld9M?iXcF z!UwGr<(|}v7NcncJGt?+ocM)?g)?v_d>@V*_DJf`?VBPL-Jt7XKy)Ha3_$c#0IW*% z%dR^!=H+V8)xa6$B&%f2@CAfV!MMdh3_mTOY~XllGU6G=5SkxA{RDYReuUt%37Ee0 z+rDwR86nKvl*cHy`t>8+x}JnjnR~cmK5_=04tKQ7?G$e?pGI+4Ph5l^_ry#scK%)c zqy*PJ&6)69S*Om)Va63t!5-Clhx7W#{I7h>Qj9r+3ORaWySrxdmWv;Op%tZDw%&+V zPtI|U8DC_=nbnS#|Jub@6!(8}7a-vJjgxc$R!T1TxL0zKJqZR($}6^m@jB0Eh59&r z!t}!xS8vG3unHs067%jBi>5ape6mFGDlX48wJ?~Ds(cy<1w7oBRd`Tvg`-ja_zkJ}YyvsRk9DAtDc>`< z2a>aFoMN@+cOksM1rD|#Y!I(Nv1E@{b$T8%EmY4RIM0iTvx`)Z*YBhXz6acesfbc) za0{x#2yq(4-3)-dCte%j(8IPKAPS!r2<=n1!6;rYu_bLTbDOo(np=V4w0?0-_phd_ zy@MC8sk;1*!lfc~eGw2bPt$v$->qj%28@ZABt+3Jj^ESr3OP&&@^s@4uwO(*xhf^S>GJ00sZ zp_}`-T{<@F2aJ20HJ{$vWEWxtlkarG4k9l2ce&%~y$Q?wIzW1q{iui82U+gCANEU5 zpm(gn+mHakQn?Is1t^=+Vr&{VIW^3m-+*(=S#j^CgrSy5^6?sg9Z6yD?{OL>>H6-4 zk=h7WkrMIt%Gd{zNbY1Vb_i&9H@HGd)!kNl-I6ITIt9~!+-rRC*TuXcv&X){H+g;0 zj=T`K>m#}XrU}HXPc+s(J-u7=EmA~+!}2S3a_7z}+U)lIot~`HXq~KvKwR<^ekfe* z8cP~_ZWU1Xd}(2qsol!!$4@m(OC(b8^zbUvU?C=SSIpVRt6d;?S<90EKKYQ%Pcbblg`HoD)zCyY`N-!4`N=THedTudR zetktWwvad5tPyp%U!d{w#2O|FNN@TS)-#jh`TNG7wP6EK2+Vy_Hw!m7;vX~3=|Vm7 z9f;DoIfIo;J;AO45%uZ0mkX7?l%~)QffDm)o{qc|hWN?|@0vXYvxM~^N`>A@Wu_y2 z%@XeoFK_f#-A_Byh2@GQGe2U>NT-*8!{z5cz;T#xoWTgfTHG%esduE6mbY}q@J%7< zEP?CKFl9+}Y8am8c)WAeqX>%s&C1~u4WZN)GyI}^DO=b5$!=DI3Ft_ny5I0Z4ZuxDO1I(T_98?B-{g>@iXHr`|0a^K9oamDX+h zW53B?n3Q$MJpSbP=MG%5;7Ou)HQG29C1BBC3$Nki1sSCq1q1P_#rqqR3Kb(u+j1WP zwtdILi9W~8>N^YtMJ%__L?Da+%1oCdea-!k!rv@7qEg&k!&X+6&ux5b6$p$X@ZP&t zy73D%6vV4TE=d_~dlpf7;kWkH?3Wa|A5zbc_osIF50E4cG%6YKHSnpHc#Uhn3sxg^ zAA^D*9$0k|d9;?@_jYn9Q)M?rf>oAg`=1sZYH`Hd`PQ^PZ)8=EPxhQ5R_|c4@o^K< zCBz*5!V=rBk)3G3MH)yCRlwXE`vISQkf{+$LLI{$zVakzN#dc=0xz#h@6a0n8mjNB zRmw$9*)W0ZJEO#p{qSu9%gC^cAe2XlTMw@}N4?2d?p)2zH}-K4;5_8dOYBK}sCS!k zkWQO)pivnM&H~2;P}V0v{1(C#yoSMseZJV04KrOd$q9YkE$qk2idkje&7)gEL>h%M z;0vm*b$CG%YH(FQ0u%1?hGnu~2Bd#OZBKv^6vnrVD7ch)?WUDiL5Kwwd|HRdVB5+s z9rx8{a2}8@I_43&n*}ZriO|9lCmOBLzN9zZN2uq46(>O}69eYqih%{CvN% z#oGo9{I5@KgpK=*p-FckwU64joU39^0TPtkwv=r}VYW?bHZ>^`_dc4-AB@*i2csL1 z4(u1yg&Fh<@qa0_#GB=^jQqb%Zl?V7$VmzaKOV0q_=c$W-)q!U1XNli;sW?fxdCh9 z#bQG~KOp%@1@Eyq|M|qNiW~QvCHoAzwk4OJG#xXpIx2CqJN?a*ZwRXSraKM^5n8v4 zzK9PTZQF``cjt?Wfa-`Qrp`7gH@#30q<0sMYVZvk|CLVfmo8ekvUE7;&92TK7w80J z$X*Pq?W$X_X~a8yWf8=J*jn`Y9^?G{uB|~ihjR~I#`T9K*(T=jOOFb4BtbK=3+SBF z0)9?H8?vTAs@EzF4kot3IX>JT4r4L~RAO5syq&f>jVALAvy;$0`UN>#zgppEf_ zW2%gd>G{M)hJfZEdUX-jGR%RaDA5ZAT)Gur6yB(yI+YAIsNi>xAX-K##fzm3RX;=7tjz9FC{rf|=LEfy#kM1|ew(edJZU{aZm`Qq>a6MP&D-YyXJ8IR5l$e&u4%r?KPCw!VAZrsB5MrwymZB9S<~uwe z6vqyqwXThPZ~O(+o~I@4w!Zew)Z+H|b;1K4Df^001tl}#(&Lg&-gTvCD!?ve%1f>% z;2Md1#0x4Ev$KcTg8>^%s+Nu%7M0t;SY9$*hqH2KY2$hLtp*V0g%jQdU!ZG{Q6v!GN*@d*Fs-pj_kY4& zjc9*LPR&{nTh_)ZE_|4s8vL_H7Z%q8mmLB`6UG;eAH6M~+96Q9YBSib!1w#(j+kLTG~gBgVx z;VX;NVmn809GxwLw?Yx>z;rTjwtD`%78k?nsy~`Gcj2ylt3Tmr(sIvX5$;@AY{Ck!3D_C=BeXHC<;F{ zAyr@A;(7V8BgpW;kELU=Dw(Kt&Qjo_v@oAQWc-0<*T?hd22BqEc4b>3{_J#<7y`GQ zPy?4+*T8cLII-7OkNsUHI?IB*Q^zHLk7$L>iE>wS@h__}pjr(ma zkw3--dgO-tinc*kS&H&*Md# zCV_m`=eNT8w*vXBV%^o(E7ZGfhmNM1{|l1~Qmmb7K6!R70p1f-dO8yO{pPoO^$q^+ z&AFmJ{J!S+(gfJAWP!dS5@Fh;VcTi`B*XihQv0?Iq2C>MCe??KYC8Fa+W3`C!~ZY$m5=n+De)D zZsi8l^h(p#39nQBuE#idgd84InHOnjNm4~I^|=iLz5VcF8lHZRA43rdGvRUWpDOWh9VG-E z)G~B%8e*(Yp^~Jlr-U6262EouNxDPglLx#V+}(cP>~^u}Akmd{RvabA-0;{1OIw-`! z6&m6=1a5ZSv?I$(ALTU=v4Z)mlS}i8uGU^dn`R%%nm!Edhw+me>?d>adtuaDctotf zP-(Jm+v>yfkM_1DNxyU(?g}TIE(?7BJ=_W1bemLg8j|te567^^t@S^)rDE@`9$7lC zb~d$aD>E|oV_zV+*D(ev23ufEK$tT+KV0$NgSstcVIWtV$8eri0RN$Fx?w8601g5a zd%W8P$2@=s@h~qZiF5l+0<0k|GozYO7bt*qB{3Zd-h1iUsv8PX-bMEXA(Z3Z!BM4# zn1i%n^awBStklp;aPKDor&V+U9E}jRxnkY>B=q6qH@RS9b&s@bp++a}ygj8Q{UD-g zZsnM5f+Nm=K@1;KxPHVUplX4_~plyMq&nBxnkuk_5_r65AY#?yG%OgA32-A-`EL5j!<1dqPYn9&IeFZxjg)dL zpP2#g%3cXueOyv4M=ppiuopDCy=Z(dNb61`Alm&Eg9keM*@$dM;=i6d?mM%6%^~6G zsshPCe#u$%%|2R}-s7Z(pr6hyrPd4YXD58L8U8?$0L6>E<-_c!-(I?FXKC%a_rbjq zu6}CE3k%`4)G-g*h_8Gv25}IAsoSV9LmGWz-y0c=aS^GwI5AxZJ(BdfVGWXG!Em7r zU$ZfRsGOMNJr^7tzt3#?VD2<8(k^4YhM+Fog``csDeSY324ZWlz($u~yah&R@XqQG z;TX9e7q*_ea8I!&eeQL|LFf05d$NzWCERvPDwF2dzgj3X-$=^k}94PLh}rrL1<6xhwp(;azhx>b|MZY37Cj!!5J}`U?hk=J9y#Dr{gO z24t1me_DIrzu)C5ep0gJ_UNjZW+GpZ8{cb zyC%-pf*^=gN!S5&Kd(-PGoJ^uNchJq&{=5*b7xekHc>pbg<6G)V(`#;R*0Ctbepew z41A#yKTq5%Z}u_Xc8FB#3Z-^;!oZV>{X0)(M-sz%AUrm0|k~;?& z^=Dx*^rCK0Kv-JwoSd8ohW=I@GWq|tLzFB6F!1J6_|pW8ALk}gh%=N|H)}CR8tx8L zUzwDgc$P>eOEi%98XF-<+V6~y2Ia6P$oS*@2z3gmD`F*14c4(|@!Zo=q_iBkj&KYF zIh0-fOfMyrpG!32VDN}WJbg%;>4{K#Qf|pV_AftvRABS}`KMqs@DW^`p46 zmDIR=kV2Y$=&efc7QBXACY`-=Sm~4aC~(kz=*7%Vn=^c);PIvW;v3wyB}y$gx;K;R zmRadwLIHTu=T=_^e_{nQvb>~!m^$LiZR1#v;C=K}9ozlf`J{R7N>VgqzJx!4CC#Hs zw#R7NQwkw-4i1N|bLI5;xs%N~L~BA_{7;M(oX#VYQ%4H0juahwIuA{%9%<+zWx?0{ zFu+9e7C8@-IC~9Br47y7OqE2%dxrh}%2VH0E;bVlgch2m3lGfp*m6?k=C-`G=KZ1g+BO{sA{5=g7G%R!MNiKlre4q$gU9)&0hWE8+2 zWvM5UZEH{{Y0Ehe)L03&ptK>FEI~z5z-lJA3eW+>BPr+tnXA+l}#FVR=OObOoSxkEnxq4j%dX(Nk zTa`^34TaLB?wG=_lS4{uSV)DsSGnR9Ke?~tYy1G=rP*%x)(9_6WgiV%V_zh{9&*H2 z=yPU=u-XfhSL(S{jfhA%Cc!fIU4`pBM*DIjYAF9$D8;H+fI@y5JPcBqbx)gWIgZ+q zzfe~IV=C?xVZQPZyoJ!SUsA?A3I7iND#2`Z4JVc8V4B2mf$XhMBA%AZpuW*m`^fPN zR2mT~7Wv@zF*?QYRLGWNAk0zTOdi{PKl?R2iQHYLnSX1SFpY$ z8Bz-NzusE=&kFc!o|7Ta;TK)T0H>Ll0CnswFM3}I`Um+IAJ=V-0!gwo<{V#Ppvk^@ z-v2&l@CkIMSGi{-MGz4G%UaG;e|&^j)b%U7Xvx;xF(c{yjJbmVz;N8spX1et(%&JY z01l{g?<-Uica0~LEk%T*HC>jZN|8gJLcdhE%1elzEpUGw^T(?1agQ=U1c<-s4#5uW z50jlfIP#5dn(hruXPlnVckQYr?S|8Si}+d1EUfNlXqY?BWr!s9RVUKNa)7n2pPeX; z`Al=kd^zt%H_tH!a0FF>IVgZFGif#;A_ccP#V=4>^iGKfdbcbFF?`)jEo< zcaAer;4w3uMqMl4y>Szt*bK6Se18TZ@bKf4MDs&`+oDcj$Vk9rxt< z$g^(C<}C-Z-BoLm@($3m2q~lO5vC>nES zEJ`WJF*-m4c@?AhWIWj}baTgCrLg__-@&k_<*(cj_T!GPYozEl>5XOv3A*(#~kTTl)qsa^AuXF{!KC`XW=fo6?mc z9JjotE-ShG_*f)dn|w`tD-a@4Tt-7+&D5s_FHF`3?FP2zI>d*VfmaFH*a)(PX#qvn zp+E)vn)(~?O`6C~T?X-`L&y8a!rf*2ii1UR@d8+v?+={Z27M}42GIh&?7*fG#G6RM zd=5*t&t?5ii^*MzCSqs0b%Z1lKR>$|JQDJf*r{Nz5CIwuKie*Mo9p=w?!pK??I?s; zbp8^7!o%{+{mR|+Js=orV3g;u zp5RP`AL~tBq5*F|%(CKYb>Hc!cs|J@{dAN5V_#2vSNM#j&8&V|wSEylk}381*4dYnaEFL8ay#}=N+S=INzDe#}*4b7kBxJG02F$#QD%4d*OA=+RP zP~kJLf77o0RHqn$Buz{|*i;(hiyd&P+!+&tx#fT80eB8M{(Rsqxt5u;uXe@~)t$IdXS6(*uaRr7asLuI2p^Uj`XAewY!;Jk~%p0jd6G zy}+bnwygM9sUXVv1pV|cj3vqVA*=sjK(4EU(S^xgw#KYHw$Rg?7 z!%WI(vCEuCiiv+XT2k0v3!-#kd4b8zpcC%yu~WhzvMwiD1j21c>uXkmiA7D{&C{hfP;PYLhrL_PZ`28d)v4>$j% zafSVg&kB^~$;j~K)bEn&_DH$VCEB7T%U50AUP9taiU1z>uozr1G`F6!BI} zc@)!1iWK%KY(h2#UYJ6nu# zyMO;Bj1)C2F8UCo<@j{_r>V=654~sGAdcgqGvIu+>#&vx8_yO=JCJ#N_|^c_IGdptDB|Ly1^_PE+0rJk)zf^evf2- z{opE@O&{0g8lF{@k@JHRacycPCVnp-)WX&x6E2_WkFn%JAj^5Gyaep`8eKP$U*FB8 zr3vea+_?D zNw&Yry9HJ62HIg4!K@*I##i?S_5A}g+CSPVaoY9mAcHe9v?1!fRsqm{`?)8$F)l@2 zgeH$WcAPL#U-!lLBf9{H+J0I7Wu!5XfDl~$h?C2^p@$P9ixxx!8Y`Hy~1E(L}VxJ}HxvGT8YHR&Z$i_l@%+paU)l2RsRH|bG~e>xoscb3J1fPX0z!(MpV5!e1EwGi zd=TYOLEx9aiPTJJ4V{V(m+>sq^4>u!o20kaglopwOeCMmQl57MM zt|Zo3H|+b{V3g8EC7XyQD(?7^)t+fU^5W4SU&~ec);IS6RI_@~8_Mf_MW0v;4NlJu zDBOMU$g6ps*Ey8NGsA$7bEB<+Mi2q>C|L56b8Y+yE3<($yLb<%EVvn~>l5)b$$W7( z+Fz-Pyy=f=;IX)0Q}7&P-e>C(p!b{gb9zevS9zA&(uPKhRfiPQkQ@@j@3Z?ao8O5g zA4yX^<#{fMh3)U>lcvvu=mCKh^(!qlie)1%?`D1h)&)82dB0cZfiv%J-`TNvLsryO z1zuBastJm6Sp6|^jqU);nrxi`EamhEUZcK(si%HUc!&A|*7^i|Hwd(uYP(oR{_X-i zBQ5_zBrxGC#OK_RAGi}H^HloQrkz_mM>`~Nd(Ctj`|ly%g-(@W91GHY-6CQZWLsV- zu=CGmZ$Jzh|Jl%Jz+mXCu}W$-qka1F!ie1p*@8VWG ziu{*O;6twXGB+6!2OpV{kn4U;_8nN#WowD&2NOo#ChrDi530LNpVlwhz{WAL8#-tje{;Nq$js7f6hf*TAQ_A%jsOFt?@;3mMV2c1x4RY_qNFN32{ zci_B{7B_)7xx>x-ECP01{YWDOmJa%G*pwIKhtBT^UmVHSeA1snc=pPRyFwpT@Q?ih zJw3Oth%2$Z15>D_Nh=ov0`H}?4*wW~ouY`WGEAXxDmEy2WZT;5R}kkxxtivh{nCr2 zM6m4+$T{;K88{G2>jJu4PSg4z)pK-3D2I7qCHCZ+@w>*i2Js#F^3MT~TcPiO%@@|x zeds$QabFa{jbS@h+2x+&X(Hb`))9T=ajtCYpz$IyNG6c%97WPp%y#M^^NsL_jy9h7 zY`%jrTDU`jZ2<_$-3Ac7_y~k~eO6cTh0;CO3hGAVFwpE7+4))qXg0SmDEsb4w}g9h z#jC)t5$i0iUIE5xTRQ?0@B%_=)T1|W>@n%1NY{nmL}S$le(q~F?8|bW?cJgUKh(RBTrn>di z8xiB~mbfGZL<0e8IPiTT)hNv#y%H^0ee z;zIC&&GZIwk&;`K8f<0l&-c#Htr_vnW*P&5NrfBl9<217Z29Rncuo9=@`9``%_E8& zTjj8i_+3JI5vVeA_LEzTXn#V?6PuIj&8Kd4Ut77mEiVqt|C%6}^soK{+Z17CtZeOm z*7qppo2!HQc<93(oB0FrPAAb;5^AA?x;VGPiC%5;)8NY+e_DM)es+$pNqr1@@4mO< z(97AyX2F-+{`Z&v*FEg<&B$IPPBhzw{ld|F-J%o{9{F?zf7(KN^VUfAARlST?%oo? z$1Lk{DP6lD*r9sbEZvw#G9a=s4zJnxgTKfQ+9813z6nGg8)3RfkHODEL39Y#{SWru zJF3a;TN@=H0s?{}f>hZms3=904nf$06;xC}N<>stM7p6SC@6{oDk3N)AZh?4om&6+*A3D!m`BjwzPy-&e1uvHa=E(-L+e_l)zWyYR=mCY8z536IURVHdcV8h7o#K(38}z z-~=kD-SkAVveAzlwsIDQ;ev`tcfwX2djqnuOJP?D)P$-y%AF9*vlmk>|Iz~Jqt#q? zP7EFz!&03QKUw;i659XOA^*3U85Yr6d%gIWm)Pk7S!ERGr3SO3W=$Te5A}*KkZCzr z6r*u=7@$T)Tkta|zTiWw9I{i4MkF9j0b{*`HdZr~MR)JQdR$>wZSiG$lHiGChR~jEg2dc2*^skLb9kCXk zP@4>oj(GCfEgHGNbq?A=@N<#BpjgWhJUk6cqesaA^cge_Cn>3rHmR&d>ZebpXUr!} zrdFUqtxZ}=zvU$%Z}f4|pl~d=PV}Eh3_yA0N=5#V`d{?R6w>4&968HWFP2^SyQe3u zckbS-+R~}ku~$`dM$x=kK1j>7TS#d}%{tIdiTVA4#Kc*`3u}`|Lm8h>?d!)a8PBA~ z60qWtJr?@idYQHoD#Qy}-`|=3H~{yluUxwuwNR7erK?PpWQH25t-doQVqL)3o!FRQ zVRz;&{{@wv@~7&apCyj`vPoIZH}>59QK|l2&92m7VS_kx-T>Br2Cy@_M7tbT#K?;3 zBz7A-#IGB`soTdAqD(#iHEu@738yqb3GP6f_5AP1Nir2w%TXtQ$TSqLL3Kd3nQ z_bELZMAhkk_1rXAxt)k%-g}QnGuU?X$6B$wMtzTBpf$#dEsE=bXVXuvv?3r1jx)5p z2fFyxLugqe++FC&KC|}vkFXg1@#9l7l9DkUl}_o-SiC!Fc+hPt5bX3GKp+F125;FtrWy|FkYJMqWb~h zI8ox1MpJT2VpF%qSPJ^04UYwW5tJ{J}=P&E6S7FP!?@V;9*5C|$ ziq&mN8?GAk80 zZF`Oa2IMPyc=~8N5ght)8oh=wi0j;)#-C?oS4DOWvLCEjcFw_iOW;b-Nb-NUhFzFq5) z`);z6wJ%hrOQFC*^}GtKV0Gz7ob)DM;dWO4-BxqeqYuO3fiseYIxj-@ds}zS#QTaz zi5T5vS<9tQMtIoahV@&bPk7V-K5vW~6_-*tCN)<&Q6%1Jawo6@=WEV*7-VCQ(m{JR z>&7akioo3z&y!C`)3%=H4fI$~seTXlgyyy)O%{e@m1?N~w(06O4!P*My*Th#itEhQ zb%;%niwSCKQJ5AyWK71(;cG_>c9kuS9iwtF}Zg?bx>xGGikxQSZzlBomgZjWDfvCX$NwLY2~%Lp9(eLN8R! z7#*vml(Tcub`WhA8M4wrTr1-KfAs(dG)sCM{oxx#Lvtn2ckr8_My~r4_7q=uH2PLD z=KDDykrVG1dds=uRujCa-Dc=Ba87<2m=7jgP~h)T;!Eb= zOQU^b@wsQfq3$J&Q^P=j2X4^f-uDR{sx!>~=n4A50O=XhZ*b^4Pt@?rauwo}FWuaDjbR39TY1e%@#8%hsk- zXt@Q2Xhf>j%^mRg{$uLas9vCDV`Blx%U>v2FTk@1EcsbrxI>L|C(Ca?DnN3mp}$02$($${I_`S(H?^xIK#MK z`%$U|9#>M>ITk*@F;9S;jvevBE)X9KXpfFZ1njqFcAp2OFBgmtX42n*m*~HYk?JF% z0)^Xvu^@QUj?|gN8Mh`B-oX!A)ncgb&^94CBX{z*XQx2$@oBLU`J>;?GyoAQwa?YJ zaLU-WG1f|RHa@Pvw3fS#oDBFXc#sUhm>j;uk##lN=EBuk+xnOSn+<#vlKJFZM~f-F z2#~=fL7y+;6mJ|j#VrWJ8xEud=wW(@kJZ2|e^ukklGXpIUmjWcsX(*HgzFEjH+3X7M}yJ1w;t#@z8H_v2M4MHcfA=ZRIZGgJ9*101hTkoaZ z-*~o;N~+tGRl$TS-KnIwgiJ?&c zxw)!dJI;-9Sr#&VXkhhyh*|N{x6?!XPwo0}%!%4(3vSCs6R?neL4M96J)`sa@zKmD z{UZW7o|;GRo%${+SpZV_QF+)Ltm$lxlu}^<%NibWifoY~6H#IH&u}ic2VUP6-R&|6 z^-4I}T(${o3sW<`hM>JiZH}LeGS}Q35GUv2Cy`ZB-C4M=Yo}S&H|UFUNm@=CGl^v# zSX;Avj3cJnB=OiqY(eQ*)vVHa&yWn)GatYy+=T4l_e?IEP_=2PtKngz9?V^5qm{Q* z%l4Su4Qw|_AKEZ)c>A{_xSHGo)Ie}f@INQRs_0+WN!kJ55v-jR((}(LKYnufSqa}{ z0=TV()JxQ!mJwvVz(zp9yt~!`)c*DB=V@6J$7tbqhegF5w|l}G)mb>ED=B*+I}Ye& z3N4acy7AX8vd_;or7vG-@K}cRmdMDJ?B!j?4K%f(&$icA*^eM1G01Lk)5!lYdX`BSQLkUvA8`LH@?ysxDWf z+)~f4aN1fK7#1G>i&FrW#505JVKf6cl(?`jIDV(5fY9(0bCe@O_UGc$WryTj3|m@h zEmXhz`OSJi=9b+2jiiQDu3E12)5^kTV_K-g%mt@u*;&=C_M^FQ76!bMv`6Dq4w>20 z+OfthLw)heMqi$0oe+1?140e03{akui0A+~S$!p6Zk$lg6lH0OCZ+E%G{syB#dEL* z$)*np&uIQ$qbcAG_2c3|2w)gqq@l9=;DsSGlR1x{A0*iNeU$8doyq#%C2^7p6Yp!+DEiI^%;nlFK3 zL_{!PH&uy*EHwt(7Td8{H8>-4{V8(kNu}|EZ85AanNkpDxf3HUp~z2j?|@RE7b3Hl zJ0SQh1OJ;jQvfjtD9_8qHLy9sM|J#9br08GYZ!e!^i1Hxt}rY?Nmir6dOEeE0Vdhr z@0W;nCoJ-PqcTDr(4N1xD;q(&Q9k$XjmzoCCeig+1Wh5{*7Wy2>PmpgyI#@0ziQXq z7a)?vwRq+tHH1juA#vITs2Lw+3aM>Y==xTR`Q6%5)YxOvTuTh=jya!nM1_IBwzw z-)d_h-yCdN^h2k}dZdpo?wUbZACeOX;x(lrX&i(^hJ&|mMGN-1u~Na(-%}~3{RyTw zVO0YTwgTQF&-9HZi9ur8~9pz?VuqaQxtvR})^ z#%V7RRH$fv+S2@|3#B-0D8K~Mtn@*o3FQcFS%ua>3D}M@_+?9K)q)^`{MUw%g4wI^ zv*z`6zM|(#JUpayExcil%SD9~O)xQoov_{jP%OUhn7U~oP%pXMr05i|BMq!Gyxc;M z@%Mkw({!qaWkYbt%Gr#noXph`v@i6NqejDwpo8B5 zJ~a(D0{KEy&Sy1k#9LD5ooNVY&+fy`ThW38v%>+se3Ey>b`QO9Ijc7Y1iiU~m+nI^ z2-HgU3)AkE^-5+6ff__uLRQe6ajp2de6K#BVZm@`j&gV5NJz%6u+M~fB-H>%qSOqp z_^(u=5;0xQ1mKqfiO%&(jt;7SWle{97T3M9;D_obhLsZL$B-NicxGjd1C$R?@AF8O zJ3F5+7i3|f?ZCD4qdu0Pp|6_m-$C_t=Gln*b!iM~@ zbD4RI1MEb9CM;pde++PErlNoWm8L6|9BWz)&(2Y5J8+^6ptHDP_|zW*@ask#U;r{~ z49QAe4&&KbK}x0qJGt*rrRe5A1_1MzzyRK+Yr|-i#k14DUk|w8M79p+|H*}dJ`{ur zcn5uc3M$|V)IN6I%?^0VyrR@hKUx7N44bU_F)G6_UNrRspF3sdG0VB4d_z&hQqc9Y#pyZuKsa9sh7p<0_qtNeYywuqBtf%xT@ zUK3cvb=efV;jZ%*Y{c{=)}dFA#l2!y58y>*C+>#vv)npK%_Kxqr<)fitlm5o^DVE`IoQ!ifnoX85m=-&~_ zxNI@r%F&|{iURBC+bwurP`dyJnhKr{u$;2;AsUg~-lm`ppy2N@S0nip&be(V!_`_U z{o222sWJt{C+fmfCN127RWhh8@DPle351^^pA|(4BIGM zCRe^+#X}tM6;hybXqp>k*tzmof$6wQflflYt%B$!qGzhGGXck{# z!W7U{$c-HfGpmzG3|Cx{AOw!TW1?j0$IF!aLJO1zRLtsX=2im5QBkGeh)sHup}%Tw z6>E}KOy`AaSkHly0k?yTX{MRhY=_o=YLqC+W`Rcp)0|nE6apInARuO4*kz8-@+WS< zO0Auy=Ar=tlh{z$=5#BG}X>RPR00@ zr4@k}-n6uzk=jwFc8L4O1t{oQ3nhnAxTB#F#W&rvSrgYaI8pgJ%qM)7 zJV~DARFazwobV0=su5Dqi-|d{oKy+ zdN46)5NKTW<&4hyL?N2W_qE;8?*-#$<&Wv0(CdSjNxzgc zM|dbeB3L9bESqJt@jhS3*$q71{Su)R29{w}Q+Pa-!G6mN1194kj^7=lYY(VL@$fY^ zHYl8i&q>a_r4d)g1r-B_3l95pAIrS4lT4J^>_DD4M6`gVFUdz9`fU|_vYX!pZ};R_ zkNDG)Wc-^B`pWNfoczinH4>hy#$`nmygked1oqLL$@c_4e&WVS)a5D~KnI;}5sO=T zUO*b7)DSQkE~8&$N5}A%MmKRU*ehT#ylRR*_|WtY?}fD`*A2a55xlLwC{OLOooTJr ze$W%RQ$UGK_@vyP;r8A0E79EqBGj-;*juzhTh$^f2KJ078nVYUVdv5nBBR3H8g8*q zDBEOf6JA9y4$F0N!biyxisL5tN?dzVsmf|eEbkJ`Aese=4@oxPX87(1o;^2-W2i9* z^%HbHi(NNk%-J8g#erR3n~n;7RsDKJg<$QtfQEmGdM@i|0J${2*d*l^!}w)roy7BB zd*?1h+#+9GPeEU9cy+5v{qV7>Py0M}%ozZ!i5d3Fu?;PR<<^G}26(Q4kn%BK=*#-} z;F?txlrO>OXtruj5-LPoOIbc~s~MhYLGY#Pr6e9O(`_=a)bAzqyy0f#(-BU!pPBmP za2@V0#k=3Q)CT(vw6WP)w&uIHY=pR?WaG102fClB2~ce79V9r%WjOyj1X=OJo_=ZeO!&VZ+#0j67u& zCmDLe9{~HXv~IKbDtl+pg37tD39w5@jv#~NMpWzGu?OVAkGkZhba^c@LE$~yh9ghl zJIV1Px>HVc;85;A81NdEH!Pdfq)JMFuhOtjWlB@9s(Km=L6N;EffD?|fzt>(Mav-_ zm8%y|q7DVZ^K)ue+j2G?+&DfRUONIMBa%bb7`PU@Wn4LA>I-=tyT#ai&G|iD+GD3? z-`+;Wmhf0K`kAs>&Xrd(ij$Fsecn6ariB#IUTZj2%zmxVb;OKaZ$(Uz7E3A`5DsaM zIZR&X1^ymCo}O$kKkZS&*}sg<4P0vKo{>EK zjR)(lY8_7@?{ObJm6vqt^K6;Uq z!Pqn=!Q?1gtJMaZ9OB142A>7_9}r;J56-2>{S9x@x3Hu$-m$!vaW9_bBvp}!T=-VW zz2`#6X=7H2$T5}(lE!*mw8zMhy7fnOmXVVbneAVZ4gF0+gzyD2_=fUs8=09zIxft0 zW#^H$4jX)5x*roG6x5iFRz>Li3Y~L{AIyqceQml$*=#|@_}btm(mm5n8vci2p|tu< z0(~=Y4IH2a$z`dDd+@C^+s)Zg=TE9vSYzlIj+qKjO|bz!fR~b)h4ak2r`%7$hp8q0 zKOX)tJQsLM`Ay1E(BloMkXsa=JOhwTdb+Ps+Kr#%zz(;n5A*NmyOFZp<+t6{SOPHM zrAI32F1-Ieum0LwNxK&!>zYkp8Xf0fMqcB!656K*@~;wujcJ3SP96Y19A|Itq^;VC zX_5%sJ7R?tH)}pHu`le?44v1kyl)=6;g<*CG*bw!xY<2JdEMCK;o6ha@4B*yV#{fT zeS6(UJQY5xTzm3NY*T&Q(3B1yWM09B&H>tg?P@~bsvq*^za>I=fq($r)e$xJT+pIW z2S_C^GpjJbt$|;+Lkj}|+m_Q*UXBjjHlDAuKWcQF0aU3BQi)_8caVk!+crFh7(ap@ z(!sSC@VU8lu^%e8MC;EP&ccqH)~A{(-3qJFB#g;Df?$s7T-`!rZw0!qE5E$viD_kt z!zu{a6EEpvD5ssSCSjZrQL?||Yc6g@dI}q=;Z=%BvuqbDj z;he1z7J}`|@+f68-pe{_%UHk;Vp3~_)vz^Y5WH%B!dyHNvn4q?@l}KDNp2ibG~vh0 zOJnF2QOyOh+}OIt_wvNz>Dq@@!x=D5RJ{o5sCkF@fXGtniS40NEt!$~cTlBzE@g*ES)NI^1GHL@C7_R@>p*Ewct+WVi5HuzPfw+ZMSx8dP*zw&gf+A4Q0ZfVF z;4~&8;Jb|Ni5AAtLDj3y!qdi+qnl45EwZ8BR2HhRk|Lc&dZ zy`t7UEm30{SBindf)wGT0>=gYTyWOy)5?lJsBm>0pWAbm^~y!$!)T{URuWSGVcd_S#Z-@Eth1+ zw*$uz8Od}4YTT%eI1R~JTq)ej0ntf1&|ATzo>5eGcLY;-xPu{eODY9zko~soCj)-n ztxT1M*=M=qCog1D5kJkX{CHv+nrdK9zLNe)#DsDu+-3h3BvVm$sXZF^qSy?!A4IXK zqyU%2r<7rcI&z+7YN#lGG^O>qt0G-fA@&^Aa!`(VB3d%yQGB9z#sU0u(Mp-5*XZIj zQJeAdTS=!=PAEO_6_vO+9(t2>V=+QBJ3c7XQ_mt?e(94=Y z{-=ZXeWWjbpO&D5Z@H-d=`}R|YMEyGTQ5(BTg3>8tH95`R-RIbFeZOl&ol_Qm!n)a!tIW_ z(YkNphtd@G&{A*tL%-3;CV1ajLjWDI4%1<&P;%O*ztG(|gU~Cy^cmlvu_m`kw5{eZ zc!Qc%(2pv$5rz)cD?4bF;0!4+oLVkIs>Cldehdu;F0xZYsU7hXBEu?fE?;mP-Sa;* zy$H$LMv-q)bFZsW(Wg|HTP54!n$jjTT#n=O?oB-UALtyN&F~&}hMs1FsBd7SMpgVtGVUO}+4Du~RB@@7cpVg;>7(KA%)M<2 z&=PZNDG{rg%-HE{d2c=V+jk&1XH^E$-)vrL_myOx@wW%cz4*-FF94x|q{^KB6n2U5 zswxW*43*O3erXQO@?I6o3Q$aPf){iqoP2skDd<6l3zN}wHOJUWzr{((u=vk03xxK# zn><2SoHwB8lX+T8$|7CA_IT(mWcA~V$GG3PTeOnS+jd=fa@iHTPE$;+(;MKZ&l#aE zZ&vWV*y+A@!ppqX?n*{PvxQ<>cx=J3h-txkMSdkuoe<=DE}E>(K1uLHKj2<;7vSxh z;vo|WjcJ=1o-8OFeN*7rQKE9y`NLqB1h0zNz1tUR5DcJaF!s<8tcT{8W2l}F5Tjl5 zjw5c4Zi_SAVTn(vxQgUHB>gZis-!V%vy96`&2UTmUXGw;5F_P~2GB{P?qZa>>}=*c z5V^lEDN@e@kSih{atoVSf%H;^+6}Wp4&%pF zx4P!Io6&*dS=A{~ol8HNrGg@;4>s>TkX)w}PnOHnHRZ1f9IG28Z|R8Z{L9yrwg>a8 zL5`-e@9ns!IgTBh=zBn%2~n`Cx(0XxAU2At_5sla;S7*DiuwSGCiK?b8=v_uAniEFoO1jR*sde?ZcpB;n4Sb z6$!q6bx8?LrQ6;gbT`{cf3m!$^4ExT`bKRYYGFU_L*5iVdk-KUVbCwJAEUb}XY`RYp?U9j~!}`QaA^g?Y zQZ^~jRVpO;^HqWIUj*+5UoX%x@=tsQOy?^33Bv5+Epx+pnj}Q1@0>DItnqF`SHr{r zZ4o{h&E2J4@}N|f?$W5vUyiu{q<+%NYf+WkD)SS)xseoTK5E0^rD|}*Gab;Z&{&Z7 zk!>ySdWJgS3hH-##9naQfPW`3c}wJ_l7$EI`9n<_W(Gu;?aY2~Z1_J;eyWb4=Y%L% zFxdT+9Cml-gmN5~=LNQNAhjw8$EknAU7PWOsCXQT!(2kVB$uUY|Ljs5lZY`;JTl~j z`5lf23<5@(*^vRhu3OCK^G&=G;r^Jrw+Ls^eR1dR7c8P5UzxU)$IGu~)k#do396NnFoNm$x?=th?TbDP2f`9Xux+-LSp*P-pOk``ZRm8ZQ=QW| zXRYL@`S@ofjaRnNdvuG$;4jy+vp(UUxVYF--kgqY4nweNuX$!{rW6G|{@18<(YoQBAT4yQH0%LIE>^mqI%+-l@5=p)!8A1{ zOq(O^AZKnan)HxIk7f`w?_`5aQZ|$^z49UI-Ukoy6DVR)HDbvc!5a7 z%g@|B2U-m1W++|hWZl;OU16EI0n2ME)A0b0!%OiL+JYwZ5v2SsN7DI0d35bBFbdL z%B&P5p=^ur%xwo_wPU4}x-uT7ILk9VGVc+~;e?!Qw|txaO$ssReO^q!e@NxzZ@=ed z_?ZrDz;pLl2P>@aKgHH@Tqa8GeTV$=R(ek!E42OQte*bEqHSu5zO@G=OcyS(51Ifh z*veOa__`%ME%4&IjQawzUtZWWADNPGs~vnAztv#;jgWG{K~w@jGq7p)pvx5zLcGmE zff0GX1jbLNTc`+SeR-eXDnco1%R(q zxKDmvD7M9XX#ee^M@KXJn<5Rh#mUc^P2b!*bJ3#_d*a4MFpD7hnfna=GpKR6oo=|L zOCn|;)Ni8iJKfGX1)zOo*G)d*mQL{WLk1F0lF5RvtQ^;Phqi!2|AEqZgYxlK83&^7 zQI>9@0`^JNfNeaj!8yba%>ygiQzTCV=-)*s=X+pvwF9EcICVo0y=fD)c|4J9Wu_`s zVGdcnt{VJ3ZjysSD0C?W+&~yuuP5nQQe-gymU^VzG#e+%hbJ- zV4qtMUdXJ!`i2rGh)h1wmRH1Pd?x}ej$AK36vG$L?GNvMAnMEPg9kQN8}M<=-WzlZ zcmv&|a)VaaHbAetPjTmvlvYyuH@D${VD{r1JMqt;C4sVcIODMgD)WrH zjnJg@^d7m4sR*$rcc=Fp0$WXFM_tGQp-k&DSCi2ovCZuoCH#gR-f?ntlIA6;(74xc z*WOv}jM#+z9yiy}WmD-cpScNMv17bPi(Iq|dAEn^mVbu)rDn;}HVbX%m zD*XCc?=RXzNp^IpwU@waOM7-Uy5UsFO914JayrGkCs&`@>l;Et7(N$eK3xP^?R=#` z$BvhAlEg!+K4ZEHQ3soYeTL@M$KHOtF?U5H;U18ODqY^-Q-0p?*O}gjC==u87{m8w zgRiKXENu#$7NZ4#7*>b&0=1V*qr3zMkzDcxD@3$Sy<-x(Fxf}Blj3dw4ZY$_3b4~> z{qEJ2?I(O-W52W4 zvS~VZVv9nq4`alP-sN$*$)hO7P!lZGL_mF5-TiQb2XAu17(j3dz0Yj5^a z^;BC12+s9R{r<1Ix3ahB#yVd(KBg3BVsG%^#8}`rZt=VWRh7If*iMkh|EeXZvuEH_4Xj%AO0Q(`n~L(2i7FG@oK{YLDLIYtO?s_#^x=m zPsg7yYf2z)jTOv<9UQYFu6&n1PqsZ}I=ks!!RuYC(L5+@H$!z3fC5T=eVnVSUZbV| znu?6O@o%w~iicFce@cg!B@TWG%VPkxhh4HXJORi@qPZl{2 zKGm*^I(S|Qb@kp$M9@xl;Px#u6vj`pZ?~y0yFMr`0Cig~2NgSzZ5fSdUBv7S$CV*vBRmqd3_~D zN+kK?{|xM;&O4Ad`~bEAd|)4`iT(Mj)T4u0nLHOIfSpfMN7V-3ISF(C&eRK?1!gE0 zZm8sg+b;zJcN?6LEBLUjliK{}ui<0voY8aZ4G+8j3{idbV@N)I--LkbKj$LZza@+Q zEF3&7QXBJy;3IonB;wCsOYe)g%c=mmcjwO#E^@zt#jjUk@xWrC+_0w}Ko;X~Gk~QP zVfovGk4vkO$N&8GpdB8_0bA)3>GneMUt8&lSKE8nT~cESVxS^Z&(Y-cN1tP0lkk@! z&x@8zokaM=x*^k@+iQPor6elSZI1y90XKy$?^h^2st3cxa*6;WK zY72DUm9>Go1{3cWSGZskvS*|xwws@#ZQkB{iSHol^JR~;Nq4sVCr|!dX}2&Mg&|>z z2mFNy{aR74NJSM`Bhj(Fw}<~AN;iJC>YtX6>=-y>zC$YA z*KWOG=XX~``>40s(DAZW5wuByCp-MHp4`MX^qzcF*>%K$a`Ia$(!EZ?j-AX|;htvO zxm?NTc`CfZbH^mWoJUk~=-7{W<1yqt8nAh~I;v3iz?P>n9XIRMiGJYd&79lecI(Mu z0P3JZg&TLJTG*qGp>IO!KMqO&u^cPVrC!1AC;7AP2IOY>^$*UyUgQ+E*Vb&X&;k07 zwB1fk9vA3`Oe2hBI&q;2eYjcKP#p^G#WFXQ3TQk4FO&*r;g${l zlYY62(>e=)_b!5aTy953$LGs;u8!K=xFIGXRA+4;xN`lwUPr(O+zzvsnyWDQ6s8lo zq05!aG_@B@iP4`=2^lEr?r%2OY*c3n8ee1?_CMoZk&kH_mLXG4YRogRO$>hJRUNJfuQeza81)-7AU%Gs@f3EY1+~Z? zY&Lij#xL(WQGI5K^dH)%mcVw7(M1viEQI8J%&PQhh1eVNW5v?HsfX7!bSgec(|@Zn zJxsR<-*YL&e>CFB3j2WDfKj2;&aq0_r5L}|IZZ*y zY0=PHJY9{~8qOjpoJL=_3kTba)EZ^hSBkqlQFcS*9?$;bg8$Ioe`vFP;FOwEpSa?^ zMi_Z=q#^CKXJG%8ll`Tgm2GoxuZ*8bo-1JN7t7M!Z>^+g8_K)(X}LH9p_+P8u;KX~ zAR$*n!M<=^sr{ecsYSHke$F#zSchebKNGds(t+_zaT`!8+y?CLsriq0_KrL##e?y7 z(DN?@6)m3oNrap(nQ(SgaVD6r9LaRN`cTvJ18z1`D}5+kKgjnn3#rjOklfK_%r*tq_pak5Zv=!CFIEq=Y&rvr8_!tPwm5E+|xxI%>9yo0%-Kn;DZ5oZ)EG8#D5DDbD;2WAv#75C3CaUXIzJS<7bs)>k`)wWyHb|p+S=b#p=lWRX&rjJM!02L45XCP>QGP_RCj| zANAJNV+gymix{S-X$(vsky(D<92){4E&<{VMoSJtEK|<3mSZ+Yer$5drHoH-QU%GHdf(yy-Wl zSQs-al$n(UMfVkq^NZ2pa`_-H!g7(kDOScPk2I(O|PKvZGhEyOdQ+yLNnX)XjD<@9<^WuX9{+r|ZuzX-m34CAk z*S;=LTKz%+&)^0Adpx>>(6W(=^8?WwyfiMSaRb|^-)9JXt^b3?fJ9ImruMP*{&8yg zq+P-Q_l<1JRV(26ov7}}*58#ST3F5FIFzkK`VSt?GPPspY#+vKpRy;-f$Hs9{RYx% z0s*iR9&nER<8^z5kKy*p_Vr=Z7|D1(IsMWN&TCK6~zbXeV%g zZ9}(QcAr>^(IR0J?erFu4%GOLG+c_B?D;l~u^gA}d?;|xntb4+Ms0nD@Woa>5!sPu z_N(et60;I8o8*4I?K9A}0_3MAtTz@X-ZSts@^0p2_cLo*(8UeHV85_}fT6cp(*e`R zJ%aZ7JC5JowHp>Oh#uY3REb>10lrms_Qr<*>kubD7uVoWfDpf0M zE2!C8RIp8dv;TNF&(dtsLU1lUN6h#)OF8g(im(1`gFkdVs+Gj%W0&JdkaI>}&g`r`sZ-ayQyNG(d%fAm&Z?2ORW9<)iyYsc@?iU;Tzw`|?xu*! z7rLTz+$#9`{6T%sJ)0bS)>n@H+HQV@Y*e8%F>_TU*IV%;5il^@ZWXzYczlHZ~UT~uMs{?o#r z9(C)Qzm&FutTPX(+>pj)lD4_zCrF+a#Ck^VR*&VTS~{5jIEb?9-&5tJuJUG!^|0{q zD+(N=m~W9UFSBFwtpdxhnD3WPDcSa4#qhOS0!`d(e_+>Gv)ehdCdAWwrdmJA1((dK11w?v`D;QQpADte!Zw3OzkKqG7`(;ICE%cS1qsl0QM$N=ODRnE z^EY>3Q--5_Vx>(D2Z2KBB+gx&6P`BvW-`^Uecx;;2o-#^u%_66<2bx0$~M+7wH;rq z3U=XgqA!$V4m6#j(SIk|u@7-CVJCaw5eGB%XGTn4_~ov4@uVB2AQO){q4lHK9V;mw z8rryHL}`$^d5_Mq^;y6iPq>icn?kyW%0C8jIQ{n5*tgFfu&!uHYz6@eGS*NU%iVQp zSJMIFhHHx3<2Y*o=mHvi4i@lqtih*1qLW|tr!J;=EmRBu`>l!aSHzt+d_jQY^0Qxj zQC*RC0m2y6(nTNFpq&A%j8r$fTYqWpb^$Q8D0Qxm5?IG#mdf*2l#lu?{yH=*_=n6m z5e>ZnE{cy^NIr=r)UHr@L^KHYhd5a_37-N!(8xdwGoOwR1PhQ} z39+IE-P!h4z38RPKZMZ#H-{l1hk*>c7bGk!K4||?I_X5;;Uj~50o!`RJPr|tyfNdB ztOEkNn+u2do-4%{_{0W0TQa)i9M(U)dIAnMhw}~k{g>W{h5!9E@z6MCATEH1cWFf1 z)bdh{pw=30CNwPt(>i#z#xQdx#@$C#(*SBI)!zx};&zy_izrxz7xJMWY*FB5q4eK#3lfNZB3k$R9xO_9=f=#M!OpK!$grfRRjnU2U*@8nR(t0k zC8LX=0!{ieXr~b!U`BVO_TVVN-@Xu6-xp#5AAj|1gqMB%g!<%1Ke5%*yc~SN^^@_| z-p>no$q{}*wyfK8}jhcF)uS9lk(95_yi`DIwz-N?Kod?B#+VT4K8;ZIyB~xA{pq_-tGj!u8+@ZAie~aI}oYkyf zOJ#WIY$kjFT=7|FKNqriy#E7+lWM{RkI|@ee@tBiDiv{Ii}6eDlQ@HqT#&$85z#A; zE$bRMerV#cU>vOTCt@9giv8NcMBW_@_z!#Li6d%=KVh(bN)ZF66-0?B*^(fN@KxK`|14N1)Farah84;$wDH%vcH8jP{!?y<+lyvv+@NJjen+BrY6}VCK@;wl! z;z5ddXvqC9^j&xigg>AgpNA!^*9h#}O7bL;a}($d{dr!dqo=r!JdP;?@uw3KlEeNHb(&QHO13)zh4hsQ((QG1Ghw$0HrwXPgT zZfQHO{)6pZhsB;X9rF0yy?ifBhuIN|80+A7FBCMyy(;2zCl0a*-6mv$1ZEn(rHP~a z#Y-m`usjXU7>?LfVTpB5^dqDL6SaJKl|q$|?775a(m7;S`#a6s?v!kwx?>5TT-I)< zq6D5Hk=GmF>)1ckyHE4_Q&|)ZsiLs@$~`0_)Ii zOVd2a3o#8Fhem5)^qC=n+R-<<6B_Ai>jV>5)s4kIJ^7^h)CnH2h5L7a54cE zqAEC5Qo|8Te)X&3u=`1sl6Ld zpFhjwB~f&4OUg77kUFWk7>K!rL)+{Z+eYm9v7*|b>wE~e5&~K$4?lX?vOWbLZEV}x;{_osrsr&^^Z@7c zqo?EJ15RsU3cy(-VDlV@Zx(R_2t| zv8)DF>dZxz+wlVYf3mSc_B0X1mAKMUoaW_OG`kd9C-oN~Sjw=V0|A()7S}0Wl5}`5 z%5h)YEbX+)Sp{!GD2kZw8BWM#u$3_YGDTA`ddpdn!A{Ysbc!q#Xk5|kNgzUWp#6Dl zc7nuHyEgdRZn6$)J55b7=HyDlFwhi$h=SD zf=0V}DM!ES$suz=T!WSt%K!dj{Qv4l_*VJa0;9QJmdL zAXS=ZaK49`61o9T7=Vs^xY#8MBdrgxc$xR(C~!{DOK;)&4DiP5`rkIsGfM%P!vY`)kZ!kh_NPsOIR@%bAl;DXWR{@t74AlYs zCmM>|ghKNTq$O;i1y+~!)>S3;h8=$n6L@#Hb0!sSCG+1uHUI11#S9>qt6y+mFgz~;V9djGxLU5EFB1XXt->Ak zmPHuE!R!UUa;}Q+28obr+ZE2+>|`{X@r{!3TE%_q-CwK;G5uM`amhhG5a#MAa64Bx zjPfywz@e};gY^MYZxuV^HfQ|`$7 z@JbGo@2)IK*7bnUE>ANc%%qVfv*5wRh4_W(L7%yC_L(@|Bx?(WwBs55Bvnq~l`iS- z_h0B2ZRFHfFCbYC$ggP@hd`DWnuRqUk4sgOI>WaRgxY}?oicl)Z1JLfpNqT&@UfKd zDv^{jTDCLg{Gv6EXtv>;fP~xx@h60X{7Uc1(u!$?jN6d` zyJIoYJ@i^~{M_AzNZrm~w|??}&`!!K*sSOEVq~jFjcU`RPtRoC}%lG9ZTAwq^+B@wygR2Zo!Idr&6DveSRIph$+%oHU>DwPr@ zT*#r2ath;2Xb2fOjhqJKG&9DW_kPxN-}m$4dH=k-eLh~8S+n<;wP&xj{_FSq{+IPc|}WRvFF6GL{Vk&;ydVcX5;XWs>HGvauJswh(k;l?R`ZBp=Sa zbtro2c3IrdB8I4y4h|`J9j6q9Hf?hu z!Ue^l4R^n+L8@NHR6}0`kd9A^5x+)9R8bQUv8Stp;e2E2p0U&zl~Zpi{D99zy=4vG zUq#M-9H20|R}c|VD=y5X#7iyVaNUgy(Fhfn`WB0rnm0)0*fsJdoLHNR zYU_(SV{yuQCz0E$B0jUR`k}kIWl)RPO7}!(DcWR>o=8Nl`-VS8Xcb~xo#{>aCWvFTy|`t{GiJj0-Z$7=CuZ7aA&7{*t?l zd{V(`OUIr9?dL@M$F`g@*%Nt8KsFa%!@w)CdwaO1ANA`8h`236n+49KJJ5M}GF&M)>@Jxr1M^SRw7-iS5t$cazXaxT~RJ z8s*b{XsoLf%qjo>AK*IQ>v)8!AH6 zd=meiX3Pprsr7oKODw`$k4Ac-z`}7a|Dhz|-f^+>EVBT;zWV;S3)cq_NWa=r zmTI)j*>8XC;1O!ajW$dFDsNO~eV%y9E>^d*Y%ohG)$nLSXCG9Z3}|)PN(oe>4Ub*y zpcL=L^$d1{ksXa1-?J<&uLD3(dR4pdK<+owpjCEzhUwLccE)hZ--m7siVpEyYQ_XSVZhw=!&H}@7rbNtA>Yx*;Q9}q zt){jPBB$oA2IIYZ0$SAVw**2rw$EfVAYT8IB=8FX5I!ihHPJ^h|Fv0kGf&2 z6e0l)Pkk8~e!a%%mI%!Oq{2Hw0a;h(7ACiYS<^Su%d>k}%B>c58T(6SRLMcP8jZc_ zT=Wufo%{<*A-oZm%BrWAS?&j=10eN5w>GF6a`-Oj1;%z3tYHW&ly-mA)e52`MA)!k z8SX<59V|rMIZnLI6wOt-M8970WBgu4Vpse5$L@0Qo(+_B&5saNk?$dn5f-J7b)C5z z{jYq4f|R5GVvH(;5XFUbC3U%Yc>Crp3aWYuR$EV{t!^1<{}Wcmck|a2-35rW$aHX{ zMi}K9WtKLw`;1zS;u{hj>4cHP_^v3{`t)GHIuZgU&26IOy`lmWNf zL_YigN&cRH%gT8Qce~GO#Slxi_i>2hb~`v||11|`)Y_Cec%#&$RCqB7#~;OrSAKbo zjFmDfVBawA&$q8x3M64&$2jhUJ|ko+Q56)ytpUW%9J3dB9p{e(o$&7`5&wO%&*;A& z0=P^NtvxR#f&4VuT|%J8S+tm=`#zMTOM@gxJ1_aQ6A=Ny%6I;ovIx@55aJFNpKZUQ)AL!)7lk>Dub1XBArk za-j-N+;7-8<$#%Yk2BAVJ!dbh2~iYAuq%LpDpv3Gm=;~23FbXPy#VpXXGczvi@L}OKok>@kNQ=m!_|n0mz*TK!}AlsC}byIj;231DbZ4 z=VtQXWj5KyOVVMyWZ;f8L+I0t0{ff$cKq{OvaHy=0aQeil2rT6S~qEVgEJJ>9@NFKz zgn%!#%>s7~nv0?G_F`XCyIe>5%m?}%r#oXWZOFZ+F?2|E^~ZP*X$1t+gim03I907r z*AsH&FMow+q(Cm^@}5}t-Jk8@@TM_HWn+C^OIJaj-Pu5KTFw>e^)w#bP z(;;(YY+A?XLx82F$ANmw(XkI6I!Tx2Rf2c6a~B&^0Dy>;lda=49S!(lhD^fa#5C-% zWbUYLP!_#t>z?1nw&dL>8dcmR&cxPK!7@7EUAyu|uqkmzluW*XF=x{FTz95BM zwE3p0o(Q?cNS?3b7u;ynNM|zt;u<#=iY)f>fcbUH+3P^9jis*fCt&E2DSY1aVhXwSIl7L& zNPsz{wRGlfk;>s7e-hVUtqZ?dB&&+QDDqd*E38Hj!9e`gFl8;E>O3e}#B7GtP+A?J z82D5V(3H{R-)H!~fuYzPFzJ~Xp^C7?bFIa5DNr!%Uwc}uViokn+XHrgZN>ZUbtITJEqWJ@vBiqHnH$^%u;!dD=at|-$`slxIqp--iX2B(%{}e(|UOZ4JQB#0H&r#;elY=DCBnUjWmC@c5)8 zi_cG!dN{($(ykrg*Kc;iZ&Hg;#E*Xqfu%j0+3C9UT_Q^^sLw`|=ydD0r=-HJNE0YT z>Ph0q1-(Oe?nO1&jThq|g{y7tI2}0N?=-9LZ^$;EshI^Ph#9`KVR;euXVwB1dsav^ zbrs!W5?k3Mv=$1@V8QSf*8A!WYmwvU^n&5@(WNcn%iBjzQdmE~@T*{d6ml9OZv)>9 zI>+nzY!uWa9N~OnIG>zj@5B5NmF{ z93_6d_T%Mo_NG~GN|X2OpjEwELxfNF9lh>k2}1Y{TVHmWl_q)hQln-FJ!h zZW9RO5^~7%+zzCDe!z@6`l25WIzc4dx>y0Tam|xgU6Zz)6+3g`^V!Q$7N}4$jn8vY zMZ8$2qf4myufqT7sXB?S$HZ3p^d}2F!Wk#t74$Kr9D9L}rMfRjmx3)ORKfhTZfsq- z=0y#WiDD6kXtRC;)#mU470Hewoa0<&LWSB=(4}%-y5!k(-fc($xz=OQxNoH{9nEfN zGx2n5-f;PKi4)#q*z%urnv0Nu1$O87#f|sZ#bz0gpAZ;v8+}7{nZ*_e$QQ27fl`p; z2vm}sPUx*fw$?>C5awRN-U!7I3gQW~+6fAhhk~)o0Ppi3NCIL0>JsXkjQKt;Wc`$-K7kxm6l$yyj zXAv+q(@_S zn1ae1(AL^lmDfTZ^kw+r4DKi0Q=jYP&NawYCPQGq0>(+)YTB+aee=oe zqz}tqVZZ44x?_U#6D{-IM3j=l$>Ni+eb6*NM!Tj?Uy@|r{&+%{LYPXPCjUMNnqkZ^ zVSxp{Ro?9_+lcJhZ0Z+^7o{8YS|>e#f)C1>@+A`FFId3iQr*QlffPRVwI}*)qX!Y2 zuX6?)1i23CU;mq_V#KJ$V?SBEM2jx%*m!U#@lo8}#|k=$5r)clpi@!8nh>?ouj!C*Pt+$r|`5|w2 zY>vy=E$a0~ALO)D7~c)cB84}~ka}IGuMHH4TGd_St8IOs3^LHU@$m1RRuuJyQhz~e zZOG&5n*6VN5&5I$q@EhT$F1yc>j*46}U+V>{(lDA^~bw=5f zxco0m6aAPw7M+#(Q0@n8yUO|FErq(0>;2UIAJwW9I_U=GA?mD8Zrrdho$#&6Li146 z>+V@F$Uej5l&xJh7BOsm@go-sxKNG%yv%-*DlmjWNCE$JNJ4|xjl0f*09x&v?%8;F zX3D8D4`Rk0-W2i`d+lFJTZ>xb6!-((**3LqRydX<1!Qr_d1rp=oHpg44f7N<7 zk+w=++20uII6o}sb~UpC)w4x+^hmU`Pe9;R^l{l=d8Em5AC+~uM2?4i{C* z6Ezk6bCO$aN!qxJR)icIa@p+%7Lc!Y%B`^(2i*tPj1LN$Wd2-!Y(TkYD z!rPPdFse31GbGv<80AhO<-@SSQTGx;xx(1XBw%Q%C^qw*kplwT#rnm$G0J&Xac5s! zED^TPhu?L8HB?aRN)_y&x%F^m7;un~WNN5AwU~KTIUGvDdv>^fgRH{am_+km2AU2? z#nAX70{lr5WA4KfSj?QWuTqW;WIp6!7MRIlHn;_NQ!!8l$gz<|MyajJH*J$D{y02# zLjD}2=l=Ju>ini7z3zT)rVf`g%58AfBHwK$&&ucr9n`Uzz~1zoAc(IAwMACQ7K>)t z;KV0YEm4K54#39voSOnRB&fP9)XOI_BlvDL`fNg3_3dWqr#^a1Oz&cRjo7*=K6)My ziovM?`{&t%RCKen6*&mX&iF*y36vA?P73J91z6&3l!)IfPa)U&ok`Zq*?De?{#GeN zHU1x^l9~%1y|(|%s;DVHf6e!=ORuXtGZyAk2WXIB+@cL+B^jL++dQUGT>EU>fc;@7 z5FP#}tcO|fJ3|1(RBs?yMhdUlYqV32^zx*c5jcHV2D)M4`0l_-H^)ZwyI-!&0|?!EJd(f#H=|&hLTfLcjSX>c>!060)qYE zTJ%c-FUmjxWsM9Y1ShC_dG%Uo5%6>Lu=Al0wjOu?2WSyM A1ONa4 literal 0 HcmV?d00001 diff --git a/versioned_docs/version-1.x/extend/notifications.md b/versioned_docs/version-1.x/extend/notifications.md index e2fc2ab1b..187d5ae2c 100644 --- a/versioned_docs/version-1.x/extend/notifications.md +++ b/versioned_docs/version-1.x/extend/notifications.md @@ -309,7 +309,7 @@ export default class NewPostNotification extends Notification { } ``` -In the example, the icon is a star, the link will go to the new post, and the content will say that "{user} posted". +In the example, the icon is a star, the link will go to the new post, and the content will say that "`{user}` posted". Next, we need to tell Flarum that the notification you send in the backend corresponds to the frontend notification we just created. diff --git a/versioned_docs/version-1.x/update.md b/versioned_docs/version-1.x/update.md index 21b090eb2..4d3a3293b 100644 --- a/versioned_docs/version-1.x/update.md +++ b/versioned_docs/version-1.x/update.md @@ -12,7 +12,7 @@ If you have the extension manager extension installed you can simply run the upd To update Flarum, you'll need to use [Composer](https://getcomposer.org). If you're not familiar with it (although you should be, because you need it to install Flarum), read [our guide](composer.md) for information on what it is and how to set it up. -If updating across major versions (e.g. <=0.1.0 to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. +If updating across major versions (e.g. `<=0.1.0` to 1.x.x, 1.x.x to 2.x.x, ...), make sure to read the appropriate "major version update guide" before running the general upgrade steps. ## General Steps @@ -38,7 +38,7 @@ php flarum cache:clear ## Major Version Update Guides -### Updating from Beta (<=0.1.0) to Stable v1 (^1.0.0) +### Updating from Beta (`<=0.1.0`) to Stable v1 (`^1.0.0`) 1. Do steps 1-5 above. 2. Change the version strings of all bundled extensions (`flarum/tags`, `flarum/mentions`, `flarum/likes`, etc) in `composer.json` from `^0.1.0` to `*`. diff --git a/yarn.lock b/yarn.lock index 921a14b29..36d7c9634 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1746 +2,2259 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz#85ff36b2673654a393c8c505345eaedd6eaa4f70" - integrity sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg== +"@algolia/abtesting@1.19.0": + version "1.19.0" + resolved "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.19.0.tgz" + integrity sha512-Lhnez3hhXHk25lfxLAMxvkP4fmN3+1RgADhD2ssMDBYuAsDVReeyP+3SGRx+ntq8ijMrLqUyfvO72TB6jsTteQ== dependencies: - "@algolia/autocomplete-shared" "1.7.4" + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" -"@algolia/autocomplete-preset-algolia@1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz#610ee1d887962f230b987cba2fd6556478000bc3" - integrity sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ== - dependencies: - "@algolia/autocomplete-shared" "1.7.4" - -"@algolia/autocomplete-shared@1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz#78aea1140a50c4d193e1f06a13b7f12c5e2cbeea" - integrity sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg== - -"@algolia/cache-browser-local-storage@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz#b9e0da012b2f124f785134a4d468ee0841b2399d" - integrity sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw== - dependencies: - "@algolia/cache-common" "4.14.3" - -"@algolia/cache-common@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.14.3.tgz#a78e9faee3dfec018eab7b0996e918e06b476ac7" - integrity sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q== - -"@algolia/cache-in-memory@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz#96cefb942aeb80e51e6a7e29f25f4f7f3439b736" - integrity sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg== - dependencies: - "@algolia/cache-common" "4.14.3" - -"@algolia/client-account@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.14.3.tgz#6d7d032a65c600339ce066505c77013d9a9e4966" - integrity sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ== +"@algolia/autocomplete-core@1.19.2": + version "1.19.2" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz" + integrity sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw== dependencies: - "@algolia/client-common" "4.14.3" - "@algolia/client-search" "4.14.3" - "@algolia/transporter" "4.14.3" + "@algolia/autocomplete-plugin-algolia-insights" "1.19.2" + "@algolia/autocomplete-shared" "1.19.2" -"@algolia/client-analytics@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.14.3.tgz#ca409d00a8fff98fdcc215dc96731039900055dc" - integrity sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw== +"@algolia/autocomplete-core@^1.19.2": + version "1.19.8" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz" + integrity sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA== dependencies: - "@algolia/client-common" "4.14.3" - "@algolia/client-search" "4.14.3" - "@algolia/requester-common" "4.14.3" - "@algolia/transporter" "4.14.3" + "@algolia/autocomplete-plugin-algolia-insights" "1.19.8" + "@algolia/autocomplete-shared" "1.19.8" -"@algolia/client-common@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.14.3.tgz#c44e48652b2121a20d7a40cfd68d095ebb4191a8" - integrity sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw== +"@algolia/autocomplete-plugin-algolia-insights@1.19.2": + version "1.19.2" + resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz" + integrity sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg== dependencies: - "@algolia/requester-common" "4.14.3" - "@algolia/transporter" "4.14.3" + "@algolia/autocomplete-shared" "1.19.2" -"@algolia/client-personalization@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.14.3.tgz#8f71325035aa2a5fa7d1d567575235cf1d6c654f" - integrity sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg== +"@algolia/autocomplete-plugin-algolia-insights@1.19.8": + version "1.19.8" + resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz" + integrity sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA== dependencies: - "@algolia/client-common" "4.14.3" - "@algolia/requester-common" "4.14.3" - "@algolia/transporter" "4.14.3" + "@algolia/autocomplete-shared" "1.19.8" -"@algolia/client-search@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.14.3.tgz#cf1e77549f5c3e73408ffe6441ede985fde69da0" - integrity sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A== - dependencies: - "@algolia/client-common" "4.14.3" - "@algolia/requester-common" "4.14.3" - "@algolia/transporter" "4.14.3" +"@algolia/autocomplete-shared@1.19.2": + version "1.19.2" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz" + integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== + +"@algolia/autocomplete-shared@1.19.8": + version "1.19.8" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz" + integrity sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ== + +"@algolia/client-abtesting@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.53.0.tgz" + integrity sha512-0ZjA5Hcmaoz5Lj6OG0zhfIyeqzJZnLW2CRJA1W17UwMFGRtZAJ9yJKRvPEDA6gkpsIoQxORTSW6sWFiuYncPNQ== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" + +"@algolia/client-analytics@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.53.0.tgz" + integrity sha512-kWNodP75iiEaOtemC9F/hlxNBG5E2QUjN1BusnE6m2b4l7Qh/BUO3fGCVsmKJI65VO4VKGGmT43ICvHtTcJ2JQ== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" + +"@algolia/client-common@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.53.0.tgz" + integrity sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg== + +"@algolia/client-insights@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.53.0.tgz" + integrity sha512-qAcYTDJE6m924FDDUQvdD6vh7DYaqOeSpFS74IP37/JRV0v4cGBauyxTF2WzDnokUylQDbqreoFIJZfg0Fitmw== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" + +"@algolia/client-personalization@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.53.0.tgz" + integrity sha512-fQaY+DkSJOpuUVUe8MQTwrdiKAqkJGhpDarB08duBn/sUv7Bkib6MDRQauCcWTWTe4HIW+EbwQP9R4kci1V/Yw== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" + +"@algolia/client-query-suggestions@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.53.0.tgz" + integrity sha512-o72tsiEZGfeS/dxL9IADfzcZWGEwKDEe5CvtrBuT//3JR+SHuTtHRI2ZTf7D7bcKagcbojvO8hnkHdfoakSlYg== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" + +"@algolia/client-search@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz" + integrity sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" "@algolia/events@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/logger-common@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.14.3.tgz#87d4725e7f56ea5a39b605771b7149fff62032a7" - integrity sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw== - -"@algolia/logger-console@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.14.3.tgz#1f19f8f0a5ef11f01d1f9545290eb6a89b71fb8a" - integrity sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw== +"@algolia/ingestion@1.53.0": + version "1.53.0" + resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.53.0.tgz" + integrity sha512-oNbT6z4NwD8Pou9VPINGlN/tlG1afESh2EbxqnP6rwl95xKVD/Zlciis1PpNeO/9U/rrajc1+7DcfKi03tX1KQ== dependencies: - "@algolia/logger-common" "4.14.3" + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" -"@algolia/requester-browser-xhr@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz#bcf55cba20f58fd9bc95ee55793b5219f3ce8888" - integrity sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q== +"@algolia/monitoring@1.53.0": + version "1.53.0" + resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.53.0.tgz" + integrity sha512-G+KZb/yd+qAOFn/cEvTGeLxQm8aP3a0od50l3z/ylccY+/o4YG3TNcjU1tFQHW4mXC137GPyR7W70R0kRQDLnA== dependencies: - "@algolia/requester-common" "4.14.3" + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" -"@algolia/requester-common@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.14.3.tgz#2d02fbe01afb7ae5651ae8dfe62d6c089f103714" - integrity sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw== +"@algolia/recommend@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.53.0.tgz" + integrity sha512-6aVfYd55Un6IUgPLbo84WfgFZlS3L0vA1ttzXL5vahHewUJ8jYgd89TzlWRTeej7w70mb9RWsVlFYGmJ/diQww== + dependencies: + "@algolia/client-common" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" -"@algolia/requester-node-http@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz#72389e1c2e5d964702451e75e368eefe85a09d8f" - integrity sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA== +"@algolia/requester-browser-xhr@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.53.0.tgz" + integrity sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA== dependencies: - "@algolia/requester-common" "4.14.3" + "@algolia/client-common" "5.53.0" -"@algolia/transporter@4.14.3": - version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.14.3.tgz#5593036bd9cf2adfd077fdc3e81d2e6118660a7a" - integrity sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w== +"@algolia/requester-fetch@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.53.0.tgz" + integrity sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg== dependencies: - "@algolia/cache-common" "4.14.3" - "@algolia/logger-common" "4.14.3" - "@algolia/requester-common" "4.14.3" + "@algolia/client-common" "5.53.0" -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@algolia/requester-node-http@5.53.0": + version "5.53.0" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.53.0.tgz" + integrity sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@algolia/client-common" "5.53.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.12.3", "@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - convert-source-map "^1.7.0" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + +"@babel/core@^7.21.3", "@babel/core@^7.25.9": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.9", "@babel/generator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz" + integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== + dependencies: + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + regexpu-core "^6.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== + dependencies: + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + debug "^4.4.3" + lodash.debounce "^4.0.8" + resolve "^1.22.11" + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== + dependencies: + "@babel/types" "^7.29.7" -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== + +"@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== + dependencies: + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/parser@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" + "@babel/types" "^7.29.7" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz" + integrity sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA== dependencies: - "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" - integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" - integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== +"@babel/plugin-syntax-import-assertions@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/plugin-syntax-import-attributes@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== dependencies: - "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== +"@babel/plugin-syntax-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== dependencies: - "@babel/types" "^7.21.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/plugin-syntax-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== +"@babel/plugin-transform-arrow-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== +"@babel/plugin-transform-async-generator-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== +"@babel/plugin-transform-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== +"@babel/plugin-transform-block-scoped-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== +"@babel/plugin-transform-block-scoping@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== +"@babel/plugin-transform-class-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== +"@babel/plugin-transform-class-static-block@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== +"@babel/plugin-transform-classes@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== +"@babel/plugin-transform-computed-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== +"@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== +"@babel/plugin-transform-dotall-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== +"@babel/plugin-transform-duplicate-keys@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== +"@babel/plugin-transform-dynamic-import@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== +"@babel/plugin-transform-explicit-resource-management@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz" + integrity sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== +"@babel/plugin-transform-exponentiation-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== +"@babel/plugin-transform-export-namespace-from@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== +"@babel/plugin-transform-for-of@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== +"@babel/plugin-transform-function-name@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== +"@babel/plugin-transform-json-strings@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== +"@babel/plugin-transform-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== +"@babel/plugin-transform-logical-assignment-operators@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-transform-member-expression-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== +"@babel/plugin-transform-modules-amd@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== +"@babel/plugin-transform-modules-systemjs@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz" + integrity sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== +"@babel/plugin-transform-modules-umd@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== +"@babel/plugin-transform-new-target@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== +"@babel/plugin-transform-numeric-separator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== +"@babel/plugin-transform-object-rest-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== +"@babel/plugin-transform-object-super@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== +"@babel/plugin-transform-optional-catch-binding@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-private-methods@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-private-property-in-object@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-property-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-classes@^7.20.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz" + integrity sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-react-display-name@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz" + integrity sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== +"@babel/plugin-transform-react-jsx-development@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz" + integrity sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-react-jsx" "^7.29.7" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-react-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz" + integrity sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-react-pure-annotations@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz" + integrity sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-regenerator@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz" + integrity sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-regexp-modifiers@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-reserved-words@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-runtime@^7.25.9": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz" + integrity sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz" + integrity sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-sticky-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-template-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typeof-symbol@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-syntax-typescript" "^7.29.7" + +"@babel/plugin-transform-unicode-escapes@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-property-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz" + integrity sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.29.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.29.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.29.7" + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array" "^7.29.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.29.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.29.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.29.7" + "@babel/plugin-syntax-import-attributes" "^7.29.7" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.29.7" + "@babel/plugin-transform-async-generator-functions" "^7.29.7" + "@babel/plugin-transform-async-to-generator" "^7.29.7" + "@babel/plugin-transform-block-scoped-functions" "^7.29.7" + "@babel/plugin-transform-block-scoping" "^7.29.7" + "@babel/plugin-transform-class-properties" "^7.29.7" + "@babel/plugin-transform-class-static-block" "^7.29.7" + "@babel/plugin-transform-classes" "^7.29.7" + "@babel/plugin-transform-computed-properties" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-dotall-regex" "^7.29.7" + "@babel/plugin-transform-duplicate-keys" "^7.29.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-dynamic-import" "^7.29.7" + "@babel/plugin-transform-explicit-resource-management" "^7.29.7" + "@babel/plugin-transform-exponentiation-operator" "^7.29.7" + "@babel/plugin-transform-export-namespace-from" "^7.29.7" + "@babel/plugin-transform-for-of" "^7.29.7" + "@babel/plugin-transform-function-name" "^7.29.7" + "@babel/plugin-transform-json-strings" "^7.29.7" + "@babel/plugin-transform-literals" "^7.29.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.29.7" + "@babel/plugin-transform-member-expression-literals" "^7.29.7" + "@babel/plugin-transform-modules-amd" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-modules-systemjs" "^7.29.7" + "@babel/plugin-transform-modules-umd" "^7.29.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-new-target" "^7.29.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.29.7" + "@babel/plugin-transform-numeric-separator" "^7.29.7" + "@babel/plugin-transform-object-rest-spread" "^7.29.7" + "@babel/plugin-transform-object-super" "^7.29.7" + "@babel/plugin-transform-optional-catch-binding" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/plugin-transform-private-methods" "^7.29.7" + "@babel/plugin-transform-private-property-in-object" "^7.29.7" + "@babel/plugin-transform-property-literals" "^7.29.7" + "@babel/plugin-transform-regenerator" "^7.29.7" + "@babel/plugin-transform-regexp-modifiers" "^7.29.7" + "@babel/plugin-transform-reserved-words" "^7.29.7" + "@babel/plugin-transform-shorthand-properties" "^7.29.7" + "@babel/plugin-transform-spread" "^7.29.7" + "@babel/plugin-transform-sticky-regex" "^7.29.7" + "@babel/plugin-transform-template-literals" "^7.29.7" + "@babel/plugin-transform-typeof-symbol" "^7.29.7" + "@babel/plugin-transform-unicode-escapes" "^7.29.7" + "@babel/plugin-transform-unicode-property-regex" "^7.29.7" + "@babel/plugin-transform-unicode-regex" "^7.29.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.29.7" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.15" + babel-plugin-polyfill-corejs3 "^0.14.0" + babel-plugin-polyfill-regenerator "^0.6.6" + core-js-compat "^3.48.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz" + integrity sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-transform-react-display-name" "^7.29.7" + "@babel/plugin-transform-react-jsx" "^7.29.7" + "@babel/plugin-transform-react-jsx-development" "^7.29.7" + "@babel/plugin-transform-react-pure-annotations" "^7.29.7" + +"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.25.9": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-typescript" "^7.29.7" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.25.9": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + debug "^4.3.1" + +"@babel/types@^7.21.3", "@babel/types@^7.29.7", "@babel/types@^7.4.4": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== - dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" +"@csstools/cascade-layer-name-parser@^2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz" + integrity sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A== -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" +"@csstools/color-helpers@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz" + integrity sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@csstools/css-color-parser@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz" + integrity sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@csstools/color-helpers" "^5.1.0" + "@csstools/css-calc" "^2.1.4" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== + +"@csstools/postcss-alpha-function@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz" + integrity sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@csstools/postcss-cascade-layers@^5.0.2": + version "5.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz" + integrity sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== +"@csstools/postcss-color-function-display-p3-linear@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz" + integrity sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-function@^4.0.12": + version "4.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz" + integrity sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-function@^3.0.12": + version "3.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz" + integrity sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz" + integrity sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-content-alt-text@^2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz" + integrity sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-contrast-color-function@^2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz" + integrity sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-exponential-functions@^2.0.9": + version "2.0.9" + resolved "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz" + integrity sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-font-format-keywords@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz" + integrity sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@csstools/postcss-gamut-mapping@^2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz" + integrity sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-gradients-interpolation-method@^5.0.12": + version "5.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz" + integrity sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-hwb-function@^4.0.12": + version "4.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz" + integrity sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-ic-unit@^4.0.4": + version "4.0.4" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz" + integrity sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-initial@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz" + integrity sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg== + +"@csstools/postcss-is-pseudo-class@^5.0.3": + version "5.0.3" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz" + integrity sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" -"@babel/plugin-transform-react-constant-elements@^7.12.1", "@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" - integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== +"@csstools/postcss-light-dark-function@^2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz" + integrity sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@csstools/postcss-logical-float-and-clear@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz" + integrity sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ== + +"@csstools/postcss-logical-overflow@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz" + integrity sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA== + +"@csstools/postcss-logical-overscroll-behavior@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz" + integrity sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w== + +"@csstools/postcss-logical-resize@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz" + integrity sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + postcss-value-parser "^4.2.0" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@csstools/postcss-logical-viewport-units@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz" + integrity sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" - integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== +"@csstools/postcss-media-minmax@^2.0.9": + version "2.0.9" + resolved "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz" + integrity sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.21.0" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@csstools/postcss-media-queries-aspect-ratio-number-values@^3.0.5": + version "3.0.5" + resolved "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz" + integrity sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@csstools/postcss-nested-calc@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz" + integrity sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@csstools/postcss-normalize-display-values@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz" + integrity sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + postcss-value-parser "^4.2.0" -"@babel/plugin-transform-runtime@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz#2a884f29556d0a68cd3d152dcc9e6c71dfb6eee8" - integrity sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg== +"@csstools/postcss-oklab-function@^4.0.12": + version "4.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz" + integrity sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@csstools/postcss-position-area-property@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz" + integrity sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q== + +"@csstools/postcss-progressive-custom-properties@^4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz" + integrity sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + postcss-value-parser "^4.2.0" -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@csstools/postcss-property-rule-prelude-list@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz" + integrity sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@csstools/postcss-random-function@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz" + integrity sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@csstools/postcss-relative-color-syntax@^3.0.12": + version "3.0.12" + resolved "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz" + integrity sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@csstools/postcss-scope-pseudo-class@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz" + integrity sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + postcss-selector-parser "^7.0.0" -"@babel/plugin-transform-typescript@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz#f0956a153679e3b377ae5b7f0143427151e4c848" - integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg== +"@csstools/postcss-sign-functions@^1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz" + integrity sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@csstools/postcss-stepped-value-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz" + integrity sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@csstools/postcss-syntax-descriptor-syntax-production@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz" + integrity sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@csstools/css-tokenizer" "^3.0.4" -"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@csstools/postcss-system-ui-font-family@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz" + integrity sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== +"@csstools/postcss-text-decoration-shorthand@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz" + integrity sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz#bcbbca513e8213691fe5d4b23d9251e01f00ebff" - integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-typescript" "^7.21.0" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime-corejs3@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz#6e4939d9d9789ff63e2dc58e88f13a3913a24eba" - integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.12.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" + "@csstools/color-helpers" "^5.1.0" + postcss-value-parser "^4.2.0" -"@babel/types@^7.12.6", "@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== +"@csstools/postcss-trigonometric-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz" + integrity sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@csstools/postcss-unset-value@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz" + integrity sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA== + +"@csstools/selector-resolve-nested@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz" + integrity sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g== + +"@csstools/selector-specificity@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz" + integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== + +"@csstools/utilities@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz" + integrity sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ== "@discoveryjs/json-ext@0.5.7": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/css@3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.3.3.tgz#f9346c9e24602218341f51b8ba91eb9109add434" - integrity sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg== +"@docsearch/core@4.6.3": + version "4.6.3" + resolved "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz" + integrity sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA== -"@docsearch/react@^3.1.1": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.3.3.tgz#907b6936a565f880b4c0892624b4f7a9f132d298" - integrity sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q== +"@docsearch/css@4.6.3": + version "4.6.3" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz" + integrity sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ== + +"@docsearch/react@^3.9.0 || ^4.3.2": + version "4.6.3" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz" + integrity sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g== dependencies: - "@algolia/autocomplete-core" "1.7.4" - "@algolia/autocomplete-preset-algolia" "1.7.4" - "@docsearch/css" "3.3.3" - algoliasearch "^4.0.0" + "@algolia/autocomplete-core" "1.19.2" + "@docsearch/core" "4.6.3" + "@docsearch/css" "4.6.3" -"@docusaurus/core@2.3.1", "@docusaurus/core@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.3.1.tgz#32849f2ffd2f086a4e55739af8c4195c5eb386f2" - integrity sha512-0Jd4jtizqnRAr7svWaBbbrCCN8mzBNd2xFLoT/IM7bGfFie5y58oz97KzXliwiLY3zWjqMXjQcuP1a5VgCv2JA== +"@docusaurus/babel@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz" + integrity sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg== dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" + "@babel/core" "^7.25.9" + "@babel/generator" "^7.25.9" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@babel/runtime" "^7.18.6" - "@babel/runtime-corejs3" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" + "@babel/plugin-transform-runtime" "^7.25.9" + "@babel/preset-env" "^7.25.9" + "@babel/preset-react" "^7.25.9" + "@babel/preset-typescript" "^7.25.9" + "@babel/runtime" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" babel-plugin-dynamic-import-node "^2.3.3" + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/bundler@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz" + integrity sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw== + dependencies: + "@babel/core" "^7.25.9" + "@docusaurus/babel" "3.10.1" + "@docusaurus/cssnano-preset" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + babel-loader "^9.2.1" + clean-css "^5.3.3" + copy-webpack-plugin "^11.0.0" + css-loader "^6.11.0" + css-minimizer-webpack-plugin "^5.0.1" + cssnano "^6.1.2" + file-loader "^6.2.0" + html-minifier-terser "^7.2.0" + mini-css-extract-plugin "^2.9.2" + null-loader "^4.0.1" + postcss "^8.5.4" + postcss-loader "^7.3.4" + postcss-preset-env "^10.2.1" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.95.0" + webpackbar "^7.0.0" + +"@docusaurus/core@3.10.1", "@docusaurus/core@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz" + integrity sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w== + dependencies: + "@docusaurus/babel" "3.10.1" + "@docusaurus/bundler" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" + cli-table3 "^0.6.3" combine-promises "^1.1.0" commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" + core-js "^3.31.1" + detect-port "^1.5.1" escape-html "^1.0.3" - eta "^2.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" + eta "^2.2.0" + eval "^0.1.8" + execa "^5.1.1" + fs-extra "^11.1.1" + html-tags "^3.3.1" + html-webpack-plugin "^5.6.0" leven "^3.1.0" lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" + open "^8.4.0" + p-map "^4.0.0" prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + react-loadable-ssr-addon-v5-slorber "^1.0.3" + react-router "^5.3.4" react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" - -"@docusaurus/cssnano-preset@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.3.1.tgz#e042487655e3e062417855e12edb3f6eee8f5ecb" - integrity sha512-7mIhAROES6CY1GmCjR4CZkUfjTL6B3u6rKHK0ChQl2d1IevYXq/k/vFgvOrJfcKxiObpMnE9+X6R2Wt1KqxC6w== - dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" - -"@docusaurus/logger@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.3.1.tgz#d76aefb452e3734b4e0e645efc6cbfc0aae52869" - integrity sha512-2lAV/olKKVr9qJhfHFCaqBIl8FgYjbUFwgUnX76+cULwQYss+42ZQ3grHGFvI0ocN2X55WcYe64ellQXz7suqg== + react-router-dom "^5.3.4" + semver "^7.5.4" + serve-handler "^6.1.7" + tinypool "^1.0.2" + tslib "^2.6.0" + update-notifier "^6.0.2" + webpack "^5.95.0" + webpack-bundle-analyzer "^4.10.2" + webpack-dev-server "^5.2.2" + webpack-merge "^6.0.1" + +"@docusaurus/cssnano-preset@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz" + integrity sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ== + dependencies: + cssnano-preset-advanced "^6.1.2" + postcss "^8.5.4" + postcss-sort-media-queries "^5.2.0" + tslib "^2.6.0" + +"@docusaurus/logger@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz" + integrity sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw== dependencies: chalk "^4.1.2" - tslib "^2.4.0" - -"@docusaurus/mdx-loader@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.3.1.tgz#7ec6acee5eff0a280e1b399ea4dd690b15a793f7" - integrity sha512-Gzga7OsxQRpt3392K9lv/bW4jGppdLFJh3luKRknCKSAaZrmVkOQv2gvCn8LAOSZ3uRg5No7AgYs/vpL8K94lA== - dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@mdx-js/mdx" "^1.6.22" + tslib "^2.6.0" + +"@docusaurus/mdx-loader@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz" + integrity sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ== + dependencies: + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" + fs-extra "^11.1.1" + image-size "^2.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" url-loader "^4.1.1" - webpack "^5.73.0" + vfile "^6.0.1" + webpack "^5.88.1" -"@docusaurus/module-type-aliases@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.3.1.tgz#986186200818fed999be2e18d6c698eaf4683a33" - integrity sha512-6KkxfAVOJqIUynTRb/tphYCl+co3cP0PlHiMDbi+SzmYxMdgIrwYqH9yAnGSDoN6Jk2ZE/JY/Azs/8LPgKP48A== +"@docusaurus/module-type-aliases@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz" + integrity sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w== dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.3.1" + "@docusaurus/types" "3.10.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - -"@docusaurus/plugin-content-blog@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.3.1.tgz#236b8ee4f20f7047aa9c285ae77ae36683ad48a3" - integrity sha512-f5LjqX+9WkiLyGiQ41x/KGSJ/9bOjSD8lsVhPvYeUYHCtYpuiDKfhZE07O4EqpHkBx4NQdtQDbp+aptgHSTuiw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - cheerio "^1.0.0-rc.12" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + +"@docusaurus/plugin-content-blog@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz" + integrity sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + cheerio "1.0.0-rc.12" + combine-promises "^1.1.0" feed "^4.2.2" - fs-extra "^10.1.0" + fs-extra "^11.1.1" lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" + schema-dts "^1.1.2" + srcset "^4.0.0" + tslib "^2.6.0" + unist-util-visit "^5.0.0" utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-docs@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.3.1.tgz#feae1555479558a55182f22f8a07acc5e0d7444d" - integrity sha512-DxztTOBEruv7qFxqUtbsqXeNcHqcVEIEe+NQoI1oi2DBmKBhW/o0MIal8lt+9gvmpx3oYtlwmLOOGepxZgJGkw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/module-type-aliases" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - "@types/react-router-config" "^5.0.6" + webpack "^5.88.1" + +"@docusaurus/plugin-content-docs@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz" + integrity sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" + fs-extra "^11.1.1" js-yaml "^4.1.0" lodash "^4.17.21" - tslib "^2.4.0" + schema-dts "^1.1.2" + tslib "^2.6.0" utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-pages@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.3.1.tgz#f534a37862be5b3f2ba5b150458d7527646b6f39" - integrity sha512-E80UL6hvKm5VVw8Ka8YaVDtO6kWWDVUK4fffGvkpQ/AJQDOg99LwOXKujPoICC22nUFTsZ2Hp70XvpezCsFQaA== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" - -"@docusaurus/plugin-debug@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.3.1.tgz#26fef904713e148f6dee44957506280f8b7853bb" - integrity sha512-Ujpml1Ppg4geB/2hyu2diWnO49az9U2bxM9Shen7b6qVcyFisNJTkVG2ocvLC7wM1efTJcUhBO6zAku2vKJGMw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-analytics@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.3.1.tgz#e2e7db4cf6a7063e8ba5e128d4e413f4d6a0c862" - integrity sha512-OHip0GQxKOFU8n7gkt3TM4HOYTXPCFDjqKbMClDD3KaDnyTuMp/Zvd9HSr770lLEscgPWIvzhJByRAClqsUWiQ== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - tslib "^2.4.0" - -"@docusaurus/plugin-google-gtag@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.3.1.tgz#b8da54a60c0a50aca609c3643faef78cb4f247a0" - integrity sha512-uXtDhfu4+Hm+oqWUySr3DNI5cWC/rmP6XJyAk83Heor3dFjZqDwCbkX8yWPywkRiWev3Dk/rVF8lEn0vIGVocA== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - tslib "^2.4.0" - -"@docusaurus/plugin-google-tag-manager@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.3.1.tgz#f19bc01cc784fa4734187c5bc637f0574857e15d" - integrity sha512-Ww2BPEYSqg8q8tJdLYPFFM3FMDBCVhEM4UUqKzJaiRMx3NEoly3qqDRAoRDGdIhlC//Rf0iJV9cWAoq2m6k3sw== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - tslib "^2.4.0" - -"@docusaurus/plugin-sitemap@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.3.1.tgz#f526ab517ca63b7a3460d585876f5952cb908aa0" - integrity sha512-8Yxile/v6QGYV9vgFiYL+8d2N4z4Er3pSHsrD08c5XI8bUXxTppMwjarDUTH/TRTfgAWotRbhJ6WZLyajLpozA== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - fs-extra "^10.1.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-pages@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz" + integrity sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + fs-extra "^11.1.1" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/plugin-css-cascade-layers@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz" + integrity sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + tslib "^2.6.0" + +"@docusaurus/plugin-debug@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz" + integrity sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + fs-extra "^11.1.1" + react-json-view-lite "^2.3.0" + tslib "^2.6.0" + +"@docusaurus/plugin-google-analytics@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz" + integrity sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + tslib "^2.6.0" + +"@docusaurus/plugin-google-gtag@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz" + integrity sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + "@types/gtag.js" "^0.0.20" + tslib "^2.6.0" + +"@docusaurus/plugin-google-tag-manager@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz" + integrity sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + tslib "^2.6.0" + +"@docusaurus/plugin-sitemap@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz" + integrity sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + fs-extra "^11.1.1" sitemap "^7.1.1" - tslib "^2.4.0" - -"@docusaurus/preset-classic@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.3.1.tgz#f0193f06093eb55cafef66bd1ad9e0d33198bf95" - integrity sha512-OQ5W0AHyfdUk0IldwJ3BlnZ1EqoJuu2L2BMhqLbqwNWdkmzmSUvlFLH1Pe7CZSQgB2YUUC/DnmjbPKk/qQD0lQ== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/plugin-content-blog" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/plugin-content-pages" "2.3.1" - "@docusaurus/plugin-debug" "2.3.1" - "@docusaurus/plugin-google-analytics" "2.3.1" - "@docusaurus/plugin-google-gtag" "2.3.1" - "@docusaurus/plugin-google-tag-manager" "2.3.1" - "@docusaurus/plugin-sitemap" "2.3.1" - "@docusaurus/theme-classic" "2.3.1" - "@docusaurus/theme-common" "2.3.1" - "@docusaurus/theme-search-algolia" "2.3.1" - "@docusaurus/types" "2.3.1" - -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.3.1.tgz#8e6e194236e702c0d4e8d7b7cbb6886ae456e598" - integrity sha512-SelSIDvyttb7ZYHj8vEUhqykhAqfOPKk+uP0z85jH72IMC58e7O8DIlcAeBv+CWsLbNIl9/Hcg71X0jazuxJug== - dependencies: - "@docusaurus/core" "2.3.1" - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/module-type-aliases" "2.3.1" - "@docusaurus/plugin-content-blog" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/plugin-content-pages" "2.3.1" - "@docusaurus/theme-common" "2.3.1" - "@docusaurus/theme-translations" "2.3.1" - "@docusaurus/types" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-common" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.42" + tslib "^2.6.0" + +"@docusaurus/plugin-svgr@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz" + integrity sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + "@svgr/core" "8.1.0" + "@svgr/webpack" "^8.1.0" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/preset-classic@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz" + integrity sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/plugin-content-blog" "3.10.1" + "@docusaurus/plugin-content-docs" "3.10.1" + "@docusaurus/plugin-content-pages" "3.10.1" + "@docusaurus/plugin-css-cascade-layers" "3.10.1" + "@docusaurus/plugin-debug" "3.10.1" + "@docusaurus/plugin-google-analytics" "3.10.1" + "@docusaurus/plugin-google-gtag" "3.10.1" + "@docusaurus/plugin-google-tag-manager" "3.10.1" + "@docusaurus/plugin-sitemap" "3.10.1" + "@docusaurus/plugin-svgr" "3.10.1" + "@docusaurus/theme-classic" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-search-algolia" "3.10.1" + "@docusaurus/types" "3.10.1" + +"@docusaurus/theme-classic@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz" + integrity sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A== + dependencies: + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/plugin-content-blog" "3.10.1" + "@docusaurus/plugin-content-docs" "3.10.1" + "@docusaurus/plugin-content-pages" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-translations" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + "@mdx-js/react" "^3.0.0" + clsx "^2.0.0" + copy-text-to-clipboard "^3.2.0" + infima "0.2.0-alpha.45" lodash "^4.17.21" nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" + postcss "^8.5.4" + prism-react-renderer "^2.3.0" + prismjs "^1.29.0" + react-router-dom "^5.3.4" + rtlcss "^4.1.0" + tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.3.1.tgz#82f52d80226efef8c4418c4eacfc5051aa215f7f" - integrity sha512-RYmYl2OR2biO+yhmW1aS5FyEvnrItPINa+0U2dMxcHpah8reSCjQ9eJGRmAgkZFchV1+aIQzXOI1K7LCW38O0g== - dependencies: - "@docusaurus/mdx-loader" "2.3.1" - "@docusaurus/module-type-aliases" "2.3.1" - "@docusaurus/plugin-content-blog" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/plugin-content-pages" "2.3.1" - "@docusaurus/utils" "2.3.1" +"@docusaurus/theme-common@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz" + integrity sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA== + dependencies: + "@docusaurus/mdx-loader" "3.10.1" + "@docusaurus/module-type-aliases" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" - clsx "^1.2.1" + clsx "^2.0.0" parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - use-sync-external-store "^1.2.0" + prism-react-renderer "^2.3.0" + tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.3.1", "@docusaurus/theme-search-algolia@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.3.1.tgz#d587b40913119e9287d14670e277b933d8f453f0" - integrity sha512-JdHaRqRuH1X++g5fEMLnq7OtULSGQdrs9AbhcWRQ428ZB8/HOiaN6mj3hzHvcD3DFgu7koIVtWPQnvnN7iwzHA== - dependencies: - "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.3.1" - "@docusaurus/logger" "2.3.1" - "@docusaurus/plugin-content-docs" "2.3.1" - "@docusaurus/theme-common" "2.3.1" - "@docusaurus/theme-translations" "2.3.1" - "@docusaurus/utils" "2.3.1" - "@docusaurus/utils-validation" "2.3.1" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^2.0.0" - fs-extra "^10.1.0" +"@docusaurus/theme-search-algolia@3.10.1", "@docusaurus/theme-search-algolia@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz" + integrity sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug== + dependencies: + "@algolia/autocomplete-core" "^1.19.2" + "@docsearch/react" "^3.9.0 || ^4.3.2" + "@docusaurus/core" "3.10.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/plugin-content-docs" "3.10.1" + "@docusaurus/theme-common" "3.10.1" + "@docusaurus/theme-translations" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-validation" "3.10.1" + algoliasearch "^5.37.0" + algoliasearch-helper "^3.26.0" + clsx "^2.0.0" + eta "^2.2.0" + fs-extra "^11.1.1" lodash "^4.17.21" - tslib "^2.4.0" + tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.3.1.tgz#b2b1ecc00a737881b5bfabc19f90b20f0fe02bb3" - integrity sha512-BsBZzAewJabVhoGG1Ij2u4pMS3MPW6gZ6sS4pc+Y7czevRpzxoFNJXRtQDVGe7mOpv/MmRmqg4owDK+lcOTCVQ== +"@docusaurus/theme-translations@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz" + integrity sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw== dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" + fs-extra "^11.1.1" + tslib "^2.6.0" -"@docusaurus/types@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.3.1.tgz#785ade2e0f4e35e1eb7fb0d04c27d11c3991a2e8" - integrity sha512-PREbIRhTaNNY042qmfSE372Jb7djZt+oVTZkoqHJ8eff8vOIc2zqqDqBVc5BhOfpZGPTrE078yy/torUEZy08A== +"@docusaurus/types@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz" + integrity sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw== dependencies: + "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" + "@types/mdast" "^4.0.2" "@types/react" "*" commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" + joi "^17.9.2" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" - -"@docusaurus/utils-common@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.3.1.tgz#1abe66846eb641547e4964d44f3011938e58e50b" - integrity sha512-pVlRpXkdNcxmKNxAaB1ya2hfCEvVsLDp2joeM6K6uv55Oc5nVIqgyYSgSNKZyMdw66NnvMfsu0RBylcwZQKo9A== - dependencies: - tslib "^2.4.0" - -"@docusaurus/utils-validation@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.3.1.tgz#b65c718ba9b84b7a891bccf5ac6d19b57ee7d887" - integrity sha512-7n0208IG3k1HVTByMHlZoIDjjOFC8sbViHVXJx0r3Q+3Ezrx+VQ1RZ/zjNn6lT+QBCRCXlnlaoJ8ug4HIVgQ3w== - dependencies: - "@docusaurus/logger" "2.3.1" - "@docusaurus/utils" "2.3.1" - joi "^17.6.0" + webpack "^5.95.0" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz" + integrity sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA== + dependencies: + "@docusaurus/types" "3.10.1" + tslib "^2.6.0" + +"@docusaurus/utils-validation@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz" + integrity sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg== + dependencies: + "@docusaurus/logger" "3.10.1" + "@docusaurus/utils" "3.10.1" + "@docusaurus/utils-common" "3.10.1" + fs-extra "^11.2.0" + joi "^17.9.2" js-yaml "^4.1.0" - tslib "^2.4.0" + lodash "^4.17.21" + tslib "^2.6.0" -"@docusaurus/utils@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.3.1.tgz#24b9cae3a23b1e6dc88f95c45722c7e82727b032" - integrity sha512-9WcQROCV0MmrpOQDXDGhtGMd52DHpSFbKLfkyaYumzbTstrbA5pPOtiGtxK1nqUHkiIv8UwexS54p0Vod2I1lg== +"@docusaurus/utils@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz" + integrity sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw== dependencies: - "@docusaurus/logger" "2.3.1" - "@svgr/webpack" "^6.2.1" + "@docusaurus/logger" "3.10.1" + "@docusaurus/types" "3.10.1" + "@docusaurus/utils-common" "3.10.1" escape-string-regexp "^4.0.0" + execa "^5.1.1" file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" globby "^11.1.0" gray-matter "^4.0.3" + jiti "^1.20.0" js-yaml "^4.1.0" lodash "^4.17.21" micromatch "^4.0.5" + p-queue "^6.6.2" + prompts "^2.4.2" resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" + tslib "^2.6.0" url-loader "^4.1.1" - webpack "^5.73.0" + utility-types "^3.10.0" + webpack "^5.88.1" -"@hapi/hoek@^9.0.0": +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/topo@^5.0.0": +"@hapi/topo@^5.1.0": version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" -"@jest/types@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" - integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.11" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz" + integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsonjoy.com/base64@17.67.0": + version "17.67.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz" + integrity sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw== + +"@jsonjoy.com/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/buffers@17.67.0", "@jsonjoy.com/buffers@^17.65.0": + version "17.67.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz" + integrity sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw== -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== +"@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": + version "1.2.1" + resolved "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz" + integrity sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== + +"@jsonjoy.com/codegen@17.67.0": + version "17.67.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz" + integrity sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q== + +"@jsonjoy.com/codegen@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz" + integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== + +"@jsonjoy.com/fs-core@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.6.tgz" + integrity sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.57.6" + "@jsonjoy.com/fs-node-utils" "4.57.6" + thingies "^2.5.0" + +"@jsonjoy.com/fs-fsa@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.6.tgz" + integrity sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw== + dependencies: + "@jsonjoy.com/fs-core" "4.57.6" + "@jsonjoy.com/fs-node-builtins" "4.57.6" + "@jsonjoy.com/fs-node-utils" "4.57.6" + thingies "^2.5.0" + +"@jsonjoy.com/fs-node-builtins@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.6.tgz" + integrity sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg== + +"@jsonjoy.com/fs-node-to-fsa@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.6.tgz" + integrity sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q== + dependencies: + "@jsonjoy.com/fs-fsa" "4.57.6" + "@jsonjoy.com/fs-node-builtins" "4.57.6" + "@jsonjoy.com/fs-node-utils" "4.57.6" + +"@jsonjoy.com/fs-node-utils@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.6.tgz" + integrity sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.57.6" + +"@jsonjoy.com/fs-node@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.6.tgz" + integrity sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw== + dependencies: + "@jsonjoy.com/fs-core" "4.57.6" + "@jsonjoy.com/fs-node-builtins" "4.57.6" + "@jsonjoy.com/fs-node-utils" "4.57.6" + "@jsonjoy.com/fs-print" "4.57.6" + "@jsonjoy.com/fs-snapshot" "4.57.6" + glob-to-regex.js "^1.0.0" + thingies "^2.5.0" + +"@jsonjoy.com/fs-print@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.6.tgz" + integrity sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw== + dependencies: + "@jsonjoy.com/fs-node-utils" "4.57.6" + tree-dump "^1.1.0" + +"@jsonjoy.com/fs-snapshot@4.57.6": + version "4.57.6" + resolved "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.6.tgz" + integrity sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg== + dependencies: + "@jsonjoy.com/buffers" "^17.65.0" + "@jsonjoy.com/fs-node-utils" "4.57.6" + "@jsonjoy.com/json-pack" "^17.65.0" + "@jsonjoy.com/util" "^17.65.0" + +"@jsonjoy.com/json-pack@^1.11.0": + version "1.21.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz" + integrity sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== + dependencies: + "@jsonjoy.com/base64" "^1.1.2" + "@jsonjoy.com/buffers" "^1.2.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/json-pointer" "^1.0.2" + "@jsonjoy.com/util" "^1.9.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/json-pack@^17.65.0": + version "17.67.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz" + integrity sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w== + dependencies: + "@jsonjoy.com/base64" "17.67.0" + "@jsonjoy.com/buffers" "17.67.0" + "@jsonjoy.com/codegen" "17.67.0" + "@jsonjoy.com/json-pointer" "17.67.0" + "@jsonjoy.com/util" "17.67.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/json-pointer@17.67.0": + version "17.67.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz" + integrity sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA== + dependencies: + "@jsonjoy.com/util" "17.67.0" + +"@jsonjoy.com/json-pointer@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz" + integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/util" "^1.9.0" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jsonjoy.com/util@17.67.0", "@jsonjoy.com/util@^17.65.0": + version "17.67.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz" + integrity sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew== + dependencies: + "@jsonjoy.com/buffers" "17.67.0" + "@jsonjoy.com/codegen" "17.67.0" -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jsonjoy.com/util@^1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz" + integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/codegen" "^1.0.0" "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@^1.6.21", "@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== +"@mdx-js/mdx@^3.0.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz" + integrity sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + acorn "^8.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-scope "^1.0.0" + estree-walker "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.0.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + +"@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1749,714 +2262,790 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz" + integrity sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + "@peculiar/asn1-x509-attr" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== +"@peculiar/asn1-csr@^2.6.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz" + integrity sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA== dependencies: - "@hapi/hoek" "^9.0.0" + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== +"@peculiar/asn1-ecc@^2.6.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz" + integrity sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== +"@peculiar/asn1-pfx@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz" + integrity sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA== + dependencies: + "@peculiar/asn1-cms" "^2.7.0" + "@peculiar/asn1-pkcs8" "^2.7.0" + "@peculiar/asn1-rsa" "^2.7.0" + "@peculiar/asn1-schema" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@peculiar/asn1-pkcs8@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz" + integrity sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@peculiar/asn1-pkcs9@^2.6.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz" + integrity sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew== + dependencies: + "@peculiar/asn1-cms" "^2.7.0" + "@peculiar/asn1-pfx" "^2.7.0" + "@peculiar/asn1-pkcs8" "^2.7.0" + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + "@peculiar/asn1-x509-attr" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" + +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz" + integrity sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== +"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz" + integrity sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg== dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.6" + tslib "^2.8.1" -"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" - integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== +"@peculiar/asn1-x509-attr@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz" + integrity sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/asn1-x509" "^2.7.0" + asn1js "^3.0.6" + tslib "^2.8.1" -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.7.0": + version "2.7.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz" + integrity sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g== + dependencies: + "@peculiar/asn1-schema" "^2.7.0" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.6" + tslib "^2.8.1" -"@svgr/babel-plugin-remove-jsx-attribute@*": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e" - integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA== +"@peculiar/utils@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz" + integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ== + dependencies: + tslib "^2.8.1" + +"@peculiar/x509@^1.14.2": + version "1.14.3" + resolved "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz" + integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== + dependencies: + "@peculiar/asn1-cms" "^2.6.0" + "@peculiar/asn1-csr" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.0" + "@peculiar/asn1-pkcs9" "^2.6.0" + "@peculiar/asn1-rsa" "^2.6.0" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.0" + pvtsutils "^1.3.6" + reflect-metadata "^0.2.2" + tslib "^2.8.1" + tsyringe "^4.10.0" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== -"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" - integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8" - integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw== +"@pnpm/npm-conf@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz" + integrity sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" -"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" - integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== -"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" - integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== -"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" - integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== +"@sinclair/typebox@^0.27.8": + version "0.27.10" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz" + integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== -"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" - integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== -"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" - integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== +"@slorber/remark-comment@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz" + integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.1.0" + micromark-util-symbol "^1.0.1" -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== -"@svgr/babel-plugin-transform-svg-component@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" - integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== -"@svgr/babel-preset@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" - integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" - "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" - "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" - "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" - "@svgr/babel-plugin-transform-svg-component" "^5.5.0" - -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" - -"@svgr/core@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" - integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== - dependencies: - "@svgr/plugin-jsx" "^5.5.0" - camelcase "^6.2.0" - cosmiconfig "^7.0.0" +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== -"@svgr/hast-util-to-babel-ast@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" - integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== dependencies: - "@babel/types" "^7.12.6" + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== dependencies: - "@babel/types" "^7.20.0" + "@babel/types" "^7.21.3" entities "^4.4.0" -"@svgr/plugin-jsx@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" - integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== - dependencies: - "@babel/core" "^7.12.3" - "@svgr/babel-preset" "^5.5.0" - "@svgr/hast-util-to-babel-ast" "^5.5.0" - svg-parser "^2.0.2" - -"@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" - integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== dependencies: - cosmiconfig "^7.0.0" - deepmerge "^4.2.2" - svgo "^1.2.2" + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@svgr/webpack@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" - integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== - dependencies: - "@babel/core" "^7.12.3" - "@babel/plugin-transform-react-constant-elements" "^7.12.1" - "@babel/preset-env" "^7.12.1" - "@babel/preset-react" "^7.12.5" - "@svgr/core" "^5.5.0" - "@svgr/plugin-jsx" "^5.5.0" - "@svgr/plugin-svgo" "^5.5.0" - loader-utils "^2.0.0" + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" -"@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== dependencies: - defer-to-connect "^1.0.1" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + defer-to-connect "^2.0.1" "@types/body-parser@*": version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== +"@types/debug@^4.0.0": + version "4.1.13" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz" + integrity sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw== dependencies: - "@types/eslint" "*" - "@types/estree" "*" + "@types/ms" "*" -"@types/eslint@*": - version "8.21.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" - integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== dependencies: "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.8": + version "1.0.9" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": + version "4.19.8" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz" + integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== +"@types/express@*", "@types/express@^4.17.25": + version "4.17.25" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz" + integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" - "@types/serve-static" "*" + "@types/serve-static" "^1" -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== +"@types/gtag.js@^0.0.20": + version "0.0.20" + resolved "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz" + integrity sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg== + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" "@types/history@^4.7.11": version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== "@types/html-minifier-terser@^6.0.0": version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@types/http-cache-semantics@^4.0.2": + version "4.2.0" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" + integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q== + +"@types/http-errors@*": + version "2.0.5" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz" + integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== + "@types/http-proxy@^1.17.8": version "1.17.10" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz" integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== +"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": + version "4.0.4" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: "@types/unist" "*" -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== +"@types/mdx@^2.0.0": + version "2.0.14" + resolved "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz" + integrity sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": version "18.14.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.4.tgz#0e64ec0b35a772e1e3d849f9a0ff61782d0cb647" + resolved "https://registry.npmjs.org/@types/node/-/node-18.14.4.tgz" integrity sha512-VhCw7I7qO2X49+jaKcAUwi3rR+hbxT5VcYF493+Z5kMLI0DL568b7JI4IDJaxWFH0D/xwmGJNoXisyX+w7GH/g== "@types/node@^17.0.5": version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== +"@types/prismjs@^1.26.0": + version "1.26.6" + resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz" + integrity sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw== "@types/qs@*": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" - integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== +"@types/react-router-config@*", "@types/react-router-config@^5.0.7": + version "5.0.11" + resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz" + integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== dependencies: "@types/history" "^4.7.11" "@types/react" "*" - "@types/react-router" "*" + "@types/react-router" "^5.1.0" "@types/react-router-dom@*": version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== dependencies: "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router" "*" -"@types/react-router@*": +"@types/react-router@*", "@types/react-router@^5.1.0": version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" "@types/react@*": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== + version "19.2.17" + resolved "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz" + integrity sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw== dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" + csstype "^3.2.2" -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== "@types/sax@^1.2.1": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" + resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz" integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/send@*": + version "1.2.1" + resolved "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz" + integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== + dependencies: + "@types/node" "*" -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== +"@types/send@<1": + version "0.17.6" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz" + integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== +"@types/serve-static@^1", "@types/serve-static@^1.15.5": + version "1.15.10" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz" + integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== dependencies: - "@types/mime" "*" + "@types/http-errors" "*" "@types/node" "*" + "@types/send" "<1" -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== +"@types/ws@^8.5.10": + version "8.18.1" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== dependencies: "@types/node" "*" "@types/yargs-parser@*": version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": version "17.0.22" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz" integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" +"@ungap/structured-clone@^1.0.0": + version "1.3.1" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz" + integrity sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ== + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-phases@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz" + integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.15.0, acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== -address@^1.0.1, address@^1.1.2: +address@^1.0.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2464,26 +3053,26 @@ aggregate-error@^3.0.0: ajv-formats@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.5: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2491,9 +3080,9 @@ ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -2501,77 +3090,75 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -algoliasearch-helper@^3.10.0: - version "3.11.3" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.11.3.tgz#6e7af8afe6f9a9e55186abffb7b6cf7ca8de3301" - integrity sha512-TbaEvLwiuGygHQIB8y+OsJKQQ40+JKUua5B91X66tMUHyyhbNHvqyr0lqd3wCoyKx7WybyQrC0WJvzoIeh24Aw== +algoliasearch-helper@^3.26.0: + version "3.29.1" + resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz" + integrity sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.0.0, algoliasearch@^4.13.1: - version "4.14.3" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.14.3.tgz#f02a77a4db17de2f676018938847494b692035e7" - integrity sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg== - dependencies: - "@algolia/cache-browser-local-storage" "4.14.3" - "@algolia/cache-common" "4.14.3" - "@algolia/cache-in-memory" "4.14.3" - "@algolia/client-account" "4.14.3" - "@algolia/client-analytics" "4.14.3" - "@algolia/client-common" "4.14.3" - "@algolia/client-personalization" "4.14.3" - "@algolia/client-search" "4.14.3" - "@algolia/logger-common" "4.14.3" - "@algolia/logger-console" "4.14.3" - "@algolia/requester-browser-xhr" "4.14.3" - "@algolia/requester-common" "4.14.3" - "@algolia/requester-node-http" "4.14.3" - "@algolia/transporter" "4.14.3" - -ansi-align@^3.0.0, ansi-align@^3.0.1: +algoliasearch@^5.37.0: + version "5.53.0" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.53.0.tgz" + integrity sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ== + dependencies: + "@algolia/abtesting" "1.19.0" + "@algolia/client-abtesting" "5.53.0" + "@algolia/client-analytics" "5.53.0" + "@algolia/client-common" "5.53.0" + "@algolia/client-insights" "5.53.0" + "@algolia/client-personalization" "5.53.0" + "@algolia/client-query-suggestions" "5.53.0" + "@algolia/client-search" "5.53.0" + "@algolia/ingestion" "1.53.0" + "@algolia/monitoring" "1.53.0" + "@algolia/recommend" "5.53.0" + "@algolia/requester-browser-xhr" "5.53.0" + "@algolia/requester-fetch" "5.53.0" + "@algolia/requester-node-http" "5.53.0" + +ansi-align@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: string-width "^4.1.0" ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +ansis@^3.2.0: + version "3.17.0" + resolved "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz" + integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== + anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2579,217 +3166,167 @@ anymatch@~3.1.2: arg@^5.0.0: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.7: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== - dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== - dependencies: - follow-redirects "^1.14.7" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -babel-loader@^8.2.5: - version "8.3.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== +asn1js@^3.0.6: + version "3.0.10" + resolved "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz" + integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" + pvtsutils "^1.3.6" + pvutils "^1.1.5" + tslib "^2.8.1" -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== +astring@^1.8.0: + version "1.9.0" + resolved "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== + +autoprefixer@^10.4.19, autoprefixer@^10.4.23: + version "10.5.0" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz" + integrity sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong== + dependencies: + browserslist "^4.28.2" + caniuse-lite "^1.0.30001787" + fraction.js "^5.3.4" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + +babel-loader@^9.2.1: + version "9.2.1" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== +babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: + version "0.4.17" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== dependencies: - "@babel/helper-plugin-utils" "7.10.4" + "@babel/compat-data" "^7.28.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" + semver "^6.3.1" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs3@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz" + integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/helper-define-polyfill-provider" "^0.6.5" + core-js-compat "^3.43.0" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.14.0: + version "0.14.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz" + integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.6.8" + core-js-compat "^3.48.0" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: + version "0.6.8" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.6.8" -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== +baseline-browser-mapping@^2.10.12: + version "2.10.34" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz" + integrity sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw== batch@0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@~1.20.5: + version "1.20.5" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz" + integrity sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA== dependencies: - bytes "3.1.2" - content-type "~1.0.4" + bytes "~3.1.2" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.15.1" + raw-body "~2.5.3" type-is "~1.6.18" - unpipe "1.0.0" + unpipe "~1.0.0" -bonjour-service@^1.0.11: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.0.tgz#424170268d68af26ff83a5c640b95def01803a13" - integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== +bonjour-service@^1.2.1: + version "1.4.0" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.0.tgz" + integrity sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - boxen@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== dependencies: ansi-align "^3.0.1" @@ -2801,9 +3338,23 @@ boxen@^6.2.1: widest-line "^4.0.1" wrap-ansi "^8.0.1" +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2811,83 +3362,117 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.28.1, browserslist@^4.28.2: + version "4.28.2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz" + integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + baseline-browser-mapping "^2.10.12" + caniuse-lite "^1.0.30001782" + electron-to-chromium "^1.5.328" + node-releases "^2.0.36" + update-browserslist-db "^1.2.3" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: +bytes@3.1.2, bytes@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: +bytestreamjs@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz" + integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + caniuse-api@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" @@ -2895,51 +3480,57 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: - version "1.0.30001458" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" - integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001782, caniuse-lite@^1.0.30001787: + version "1.0.30001797" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz" + integrity sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w== -chalk@^2.0.0, chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== +chalk@^5.0.1, chalk@^5.2.0: + version "5.6.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== cheerio-select@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== dependencies: boolbase "^1.0.0" @@ -2949,9 +3540,9 @@ cheerio-select@^2.1.0: domhandler "^5.0.3" domutils "^3.0.1" -cheerio@^1.0.0-rc.12: +cheerio@1.0.0-rc.12: version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" @@ -2962,10 +3553,10 @@ cheerio@^1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -2979,45 +3570,35 @@ chokidar@^3.4.2, chokidar@^3.5.3: chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - ci-info@^3.2.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== +clean-css@^5.2.2, clean-css@^5.3.3, clean-css@~5.3.2: + version "5.3.3" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-boxes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== -cli-table3@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== +cli-table3@^0.6.3: + version "0.6.5" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" optionalDependencies: @@ -3025,195 +3606,179 @@ cli-table3@^0.6.2: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clsx@^1.1.1, clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colord@^2.9.1: +colord@^2.9.3: version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.10: version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combine-promises@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== commander@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== +compression@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" connect-history-api-fallback@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== +consola@^3.2.3: + version "3.4.2" + resolved "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== content-disposition@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== -content-disposition@0.5.4: +content-disposition@~0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== -copy-text-to-clipboard@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" - integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== +copy-text-to-clipboard@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz" + integrity sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A== copy-webpack-plugin@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== dependencies: fast-glob "^3.2.11" @@ -3223,120 +3788,104 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.25.1: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" - integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== +core-js-compat@^3.43.0, core-js-compat@^3.48.0: + version "3.49.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz" + integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== dependencies: - browserslist "^4.21.5" + browserslist "^4.28.1" -core-js-pure@^3.25.1: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.29.0.tgz#0e1ac889214398641ea4bb1c6cf25ff0959ec1d2" - integrity sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ== - -core-js@^3.23.3: - version "3.29.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.0.tgz#0273e142b67761058bcde5615c503c7406b572d6" - integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg== +core-js@^3.31.1: + version "3.49.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz" + integrity sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== +cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" path-type "^4.0.0" - yaml "^1.10.0" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" -css-declaration-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" - integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== +css-blank-pseudo@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz" + integrity sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag== + dependencies: + postcss-selector-parser "^7.0.0" + +css-declaration-sorter@^7.2.0: + version "7.4.0" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz" + integrity sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw== -css-loader@^6.7.1: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== +css-has-pseudo@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz" + integrity sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.2.0" + +css-loader@^6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.19" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.8" + semver "^7.5.4" -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== +css-minimizer-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" +css-prefers-color-scheme@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz" + integrity sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ== css-select@^4.1.3: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -3347,7 +3896,7 @@ css-select@^4.1.3: css-select@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" @@ -3356,260 +3905,254 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" + mdn-data "2.0.30" + source-map-js "^1.0.1" -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + mdn-data "2.0.28" + source-map-js "^1.0.1" css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +cssdb@^8.6.0: + version "8.9.0" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-8.9.0.tgz" + integrity sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw== + cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-advanced@^5.3.8: - version "5.3.10" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== +cssnano-preset-advanced@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz" + integrity sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ== + dependencies: + autoprefixer "^10.4.19" + browserslist "^4.23.0" + cssnano-preset-default "^6.1.2" + postcss-discard-unused "^6.0.5" + postcss-merge-idents "^6.0.3" + postcss-reduce-idents "^6.0.3" + postcss-zindex "^6.0.2" + +cssnano-preset-default@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz" + integrity sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg== + dependencies: + browserslist "^4.23.0" + css-declaration-sorter "^7.2.0" + cssnano-utils "^4.0.2" + postcss-calc "^9.0.1" + postcss-colormin "^6.1.0" + postcss-convert-values "^6.1.0" + postcss-discard-comments "^6.0.2" + postcss-discard-duplicates "^6.0.3" + postcss-discard-empty "^6.0.3" + postcss-discard-overridden "^6.0.2" + postcss-merge-longhand "^6.0.5" + postcss-merge-rules "^6.1.1" + postcss-minify-font-values "^6.1.0" + postcss-minify-gradients "^6.0.3" + postcss-minify-params "^6.1.0" + postcss-minify-selectors "^6.0.4" + postcss-normalize-charset "^6.0.2" + postcss-normalize-display-values "^6.0.2" + postcss-normalize-positions "^6.0.2" + postcss-normalize-repeat-style "^6.0.2" + postcss-normalize-string "^6.0.2" + postcss-normalize-timing-functions "^6.0.2" + postcss-normalize-unicode "^6.1.0" + postcss-normalize-url "^6.0.2" + postcss-normalize-whitespace "^6.0.2" + postcss-ordered-values "^6.0.2" + postcss-reduce-initial "^6.1.0" + postcss-reduce-transforms "^6.0.2" + postcss-svgo "^6.0.3" + postcss-unique-selectors "^6.0.4" + +cssnano-utils@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz" + integrity sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ== -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== +cssnano@^6.0.1, cssnano@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz" + integrity sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA== dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" + cssnano-preset-default "^6.1.2" + lilconfig "^3.1.1" -csso@^4.0.2, csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== dependencies: - css-tree "^1.1.2" + css-tree "~2.2.0" -csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +csstype@^3.2.2: + version "3.2.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== -debug@2.6.9, debug@^2.6.0: +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: - ms "2.1.2" + ms "^2.1.3" -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== +decode-named-character-reference@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz" + integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== dependencies: - mimic-response "^1.0.0" + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== +default-browser-id@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz" + integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== + +default-browser@^5.2.1: + version "5.5.0" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz" + integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== dependencies: - execa "^5.0.0" + bundle-name "^4.1.0" + default-browser-id "^5.0.0" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4: +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -destroy@1.2.0: +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0, destroy@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detab@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== +detect-port@^1.5.1: + version "1.6.1" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz" + integrity sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q== dependencies: address "^1.0.1" - debug "^2.6.0" + debug "4" -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: - address "^1.0.1" - debug "4" + dequal "^2.0.0" dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - dns-packet@^5.2.2: version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz" integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" dom-converter@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== dependencies: utila "~0.4" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -3618,48 +4161,35 @@ dom-serializer@^1.0.1: dom-serializer@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: domelementtype "^2.3.0" domhandler "^5.0.2" entities "^4.2.0" -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== dependencies: domelementtype "^2.3.0" -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -3668,7 +4198,7 @@ domutils@^2.5.2, domutils@^2.8.0: domutils@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== dependencies: dom-serializer "^2.0.0" @@ -3677,196 +4207,173 @@ domutils@^3.0.1: dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== dependencies: is-obj "^2.0.0" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" duplexer@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.284: - version "1.4.315" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz#b60a6676b3a1db332cfc8919118344aa06b9ac99" - integrity sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg== +electron-to-chromium@^1.5.328: + version "1.5.370" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.370.tgz" + integrity sha512-D5tSHJReAb/Kf3Hu9F/GO4lJuSWzEWHwvQ/kKSUP7pimNgvxkSKj+gUQhHpKKACwrin7rS3byU7IxreF56rl5g== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +emoticon@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz" + integrity sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ== -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== +enhanced-resolve@^5.22.0: + version "5.23.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz" + integrity sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.3" entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - 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.4" - is-array-buffer "^3.0.1" - 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.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== +es-module-lexer@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz" + integrity sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" + es-errors "^1.3.0" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -3874,62 +4381,123 @@ eslint-scope@5.1.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.5.0" + resolved "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz" + integrity sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eta@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/eta/-/eta-2.0.1.tgz#199e675359cb6e19d38f29e1f405e1ba0e79a6df" - integrity sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg== +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eval@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== dependencies: "@types/node" "*" require-like ">= 0.1.1" -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: +execa@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -3942,63 +4510,63 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== +express@^4.22.1: + version "4.22.2" + resolved "https://registry.npmjs.org/express/-/express-4.22.2.tgz" + integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" + body-parser "~1.20.5" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" + 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" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" + merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "2.4.1" + 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.15.1" 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" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -4009,355 +4577,213 @@ fast-glob@^3.2.11, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + faye-websocket@^0.11.3: version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - feed@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== dependencies: xml-js "^1.6.11" file-loader@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~2.0.2" unpipe "~1.0.0" -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" + locate-path "^7.1.0" + path-exists "^5.0.0" -flux@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" - integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.7: +follow-redirects@^1.0.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" - integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fraction.js@^5.3.4: + version "5.3.4" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz" + integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== -fresh@0.5.2: +fresh@~0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== +fs-extra@^11.1.1, fs-extra@^11.2.0: + version "11.3.5" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz" + integrity sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg== dependencies: - at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: - pump "^3.0.0" + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -github-slugger@^1.4.0: +github-slugger@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.1: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" +glob-to-regex.js@^1.0.0, glob-to-regex.js@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz" + integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== + glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-dirs@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: +globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4369,7 +4795,7 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: globby@^13.1.1: version "13.1.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz" integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== dependencies: dir-glob "^3.0.1" @@ -4378,38 +4804,41 @@ globby@^13.1.1: merge2 "^1.4.1" slash "^4.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.npmjs.org/got/-/got-12.6.1.tgz" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@4.2.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.2.11: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + gray-matter@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== dependencies: js-yaml "^3.13.1" @@ -4419,143 +4848,167 @@ gray-matter@^4.0.3: gzip-size@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: duplexer "^0.1.2" handle-thing@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +hasown@^2.0.2, hasown@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: - has-symbols "^1.0.2" + function-bind "^1.1.2" -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: - function-bind "^1.1.1" + "@types/hast" "^3.0.0" -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== +hast-util-raw@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.3" + resolved "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz" + integrity sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.6" + resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz" + integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz" + integrity sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" + "@types/hast" "^3.0.0" -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== history@^4.9.0: version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== dependencies: "@babel/runtime" "^7.1.2" @@ -4567,14 +5020,14 @@ history@^4.9.0: hoist-non-react-statics@^3.1.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hpack.js@^2.1.6: version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" @@ -4582,14 +5035,14 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: +html-minifier-terser@^6.0.2: version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: camel-case "^4.1.2" @@ -4600,20 +5053,33 @@ html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: relateurl "^0.2.7" terser "^5.10.0" -html-tags@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" - integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz" + integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== + dependencies: + camel-case "^4.1.2" + clean-css "~5.3.2" + commander "^10.0.0" + entities "^4.4.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.15.1" -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.6.0: + version "5.6.7" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz" + integrity sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -4623,7 +5089,7 @@ html-webpack-plugin@^5.5.0: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -4633,7 +5099,7 @@ htmlparser2@^6.1.0: htmlparser2@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== dependencies: domelementtype "^2.3.0" @@ -4641,30 +5107,19 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.3.0" -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== http-deceiver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - http-errors@~1.6.2: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" @@ -4672,15 +5127,26 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + http-parser-js@>=0.5.1: version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== +http-proxy-middleware@^2.0.9: + version "2.0.9" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz" + integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -4690,438 +5156,326 @@ http-proxy-middleware@^2.0.3: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24: +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + +iconv-lite@~0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== ignore@^5.2.0: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -image-size@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.19" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" - integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== +image-size@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz" + integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.42: - version "0.2.0-alpha.42" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5" - integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +infima@0.2.0-alpha.45: + version "0.2.0-alpha.45" + resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz" + integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -internal-slot@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== +ipaddr.js@^2.1.0: + version "2.4.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz" + integrity sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ== -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== -is-array-buffer@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - has "^1.0.3" + ci-info "^3.2.0" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-core-module@^2.16.1: + version "2.16.2" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== dependencies: - has-tostringtag "^1.0.0" + hasown "^2.0.3" -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extendable@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" is-installed-globally@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" is-path-inside "^3.0.2" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== +is-network-error@^1.0.0: + version "1.3.2" + resolved "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz" + integrity sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" +is-npm@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz" + integrity sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - is-path-inside@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - 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-typedarray@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - is-wsl@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +is-wsl@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz" + integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== + dependencies: + is-inside-container "^1.0.0" + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== isarray@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -jest-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" - integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -5130,42 +5484,47 @@ jest-util@^29.4.3: jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.1.2: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" - integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== +jest-worker@^29.4.3: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.4.3" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" -joi@^17.6.0: - version "17.8.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.8.3.tgz#d772fe27a87a5cda21aace5cf11eee8671ca7e6f" - integrity sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w== +jiti@^1.20.0: + version "1.21.7" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + +joi@^17.9.2: + version "17.13.3" + resolved "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -5173,303 +5532,876 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@^3.0.2, jsesc@~3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json5@^2.1.2, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - json-buffer "3.0.0" + json-buffer "3.0.1" kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -klona@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== +launch-editor@^2.6.1: + version "2.14.1" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== dependencies: - package-json "^6.3.0" + picocolors "^1.1.1" + shell-quote "^1.8.4" leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -lilconfig@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== +loader-runner@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz" + integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w== loader-utils@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: - p-locate "^5.0.0" - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + p-locate "^6.0.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - lodash.memoize@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdast-util-directive@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + resolved "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz" + integrity sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== dependencies: - semver "^6.0.0" + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== +mdast-util-from-markdown@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz" + integrity sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== dependencies: - unist-util-remove "^2.0.0" + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== dependencies: - unist-util-visit "^2.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^2.0.0: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdast-util-gfm@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdast-util-mdx-jsx@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.2.1" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.2" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.1.2, memfs@^3.4.3: - version "3.4.13" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" - integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== - dependencies: - fs-monkey "^1.0.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +memfs@^4.43.1: + version "4.57.6" + resolved "https://registry.npmjs.org/memfs/-/memfs-4.57.6.tgz" + integrity sha512-WQK+DGjKCnPdpSyJUXphz+COF2uEhhsxQ3VIWBSbzpbbXuch3h4FePMqXrXGdLjsTgo4JFzBFsP6AWd9pVazGw== + dependencies: + "@jsonjoy.com/fs-core" "4.57.6" + "@jsonjoy.com/fs-fsa" "4.57.6" + "@jsonjoy.com/fs-node" "4.57.6" + "@jsonjoy.com/fs-node-builtins" "4.57.6" + "@jsonjoy.com/fs-node-to-fsa" "4.57.6" + "@jsonjoy.com/fs-node-utils" "4.57.6" + "@jsonjoy.com/fs-print" "4.57.6" + "@jsonjoy.com/fs-snapshot" "4.57.6" + "@jsonjoy.com/json-pack" "^1.11.0" + "@jsonjoy.com/util" "^1.9.0" + glob-to-regex.js "^1.0.1" + thingies "^2.5.0" + tree-dump "^1.0.3" + tslib "^2.0.0" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromark-core-commonmark@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz" + integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz" + integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz" + integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz" + integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== + dependencies: + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== + +micromark@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz" + integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -5477,213 +6409,206 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-db@~1.33.0: version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== -mime-types@2.1.18: +mime-types@2.1.18, mime-types@~2.1.17: version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime-types@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== -mini-css-extract-plugin@^2.6.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" - integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== +mini-css-extract-plugin@^2.9.2: + version "2.10.2" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz" + integrity sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" minimalistic-assert@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns@^7.2.5: version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.12: + version "3.3.12" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz" + integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" tslib "^2.0.3" -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-emoji@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz" + integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.36: + version "2.0.47" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz" + integrity sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +normalize-url@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz" + integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" nprogress@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" -object-assign@^4.1.0, object-assign@^4.1.1: +null-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0, object.assign@^4.1.4: +object.assign@^4.1.0: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -5691,59 +6616,43 @@ object.assign@^4.1.0, object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.1.0: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1: +on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open@^8.0.9, open@^8.4.0: +open@^10.0.3: + version "10.2.0" + resolved "https://registry.npmjs.org/open/-/open-10.2.0.tgz" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +open@^8.4.0: version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" @@ -5752,82 +6661,77 @@ open@^8.0.9, open@^8.4.0: opener@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: +p-cancelable@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: - p-limit "^2.2.0" + yocto-queue "^1.0.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: - p-limit "^3.0.2" + p-limit "^4.0.0" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: - "@types/retry" "0.12.0" + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@^6.2.0: + version "6.2.1" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" retry "^0.13.1" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" param-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: dot-case "^3.0.4" @@ -5835,26 +6739,27 @@ param-case@^3.0.4: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -5864,416 +6769,675 @@ parse-json@^5.0.0: parse-numeric-range@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== dependencies: domhandler "^5.0.2" parse5 "^7.0.0" -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" tslib "^2.0.3" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== path-is-inside@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== +path-to-regexp@3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz" + integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== path-to-regexp@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" +path-to-regexp@~0.1.12: + version "0.1.13" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz" + integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== + path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== dependencies: - find-up "^4.0.0" + find-up "^6.3.0" -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== +pkijs@^3.3.3: + version "3.4.0" + resolved "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz" + integrity sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw== + dependencies: + "@noble/hashes" "1.4.0" + asn1js "^3.0.6" + bytestreamjs "^2.0.1" + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + +postcss-attribute-case-insensitive@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz" + integrity sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-calc@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== + dependencies: + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^7.0.12: + version "7.0.12" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz" + integrity sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +postcss-color-hex-alpha@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz" + integrity sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w== dependencies: - find-up "^3.0.0" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== +postcss-color-rebeccapurple@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz" + integrity sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ== dependencies: - postcss-selector-parser "^6.0.9" + "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== +postcss-colormin@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz" + integrity sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" caniuse-api "^3.0.0" - colord "^2.9.1" + colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== +postcss-convert-values@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz" + integrity sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== +postcss-custom-media@^11.0.6: + version "11.0.6" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz" + integrity sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +postcss-custom-properties@^14.0.6: + version "14.0.6" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz" + integrity sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== +postcss-custom-selectors@^8.0.5: + version "8.0.5" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz" + integrity sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + postcss-selector-parser "^7.0.0" -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== +postcss-dir-pseudo-class@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz" + integrity sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA== + dependencies: + postcss-selector-parser "^7.0.0" -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== +postcss-discard-comments@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz" + integrity sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw== -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== +postcss-discard-duplicates@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz" + integrity sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw== + +postcss-discard-empty@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz" + integrity sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ== + +postcss-discard-overridden@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz" + integrity sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ== + +postcss-discard-unused@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz" + integrity sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-double-position-gradients@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz" + integrity sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g== dependencies: - postcss-selector-parser "^6.0.5" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-loader@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.2.tgz#b53ff44a26fba3688eee92a048c7f2d4802e23bb" - integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== +postcss-focus-visible@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz" + integrity sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA== dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.8" + postcss-selector-parser "^7.0.0" -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== +postcss-focus-within@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz" + integrity sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz" + integrity sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw== + +postcss-image-set-function@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz" + integrity sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-lab-function@^7.0.12: + version "7.0.12" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz" + integrity sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +postcss-loader@^7.3.4: + version "7.3.4" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + dependencies: + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-logical@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz" + integrity sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA== dependencies: - cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== +postcss-merge-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz" + integrity sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g== + dependencies: + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz" + integrity sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" + stylehacks "^6.1.1" -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== +postcss-merge-rules@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz" + integrity sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" + cssnano-utils "^4.0.2" + postcss-selector-parser "^6.0.16" -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== +postcss-minify-font-values@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz" + integrity sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg== dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== +postcss-minify-gradients@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz" + integrity sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q== dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" + colord "^2.9.3" + cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== +postcss-minify-params@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz" + integrity sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA== dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" + browserslist "^4.23.0" + cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== +postcss-minify-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz" + integrity sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.16" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" + postcss-selector-parser "^7.0.0" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== dependencies: - postcss-selector-parser "^6.0.4" + postcss-selector-parser "^7.0.0" postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== +postcss-nesting@^13.0.2: + version "13.0.2" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz" + integrity sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ== + dependencies: + "@csstools/selector-resolve-nested" "^3.1.0" + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== +postcss-normalize-charset@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz" + integrity sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ== + +postcss-normalize-display-values@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz" + integrity sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== +postcss-normalize-positions@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz" + integrity sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== +postcss-normalize-repeat-style@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz" + integrity sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== +postcss-normalize-string@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz" + integrity sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== +postcss-normalize-timing-functions@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz" + integrity sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== +postcss-normalize-unicode@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz" + integrity sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== +postcss-normalize-url@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz" + integrity sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ== dependencies: - normalize-url "^6.0.1" postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== +postcss-normalize-whitespace@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz" + integrity sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-opacity-percentage@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz" + integrity sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ== + +postcss-ordered-values@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz" + integrity sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q== dependencies: + cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== +postcss-overflow-shorthand@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz" + integrity sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q== dependencies: - cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz" + integrity sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw== dependencies: postcss-value-parser "^4.2.0" -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== +postcss-preset-env@^10.2.1: + version "10.6.1" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz" + integrity sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g== + dependencies: + "@csstools/postcss-alpha-function" "^1.0.1" + "@csstools/postcss-cascade-layers" "^5.0.2" + "@csstools/postcss-color-function" "^4.0.12" + "@csstools/postcss-color-function-display-p3-linear" "^1.0.1" + "@csstools/postcss-color-mix-function" "^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.2" + "@csstools/postcss-content-alt-text" "^2.0.8" + "@csstools/postcss-contrast-color-function" "^2.0.12" + "@csstools/postcss-exponential-functions" "^2.0.9" + "@csstools/postcss-font-format-keywords" "^4.0.0" + "@csstools/postcss-gamut-mapping" "^2.0.11" + "@csstools/postcss-gradients-interpolation-method" "^5.0.12" + "@csstools/postcss-hwb-function" "^4.0.12" + "@csstools/postcss-ic-unit" "^4.0.4" + "@csstools/postcss-initial" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^5.0.3" + "@csstools/postcss-light-dark-function" "^2.0.11" + "@csstools/postcss-logical-float-and-clear" "^3.0.0" + "@csstools/postcss-logical-overflow" "^2.0.0" + "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" + "@csstools/postcss-logical-resize" "^3.0.0" + "@csstools/postcss-logical-viewport-units" "^3.0.4" + "@csstools/postcss-media-minmax" "^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" + "@csstools/postcss-nested-calc" "^4.0.0" + "@csstools/postcss-normalize-display-values" "^4.0.1" + "@csstools/postcss-oklab-function" "^4.0.12" + "@csstools/postcss-position-area-property" "^1.0.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/postcss-property-rule-prelude-list" "^1.0.0" + "@csstools/postcss-random-function" "^2.0.1" + "@csstools/postcss-relative-color-syntax" "^3.0.12" + "@csstools/postcss-scope-pseudo-class" "^4.0.1" + "@csstools/postcss-sign-functions" "^1.1.4" + "@csstools/postcss-stepped-value-functions" "^4.0.9" + "@csstools/postcss-syntax-descriptor-syntax-production" "^1.0.1" + "@csstools/postcss-system-ui-font-family" "^1.0.0" + "@csstools/postcss-text-decoration-shorthand" "^4.0.3" + "@csstools/postcss-trigonometric-functions" "^4.0.9" + "@csstools/postcss-unset-value" "^4.0.0" + autoprefixer "^10.4.23" + browserslist "^4.28.1" + css-blank-pseudo "^7.0.1" + css-has-pseudo "^7.0.3" + css-prefers-color-scheme "^10.0.0" + cssdb "^8.6.0" + postcss-attribute-case-insensitive "^7.0.1" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^7.0.12" + postcss-color-hex-alpha "^10.0.0" + postcss-color-rebeccapurple "^10.0.0" + postcss-custom-media "^11.0.6" + postcss-custom-properties "^14.0.6" + postcss-custom-selectors "^8.0.5" + postcss-dir-pseudo-class "^9.0.1" + postcss-double-position-gradients "^6.0.4" + postcss-focus-visible "^10.0.1" + postcss-focus-within "^9.0.1" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^6.0.0" + postcss-image-set-function "^7.0.0" + postcss-lab-function "^7.0.12" + postcss-logical "^8.1.0" + postcss-nesting "^13.0.2" + postcss-opacity-percentage "^3.0.0" + postcss-overflow-shorthand "^6.0.0" + postcss-page-break "^3.0.4" + postcss-place "^10.0.0" + postcss-pseudo-class-any-link "^10.0.1" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^8.0.1" + +postcss-pseudo-class-any-link@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz" + integrity sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-reduce-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz" + integrity sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz" + integrity sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" caniuse-api "^3.0.0" -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== +postcss-reduce-transforms@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz" + integrity sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA== dependencies: postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz" + integrity sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: + version "6.1.2" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-sort-media-queries@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz#f48a77d6ce379e86676fc3f140cf1b10a06f6051" - integrity sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg== +postcss-selector-parser@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.2.tgz" + integrity sha512-Wjvt4scRFouioIInHf51IFNP4ltJ2EngJM+cZPGiqbKetBfmP3vpdPV8ID2S6JS6/jdo74N8+aEYH9lQr2C6sA== dependencies: - sort-css-media-queries "2.1.0" + cssesc "^3.0.0" + util-deprecate "^1.0.2" -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== +postcss-sort-media-queries@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz" + integrity sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA== + dependencies: + sort-css-media-queries "2.2.0" + +postcss-svgo@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz" + integrity sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g== dependencies: postcss-value-parser "^4.2.0" - svgo "^2.7.0" + svgo "^3.2.0" -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== +postcss-unique-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz" + integrity sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.16" postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== +postcss-zindex@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz" + integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: + version "8.5.15" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz" + integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A== dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + nanoid "^3.3.12" + picocolors "^1.1.1" + source-map-js "^1.2.1" pretty-error@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" @@ -6281,34 +7445,30 @@ pretty-error@^4.0.0: pretty-time@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^1.2.1, prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== +prism-react-renderer@^2.3.0: + version "2.4.1" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz" + integrity sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^2.0.0" -prismjs@^1.28.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== +prismjs@^1.29.0: + version "1.30.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz" + integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - prompts@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -6316,112 +7476,102 @@ prompts@^2.4.2: prop-types@^15.6.2, prop-types@^15.7.2: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" react-is "^16.13.1" -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" +property-information@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz" + integrity sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" ipaddr.js "1.9.1" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== +pupa@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz" + integrity sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA== dependencies: - escape-goat "^2.0.0" + escape-goat "^4.0.0" -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== +pvutils@^1.1.3, pvutils@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz" + integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@~6.15.1: + version "6.15.2" + resolved "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz" + integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== dependencies: - side-channel "^1.0.4" + side-channel "^1.1.0" queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" range-parser@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" -rc@1.2.8, rc@^1.2.8: +rc@1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -6429,69 +7579,23 @@ rc@1.2.8, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.0.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + scheduler "^0.23.2" react-fast-compare@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-helmet-async@*, react-helmet-async@^1.3.0: +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + resolved "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz" + integrity sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A== dependencies: "@babel/runtime" "^7.12.5" invariant "^2.2.4" @@ -6501,41 +7605,38 @@ react-helmet-async@*, react-helmet-async@^1.3.0: react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-json-view-lite@^2.3.0: + version "2.5.0" + resolved "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz" + integrity sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g== -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== +react-loadable-ssr-addon-v5-slorber@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz" + integrity sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ== dependencies: "@babel/runtime" "^7.10.3" +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz" + integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ== + dependencies: + "@types/react" "*" + react-router-config@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== dependencies: "@babel/runtime" "^7.1.2" -react-router-dom@^5.3.3: +react-router-dom@^5.3.4: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" @@ -6546,9 +7647,9 @@ react-router-dom@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.4, react-router@^5.3.3: +react-router@5.3.4, react-router@^5.3.4: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" @@ -6561,26 +7662,16 @@ react-router@5.3.4, react-router@^5.3.3: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-textarea-autosize@^8.3.2: - version "8.4.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz#4d0244d6a50caa897806b8c44abc0540a69bfc8c" - integrity sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.0.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" readable-stream@^2.0.1: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -6593,7 +7684,7 @@ readable-stream@^2.0.1: readable-stream@^3.0.6: version "3.6.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz" integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== dependencies: inherits "^2.0.3" @@ -6602,161 +7693,213 @@ readable-stream@^3.0.6: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== +recma-jsx@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz" + integrity sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w== dependencies: - resolve "^1.1.6" + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== dependencies: - minimatch "^3.0.5" + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +regenerate-unicode-properties@^10.2.2: + version "10.2.2" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz" + integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regexpu-core@^6.3.1: + version "6.4.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz" + integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== dependencies: - "@babel/runtime" "^7.8.4" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.2" + regjsgen "^0.8.0" + regjsparser "^0.13.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.2.1" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +registry-auth-token@^5.0.1: + version "5.1.1" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz" + integrity sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + "@pnpm/npm-conf" "^3.0.2" -regexpu-core@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" - integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" + rc "1.2.8" -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.13.0: + version "0.13.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz" + integrity sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw== dependencies: - rc "1.2.8" + jsesc "~3.1.0" -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== dependencies: - rc "^1.2.8" + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== dependencies: - jsesc "~0.5.0" + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" relateurl@^0.2.7: version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== +remark-directive@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz" + integrity sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A== dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz" + integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== + dependencies: + "@types/mdast" "^4.0.2" + emoticon "^4.0.1" + mdast-util-find-and-replace "^3.0.1" + node-emoji "^2.1.0" + unified "^11.0.4" + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-mdx@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz" + integrity sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.1.2" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz" + integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== dependencies: - mdast-squeeze-paragraphs "^4.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" renderkid@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" @@ -6765,175 +7908,139 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== "require-like@>= 0.1.1": version "0.1.2" - resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-pathname@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.22.11: + version "1.22.12" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== dependencies: - is-core-module "^2.9.0" + es-errors "^1.3.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== dependencies: - lowercase-keys "^1.0.0" + lowercase-keys "^3.0.0" retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -rtl-detect@^1.0.4: +reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== +rtlcss@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz" + integrity sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig== dependencies: - find-up "^5.0.0" + escalade "^3.1.1" picocolors "^1.0.0" - postcss "^8.3.11" + postcss "^8.4.21" strip-json-comments "^3.1.1" +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.4: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +sax@^1.2.4, sax@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz" + integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" +schema-dts@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz" + integrity sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg== -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== +schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: + version "4.3.3" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz" + integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" section-matter@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== dependencies: extend-shallow "^2.0.1" @@ -6941,83 +8048,76 @@ section-matter@^1.0.0: select-hose@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== +selfsigned@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz" + integrity sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew== dependencies: - node-forge "^1" + "@peculiar/x509" "^1.14.2" + pkijs "^3.3.3" -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== dependencies: - semver "^6.3.0" - -semver@^5.4.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver "^7.3.5" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: + version "7.8.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz" + integrity sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.npmjs.org/send/-/send-0.19.2.tgz" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" + fresh "~0.5.2" + http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.4.1" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~2.0.2" -serialize-javascript@^6.0.0: +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" -serve-handler@^6.1.3: - version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== +serve-handler@^6.1.7: + version "6.1.7" + resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz" + integrity sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg== dependencies: bytes "3.0.0" content-disposition "0.5.2" - fast-url-parser "1.1.3" mime-types "2.1.18" - minimatch "3.1.2" + minimatch "3.1.5" path-is-inside "1.0.2" - path-to-regexp "2.2.1" + path-to-regexp "3.3.0" range-parser "1.2.0" serve-index@^1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" @@ -7028,100 +8128,117 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + send "~0.19.1" setprototypeof@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== +shell-quote@^1.8.4: + version "1.8.4" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz" + integrity sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ== -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" + es-errors "^1.3.0" + object-inspect "^1.13.4" -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== sitemap@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== dependencies: "@types/node" "^17.0.5" @@ -7129,61 +8246,76 @@ sitemap@^7.1.1: arg "^5.0.0" sax "^1.2.4" +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + sockjs@^0.3.24: version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: faye-websocket "^0.11.3" uuid "^8.3.2" websocket-driver "^0.7.4" -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== +sort-css-media-queries@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz" + integrity sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.0.1, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@^0.6.0, source-map@~0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== +source-map@^0.7.0: + version "0.7.6" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spdy-transport@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" @@ -7195,7 +8327,7 @@ spdy-transport@^3.0.0: spdy@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" @@ -7206,787 +8338,650 @@ spdy@^4.0.2: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== "statuses@>= 1.4.0 < 2": version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.2.tgz#af27343b001616015534292178327b202b9ee955" - integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +std-env@^3.7.0: + version "3.10.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1: +string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: ansi-regex "^6.0.1" strip-bom-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== +style-to-js@^1.0.0: + version "1.1.21" + resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== dependencies: - inline-style-parser "0.1.1" + style-to-object "1.0.14" -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" + inline-style-parser "0.2.7" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +stylehacks@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz" + integrity sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg== dependencies: - has-flag "^3.0.0" + browserslist "^4.23.0" + postcss-selector-parser "^6.0.16" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-parser@^2.0.2, svg-parser@^2.0.4: +svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== +svgo@^3.0.2, svgo@^3.2.0: + version "3.3.3" + resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz" + integrity sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng== dependencies: - "@trysound/sax" "0.2.0" commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" picocolors "^1.0.0" - stable "^0.1.8" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + sax "^1.5.0" -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tapable@^2.0.0, tapable@^2.2.1, tapable@^2.3.0, tapable@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz" + integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.3.9, terser-webpack-plugin@^5.5.0: + version "5.6.1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz" + integrity sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + schema-utils "^4.3.0" + terser "^5.31.1" -terser@^5.10.0, terser@^5.14.1: - version "5.16.5" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.5.tgz#1c285ca0655f467f92af1bbab46ab72d1cb08e5a" - integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg== +terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: + version "5.48.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz" + integrity sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thingies@^2.5.0: + version "2.6.0" + resolved "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz" + integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg== thunky@^1.0.2: version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== tiny-invariant@^1.0.2: version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tiny-warning@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== +tinypool@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -toidentifier@1.0.1: +toidentifier@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -totalist@^1.0.0: +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tree-dump@^1.0.3, tree-dump@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz" + integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.6.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tsyringe@^4.10.0: + version "4.10.0" + resolved "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz" + integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== + dependencies: + tslib "^1.9.3" -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.5.0: +type-fest@^2.13.0, type-fest@^2.5.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" -ua-parser-js@^0.7.30: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== +unicode-match-property-value-ecmascript@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz" + integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unified@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.5" + resolved "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== dependencies: - bail "^1.0.0" + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" + crypto-random-string "^4.0.0" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== +unist-util-is@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + "@types/unist" "^3.0.0" -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== dependencies: - unist-util-visit "^2.0.0" + "@types/unist" "^3.0.0" -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: - unist-util-is "^4.0.0" + "@types/unist" "^3.0.0" -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: - "@types/unist" "^2.0.2" + "@types/unist" "^3.0.0" -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== +unist-util-visit-parents@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== +unist-util-visit@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz" + integrity sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.1" -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-loader@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - utila@~0.4: version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== utility-types@^3.10.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== value-equal@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" + "@types/unist" "^3.0.0" + vfile "^6.0.0" -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== +vfile-message@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz" + integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.3" + resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -webpack-bundle-analyzer@^4.5.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz#951b8aaf491f665d2ae325d8b84da229157b1d04" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== +webpack-bundle-analyzer@^4.10.2: + version "4.10.2" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" acorn-walk "^8.0.0" - chalk "^4.1.0" commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" gzip-size "^6.0.0" - lodash "^4.17.20" + html-escaper "^2.0.2" opener "^1.5.2" - sirv "^1.0.7" + picocolors "^1.0.0" + sirv "^2.0.3" ws "^7.3.1" -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^7.4.2: + version "7.4.5" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz" + integrity sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA== dependencies: colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" + memfs "^4.43.1" + mime-types "^3.0.1" + on-finished "^2.4.1" range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.9.3: - version "4.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" +webpack-dev-server@^5.2.2: + version "5.2.4" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz" + integrity sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.25" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" + bonjour-service "^1.2.1" + chokidar "^3.6.0" colorette "^2.0.10" - compression "^1.7.4" + compression "^1.8.1" connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" + express "^4.22.1" graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^5.5.0" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" -webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== +webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: clone-deep "^4.0.1" + flat "^5.0.2" wildcard "^2.0.0" -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.73.0: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + +webpack-sources@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz" + integrity sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ== + +webpack@^5.88.1, webpack@^5.95.0: + version "5.107.2" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz" + integrity sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ== + dependencies: + "@types/estree" "^1.0.8" + "@types/json-schema" "^7.0.15" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.16.0" + acorn-import-phases "^1.0.3" + browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.22.0" + es-module-lexer "^2.1.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" + graceful-fs "^4.2.11" + loader-runner "^4.3.2" + mime-db "^1.54.0" neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" + schema-utils "^4.3.3" + tapable "^2.3.0" + terser-webpack-plugin "^5.5.0" + watchpack "^2.5.1" + webpack-sources "^3.5.0" -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== +webpackbar@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz" + integrity sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q== dependencies: - chalk "^4.1.0" - consola "^2.15.3" + ansis "^3.2.0" + consola "^3.2.3" pretty-time "^1.1.0" - std-env "^3.0.1" + std-env "^3.7.0" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: http-parser-js ">=0.5.1" @@ -7995,99 +8990,40 @@ websocket-driver@>=0.5.1, websocket-driver@^0.7.4: websocket-extensions@>=0.1.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - 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" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - widest-line@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== dependencies: string-width "^5.0.1" -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" +wildcard@^2.0.0, wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -wrap-ansi@^8.0.1: +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" strip-ansi "^7.0.1" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: +write-file-atomic@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -8097,52 +9033,44 @@ write-file-atomic@^3.0.0: ws@^7.3.1: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.4.2: - version "8.12.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" - integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== +ws@^8.18.0: + version "8.21.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz" + integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== xml-js@^1.6.11: version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== dependencies: sax "^1.2.4" -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yocto-queue@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz" + integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 6e4e49a7ff11dc87f7d0b2542e74f1494931db2a Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Tue, 9 Jun 2026 16:40:07 +0000 Subject: [PATCH 39/39] [ImgBot] Optimize images *Total -- 2,134.49kb -> 1,495.14kb (29.95%) /static/img/flarum-banner.png -- 170.77kb -> 44.43kb (73.98%) /docs/assets/extension-manager-page.png -- 416.47kb -> 238.49kb (42.74%) /docs/assets/home_screenshot.png -- 675.84kb -> 431.92kb (36.09%) /docs/assets/config-repositories.png -- 72.91kb -> 56.17kb (22.97%) /static/en/img/config-repositories.png -- 72.91kb -> 56.17kb (22.97%) /static/en/img/update-extension.png -- 41.38kb -> 34.19kb (17.37%) /docs/assets/uninstall-extension.png -- 55.98kb -> 46.74kb (16.51%) /static/en/img/uninstall-extension.png -- 55.98kb -> 46.74kb (16.51%) /static/en/img/install-extension.png -- 50.48kb -> 42.65kb (15.51%) /docs/assets/update-extension.png -- 83.82kb -> 72.99kb (12.91%) /docs/assets/install-extension.png -- 43.96kb -> 38.50kb (12.43%) /docs/assets/gambit_autocomplete_dropdown.png -- 60.26kb -> 54.91kb (8.89%) /src/assets/cube.svg -- 0.28kb -> 0.27kb (2.13%) /src/assets/arrow-down-tray.svg -- 0.30kb -> 0.29kb (1.95%) /src/assets/adjustments-vertical.svg -- 0.40kb -> 0.39kb (1.47%) /src/assets/book-open.svg -- 0.43kb -> 0.42kb (1.36%) /src/assets/light-bulb.svg -- 0.43kb -> 0.43kb (1.35%) /src/assets/document-arrow-up.svg -- 0.47kb -> 0.47kb (1.24%) /src/assets/cog-6-tooth.svg -- 1.27kb -> 1.26kb (0.77%) /docs/assets/api_flowchart.svg -- 296.43kb -> 294.15kb (0.77%) /src/assets/lifebuoy.svg -- 1.17kb -> 1.17kb (0.5%) /docs/assets/global_search_modal.png -- 32.54kb -> 32.41kb (0.4%) Signed-off-by: ImgBotApp --- docs/assets/api_flowchart.svg | 32 +------------------ docs/assets/config-repositories.png | Bin 74661 -> 57515 bytes docs/assets/extension-manager-page.png | Bin 426465 -> 244215 bytes docs/assets/gambit_autocomplete_dropdown.png | Bin 61709 -> 56225 bytes docs/assets/global_search_modal.png | Bin 33318 -> 33186 bytes docs/assets/home_screenshot.png | Bin 692065 -> 442282 bytes docs/assets/install-extension.png | Bin 45017 -> 39422 bytes docs/assets/uninstall-extension.png | Bin 57324 -> 47857 bytes docs/assets/update-extension.png | Bin 85827 -> 74744 bytes src/assets/adjustments-vertical.svg | 4 +-- src/assets/arrow-down-tray.svg | 4 +-- src/assets/book-open.svg | 4 +-- src/assets/cog-6-tooth.svg | 5 +-- src/assets/cube.svg | 4 +-- src/assets/document-arrow-up.svg | 4 +-- src/assets/lifebuoy.svg | 4 +-- src/assets/light-bulb.svg | 4 +-- static/en/img/config-repositories.png | Bin 74661 -> 57515 bytes static/en/img/install-extension.png | Bin 51690 -> 43674 bytes static/en/img/uninstall-extension.png | Bin 57324 -> 47857 bytes static/en/img/update-extension.png | Bin 42374 -> 35015 bytes static/img/flarum-banner.png | Bin 174872 -> 45496 bytes 22 files changed, 9 insertions(+), 56 deletions(-) diff --git a/docs/assets/api_flowchart.svg b/docs/assets/api_flowchart.svg index 04921c3ad..9ba0625dd 100644 --- a/docs/assets/api_flowchart.svg +++ b/docs/assets/api_flowchart.svg @@ -1,31 +1 @@ -API ResourceAPI ResourceEndpointEndpointDatabaseDatabaseFieldsFieldsFieldsFieldsFieldsFields2. Pass request through middleware  -to matching endpoint2. Pass request through middleware  -to matching endpoint1. Send request in JSON:API  -format1. Send request in JSON:API  -format7 (cont). Return JSON response7 (cont). Return JSON response8 (optional). Convert JSON response to frontend  -models, add to `app.store`.8 (optional). Convert JSON response to frontend  -models, add to `app.store`.7. Pass through middleware again,  -return JSON response7. Pass through middleware again,  -return JSON response3. Apply extension  -changes to endpoint3. Apply extension  -changes to endpoint5. Apply extension changes  -to serialization fields5. Apply extension changes  -to serialization fields6. Serialize  -data6. Serialize  -data4. Run endpoint logic,  -interact with database4. Run endpoint logic,  -interact with databaseapp.storeapp.store \ No newline at end of file +API ResourceAPI ResourceEndpointEndpointDatabaseDatabaseFieldsFieldsFieldsFieldsFieldsFields2. Pass request through middleware to matching endpoint2. Pass request through middleware to matching endpoint1. Send request in JSON:API format1. Send request in JSON:API format7 (cont). Return JSON response7 (cont). Return JSON response8 (optional). Convert JSON response to frontend models, add to `app.store`.8 (optional). Convert JSON response to frontend models, add to `app.store`.7. Pass through middleware again, return JSON response7. Pass through middleware again, return JSON response3. Apply extension changes to endpoint3. Apply extension changes to endpoint5. Apply extension changes to serialization fields5. Apply extension changes to serialization fields6. Serialize data6. Serialize data4. Run endpoint logic, interact with database4. Run endpoint logic, interact with databaseapp.storeapp.store \ No newline at end of file diff --git a/docs/assets/config-repositories.png b/docs/assets/config-repositories.png index 24f6ffb68d8972c1320302b1934c1056e8c2486a..50ef74344ec6fef7fc15ad7cef99721d84aa1680 100644 GIT binary patch literal 57515 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 literal 74661 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≫92D=-epB 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%0D=clj6WWBT(4>;t@k~~;r&XkzChjVa>G&+-? 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 literal 426465 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%0Dd4q^itG)-hDv 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 z z&+q-abMnuTku271J8H!DTR+mfYEO=B~2^rt*e(8 zX*F)m$asA}guO@a4(p&t7*g~1%MqxEQF*tm@OmM@fpgOWx*#iky~t5U@AA?qP^BxA zMEEkD>dskVC4bbe1q|8uOO-Qpr4OTGUG&lP;W_kgZ3%u}$J+`g%A{)o-yhPwZOoQV z4w8pfTjIvn0w5M`l||)BS?J8;1vf1X568bl#|ZGP)xGJ^C-Y#oy{nDcm+yFyA7bsn z=vq2W4cDV)M;>3SKrLI#Qk^MpZU@dXSiu$2-svgnj*aW6>T4w|+eENq*0|R8UvMRx z5?q---O-p_SUspwwn~rQy}XDrj$*V+apZ9WH8?W&)w-j;;W;|%TohcP-9?n79b{>fOO})wQ98p zqf&o)1sMX0P_4_eA#Si(?`5b!+tDMcdoJ!K($0<}_`6)B8J$=o+J-0^nOW?DwM9eu zbC-g-5S_m^qof+UgT3x*@X5>s%}CTGN8))9XBTF}+@%}9WV(fGQz3n6Og&u+$QosT z0W_bX)L$p?%;XYn!}f7C+UIa1$s(~3UM&D6U=J9sRDoKyUUu zHJ&o?wTY7%ay$e(7oqm{N!yKRhVo9jt-HK}o!~8vhL9FJFFk#oZ_SrB zXhtnn2OJtxYi@t`qAA9_vBo!GCHJ*=XXNzFW zpucH%9GEtO?H`Gz4Grja)3Fo{aes9}h^$53yN_F(!>XMbtWUZf+38ntxIQRLtq1as z0db~Gd1UQXlE^#5Z5Imat9%|y%sI&=>-Roy6m>K7MuWW6>&{|eNK;X zT7BqTAs;W0$_>pHvAo|yp=2$>1uFr>b#0TKd?EmRdI|Xc)k$92BJ?f7;88O2=g+;? zcf2}qe=`NNtq?u7<3s)rGqY#PZww+_S0cN0UkJjNp`HV{rT2&E0mcu<6qshS+tkd< z$ljeMlJ8Uv`+T+S*x?wT=*J49*eVB{ljBN7-ltNua)CeM+u^urt2>K?_VagGd>xG<<7@^y)EZ* zVUvo$n_pa@H8$xvmBFn4zJ4yidnaS2qf0i{zta2^ZH}f`A<~%?tW!fpz9t#q{I&_U zrY?wu($8TsWAQrZR8h376J9CXgmL_1&iBjOhhv^q$Zi;<=pB~@G=^M*+IL0wqy1UB zEPzgLqbb}WuZ;oLaU{ylbB|7uXGS(fR zX@%@-1QKXaon@WE=s9@gX}zc49v`IBqB26TTP^c-CvrRDYl0w{V4Qc5+^iD&e>s~40Ni|E7um}~CLZ~l zz-Xtyxwu({@>!xF=~WLTjv;=Ui&Z*BN)$aC{5T=6mFN~h;$8jstS{sg1P?au(GL}> zuT~Ym1!Z1hoB?q@YP;0bvk%xEG6RP^;B? z3Uf+ISqAI#tY5bB)h+Y0;Hgi(yRYNXwx0$@R!!A?1)rGNj`7r6YoR8r3qx1LvGqyW z4uk!Em}=IK1=Nfz+u& z5b`3)Reg;4)SpgD#(kHqKqbyMqV%~K2N7hX-hPLlj+Yw{1xxR?lSHNST|mYl$e-#Y zou20D&Jm($EXv2q#gNaM_)$tx5*lHchi@{W#Yuth_WQAmDt#0^Leqt(sxuNn!u$w0 zJupdgn3?0pbLo!L+pmcC18qgUE8Yn*ra0#AfzNM$n5ojyP?$Ttuo?eJZ7+%JiPBQn zrnz~U>IoO}S!_8CRSthFpt-ksYlWSPCDk#6i}EUB47l9Rh`B>&3DVUmVe%=jr`2iW z#%ZzHr0_KRAuR}Tw+-S>^~xbi3p?QOw<;D1!PL&0s6bNw(%L$cQoQ;TYyNOb(Ox~O zD^~(kF6cfV#!`@p()uA+PgTaEkySux)6WrYc1a}DT?!h%kaN9V+-7QFvAVCw{ zU1meV`Q|;d);s^r+|2r}SZlL)cUSdO)zwu`cmGTakB7QIZCLlUUGl1(t=wi?HDt`G z1%^c-Y-qnDh_5#uyr*XKL0beKaEd~pxToOF=N)!*${xGSH-MzFACfOc)Gxr`$f!LS zcf1`wysOUhYkrv>e`(cBzFzUdN4*fyMNUq*u2JSTq;0j}HiLuym~^R8Up^FKmxkRB z`e*PM^$SqW+)fZHjSwQgbNhc*HIP;)cfgLBN=7eygmWo6jeCy#-lHgg%_xLJIZUxR zlk;sq$ZFTlZOxouU963oVBIkHGApD!3V zzwXV{`VF;r7&hw)VQoCkfyIW4zINjMrqm4F9;^*7IKC6Re zfy#{whg8h_U@8_L`c=ydboPPL>3D-1b$1siN)9AlQ`h#4W#5=d*?i%(vICY4c|1fs z>tX6ax}Z)V$}hAWEO_-F=iU{Kgu1KcE^=ZGuj87xFB8IKE?RM&*|>t{-CNTU@qP*n zE(;FdJaj+hHu@g2P!%?|BOm=Vv9dg%rnmaE;XBv|601uS{tFVT*k6=dCM;ak*huEq zh+>h7kw)7omO2l;clpJXZqBWqaYW5j zI6xtfXHDG+Ami9Ch!L{!3w^j|O?#V#ZcZWSscoKnP98<4dGnTaRW8aWrk)#KE8}jQ zRj4DQ*vB~~aptTFSg$7u!pz!gC+@ex^T6BCM>_Uhe3I@^-D)njFI zhJb-ys_V%Za{0|MAJaNQIf^=U$pmIu2&j=J+5YDAQ6kD%@_a}~q~~YAxZ)3#=-Y?p zbSHiI`-9(4cd{Qg1r}*9*-;~$w2wN6o0X1R^4L@^xTIusqeAMeNf;?4P z!-!>%H2GW`BFayZ7&^DvtjRAx~kBV zK<(eO_%;e>W7e+4A>WtrYdX;gcUWtgk(5HD_zx^r0aCt{^OZ2qPa3NjLOdj!jm=|@i$T^ z>p}bhI(x)-$FO*Uq`*BnZ-KIbn7njfO^JUo4~?jNI9`Q}5DrpQlV=ezt-RGodj-}A z(}8$5351U=_IA`F-K22>tjN&9hurjPXEr)$|Di{04s%Ri$LCg=2hlq1Kwd%!YX z!ORz6t$d0_L6<}{k(5T&_9TOn%Z!;VK}j5hIq8y?R~qx`ee(OJ|d535C> zq(5!j77qRtg2BbAVG~b1*v1Yce?6g}%+wmrhlP@0YVi{z9QkUH1p9Xp*UxAW^<#?C zpfft^4D!I&dXP48?rO@fn0B!hpJFC?+{9D;XQL8G2Z(6}AwQ;|@*_58;j#Hb zUK62x_5%aAhOh2r8*1PwmuioOP))HUzN<#d`OcAFKY;H;nh&@RCu{Tf8Ed=JgA4K< zc+W<&jEqJQJ<1&(wzmv9aqYdI<`vn+Eecq`*Q1(u0I%U0TjlA9H%iTpkEmmQfV@Dj ze?R}R2?ZS!?HCR#I*3qCe4C880aXwTCxr%Zkj0YuwZJcL0RP)hleqJIGSlAcQa3G& z3WmOzo+K{vUQOG>xLa@%>J4Gj7$ySGG%v(%nvU35;Y$}(oM8I?U`@MwQ@Sk7WnaI2 zg^$J1$HB@gQR;{WV*R~FQ(#k2zq7c^_{`!rCM&(X7AMQYDZK-jn2lHne*K0Iq7aXX@N~rp?({Fh)fdFVJn$SM16UoBBnp3WbW=2R$(qbL3j05upFhV z;UMftaoPC!c86}LWixE+k$Ch=M5k%}!8tNRbjVo&#? zDztgtN&sI(M+PyIErt3RH>9)BS$${FlRPvifV?Gcp z*~3C2pXRO}hh!=`tfa&CnfWnt^~vj)5u;UVj?3*4(&EtO>3ViH%$B*PRgO-gd@y4z z#k1p^ASfO$&+okFNI8874;plf#m2Lh6Ni%g48Us$6hsqZ({|c?yg4ml5H_lEs2!?2 zAY2;5J3fdcpW-3lQvvV6W7wbxBGup_CX5f0gUxrD;F*?=`K>_4!P-trCa_v8nR#1` zJyu$CkG%!VXl6Lv1GKIT7(mGWOV}o^q2+yHeGO8EV5w3pe(4V~D41xmTQF%UoZkq= zjpcOHI?F}N&{19r)sgS>@p;_q6V z*Q_7f)Il;FawD7?;$(G*jGv#rc0-1caqWoxaj9886f^rEPjRS#|E{^(ug@W3rS_}h z=~(b;!gP9NknRd}cr2P|Zs*OgvGrXqewqSydfHZ$1hh^7j3@nf<5k{1#UH#+w-_?x z#aS+jexPWd-$0b3SF?Abs8q4;B2C9Uz8{ry1RPej4v&NOQ^+kepFMUMDRim3MH^-(4h2_{l^CKc;nlcFC?Hny17d;G0{9M}ixW484ZTE?ZEW2+(DMsHoE28?VS6B zm&_du7pb~~1pcMk&*fWiOBmBZ>bY{Pt8;|T`Ea+Nl&t-F2L1}v15m{bnG#)nLct8*$vc$f%xf?8tYrjr%RAu)U6f z%AIpu!9$J03-s5D&$C1&1OhWpVrb<@UTAARLtF?vLGniw;Q!#D|BT41<@KA2oj4#m z8)y`(}2Ltr_w%`OnQV-Si6p|NMo6GlVsMqtR(Jf5bmu_ys+W zV;BzNB7tuVyv_Z!IYqxA&dYy(M%B5Ad-rFU&kflZ`>~>!05Op()yn-cc;Kgj+MU>d z2-aP!8OCr#$-h7K>jAfpR%tpNGpY*VEd1L-ry9ib%Es6D3`&IL+9 z*Lxi=m0`4Bg#*kdySd^soYxQE*85d}BxB+ITT`iCCWL>L2^`N?(1w^Lp!5Xd|A=w^ zvZDI&AcH8S zH#GlMDkIQ_ernyD?P`r4T$R5qtd)W`ywx<$Ucz<>13oSAcNTyRi-L}asbwlbt}?vp z53O3_1r?lDz^4gbKLjcj2xYjKe``v%9f0^hjp>2t4A=mrkInl>l^!qs3S}vUrUKsw zcx?{tKZW~GY~azXMfIk#?%GqK*vbFZS?6aAdx`S(D4w?$@78;iUZrAs#$TnE(|p;_ zXzIV{vR8Wn;KV@`PcQH(glFZwjL?txj{^y`OZf+LnxuwSncbTi?7$ZZ{zs|L_j00(DZ3!WK|?5Sc0Op|@fiPAId4$) zXVW!2hMgx@XYMhL>6mT-gZL#w!)vMNNb@SjE>sUxH=3%LVuV+)tr5}YTV>vZh zsh7bU&@Vyy(C$tajZMaykO)&J0wZY7ACrg8UV$POlMwMS8Y9WUR@Yo<7GD+&XFB0rdX{1~q_}9rjbXWhH z!j^Kp=o7Bk(tJAo@T2}-xBz0lY8tCeMT5TKp#U{Wn3>`#_})}t8e45qTqoNT}#gjn0SZ|^?jE9ccei0 zNE1U1e)9nrS5Ih!CM6r>Y@d9Tiu`qet2Ca7Y`MJQ=@`gkEBW)f5)Z0AKtpoGh*sMW zGxsT2v!fBl@c??k<3fgX9dH`Y6~to&8VfN2Uo-##gVq`!xq<9-VjbZPnW{<|W7tOt zqS?k5uS1f)3)Y>w6#0>A4?DVCtv1e>X41M!@-X8g6|k!W1@sYR;M!B&;#cn=V<4(a zdsArL-EPCOIaH6g95kz{|I1QCDA$`qU6D?mQCh4Zm8fh3@3PGY>thcJK-&DXczB3i zd)E}BrP6GH*!d5L!5EfD1ht(Jz{!PiapC9@yxCVJfE%VG6Fly=xP{pp=vs}2oqRK0 z9Q836R{r9ReZx`zp~i>@JK_PYp~h?uRWyu^K*rtKGLUFD zQx%JghGL4CtjA>`2gdo-ZhTcz@q+V=+?xX4>JyaatdbDNPCmcx-y9NqwHDlMmMWk3 zLA}jJfP`#?EG!D9_eMo-7u{aAec|DX%1#Ps%%5{!yuR|@u43MP8~^-e^kuq*o0NC! zn=ha+2VR+ESl9|?MBW9db5x2A1|c>{!kVW`Y`qtc_~qOQkrz4j%S~N_TzoBT1i2D+ z3r_+OjEKgw0HJa(8t8bDgfB(#;w|szzvBeIkL}BdnN9UVJv)_6R?4dCZOHl(H?AMH z5B(M;m4A$i#~$w^Wya(@$TdWC*G$^bAl8zvn3O{y9Is$yZ;8YhM^P^7dbNdXoqyAi zZ0!Wv`fq$S3-;OoIo=ZtHV!z^iMf1XO^|^kJB};ZmFGyp4+~_^7@gUzU8%p6hau7E z!Rkx#RJbSEuG*=_QW8(u+Wnza58<{%*zL-SuPmfu*6=`Sqr&QZbU!_o7ApP2-Nk)D=Vd%?CQTiCIoxg^vr!iGnVAFFUx|zJp1=~@y=2%@iMa%nf4*U zPeupv6cs|l_^3O;d-=Jb(cVi|Tl%(*cZiRt#?GpEjR`g8l4*prx#%_Fpj5GsXkqd3 zgt;+9b%Rl_4)jh6UB6q7X3W)?G1;*S=98vn3Sw|Z#*EFeOV?*s_%{6?WvwpW<4zoU?Sz?8pBJ-b-9&6^ zT!f3(#wY?8J3)%khIxuZy%k)I#kK2hZlP9m zp(Err?>BTYs8PME9NSTJ(27uMl>ThV6YO^715rTV8__}^^-hdz)fvT(xkQuM4zB?I z%Y01>iiSy%$rzkU3#8^mKkZ9k+S%Wm8tj)mAS#o%*&dkrNjr_Rk;qhld>?BjI^xO^ zAnuuvp!4Qi%BW;N6)QX|S0Pw&J9hxOK~(=@AM>%sYBzrNuC$EDP@})V3Ts$`9nD92 zgsr5!&kgW2@0n_RtoUvy$W$BK)u3Zr*5f%G*t$dB5wlmLm!x`@?nVH7u0H7Q+e>yE zLz1s9?g7p&_|S%0esZ(CeMcbIEjB~qw!@t0zT%%G7|qHIJ>HE-82J*S`DuZSY@jXc z05|_~^SIoYcQ|!~LIFXN1heH5yh*X>i?#7V#<}5|=FSq4+XANvf%B@^A?0Dy^Xix` z{5OTgqdiB07kv{sXtf^l{xxkZURbF?CD9+b2o@Wo3}~@34j>lxB$Zs3RLfI&5rp4D zRwfqH@P)VmUDW)~n9qjPXwd{x8j$gC(yahTLevqK8Mz7IM3#;u7)2pnN6Ogx?)4aM z4|$x(GfKhqj7h|%4j3%KCBKKK=P#9+?+La1=vHMmTXkY0-q|QRH;V!@!Ubt1gHZ{f zZ`IqWEk~-)?8#{uoV!_xu%HFgBSwKQiIJJ^ao%Y9HesA1SR9@S(Xb3yNldApPR~=) zic5>)s(yPDb!ySmcg!}{@TuZrzOe&JyxvC9T?(0p9DbtkZN|Yq4+H~LU@W}UFHf^K zYLKhltBWXih%7K*e0GiN1KrkCS;FnMs{5C2hBp!&X4q;S8Gd+Ukhg z=?VTWtN|eJ(HmMd!(a}w-jEp$K90eWrKZA{^B9C&91S`gJt*TPP{)1bznP0p_`!Md z!5u?gf%$1*eBQf~ay5A%cgqiscOryX2TO{{QNRuu9ZtV~q#gjOD!LgVR5HGesH!~9U-jrx*#uL@4ITiNrpl)w0lyr;HRV=Iw z>2cN366SC;iCOgoqUx@p@#m%TF;}QWjX}%7C60a~W z8DcFdDiGLQ1<@x2sB>t`zTv#+zYMZRQXaul2Lr$t}M=7mvH8jLGuQ z%QU*){+%N05GV0TgM$V(PNI;aEQ|VRBnJww4tRg}AD5Kt#}0@HR?}=hDDY^_M?zmL zTloPDoYJtR65c$hAHV{>%|HTdzm{m#_V+vc%^727mqd3JmOFT?jvVl&;+i@n&+89bp1yNgf8Z z!aCZ)W1QG+!zfeXFmmsW+Is?Z?_a?=6|(*FAuRi47kx8;l=#|w=nrL4WUC(O4!@2d z9n2ixCNJA~7`K3g;bx0tXJG&Mmje z$Cq7JwS4EC=AcW09skAP%`|f2FT7D(ikoeIgc0Dq+u{9Y7MvQ!(|h${o?aLf$sMuv z_1;6A;gE@kK~)lFzrf5V>>yQ@LHDR7>C6*j! zRCb6J3%_0Wvc4O}T%ess+9`C~&R9FMq>f9C$dN_pon`$pe`AE22fPtky@_{nB`So0 zT0)9P>60(kQmKT|?_pE1D>kFmGDszi%&`4BsB7vBMWPW&r8tTkbtfuJ+>AWHZLVfi z0O%jLj*s}A{Kv_X^ilg-@wB~{pJ6qrzc+(Au(IK6w0!w2}%@cnVG+NNp42(SZrxeED|o-QWUyZkcph%9SAh?2Dyg zVrlt)g+n;-^wQ%)&#mKBYO>X!a1PJv3umU9?LL!)@9(`lhzKEUPc&<}aCYh&Zx8WP zdD%J8af6b4hqbMjG~s-WK9kiEaO0llrgLK=O1`0Yc|W+|i=ouUnhHc$w-a_`hjNfG zANeLGTHLj?f27(xpbSlqI(@!ZRX62ZYOES$;-D8FI<${oTqCHkuyQ2jQn8!QbuZ>S zPmL>DV1Yp{8*QXcqoM?|I!45Z1-SBQJH#!DF2?v*hvBPS3Uq%BcU?ITT(JMP=^gLkE7`fui6231))Z7V?0jO4Stk18_Kch zE9d&$lLX%T2ft*MzWJ{PF+m2v^<0XaCWw9#w`a!0bV@W>?Q9@U1+!4TJsPFqcO7>> zvO3eDi2Qd|Yj-Ir57&H|@b%3YxH&wxU_$M8uK@>U+$qK%Z zI3-k_q>ildwg|b}iQ@Dvu40d)Oy(7N(4ZPmqi&5XgSN&9uU&;aL!p)4x(-P^vCEcFtiYW$Bp)bz5E=G$1y`IP~}^D8oU#0-h+!8UTKUmY=& z88CkS#!or%J6>(8U96w*Qh}^O7aqJFQYFL2?L|FlR-!yPNr*aN#XZu}$d zSNJOzVE0t(yLXVz;K*q;brtG|*ogp-DA^rJgavi%(!Shn3#0y~ zcpGX}d>f1FuUOoK1`flwwmS3(<-IP6>@?dEdpD~ zM#$$Tw(?B;w}Pao`8cpE17Ce54aXSQ*#M!J4WF1V20#ABQmw@_mXwmA7Jn@frI7S#4Y}*V z6U;ER6Trjrh>QYRP92ju*-Hfx93xkT%QGgN6Oc~#TnXqj`eW^V>pZ&=$IkNP+QFqi z0^%MuaT4y^)(DBFqLiGeh>jH3XCxs3wKZ2!KLFD6bzJ@Sr(>I`2$PHUIF#cwL@7Bv z;SseK*q_3ZVta{tb$p+`nD)sVi3#jJaP8L{bv>j-*KdBuXGUCxACFIl_C9_vvhR3 zg;+|`@j(RSWZ!Ogi0916b4kY`GfyLJ4;UnD&Np6oZw|355W&X|)C4<(%>a|R*4?>! zp~Pi-%f3WZ7!wR~V#T>21V(d*yc+S;aCB0Wj5iHuUwSO0J<&$i*#dcac9JZX6}Uoe zy=~C4fi~$gS)RJrcnYrqU}?ozipdmL9Hyg_<49Cxj)VFp)BYuMtS18OP_stHirm13 zSbhJnH*dAjXdRoF>7;WaJ3@R6S29;7Tq0UFCb4LpcohJN?si@YHLcKIqJf6deU=NM zNmh5F(06Q5tR=u`z0p)pj+{Zz3}_SSnc~;<<#@{|fDxU{7n!ce_hh85PzE##%^1KGR(*5|l#1Hxgr3Ajl3DZ_pa+;-cj4 z;4peod%kHv&~@7?|Ko0ut^ijyPOJU&pns=`QHuw5?;HIR%e2MmfvLb;n;SyDvbo_9 z+Oj~N;*$<4$!gI!iY@$Ip{SgWZjLie_M@6`AMyZ(h;t8~_tB;$ zsWFU+%;{cb-O1l0>;*`mX}5Q6*cZxg8Y2O$A6GIo&6A&tT88=0@%I-sZQamu?8ZYV zIoY1!bEd4`^j#71hBmFB2v<3)0teRW5Avy9g=qxSQ!Sgy+;eshFvME001LjEp+-F3 zsH=jHP)ia^#Qn_dE3E3AH)bBKly3>(w+8u@!y_mlR0$4`_kT&uv`PZVT7CHnv%Fwk zYE`20%O%H0ZiMERoI65K0w zM8nbsiD{-@HFh+%`Qb^&f^Y7D4V1j9Jv8ALT)EsVU5fJ2nI1~iEYA?%GWM^<#wlwM z^cmc!598}i9;HyYSL!{2E*QzXPeXVijcBrfpDrbZ@y2Xd z#qKtfYpR1$GY*)=djlZ`^IYR8=}+fTr97*qX~bwdYns&oH)F^QuVd~uC59L_g^WLY zUrTX9aUT^iu-L9*Mo4fMCu6s_dBg>!cK~15%_se&jI5O+dimXvqr<|tYKus4q zB--E#qzna8^BrbY2uh<1(T9l>~Mh?5?Q#qNtBo-AG036H>=HjbhSXP-ZtPpN`E0 zrgKxukDAB4e|GeWoh%?$#^@uKep}}4x!9rl%U}yP?dd;|9f5bJn~4=uu9uD{o9tB@ ztLh;plSvJ-xE_`?Gvl{~H}LP+o8-9~oQ@%E@OKY$diHV^_IsWu*ij64Zc8~>l)+Kj z=7euuMTZaq_oHV00jowx{jVf1c}=r&MdvAI?u*AW-eo1@9!V1J&6h5 zLy2D2wzVjwwalekjV^zB`cnhWgRqVc)}^@#dDo^hWr1J5$4&D#@({5UwT9Z%vUOq0+$VX`{TmwDT6CQ)aPWHoNCCzZC8aoyr0 zYC^lp)|FZfA+k5*Rld3uH24vFFq>%hLxjgt*Fy^PZ~qTcgh#MLeU8>E4hUE0**6qR z6g>_VtgDv?^ufAZXL4;hd2v$1;^RXMQb%YFm2m2UJs}$vioq1?eZk$se5^x_P{d)w zqE@H6bXh2G6x#SZTgDSfB)QHG;%^3F%6mOrPHiYy2JX65QoZL=yw2i9m*<3K(ZD-kP_Di)N?u&tusQCvFcnNH z)$g0OhfE6iU%#Ni{wInbKX&<&76Ihi-IGS)0n`#`8@=S7IgGOI2*V zckz7c*t)7uVBy0xWf2K|9je-DW*`|EmT-b?W*JRiWxk^<+IUA~^+dy`LV*ilN$D|b zFyN)6^oJ*ctUgOjmftXBFU7lk0-VxJ_iGJ2(Zg`uPl<1!*SE(85~RPLgiJO3w&Pv! zKzJ{Q67=>RNHE^}95fMEhfFh)1d%(tf|XU_w!8Bs{xxOv2J7$ThT7~Vb%z*=ZGh0z z$`W@j2e$jEAVmEM$&uL6tQ!n4VjN{JCvYnPKE$XdureQvP^63I##u!o*;<=;9(ks= zQ#qe|@A3x{tasV6-C{>8sr^#-57JV+2bR?FD2rRNttlu+%R(SmP+XSDwPQl)AAXN)HSvwaA_Kgn)!gWm_g zesCc(wtt?DP60nSnK8!LBp0$Kd0YrIs<&o)Jl?5ym{TPOn_`vjKDvAT1vs>Za+!I{ zpxREJMtZ<_*N*m=BPUIQF2qDJ0&0BANye*AHM$zUc~rd*!b*on#f zjTS%7QVU2pxDQCYyXJg`Hr9q!Md*GHqy2ppUWMLaoQyXzH#z!9;oH33VmNMc$2uC2 z4?;}qhgl)zT(lFszqz7qaL=ZgxWV=cuf}Ci)!}UEB%<{R(^5~Ul9vx+A|5>BoQQE~ zeQD?xj{dX6SItHGHdlm1Q9tHlX#|jj^yaT3$Mazj&I`FknG2jxzR%CV!Bv5 z`*+Pbn&dweD4Ul&Qu^Fn?pMW_iYlv#UmU6#Ot5_LWh~B(Ml1^qZ3Stixo|pH8tbFv zMlHlZ>hu8dhQE6+yxaE&+!F805Jmsy&5SrQUX>shyYD2sz{8SgUs^8e@+$F~B}bGT z)IlJA5W_=>$n?{hLVeN;swj)a3oXCL+tgDIlISCHa>dKLJB=LH-n1SS-AJV4qb17? zItb<%IlgJqat9pYu>rS1P-SN;JTVb#D_v|VCmLrTHrq8K5<)oSbiODDkrx_?*O(b6 z0-6{~bCGaOXDw8ndsO~m-^vqdpH0VgKr(u5hl(qV2_-yY6TeNc;{jMJpgXQSfTBBg z=>&Xcj+e@a4@+c5iC&%Sp~B_Fx0()g*xm?qzk=n);r;saH)>Eg@Qvl3ML_XkIN70pZv=Pd`<{*!o)7>RTi`MqgdY$Ac<+l&Mtue#5w^enSNQ^gPRbbhC%awA zU&^1iH$Ql(QHHiw;AXeCL&3&&@}ma)H1E3%-j_qOPxdSQiZrobDpJ;mE)!qJ1RL2O znN@G@0MYtKUJr`szYk2a$1WQ%!s0P(cwlER5|XbkZPq zFjS@0TU#Qk7B;XH4FPc_Kvs^k)pw|fir}r6z)lFMnqQsy$ifM~dv4y~dtPY?Ha-4f z+}pRt)-zmWV%HI=zbxCm>4ZVWlk>5PcR?6BbyZuawNsoy`c*rh@P6?JXIUpW?+ef5Qi#@f=ecGQGsr z%&*+3CT!4(qKNo2Bl6O8aRi}{!0K17o2UJ9mW-XmnHD85CMK zSV9|IHi$~7g(;TBFPgq$vpqb0Z~sj;`(Hll|MF4)KjNdpC2ZY; zq7~j~^0!PVOjap_ZVQLS3L;_9U(rD@(U4rbFHg@qnd}roDOYaYv0$4GC5=A4M6p2H zwWi<6B#}?E7u%~gMq%bzF}{`zan>pfzc%vvzZakOs?|T*uqOtgSk?XY9#HZ+tiM|Q ze|{HC#}7z^c<`C$`7iCgOc)3z3Xr!ItdEf)^H=Bputfje3sW^jsu%A3QE0_0llni$ z_ouy=4*z$k|Etyi#p?gDS=m~i%FWJ3)8f-OmwvTBSnLcj-g`A_tRJAFA#e1v39z;g zpcN3^iumYEh>MtNQC=-u42FpS1-j4p)m-6ZUVRlDhn{5%%xbRw@#U#s#oA&a6mB;)Bqo6dR-^hPC+ljf^D@=D}Foj z+QMS>quVj8!r#34BZGezInk)&ZRHJ20GK!4tzlF!-tfpjoOr{)Hygyb$L`d?<>tj@ zF)$j&YW^xDUmZ8F94P)7gFoYV!#N81>WVHp64`dG{Bf&S z#bM37FnsMZ|LXydUoi7LwmqA;o@lR9p-rMb_Y1cBU(X)==i#3FJ~Q?iw#f+V_s)B^f}D6-^%FGhqsgcE2>}FOC0<0|Bok|bX~WWlCGSlP9_v4 zFLH2n_msKeG@DM45Eb0L7*SRP?~z0JQ@19+{*T^l+h5L(P*&F?^otlLYW+R`vc?07 z|D9)YZaIK<`Jl<80&LhyMpv})79^w-KY)U^ z0X+OeZoLZ=21@?O>(Q_8$W1fe$e1ndqMiyZ;?b85XI)USOH4n!gT%jw(_7n=lUzQE za9iyGL#}X^mt8B+B;Gc38UoYA3^%S0eW;xDCv)G$gTa4<$t^*;#=if@=~QcXF8UL_ zqp52E%AO2-f$9$`4cB1moDKT9XStnqTP#&b+d|>`EGDLo-4N@33*2J1?IEweashO3 z%QU}1{k!wRPQ%#e95sbC<>Y058CYJ?wZJ8;tuQyy3OKIt9~f45_|=06C)f3+^I*Yh zk&M>-bqfBpidFZB46Y+U|A>4j4E4!t!uG0;LLE@&XtfKJv4rJMod_snc4q|=Y_saA z4biCe?p~qp1IMvIwKeh|Av*Oz=itD#v>Vxh>a0;s+xlz1VDE%njAOn<3N>%a`89Cmw%x{vvOyz;ap30W0OV{-3QNaj;ALB{88*a;dyD_cj$`da z`L7dvgYnYv0H6>7fkUfw^z?O7h}XiL{ZE(nP>q`c%N?-Ei<4mnY3uqJE!9&V& zp7wPmhQ4yXw5C{lt5UR93&bvPSsfFK`+{gAhmQfz@iBIwy6AfsCoy=_H>jnoyoDY~x)O=O@w%aWST z(Telwntk77%1cC@`8E&1VpCgwB7feRosOxj@y*?f(0})|BMfKI0gBRr`{X-OG_l?i zJzzgJD#}byb6&Aj#J7Qd$92l^tQ|ahLpi#cm6e$EMV!HoJA`guSU~{+0jRGB9AXk; zrB6!8cQdn4_p@~F?z9ea)Llr>lPWdPDc?H~liq)7xoexy;pzOU9Qw^S zX~QPKn<=H$r2Jh<}Vk_vU%=8oBH)VT9H&q33C1 z$M3LWvQM)t7S7$AhokE!A+xWlf}T)69NU-mB<-YpKCp6FQe624#1`X^;Ad>*rt}p) zV@v<@*IJkZ{`JR7S6A1(f=wqjJqwmwU4lb`roF=!WDFdN+Xe3*UQ8>r+Riua0du`H z$?C>(_{QtG#2bV`PtzSiZc85S{zAstBLF?hdBRv>*O|IqMFX$Y2cKvM z|52iGyll4;Ty5l6LJ0Je?JjqT=B>trk}JVL@8XvaK^Goesn-&MicYDh_dp-?#Bt7Q zI*1fS=*vqXmkIu}qwoGlxu%680PZKGCbVdd_%83N*?C_;m8~`iTs4u;);zCv{=(#w z9yLfn5ly1 z>l})Ksoe?!)u_@Je=N!=e$p6K7`-xKGU~qSLsLshTjNJw5p5Mu!GzI9Ez?x>PjX3( z4kdHzvfFzS#`(5{^X0UEm)&S<3DU~`_W_J9DvI5^C&b6AU_+@Za_8;)xAZP;&`m}u zlK>a!bU}^|(#|z(+?w-)izGYYpUFi421>*&IsD@eZw~$W3mg_nw{;P3{K}Xn{GSM^ zfHC*J#jC!T(11&!GeJ{IssUf{QQ_04xH=sIJ{ByMqDMt%&_lCckwDIyZ2lbCh&+8Mx$PZ?x|)M0tR2_AqM`@^*3c@XnP5V0|upc8iJ=Mh>91=H4Cow`}$G8 zatMWre59*Pt*`IF_;UGgDz?#o?JC53LG5_apP*bXovqHo;r z!U8PUV*w8VnCnl9QL)M4nz&}b(B>ySpYxUDCNV0nr9qFi33OGZ2wl##Nvlg2?9g7s zN!LXEUS$vM?{N3ZCRD&v)f)(ff%FSz&Caf&#+-*k_AJXUCL8hmPIwY^nf)zCNqI84 z7ZV`JgXy@j;rb~`K$`Q)0U+sQG#Ix7FYp`<9WHu z_`=9jgQHTtVih+2`*LeFfpVa|)gPd)_h64*1w)bz_#?|CG+KX`NdwCstii2dHt=b1QqA*+;DAaTMEGz$|IaRn z-T2W>xA!P@iC9=*C@6Lvw}RKJxQ-9*C{WN%oIZicyV7wX*_}zTrDL|-)LdG4h+1eP zSnlsJV(486w1Ph<9EdLmV>o-f(SIaG7I-8eo6z;6Bmlm>+(WmE@c?7s?#X7LLyg3O*Z8)c6!27D7^i~1&__G(kMDdSv~#Y}(NgF= zLM32z@C-jdNa^?7|EysDP3QiIfL2vYbhG^v!q>L~w~2D?=6+d|NxQ6B8zk#{5M}k< z+Grr<_mltESc9%hW#9XwPq0XgX0+~3Lyb;LCmSsqxsyGzrw8jg?iTBgo6uku z@d|5!dGJz)_>g;an!&v{OG@7%t{ML?_TI89uBGb&#ogWA-8D$?1a}J_TpE|)?iL_e zfZ*=#?(R-w!QGwP$vNkF$Nd5K+Z|(%{!raryK2>{C9`C%M6V>zmU%iT$aj2-ui-<~ zHdzOE&OO>>v0-Sg?zEIS3e-x+$n!zz5C2fMqKl}0uIk`7(y};O3d%+oaV^Gxf%VWU zkWYJA!%k{M8m!^cMS%^u&hy@&d!EnG58f8pi|RDq zTl)*TN1t__6Xz^pl3!-fE*62^t+#q#zC0nQncZpE@ZroTba*`W8d#^hR$j_h?~`^m zfJ6e#>I-l;P+agJKg|bR=!9s9$$Q$5^djmXNSFhUM&fHPb>2|ES`8}fwPu=9%k_!l z4C?=ww^0RMt;#eRMpfp`1aoxoTLrWd#Vn?tl|9JEq@5JOM^1GbFMfCQ%;&r%H6LYb z^9{Kz1p*5X3gZ3nL*S^;9xRzcR>i;~(98A`6O~v1i}O4Sp4V;bx$rPcv{BS+(z>kK zSm6DvL1332d8 zh2l2OKzxWt?#}1YTlXQxv*e}reGjTgd{_>dnE>y|oXg#hWRIYJcJEMf=eLYpCX?nH zt`FPOQUm#LC_4sgsQ#o4`|x4W!8$tW@yW^N4!uFcGWY9lq%W@!WBQ()#@Qd!yb?sO zt{d4t5H~%oLDc<(3!NNT+}d$NOZIIb$>7PnUAU)VMyaZRm3h;uD#S@Y=bWMyIF4() zbkk~VMJr^1*t)E}>?_&7l*loQ_A!_W>f2ZLI!G>V|H+ zy%5s!k>KRqupTf|Yp)fp_0Gqq{DleZxQEDGt-=ky&A`LPkJ>u|OmA1#pMEtbMzMJy zeye$=Q>cHS{P5;meS@~wd$~zFmRmc7ss>U_rLy}ek%IA9{&(~)zAn)g&;G1A*!=OCxYNM zn@C5*4qWE>(CcfA15!jO3J*Aj`>Pcz#JO#6QX%dy`BMh}`&kYss^?#_cTPi%_jbPA zOvvDXH z5BOwz3vMv5p-Y4V|JtV-W>Odf@z&t5;{nFfz1)hIL*CZpE7_eDe>L%Ft;SXtKWkq5 z3$iOKL2(STTtBo+Yx2%;wDhH|H=;n>EBbAq$HOh+q>1ZSz%?l51YP@RxT6bu;o%M2 z)_c~C$$C1FR^7^#5dYLK4h~~nsW3aK_lonQawGVAngEv`)(Sg9^}UckH|xvQlb?3R z34a;Jc2*jW`*Y~d9e!tbMKb5KAQH_}Zw}__Lv-(V>f*3#a2>|$%a=DAsA%Mnx?3Uz z?$2>G4}(KdaYdL;y86sw!5Tlum!!D(5kV1Wpc*Kfp%$n}1xj(Sp3~{*AeSL5I$mB} zbP-p(ZHu_n3o!2b#63Vp;a`iGLH~gfpw97Xf7c;4S$+7*@o2_yx!?^?T*)jwn!WMq z6Gc5!OsGU32eX0AU<+>J4r#v20TFueZgb}Vsphy;6B<%DzV3{bXQxA61&){JS4NH3 zJyyClupp5~@QC+Bq{=7IE}eJ%j~ksG-NgkcT_Qx+3$KvrfOl9Nky`}eO8(d%D1fN6 z#1QDoHa~+xivc^XoliR53cIYA)0ZA}Z6eUe3TqZ&nj@IzF%Ul zdtNCpt2S9%FOP>Qx;-NumybImEZ8(>Ox zFd5vQ5IpDbJRJ`UhOxXFhgG@#+{ijzBa`wQ3nfdW6FO`21DD91v@_Dut}fzL=I3s4 z!DF!7D5_ui`Iva1OB+Lldn#$QQ@xH!!Y`(oiv;(h>qM{(?{feyjTt{}$R1s{S(`+> zi9c7m8|^;OMTrqBs5ky{njygQy0Y#gS^W9vnk`#f4yMB*YEklDws`S4As2Nb3kujN zy}a1kHlvG9h?g##Hh%ng{}SBPysFIWMJ1)*;`d{?{Zs!@=jPk43mqvt#s)6Subro5 z$GvEQ_hy9IJ-flio`~k@Em2uwognQu%BSxDoqMzf-HY?S$0r=;n2Ej^lS-q8V9t)4 zMghM*+-b}KLkm@81!x-ManP-x&4ZG9zu(`nAt7Vd5r`*3Xk1HK4;jlE#)pM#;%G}+sM*D^eR&cR zcJfa(V#!MNR~}e=nWf~v=HLG?nL4?D>(M#kk#!ib48x^{W!PKrf$rP=peQT!)g;}o ztoZNX45jxnI3Qj@dwvLpM4$A)Nsb8nPwyc`r{+p!Rk}?Wgh0NC7oNRzRE$j7g2x3j z1$Xfu-_Sa?-o@sl7Lqo;4{CP#&Oj>J>V>4O>5Mm0WyiI@2o8C@2Osf@Sn#7R?xZTB zT_j?SESlv!d5-1`?-?e*U6=39^5fNhC1oH0p9B-xY>A^NhQ-hz9k^T0Mo9-WW%~D< z6zn9(X0BkbWR^dTMzIvF2oR&Td!W4ebe%?EsHuTx#&*Q~bT%Sa!>;iWgqh{d5O3#M z$FRHYYlBRcfuAyiu*eN?&@g zvYKU+`uCLqm;p-VW9~?UPQ!HX(v*x)xZd%_Wi8kC!{K z%)g&+4kNeX7a$ev;taKtWzzXte?HRSfwC8M;LMN62#%?jU_KO}1PM!Lt6WC6EGtJ$ngrCwbl5ZKT z@Wm=vtAS&R2#3356SA4Tz!qIx!&=EIsVJjD$@LZdWR^j&;0C^k!H`ukZq9q+EZBNu z;p<$N{|1J3M%~kb5eE$^?gGV;e(MPZnZ#nlx(T8Y(yhoyoD;>7V&S%xzB# z7d9;>)`~*PAC#6x5Gjv^LwBrQZlbl5vd{ZRwL8St)yTzTVz8Q0*McXRf1-JHDz ziG{smvK<#ni%JuEj+2}pVnLVUEuTI(*J>N4j*gz<2QSv5>_CU#Me*FzwbkvP%Xkza zwBkf}znoGZu$u@fR49sOq;djZ%xt7Dzvb3N34GiaMn4vg>}psp9ujBLczuP&lA9O2 zE{}fHh>eo$WqX~C&~PZ^9EQP91E}k$GI8y5N4@oX@-1@1>mu+P87DQ>CEPym@Axmb z`VFdHaA;6+b7HX)@r4+i;77BQsu}OS%Sm>>w}%GA;o9@;xT)E7`c#dD0$r!mHR>=J}TA!`=eSryUsEKJt?k`bA4iA)u)dpIu`Vj7nD+eq)QKT|@JAUO-=qt!!mT7q-rx9u+(#G@iunetc zm_RM6lx{Di{V-mT!KL$X({%R55b0aoyICJ4xfU9a{E)~E@k?fy7^!W`Vn{8&OtKU?y&MD=qp~v> zBw@`+s>ge?DIZ8F+wOi|&u6#2R-OLUp5tEdJuF!8s@ZLF12RL42 zF}}0Yt=5_=MuBcU__g2-Msj4lx{xzb5;}J3l|c0df927uJLx_f@7(2%$ztSWGqjcp zuwuSuU@#yFIn-tRHKBjwgYlx!9%=AGf$b5k?Ed;-)P|Nbi!3EVq-Rsyxz(9I{>%AD zukZB(HuQI`vL{#8y^PrufIxZngf7)r`WdV6Z${HD>hQuT_lRxJ?Qzq^aL3zn<|-Un zt~C%@a)crM1`ySN--hQeN`V44&Dd->CWy>G{xY2lii<|!VCXcMpYK~(S?N__;o!iq z7HdWh7jSM&WQoKkK!+5!P-DQ;D1IBUf;|tyaa6vRXIllKe7pQ}!tWofM!^~{eS2Of zQKe`1CwHC(gEgS5=BI0<|4cPz{E$RQPxj+EuMZbvEQWo@e6G9DaAJjTQ(i$L?TG5} z^h5kF7!YogA0Mutl>p9r>Au@EyOlhE4*2fuqEnC#ts)spK*0PQ7TqWZci$34(dXp> zl8A)54N6dQ15rO^VH?eADRxCX@@y`!jKOEcdPi4lxj3@!aYt|h85$G@t8h8}=ymNm z97v6`)}cS}W1_wvW1b+o!-qCPQ>bh8mvc`TgD&Mfhzwt%t$R(>w^GdI1RA4SB8lvz zWU%c){xGH3_w6H|DN3hg4ww`|a!RH#%sYD_m^aNMRo<$;eBER`@oIG-u!MG`8iei< ze>Rm=5YQl*f-1J?2!EWfMuLy?D@C*5%L>+Pz|L-w52b=5z=G+lF;| zhdEmKbk{Oz6;j0m9Ej9KXh?^%S<{sFCj~4x#&#FdNvJZxW@1&Rdc<(4yv?QfmPuVSk%D>QUG=!~SO zHit13w1~~^CTzl5e7Z8hIjq-8#Kb1Qyc;U`gLYOj%I0`ZoyE6JW&EH7n8De>3y*p2 zHW?|ePp73#rgz>*_%2W3Z#>B4+IPkiFKPU;9~WG|rGVJ0SE6L32C#0T8%adO7pujm z65F9&lKTqfYP3;P1+V3&I1J<@2NI+%@qYGtDn<=h)B5GbzDLU|;#lA^f@kWzZc_hj zXYi`4&i81kTUzl2DOo4={-GlR{f)|9d;Z^Ta`+)UCwK0*6hSVd*1GqD@** z6VNPsWF0d*x4?J*Ft^xf~M1<)%Op#!n>15qP?M<4wUUk2Lc3dgd2XzZsb;) zFT7T^XexU?Fg%D%jK$zbv;FA+o{Y!63cb|zdZ?@q#EXtG1Z(4|fR#W8XvpJQiZV=- z4(_wwmn!}x>J&gv1pPrO0GG!oC)G=u`goA+$<5=!)0H(srFFADh232-qh=mcxpT66 zYuST9RdF>m+#rG%_`LzgXckJbYsqVt!2Pz}m>nRMxJSf)JBa9?Yi6{O+mI18W8BgF zNaiJh7tl^c;8flWAMqWL&ha>S%fIV4X@!_T73q`nJW0s&pX11~4$So<~ z2{}mnV?;3#+yK2#2{Zu&c8*jmJ_tMOtdzBVxDJ6yLm)~`nij%|Glf6jU#WfzHJP5# zLaH_ijcsPHmM&Zp=(w9BmqKiQzoHy6hsu6aRCTx>)e#kd+5ogeE|*U#-xi`ORZi8b zA;hxFZu0J+bNRd=F?60ylL)V6`a6k%kagCrb7>VcQM~p+2hao9GZ{@y#G6^F)_K`XBN0rs3Z;FN7r4Vw5t<@346K+Hc&5z{O%S8gY!U+rAwM%=Qr8|VRkqX?`IyL zFU_O_+LNoyJYVTgzvhPbPnnJLwo4A;_z3TfHGaPzBom-Uy=~t!I=?SPv#uM}ue~k@ zD;A0EZ8d*E;}(RTd>un<_SFtSg{GX!d2~fNfBQgCY%azQa1++R54t{bu)DV^d%Na2 z8Ld<*#La5rLDV&4!`b=f_VF$ZN@i1^mP`r}K1wb>!^>hx{9sYB)@tA<=+s-ZC9V8e zO$-8Gz1sW^y|XU>K95&qFq+zWem|wD|BZE57IV|}+Mvke7`4eo!*ee@qZ1+>QeolB zu`w@vPEim)@^O`MB`>3H(hJi5P+acm(b471zIJbQiQ&ZajNIjDV2VDy>OK~8+Vq{G zk7Xqofzy%}77y01<*er?d5=O9TprQ*-0sG%l8Qtp9r)=#?m6j5#=f!5OYLi-Sn z0C6-jrKA*ApsUh!`^f4Z^lhg@cVGE=4`L3dX!EZ2J@_RFitJdOZiC;9``~LWPK{Xy z_nsxr_D|e+*BP_xa=c@b%B~7?V|I~th|G9;KCcIA39VUZ{uSq#SA(7{6Z$YQoFB0% zL8znLd#hu|=M*f$*w7$)X3v>;j8j;yh1`x|%uJWP8>Q8{1dV4~qCd_Z6K_MSRs ztCnTQ^8Y4@eZd*mkxz?ly$L?Pw32#xXDQr~bAnhzevP%}{2}eQw-3%M=grycd)dO4 zivcdu6@g9tPakm4x(In}xI*r=BFV|KmK*l%4qJKDR1V;pxfj$Ut8QcaYaU(SX*nQ! zk8vFzpdy2NCUMWc?jKNJB=fjdf-+OTU?%kSa;$N|M6|3hqi)u#v{JNtV_xfS6*XQH z8cE9;Z_tMnTJiL;2F8;1*o7V6c4SoecIkc%GNpDk;xPoHEg3I*@eTeIzg0-bSnPJO z)DKL=J%VdhKYL?sqOn@E-9Bch?%sZa4|Y~* z*1V&h9r*1q=*QF>2^?|}ED12+Wxg7QdHl(iipG}VV_%KjSA;{7%Cp|9WRZ^^yNFA5 zOgNd*_*x$<1cZy{;f0Q)j;>YN_i)d1HgPubryzx>Z<{ofgP*`oQvqk#OSfN`_RcGm z8v84yQ8zWPOIj5A?|NKhsvP!%=)3pPaRQT^V8ko*=qrGSA=Z!Xo+c!pqkl|KdttuL zntTKqSX?rtru|B-EP!x^Vkx+JzdNSZlow|j`ubM=w#h^6cd^?oh&4IZZpH6saSHAz z!kz9ABtk*gtwCk}yi*Ua=yN_V;74z{5MI78o%5wr)W4wWD?dc8)Go|2|8X#>0I<&u zR+H}5SeZLMUAGK#t5gGy40${*(u`-T7yu?I%E$sQ}Y)0AZHl zQ*UIv^6zkxcvKUuF592a<|Lnk=28M47joyPFkR1{Z!c7jBjN$rM$b{7Z8wLtP=j}R z3qy=N3UI#*GY%9~Q#}2dV?00>7U|u(4ACs58~e(hW>xBI0eG z1Qyl(`~-2}D1CgV6D&`rm7qb9trnexFdw7WWtjq`cn-&G(CS@eMe#nU2ldMsVd5#NG@eeoWPm3ibzL6AaEe-EgORQA$vVe?|@ z^GOd^qpb6SZ?=zXZa{DMm&?Je{bRtbwVN1XbJZiw1K@S~*6nx`b1QnUHY;~8kh#gb z0q48&WcPh);bt+Sux038;acP6&M|R{j%buLJZ`iJRGza+}P#ieHMo)zJIG;p)fxMt+7B^T~$5lK1|Q8z!tT6%a3C>}*yv zZx`LNVe@H;8ot#l5Cu>MN-wHf__Vy<;d`Yry6vQ?QiQDdzc6Hf{su+rU;IUT`E5wZ5F)%;%agrxh5S|2@r z@Cg0KkWgNjnDD>NDp}QQj*p9MEmc?AzYe&Rnz}#-8O~Bpv%?)>QymGuPg3IDw>D<( z(C^7seC^Oauf)nkbjw*K20j*8TB=WYx}Tzw8XLTE&p{(eoFoRjza~*3p{aa|3}-%c zX?mM-jPmiI{ak^7m=?t88o z4)+X%1%L>-y3XcFYk)5(!m+{I!bMXrSxy!YZumZ8U>~HALL~?#(8ijN+!hg*QzU#( z;Q7Kk9x_<84E(?Ahy=mFjZ~08pT9tuys@I{ho@h>4t|1xS;??F%Bb+&IwsA|{@7|G zw}{6|3I#jDbx0E}a{D<^zmy$L$-}+Lq}O_K4385P28A{`&Nl1}u3&>{K9EV6lJ2iV)t*bBO%hxP`RQmq|Kx+97I=C&PMdSqFp6 zKZacCUX^%a4m+ad;dHgp;ilAA^r13kG7uGIATW>wOI1zJEN&6aecjv)J2thBP!X=*H)z(Gghjnr|`j2I=D^*!$#Gmz+mZ1Jh{oHlZaq zX#ZOsM7k#PO9*}`CpbtCu)O>(;UU>vL<4mP*H@$*E2b4kwdVwi0FKiER#z%ABx!yX zn6zD-IlhrwFzU={5uK8H13>#@`|Ja+jh1d_Q-AgM-^NIu-)N6KZ-abIs4I#!WrB_O z7UaqZt#=%$*lRm6lRZRE;W|XF0ioY6rhdU*cwJ$l=mi?kfP?xyAuSp_^KxEwZ-8rG zEC!#yq;-}Df4dE&Ebtfe#7C7_z+4Q82p+f)Wjlg zc7yhs$Mx;)?E}p{p_&$)K(p)`yVrw#P*50f`Q&sj`Ym&dNA#FfYZ!@xfz%YB3f*MC)wYb47_huh zY2Yh?6pd!vwocFN9Ge1oa*{#d^#D6_DwV#zC4Bg_J7T9=JCy{jF`rzV^6uMee>KCc zHt&(WA6T8jCIVflKniBWN+ePa^||6L%#G*Vy7gI}ipt3Jp{5xVedX9E9%#t^M{hy; zLo;O=C|}Se)3$}49#s(=3!(s|Thqa5FP-}0fKmd8*}ChPR5mbsjpE%IZLPsMI^cKZ zHON}ovm+sHhz2P{Eqc?mGck3Eae7+$!=*IVdn;a2Qc_X73!+LfY>Vq@g#O3&%PvS% zQ3h@on8HT}v3#Qg7Wk@SWU;M@vd|!C86Q~#Kh2^luur?vT2Xb^%xbUEk?|53t-1Y0 znrC!A8VY~H&m8!r++ZtfYlq7jNw~Cwg>v1a7AR(_&Uc@i(^=e&4W17`@HLREP}2Z8 z`@!=8NPOCo&XZVZ5J zTMXkC4O>}OA8+HZzQ2iYZpimx7^@?vv0&#^uehqsi8pXsR|1qO>u^8mheG`UoPKn* zmjqjM@UvCYRT23OR(=PA2dP(Fm!90OYuNOkkjXkj{6Do3{}zhw(X1<&t0whUbIo13hPY5cefGIgfi?KMT7Y!ALqmYc-%aLlnY|9ULaT z4;iICj!%I}^54Q__4k2WnqbwBP%^u4@xq2~8FS*>Q_85}JAEqu{Oz8{-%}ZJ+RMps zLe-ETEY{!;O#4SwT2sIR<+ou%b!3QWe^C5W2=3qY_(Uw z=LM>juNv!bH$bz;TBk@g74SP@=TggLzoWKqgh?+7 zUUB>B!ToQkJ&k`z7J+^C+n3O+cbcEq3zJS@AI`4ri#+GV7cSX(zGk4y{*fQ(@r&td zF9;S$dUW+3{=oHx&r@?uBi08Jz3Q&FHHX;->fg4+i9TaA=?2QriJb~gv=RJU%9rkk z=KR!nWE^_xhw0iTM0R>ybxC8NO;RH)h(}m65k~!wuw_KEy4v&pzUBCuYtHLsztyBBXlvp2(Ig#{uZ2(a(e?t->D*e-Q`v4y>z*H1kHizp;_KaH*sI$sj}XFNP3Mb&5Jzt}b% z*%N#wAOFf4tACN;Y^~`xC;r0$6i8IeM&nZc9i}E&_@)+|Bj-I`lVxnR@~3rTSrPg$ z#?IfJp`J?To)`OFED8VWVf)8TI}{#e#C1ZaxOS?4{_O_0X3-LJ94)f)GeSj%9e>kD zq(v4&01D?e&Z8^}*<~nkNAizz0O_JKL`6xkK*nQ1y06$uev9uLWb}JSP!<89fU^z) z>_Lmj6s&&i+s|Se!9*_Bzcc%fqQd&O@-Im+JG+gcHw65t2lT9@i>@oW6j_$^lo#l% zy%nRBWT`#C%O6>t1wzd{=N&j^;kJBk+oHS-T=dpIU55%hRz}6&Hnk}dFC_e5&Gy{P zbC%=06O#Wa892rP9YhBC(wwsQzRN#t{_{FfGEt#EkADX4PmIorX|D#F0vi}=sQ3%j!B=JAgIWa8%=@=ONl6aSLh8T!=`RE1ZzfwP0P_>5P z{{M21{L|0BpL>M+|H%LEC+HXwm!0@^G-t%WvH<-i3XYGVst@d6rl5ay>`#NQqn-ZB z>z~>zIvoDEtA8KSPz?K!KLjKKSQ!743DxEd)X!`X|4pbYDu$r+f8Cfef+CuyUwd3I z67NO)R~x|Koi!k05SZ9s|7BbGzxNtO_;J>O7>70w{EVa7Wn%Rz5C(u@Jfh_1FPmUku>RG|Q~Q6|ZKR+GlIR#!v#qN{yx{-3T9AUA z89_`;F%YXui|0cuP9b-{VfanndAj2OZS?>FH4X428!GNv)@h%^t%f!k>oumJ-+gcg ztn}hIS|uQ;$O8Ow1^REt8;>B`UI!8JIv(h$9vZ22>h>{T^7(PB3xmSCY|YVsL))yy zLB{rd9V52r-(?*CI5LzJW=gfP{9)Rlwnyd0#fEul399MXp*FaX z*=0Uyr|ZmQs7VW++6#@>gy8%0hEPEnvtG0H2oG;I_;*20gL48n1v?oNcAkzT$WHBH z859@Cb(|9GCRYMokx6NvV2lfd-VztxCp9ufTMCLE^R2cp26rB6P;rEbh zZLMbA@XJp8NIY6THHG$2EYiUmF6vDEOg|Y;9XTY zc2_#5dlQcsB1Rl3%BE(F=G6Ty_74d0KUNr=dvhK&0;9$SFV=s3EpzW1>)=yIU+8op z8leSUol_S}o-#74)k+Slhv6FxEq=o!nM*h8$#MaX12j{ z6b-E?ogG_;j^--MabO1dF*m0KajEG^5K2f8Ib7(p6RFcOK-7uf^_86%KPkjFL7JB0 z7XG)MMaMju(>2Q1huDE02l5MRo1oCjv8T@>D8le-AO8-Ld}Cuw&a358oNgdYHijGh zuD=laqYM{D=#$&f`R7-!7YDutntSVZA5(UepGAXHP4-Z354AOrXXLzBmjf*y5_yhe z6QL**e1n_y`MH37a)$qoqP+*iofWoj7oUbSGKa{9e_ctp6=$wuWU51D8i2xBssTwM zG_f6V)q>${j@%pegd14GinBQs>yJlD>~3EBmH&{qD_+a?FWT}-BQ-7~Dn>R1hhI`7 z-!|zyg?C*8vYr)^UF;bU&I;G^F8Jy1DgHfDqB!g*jI=i#q&AKLj}26>3}mEH)Ym3x z73;%Bh8@c_vg2uwcikvnyh{O(1&B1mPe#+*?nsu)+BsrdXT(~*D&fK=!RLhdPR2gC zZarRto>;Oo>zCHv*Ya|@wk)$jYl`m?koUC4zcC%tJI7g5$dojLZc7o+II{M1TPIQL z9~(&Xr&ZZ_bGTuHTh(MLJ#o*xtUIF0OJg8ZeS()?S2JK(Wgv*fx|IE?3zYBXr-OPj zR;!xX2|5*#z>gA}bY39eTrW5R3gvp&KAvVJ@6BX$l{Mp=f>zNF4Ly?%!#u-&CG-3o zoZ`p4&=R#4Uk?uE%?Ei)eeuELe|(*@9mJg__UhA#67kW)C-g+SuC8H4lWxNdl$OwO zUTb#B)sRBS&x>R`cGkJG+X{E-0Ae;Yw_9prb|BXBp_T^?5@S}RA4`kdAkh5GYQ=^K zVh!@X{z+2+2kcM ztu6sM0&yuRGjwf+fNSVwdbS;AQ5hx>h_N9(w9a;0xto+?zN5$WhuR`L*H27^sk7t9YYkm#H&B%dIIGwcFnKJ`|poF>|%_6BH1sZb;lNslx*KDbs& z^~Qa2=hjHKR*jEs1a6Brg2Y zq26u(VKNkE0a~t>b()AE3lMGx%WoL{=rCKwQLz$NScQ3}#503fAvVn= z53XGc0oy>_uW8C%grnv8XtGI}%f{P~JZ(je9Rqk~Y{*>H*u@FU%MX{is9(DqJJlYd zYlfF3CPR!C8{upT^~Aht1oUb|4U`-j5jZtbpaN{#B0_O#DY}6@F7rD!7BvKL!6S%E zEu5&2zqyroKBE%}qErsRHf+#F1?T$1F9gl3nJj(Rj#8l}yG9njdU21sfl<tzjNuYSObkx&RR@@GDin8CW?<`*aE+W7!W* z?uzN6r@5Xr&<2$BcMZQD!k)DR(FIB<_N`1h=C+_nUXaG1c0UYX%AonIK4tBVF1;*} z?=D!rE0g$Z2J3atr}3LRvZSQ#w<{8+T}nB%9t`=sly4S%%jA*qMkAR4{wIzu?&}b!+e^RjN-gp35Ooi+?PWQKD$8KXo7UKxSzKO9 z^~BGg_cO5I`%Wuu5_Vx&Uj#@~dOCIRay`LdQRn@*M;fwxy}gy35z^RMG41*(q{-Zj zVtJiTz9HYU^|HNJbXCip<&dmlQApxlyO;+U!S0nEj)WjpTwJ0^(!UBD$vyck`&4m& zvba;OoPA}jG$CJxQ_J1>L9S9bBiIE$*`Zwr-n16$<7+Sap=S6CX@!Ne^?~778bSUv z+snTJau+d;VU|X9`Sji5bkGaPB-Qg149{RLeWQe6+&|hFEKdRKZ9un=#NQ3RHt{gv z%Ss&?vk6{||FU#IpHNI>A?f* z%kKrA44}()zW=y(V=0q}lhUDp=*Y=VsTG!rhpKsNns+|>@vi@~TI=wX`J7f+Sn%P! zYAridSD6n7?qWdGgUapUj=M-MUVhSNuBK1qsHd@)J2~jH;?F2nheDlC9ImJQF+2U- zN-d*kFERl%Ka3g9uqu7+{79c}tHmqj z#wH94Tuv$PV)!j9DT^##Fwvi&>00NV1<%GwYSS8A%>}Zyk(gDWt>RtIpoAca?;?49 z=rlbnshWGKZI2Gip`0G4^cr=`4fYtFlOIO$#&vL>^s4Gn200UL!t0u4utMZq+Q*P< zk0z*FQ$1$vCYO(e*Qnzov}7=biUGcTJDhIA?`(D!eAyi2Tym@H(=11(j77v{QWDAK zuuod-BS6qvTaaw1tKm4RBb9vkzy;XmmB^imi7AxEI6hM9(?^Y%6!UHNkxKYvr&yyM zc>FyUdC@#I!Y+I+WZC)CIJ}>o6i61msYp!kVj<0n3nrtuXDPLOIO2KobZZGA%wgR` zlSDQh#JTK*!CZ;H6OcJOm!s(G_Rq#74L-^-{BWtvZmS4Xfs|&0W)UthiyN z+9}JVa^g9J=EHw6gHjOv+-8_%wG?6ZOh&K9;5PKC z8;$n6SX_pmu75565^oztZU1DDkrtxb*a!=PiT$$1xTAPK48j3%8=cZR0E1(w{dNpR zwjk-=vh39a9HKx@)X^8;4ye@A9*X)^O!zYTaHw4b265ol-}4g+=)4L+$XG^5-Ua~= ztk+KU?tVMD`h2h6H+)}q7vfjKiUmCQZ)OM>!FjuO81AC}kc6|BNd{P%q>HE>+_-TK zoT%!Q7?)N*r(=3u&qIB7RxCFxuB&j7vqG?YMzyZh^UC=HO4w_w3@_v(z3Xi{4qsX1 z#+cK`8V3jx*WZi}$!g)n#-DxO^>Ki+%y*UIZdNEDn(T>7H(rBDdPf>%bu1~*F zX~>_WqGsGp`Chu#Isz77Gkq~*L-QHFOz=lU10OBwqDRJ@K9L%Fu8ZGfCGn&HipnJ{ zbCJMjzI_q+hDI3q&3J1@E2tD#(~>*tO#jqn*kZA9i&Kx7j~_D%n=_QXk71 znle~2{)iHlDHZTz1G?8ieu(Xt?k-i^Y{f*+a>u1s(i$pD#D zP6XJuHbUSnVQ9aDzkOw?zseD6bMo($2pvwWyPlcUUUEPM>{t1rx2ZXo8;|q|d~J_= z?x`;zd(v&^^_w`j+2koZIUPgYZXNB!GrxTAvb+IJ9Bk}}mKV_$3*EqK>&h8wH#+Iz ztkh&lov0|B^)MwZ995lErZ?@%zAS~rKT}C;noc~fvd?*K*n)r&K=&*0slB3Vmk5KC%a#q5yq|R`$I1NKns2K612mLgbqr%T+ z0x_n#cH6`Gm}s;oH{fJ;jI~wizbhZgj``X+KYHphi)K91?Bbq#P{S6lR!}%9P+(LL z*$7?B`|j%=nA+%Pfd6jN*5Z;gnM)*I_n({T{>8_A0YJwCWK{u?!fwRv#vXEZ11ZW(R5Doo*( zb)B45D1rM4$L0-A;f@g<`MM-zG}gwo~L zXjfu{(z3T4y=I)!tZ%B;9njQA&}}w=*6!DWGYFnHcGwzvu`1Fb`PGmcyPY_JhICV! z_}d?D9olm8CF{&ZStY9Pl3ni*AT5?scmA+95K?!hg5@e_*Bl=70~kVs`poMc3|V4I zV4{*0J;kfKI1OvaaQgMoq23|o!kA)vPM6UCXbqHnST~!s-MV#Za{y0{LN`Y02kz2% zSAggJ_VS+ttv$3Jr(Hl-pX0DEGT&oMN6j?hmkD!bHcBaStfvC%G29PQn(w8qdaA=N zYvNp0Y*9!g=9>(Rx;G0NcC2g{^QYIW(Slm+X?CvMksL6`-gC7wH=f>^%X!$w>ffzw zS-!BZs8f24Z`;Z20PT@cUQA&XkQWGYrkfdZ zBV}u=(Y}*UD|b%p$DiDJo5M4M#`~wJLr60oWk0tCwK#^)y~~n2I;mu=s6uK z8}Pgm@GEp+bRfX3&4WtahD!s%#0(8J9x{X`#mAt`@c#jylWG41ddQLOE=77Xj#}WwCA8lSqWa@zn3z_V z!}wRA8<>UaA6@_|S-!8qnpl~NQKF=_Ob9)K#la~ND!zpYEfnMUO|}&#eyb8=Lo2P7 zRi3i<)65NXk*US+Uq44`N0A?#6U>@|&m7SLIBl`84a5kUg9k>JT4*5E;cKfb4zMFH zv$KJxU8}*4RPT;h#@~)i@dwRsTDnpp4J{-QC}Fkjv=ZErEZqpg7J`;^(|s&9LM1Idysyjo5G(WO*}Oh~_zqK_Nm?Fr zo@)HZrT`i??1Zw<#a;|~+3p+D9zKp1_I)l}&_Np8%qY-Y<5sOUA0st6i)8Yco75@OG$9gi_mg`=saHx%(uNQkx==Qj-`rf}| z^Dai0T)g>I5}vc!X^AU;qNoDYJ6ql{ZHgiWR`6eSCdL?ra@eOfylBu2K<9xreF&^I zNu}d2QJLsUOl`P)IoN4dz}|UZgV$}P=&6D$;lvEhG0on2z~ga2$pDSJm<#wZaKzth zLXHZS5OzQ=)kZA8;B7sof$(A~r8ixDS|)?(V_KD%T}Y}&$t0CR4mVK84V?f=xEvle z5(ZjHPsOj@0EevcOOC>0%8NVR%fwg1;X7k4ynLU;SUHKK2Rj-$g4xCRV_zT$q_uB3 z1)%NMR(6}wB163JI^FO=5b zTbl$7?}=#s;`Lz9M;1cY%)f`xe%(MV6lhXz@nWJC#yG)ER!lnl;+~BtptoxWadyFn zS@IMD@@%;i8!#8f8i#5%&Q1q9%^__mw>@U`@6ldAPG>&i2%8XXJDYbjdy1VgLnDpx z+CF9OBs-M1kk}{x%C1Nk;CA`h2!Ab4o%dxy&>Z>?0(C|Br2dcU76uve_W& z02EFgbS5*gf1?mE_&QGT=eh{n=&DkbdiG0xM_3EjS42|sxVHg#ejNCLl(~RM4fEf6 z7jG102C9B>9;$2?eJDgHB!R*};!q9;0;!B;e{S{ZZ^fPU-t|{6(!WiK_`DztGAgAO z-+C`bX(`cBM%l4rL8llm&MdbD1UMDfu`t;wt*;C69EQ1oIkWH0^AZ9W~jj#Tw}f=t7j0mh8n%sMV- zcIG*%S$M@2(ZmvDJ#lFblNF{-W}3%%LGf7Su&7;zMEi>FwPip}1$@UlH#mT1B%bl4 z=880w7t_-ci8?m}K(CABww}TXoO|~%VZ))8&WV*vkbU7i#MBt${g|k>-L=>LP%=O~ zfA-3?PjHwH=*F#bQ0MtjP*>qqZPii#6SokZzWi}ub;54^jFUXrl<#W~O05fQyf&lw z8j(E1r`w4p07U#%Ivv@uQ(oHoiptWjF`bZj+Th?wHmrll&mxBe>He?$*4mc6jrs8ZO!>PXuUMq$K>o~ zDsd0|d@S(zge`Qx0y_J#rW(NkEW123vD#1X=QsMG$lX~RwMnm4Y~EoSa`Xo5p9gQ< zXZy1jm;$q;8S1d|2^(S7%|zCgN%;^awU1-f7>WdSPGlDleK-g4Ip8N@VS9WQymXi=Vc)nbVsRPu&?@#H`|_gCCF6WF1Q{7d*>^SFUX+d5(biprPN zn0x6wt)umWW=6wo+eVI1@_wRr>NC3nI7RQ`3U(uI4aS}vyT!^3l;YPjpA_oM+fPbsz*?tZ&hFYC3Q?ge-MGs!Z( z>RQj8Kf}dOKK;DoR+p9jqHhd+c^UloKB!9VCM7N^AdE7ZVj8<>&$bnc6$qaQm49{E z{n5B-3x=s#W;Lx<*LIVRItkHRJF&uNm(hAF*(wZxu-22u6@T=Lr4!jw(~`>YIFE3r z<1_~8Xf`=nY==4cESx0GX>8Y$s10mUhU=dz57u!VhX@e^c!*CSpXv_8)S{*=PR`90 zdH!h;x+>3Ckc~TMRRJtczn7^;sd_chG7Rm!LY3{@yoZT6;M33T)I^=#^4ZDUVGVA2 z#MMP&*~zJlc0f{61c3djHHLyzXi{S%dDQ*x z2ealG-!$tv+XLTs*-MF*=4Djlc_-96{u_m3=yR}j2~pug_G2o^3vjqo4lRZ90=R;c zfgpq7aoNRZ)Jw~Dn$3(?*gFCueB>ptMj_G}XGZ0$P)e4!q6&nbGU?Jd$83Ljrre`Zt#Y4Ys}) z+ofXKL1sHc8A@HUUz zaP;6Mo#A{~*4tOuW95L}kh`^ZL2=I|HQvz6%Y0~Hv@@^+eX zK9I$U`P99oExbS?9PQD$JX7X>imQ9zDt0lyt+sm!t zFtnV>K0&eDHB5Lqm;t{Mi4IqpIcIW&Z?h79Rr_K01)m^|?{1I7e|%3qsnhzv%Sr;( zIukK8iQsgeXr*2QFK=v$UofaH>RH?Lb+t}sumB4=fcm;NmvyeHwq=(E+qMTrC@>x> zn1kZ37sWgr+WRQwqddJY>iLkb#~JftkLi6^cRbUshmnr+Nid#+@Vn|Us zCpC|ec+JLON?LZ8{&(HiqLq6RkYAyVXQ`yRQa4I{7Ia&N!i7T@kZM~w3jlIC>9${N zKElq9NG7_vdY@Z&=??Z;21J0ZfmDUpRyLQECm)jsN=Eeh8(x3qb#`{aoipGz58Ze~ zOTLt;bL(g5%78f=WD0lq--}2$mGAa>dBP$w7*F-l7)vgOSgDTRnQv9ptHeo9Cx=WX z-K6C@V#;r+UDlc}8#YWO?Gg>K&ReVj!V({)+Z^fjQz0(qi~@eO zxl$a$YK_IvYj7zGB2+x0W2#qzUVc@^7B<9r7FjL})S@Hi!2(3@vioxqE~976d>ntL zM`K1K+fgL?2OFLmT$+fEA0qBkGu=!2j7cGWTQ%9F4_hJ@_!k`RFKP4V#t^uokr`ZV8YFV@0S4va1%OARFbxm@e>EwAzP|nm{y8tA>s)vPI$L1A%eO_=!Ls;FLjxa z&xBU$osF~`gj?8WO{i((We;?z0f$7^22&G<(CS(G&&Gx2l*l;T!L6H`{E3kb9TH&9 zMj%_HqUc9)lcm%XmMtXbuu^p~&hW>cr5$?bX&nVcTxRS}n1+7zj?sKui?H-TG6aR? ziOb(;Y)25zrFJ4nc)t49&$1Jw*cw=|5IDBf*FEi?9KGtU(H0KL1k1hi&%D3-vDs0n z!xfinY28!9QrY9J3%`KE6~ck_M092udA4P>jCmZJt~xJ*z#VIfrLY4*E)H00-^=N% zm+<>cfD@6)w3{6tN1jzKVN};Vq+O;D0THH=eRb%cwS_arK$F-~vn64u#S?OIhCrnW z2X5i`wfSKmOqEzM8>-)h-7MZ|&1ad=DE{lIO@@bLIW)OrJ?t2Zp z&$lf=1!<^(KY6PKiq~ZK7gJlDy-+bxIh^!R5+b#0H^^#A83TNS2*e;-QeA!L4^zh! z-VfD#sDNd#wk81_A5)HnaF8oxY=ESHwj}2CS!J|{d0?<* zn>BMsjDuyHQnnOW|H(Vh&5Y?gk>5>xP~AAvoY@!PWD(Htd_$dMj3LL#<0G9Yl>{zy z8;OuXUq@%1?V0$Othn>OtLHO<3Y%gTpXPHmH3i>X6fm-;oXJ|`lT8;1z(OPl$q0Vv zQG|Y!ZGDe!dYiVT2M1(WRYCdKlxNO>cM%rYQ*ufmn^4?Y*NVCXB$R9k3?fnaMZOXU z`k0B-F{~(b*^pF6f0v)}yuHTtPw;~UDA_(3AzWI&rGA)?ML{_WilMj3t7p&j#$-e; z1(OZ3yay9Ue4j&uWf{p9h#76iRZs(I)CuX=wE=#o;m@lTL$n?A#!>N%O33~#QgVrw z&K_>4(4=xs+n`7QYKnvN)k}Zk%>F=ssQov3^%BFP6aIstv$E3&@ancpDI1r%@_hyL zt$ZX{DUi;*bpQuD`}`F^Q6q;CXQ$ij?6}}4EsQ1 z@V^ZB%7y@Br}r?Q*Orkc*6yqx!^&mf6&MPPTHXZ z4&OsQa@()ST=n}0hRZ?q%6K0C3*-IMR;&&8Wr!rpE7@&Fz{daisVBW6MzQ~IqhI#u z-=V?(x6yz2_WvaMzo_*8FCW_?bJmQJ?Q#+Rpir#+m36{vgZnVGG_8C&a9m|fBM9~U||8~PV`0f`x_Ds@P}TPMCr%n0Bi>dsT|L!m2%a!m~KC^Za{O zQtN$IT}55n`d`#m+a=`B5T(j*h1`2a1!Y3Uw^HN^h&OkRf?|Es(4h{|F!e&hmcQY=ssU)dk>((b$k+?p*d2rKkwX`BP#pDy`J*zHj6aB+re z9nzAU04T$EkO}xN_VN8>CI_aeY(lC}bA2~?>14SSu=BE2s3#W`eY1wX@b_1k^nS?^ zITgS+4d&rC(Dfh7V;G*aXJHmynNo7(i^(7H*cc_^0sZ*RRS05R3Wy@)u3y~b__S%nc;o|vHlfm-j2fGJjx zDo_J1K7E+i2oU!UmATeauIzVX zK6(mFHtR8f1rd^4+#G+0`ydVnja_ADL|^TLjB| z|53pWdw_>0Y%fhtr5+!VAJu_u)NTLWQxoyab_5b@*D4`6yJsde+bg8^b znk$r3Q$tA@3K7nzLOYr5)Y1s2;>sYTjT?(|HFE()9U5yc0cjXQZ#NcFuZuX28&%K% z#O0ddB~=!#y3MexusKr=fGI;Y6F4F{$UA3MDnaHx&8nP1l&HXm@#qREEh-+|?cg&s zi0GAajQ;kO0G#X@w;9B#6ul};_M*^7^T4Gx;;`Zo8C2MmtAK!PvLI! zLsOI@i3A!d+99MF_6|3 zD*y_MUq2a?Kh8e-Z2nQjqXa7s0AJ$y*7sZ8XMKLWve*S5l^e-GwRq7RKdd;>5_Vcz zZ+(iZmvp#efnNz`kR@s6Vxe+3Det58OV$}VbFTjbi~G9N5-W&CnYu_}#rts1<*tVU zfFc2SFW7%@fL|K-3VMIdC!bmM@m-5eHf~r>7r{8R-+qv2JI?n_jA&Ls)theNa+CiY zwD*-_Bl9sTreKnjTc!&^S%KqkBHVtlG6|Z8=4TkrM0l2FTGCFRKt58zp zLp*`ZvwUk+>+sW^XXmrKr^w2TFON1q?ecGcg$eFCAywis@mq7i8Ea{@sRCjOOExe; zVciE&Hs{*|Nlke;)AZ-IIt#ru_Yf~>*hoH6gqLV9a~|M!UvT+&<(X`KTI6@_-VIe1 zWC}lqXZX0|db5*S9=&{>ZXzC~nQ44h8XQguOlwX+t~1uwe%C<#a>rkjfln^R=NfKe zg`S^0aa8#m{M;rZDuwkTlYRZCl}yccQ~eeSTB5`3Y;qV(KNR^p)#VnM^P!_2bhw_BHXBKq7$pEhn}T?v^Jmoa7x8aj?~c`pzIxNz zRmI@|utPmP-gA1hYedM8{^xg3QS+hXFqGfoeNTWBg4cq7=!hYk64LuYw_`2A-NNigdPaAq;^H-?PfHm}xcM#dGoLHBq3ybqI9 z!{;gIP3b@_X~*o#wi@Q`QF_l&H~J}9W+8q!=f=HC_i66O+Cl->Om#l{cTr9y54WgC z{f&fKUt?{ZKj`uOO z!kYWivyn`XM{;Q14{goF4tq*=MnD7ZM%H2iDErM#T4rk-eO#z_BSO5qN4#_gqPKLD zR?%t$Q@lRBQZ`~G6gHvE-R8!k`RTP}$~EXOQb`KJRgElt z0aU)Dd8f&xu(*;mIPfY%ELOvVKTLG#^@?{vq>A@;+7f{~s=BPZT1 zd(nQP*K1Xb77*8Ufw1+Oml80216G^*lq?V65Xm^e%P!GEifj#srVl%~;n!&s4|!kC z%tIkgwQvPoeq|=GmXW1Y$4wXVeeKtIpgLqIi&yKMoy0YmHm4Iu5CWDh?G+!Q5XntN zY682}`%;00?Z;=K@d2!*Q2axjq3-3Gon0Dgc!k9~%8$C8XG~(GQX+Mo7+nuk@AEC= zvLr2FUCER|xX?oBXkGaRhHHPM*qP0Gg5^W&SJ>NhuNe9hmZV4PUdr_K5mV2m`*hfl zAD_F?b+}N#QbN<}8a~itH-8QmcO|p?K_MLF8u;Ttzt7-cAvJg+<#WvJO!j;A6qApL(*g3vap`$ozYMS8T*!W!aG|ix00<*`uvq zHh8B3P5RB$lj6pM1*~&>u3{8NVzk1VTEKPu{yl&4&3{-0r))eme^D-FTjJV36Bo=O@7}6gN6AGM~Mirbu{dyv?n8yO`nJRF~A9TTef zaI91r&o}JUua*sOo@Y6vDRVV}Rpo}0rYmgzRN@%&#;TwKz8I!Y%e)gI!up0zHr&1P z)6J<1g?N9lHkHG->1aU&gc;$}>!u|De&94-7fp+2tyN6O#sj0jbwbt-0+pUW$(z|u>(e2y5&@F(cO zPd|0<(AT{WxBMiqd4A{Ef)N_z2NaX&Ad|`q4yXq%ux4&x#!;s5ZrB}|-m{!5~G+!+{MRZinWIJ z>yYNx(G&^P5x6IpuroPw8%Ob^0KCXz<#PP7D+PWl;oYyYW;zdbd@w498=$*2j?4}L z$&OF@C`#{i$v{G}0!}pZVlikxy?jxrxWY@ft9;gP(7Qv|ZDq$BCdT=;jmMmGjU?Ni zc$tZ(`YdGTq)%rie7eS}aN@>wuQ}o=9eEfl@h;i-@TIyKQ@B^3b#M>e7wNOoI|kh+ zk9VT`*n<}Mx1>iw?8o5Q9X}o^#Tx2tZoka&51bACe|lJS#0h16!{58h1gmJ0GqW`2ngsz*}*q-h{S{ml@Rd zNgI4sdkVBNafj)%7zD>VfkIz%2H$2RnB{%rz`G)NeoHXDKn>83`6N1>*5E=y{%zCZ z>wqMe;Uaw-FFGxpNkC(KxXu9F?MV^?(CX1t+o7&{)O@y2D$MMs`$~c;q_3i29gQ4# zoYRNG4aK~K0$eL9Q4t$A#5o*P(U!CKH97_@tV_u|KGNiZnG3k7I8x9RzI`886U%P` z^wJ_>kd%7LLqxAul0LC2X2hdLz)9~(x1i*?1r!i5*r5){s(kjFO65Lr+o1!o|E=B~ z7c?p1>31H}2XQUCcwYd&!A@jT*7_qfE=sGxhg@+tNN`%#KMBWDvI(QF|LaRV9!!O{ z-|q$z+7p&UK|kxY_QXNkAD6M-e%2l@((9iceYdljW9F zQnR$_$VWzVKYO86%N=%J=}2^Syx&RiTtayvN37+MT)@kfAbe|IrYV!|y#$MX+ebQh zS~w%{4Z}69Mh5Nklt?!u)H$p~AZAyh1tTzM-@g2Y8oe&R1rM0J4`42sN*+jG>P;RX z1zsmOF>Xym&c9T?GeQO$*FzZ((6PZ&{tb^3?JaQGEdtObJ1Bu8c{{31YVNRVamT`Y z=4~y>v|EzJTBwZ-RFHTFWgS$u)inJ|t`_E=L@0f=&^uf+2#I9+=$KE~0*m$vqfz_m zGTtrDm;s?2n=~jPH6Ar(i?@#4x12)TF00YT%~q5wsP}Vz+G+433;pfGbxg<~FazLx zQkcG5D!Qzd^8|Mv8L&djecgt*-xDD2ITZb|PA4RD0O{IntwC{BI`6m6o!+^CuRIeI zpEWoPIqZTOYW!%oDEaFRGivjFGC%tTXK*?XPXs3$ zBT{Fh&8hnl*x(S1(B-p?Saglvu05U*H0MuWzRO}=Uk^G&A5c~u8xvy=j#hx9F>D`g z2^Ae`5twwC|0SsOi;g)`Xs&=W)nx!Vn|}oBhMv)e5eQ1|+Tu{{Nz=)45ub3gllTC_3>G=#yNCe7AjeL$bjfpnJsl37B`Xxc?eMZoIrLqr7DWR0U(++6w*q?6 z?lYq6U{nLH^g4xW?;xwcGpd|9i=<9I0Z=X4OZ={b9%Qogs|E-0W%xx0l7vr~@!4$a zL#{VQgSh=&$(4C#q5w}cBNLPwwjvZGV%J>(|F*cil19|ok$@h7J&S5C5ND+zp`buO z)f%HeCvoOPk)w>9H1_}jnO-$Y;rA8Efy0;Yo8Er%cWrWk2ov8e6HnDpIGcErH%cFp zX%B$4NDhFfHKx?m7Kn+Lw@5aqj#dw_zV*^uSWTQd%F|QWO}&@1EE+aZq~)C5X3&kp z6WL6lNSG8wiI_a_O@BoER))%o5O>?G5ekm0T)0(^;CsMk5TDV293AlhdQb=kk;7wbj>hGaoNCrLKUG^e+Cuv|kWmLC$ z39^#HU)hl?MVj1MUhMwp4!{Mb%!BLO;IWZEwHU;RfzVK8*PAdUfQSslxBemDL$zr@ zPF>D7)!sZ~BVsRN5%JEAr8MFxn0Zo>oT4dI@H8OGAzhL%P)dO_^GWLsRYjmwcLer6xJCQeCDb&T5x3wa=OnblN=qrOAAZ99KE;tY z-I_T|v6+_{)=tNtOoh$PB+4P3EDInCD=Wng+@770L&_{}bPFSM6qaxOv71lh&tMww zwSt|Cvde;V6j-f34@Vc?9jm(* zp7z!DH^G$5e)pal@zaf)0=;2oo%EDhKhA!_sV;O^x`7kl>;9*!~5)H!0Q65gE5xJgk}!-cXRxPXHvV0 z(ddj#;&~ezKo8775Xv!5MHHOu$Wce^Ggd2>1Efebl{N9$(=yXXxPk zs(aZFQzwN7UanQE=Xw9mjyEm%$0#Jaiv_2W_+#vLEkvbE>PB)!_Q?}S%-t~SJmcLu z?ef_`pv(=5sI4VGWvxFArS`ZbQ=H%2ZrHv+3Z>O%t=`P7Jn2WpM#2?iPv6_5svQyb zD|Z}GB91y3da7}4+Jhr`nHo&-m_%fx;-&aZSIj%0(L}d_uD!6r-gAhyCTq-G(va9? zsx#;C?PiR#&Ffe1Gt!H_GPqD9c|kOl(V}#0h!-R(dtr}wiV_-d9cQ|b&0UQh({(xO z=0KQr-9JyD?*kMJ{>6dp3}jQ?cq1N>tX%=3bRZ$`es&6OQ1H8!}}(*w23AaXcWA=W*_ zBh_~ow5F3!LU?RNWXk}KnF5$)i(D~YJM`0hXgL)nP&Lksl2SUf?EucZwT7oDzEgt( z&KoL^CfRQ+&3EgY+wQC8B8X)ty^bn&J?}%lIuTGgV0qXnAFdSpF@L;Oa%RRc)g5Ug zHDdaDi}eLN_dYFeQS^RW%6))x0_3ywjDA{ypJOMUrWE*A2G>F8<{`?AASG z%lMMoW=-GTWh&%Y&6IzE%xP3DRH9$Af+ois7HOtt*2 zAY?u@b4xl=BP}1x9kY$Ubc8>{nhz|$K#8`8n=ZuPjL2!r6@3&|f^v!ONw z5+ibU=+f^PI8}Xqn5bK#ZV#6FD@?=*4}1m{f^+1fUO@%pvC?Cu2{*oqX7I)Pdjwl0 z#j?)>#3@hdNCq7YuCfpfcrqQEUdnX&o{PU>@1iX`3{9w%G_MuG5(Er`Q7)$8>6G=d zetfNNZS6_4B=L!%>Xf|kW^uE!cuY>T4TBWam4B@VJPKdI)W!fdk-|ecLZaJV19$;; zVa}0%CT1J{x1v~EECII%t*!@^66um}xwMChLRE;Qt?VAvugO-j7z-CqVz;V6wsR?K zyu-d)u}oy$Q{gT%_E5>`cTKF7Pwbk(sh0VTtIe|>vI_kZ3%4~Fbd-YC$8K1YEii>0 zz7pH-F4$aAzbgx@KJGi1Rh|hipBqQ=aDyUrgtH@kx4aVAwctKgR((+FS~&1wUv1g3 zC|_{CDqXaqhPI!=o1P>Uq_X0EgqR{m)~&FTRwL8nVYi=$;M~ssFh{hO$k2uDz?ZYt z!T3IiVO&>NaXBp3ZT$KMY&eKfBV75lq%+|4AzNJ(!Rv{KmR)ybz2%0(z>(tmXl9OQ z0`#a%++fdfWzC_sq!}jtB9>+#2XySR=Y??&Jw!yA%G!)HH~B%ThdJR=%E+|*iFmi< zM?{fo8X=nnpaW`~&XQg4%aOK8MAw3m{GHT%1WIJc#;aBeK{0IXuh+gZq%P9*}8)nm% z0Z7BFMFL=IM~FW20KzZiXcl_`1sgCtYO#JtNUnsgq95*B3hPe>12@$Agw19W{2K*D z^=jI?lIi$xu94f#C z*mXTni;lAKIw`9Qy0qXl)X%*)@DqEMfm#c3S>x{R5?$O#mIcn-P)CeA=oP&_%?#Yp zV9k+@!C7#JeoVvjmutq>R*vyjOfJ_6+#9UDfjwo*a@d+5#`z^n4#1wX+2#Pkik5WxT)-z{>A5S~~mh28HO>)pK-KgCSkQ?V|d=$>? zXl_|2LP&{c^RPl_ffZAmGg$HmcHEHgm=078_)~`pU9{}G_?nIR*q_7)^}GJY*)Cc3 z7L=&wEimQQ*$7kFQ29t#x)MQfsKPgGfCug!dbE6r>Cg!lOEMGSxsJR}lpj{@$&l!+ zRjoX%feBsq3nt6fJHJZv=?^nU%+U(+(7q@+f8-ZQ{Yw4yl7KjyrAsf}Wsu0By8!JG zpWPjOUV2e0hgg#3Hay)+^)WQ1V|3=${|vjUgd?=WyFCzHKceI_ff6-Nq-x7`SSP+9LVw0z=TSrEnOV-T9py z?*`tC=1 z!xXrNS?J1{+M*3Lw4Jd1lCvn)t#`FogexLoN}l#$7STuPRHlR5`88n=3^i_PzVefb zR#)j>*TBrfzU%M$u zc}m#bV^YMsv>Xd)L=eT*uA$pvS_}f0Q^OC=?tLl_H$twz-Wrz&5)<#A*;xIY0MhJ8 zkv8V}evKnilxme$!cZeis;YZhs-mKv-BLI2+Zx4;;^4cHOed-+7wBH;8l|#`7gc_n zm3*fjNI5mmoSx;prIzZ938xbkCCf~STUhItEz^N8rsh8}b2#Ii3x(rPDZxmI>S-F2 zs&M2cPqJJFwY{g&xe_=AacEL{J;-_=U9>Sj!3V+?Vs(AvAv`PEEkFr4yrPtCFMTr? zH54o9x4H{x4y2IdG@Z#Akpm64xJR8Yn|YTCzM7qMTR!J%^eJXC@fe6>Od7M#FD zmsZTAtm=n5i6;}iDp$D!c4m(%jGUO!PHBRGJg@s#{Vs zKioGt0mmVk36olSXZ#~%Im1FeR$>RNpV(s5LJ{kk59S+nPsRli zrex|5)yZk?89m|T?}=T5Qka`*uh*mXm4fmruP`lT13!iQ6`3L* zD$Ysf1bg=Dr*^fiyf0*4`NvLW@?XT%XlNhOH0%+-pO$MY;VFI-(*pQ-C_kdF^&Ur1 zoLufC&^Li&Hgog_o*3CQWWm((KcYWKh6#fHh`{cNOQ&7GJEUwI{tzy`cp5Cr!Jn{B zRUdkT=g}P{;U_NW3U24gfNtwwBe<36)P+qW^a)h^cmrxVKY(CidNj@hhqnBIkflVj zBbGli5clXyx!fawQ|N1O=s}kPQ&x+`A~o4v(39nDtTtIz4wk@mXzx0e14aEhy;%*~ zoCiUKAUq~>*&1jeIi)w&%fgWEc-Ud&-)l%|#v1&Q{54u39>!P6M|_oh?5!&~)ktq< zt)lXssj1`&C@v6af&Dn0-<%(Z0N!Z;4J(e?n#|h85arLKt*}!-(6EBeIOmD=hhxxE zU7_ZgRNZl|f{F}>%=KH86TQ<}% zhD~ht_j;^`Xvyr;=rX-=FGn@<4B@r~m2PCo^Sgq!-5ZUW6SdvP#iuzA6iSdLK)`7) zW~XevVndR0icC{>xP4|e+qIkr0;L~ss!RjXVeYVlVl^<5Y;r5X7rk?)H7co(RR^M$ zR=2aEvlojFQ?66PG~!M+RC?Pjm;tB2HBIE!tV7^Hn3q#0+-j;+7L4KX9V&4z!qt@# z2*p+gfF4C5QP{P3r?(afjI8e#i!Zyh&IEFL^0i0UH?bp1XK;scTM}@}zM$t)mD#rX zbq#^Tr>pskt8|Wa!*&Y#C{AKa-hxofD`|?igIC6{;^2lu&|ZE&=y0qi?q|}Sy|G`` z(c)k9IK21M-gRQtpG*`iGS1#i6IfH&cIVn_(R&|ZG>jd|KArG!i0UPq!u17stDE9F z?2G!D6uQf5y+T)4I=_QC22gdp#c^=PsJ8Dl3(x75k-PrQPq;69Y!YAPZ0LP|6xfsg zu=`K~1qkO-iI+KiNb(YHpZjp+JSx-u^r}VFf#bkbdW=+liyH8g)*MO-nxuVU_ezpB zKUn2vLPu!Vh#`r+753gD#gDnT+k+7Y3|R#*9`m<@n0jS2^?L|j2IZ67>$UaVxW5De zL7WvGgbHFM`l+@Dp8m+h7~cepY5KVs*jo z91g#Ezvmhq>J^Xf35_-7#7s($Xe}>eSXLSOp4FD2c?2b ziJprmpj2nM49CUkvP&BdJlX*h1D8TgHe(lr&2qwS>L3U(11}yR ziS?McWViM0Z@@H48Ni8spKg@r4AiGN20%!B}Z6ZJys1KkIn-ygPivFP_)!Lk5;Y zC}tAIgXst`Jem}V0SZ7U(Xx)6nAuAvCUpK z{Ljb=-0Ke-ujWZZD8@ff0h5& zj{^FD{nLjp8;VI-w}j%(NP&1Me7KA!XKEaJqGk8O6k|JxL zg{A*PwEtLqh8$=TA^jAxI};_MrS#ucZGtqT$d%&q7pJnV#5~w<1BH=l8>avsJPNxq zangIE!Iz>}8jmdg=XB>lk_eTIgL!ToUYO=}bzba$*dsA}*z}FyP6e+4*mgk6S2p~I zG^EQn7%wXNPiK2j>eN~tz(UC1K1`lL@S5s1`cJl^yX_hIrysJD*muj@T8r##c`TJ` zlWs@xe<+a@#&_B5S|{fQUUoRgvX_7k%}h!A4-LFPfkOkR+tzd6$otdD+dt3`cV@VD zZGN+&s?xuCrlz|Ug6E%4!A0Q> zkeEf4!p;SnV{xAHi^bn;>Z?V)_`#;|w%Gq^ecoF%Z5wLm z9=zB%ZyWnRjm`&+sC`xn+D!c+_D$OVr_nQG;tPRCzWaa34i5AFcDOQQ&j?8KZ-6+@+-~2VSe}v454|wwWC{vwObXNmoj`OF* z1qilYCiq3xEX`XR4p4Ns(@y@kQM0N4j*7DUF(5UJ`JlTd;;eC_>gDYJqP9i{LHhft zl@YhURxBTCB;czdT@V zy?>Ma6Fz|Plm?hYTnJpwH~qPi3IE4maw69R!~6E;nvkMZFiGp2mG)_2aOV6~h8gv* zKE%1(e|kO{Qh)pyA4`C@_E&i)5WSf7jb!${rZ?XV;P1S;5-I)i)!E}q&VtkHX=iyOsjSz(`IP^@ zcyAFDqu?$T`HQgvv48moaMgVBU6fK|zXTt@-&nm3#FXTfYb_qKcLa|L^{W1j&PXBn+e9!<^Qlj5Fr8(5QjA+$%ykk#k_IQt?sMup? z?105-YRWZMPo#Nq7{)FGM}N=L6#2$OhrpZH{c>MOx>Jkh>s-sRQLZVi;QCvSOSNGe zl^l!~#Y0)9%vZH(yz64?kc63@Z?A*x|e#rs<|+|Br^CkSR7j_&x6 zRev%KfX&6!dOfBfB+ZLf9x$v`Z4;Is{G?xGa!QuIaz~hRM@bQ~fc3CkdYg;)7Lm3^ ziEckq!n~;TDvgj?(66B9&BWgtKGirUDr8-fuzmryjbM#rmO_76!bt(tLJ1{P%;SA+ zv1PK*=u{C6$Bdnj>;4B)4MQ_M+x3{F``Wqf( zdX=S|)ob3woKK4Hi#_x-WqIbql17MnSLv7R5OXxK5-bO~(0Xg}q0XNLfJnH>kBee^ z)aF3{hMCoBR@HAmGU=T0{)i4ABht%xY0G+WSCE`J@u8KZXQ5?m9)$Y}S3;Jhfr0a{ z+;g$LBr@bhO{MV!3j10~AB;?t!+t+y)5}zW7-aXJ<-IQNqyk#K>;^|z(GT`60jDH& z_3O2h&*FFrn{e|vYOI^-hsGt7le+uTcAm~Agg>e{V;1t|1ar=}buotR&^*b7<=BdG z9yj|}yNuerLI&Nx*xnhv^iGRzT$XfSHUm71BYHgFaaSaiF-sTY7|e>reEW82=Tcr>vV z9Wh6!^ftuOEMYheCx{ySa}NBH@tPTpFqXzkUDEImE~1ogG>N%#n40QUyRyh$NM`-J zCtPO00&9m^2Tk1uq_Fi62IQ{6Tr|>ciAebc5v9V1ZUb27F$B}3j~@BH=}A9%9o{S( z-}q}-fKePUkux!hCV8nuV57$6h||*t?Mo`XJfzUkuBT%B!%5GUmgPE{8__ zYpIw5Z7C|<6COjmK7Fk6v9oD^B==+m6mvb4RZzxY7sCn=*_CW51S#RT{$|gaap#F9 ztEju9IQh&IZJC#R3iX${Bwmw$TNtk+>FK|1Dj?SYPe-OiU#(?(r+qf0U{Lc{7jdZo z8BfyaE33QU`|Mauzegm1)bELBw+?n;jo28jRXWOEr85Nk;#w_A#h<-LO6mCkO!B-C z(r>fA3>0#u~(BH!uadL6Y?&m>eLyPzt4BkUNC)o<+dn%5b5W>7#|E0oAviAhNNq6OuCxygDZF zuWX*d4>}y1ZhT?8WCyFl_FP(97oj?$C!LbDG)5HfX1aOFF!#7gGs6x{-WpV-<`pa9 z`tt`^QN&07F)~-3gZgI4mc+|M=6gbd(;8~h_MM#Muc88oM~i{Z1^ep zsu|J&8Qu%h<&--jizizM<7{?BcKzJiC^a{5=kCwg1H(QW){agb?Cl!A!BVli;Z=>* zOgT)t!FWkctfSg<+mv)glHX7b0KVdXQN0AU zguilJms;GhX4z-So2=h=ctUHL&)4|b{tDkY8q+vk&U34ucg|?G2bcdS_mi1STJCrw zO1y;v(NfN`T^gX`PC5rYt#q zk+wZ*cRb#^@P@N?1gP1;X-dAToG>C;RV##h4=$f$@zIvl8XtyGtT4UPI3cN4b zT!dF+FG4|!ZdTlK>KrRwkhu)k7BG96N$iyqEE4;bjLGMpag$$4+HDdHzgsg9nRQkHHOvRqGeUnF=7NLoU^o+J>Z|_6Uu9p%*P})%q7P;%m;(yCoE5TiI=}z zx?mil79m=aO|2TXTC)7uKuVYb*T{7cNK`4;brXEheL@ zaD@>d#v!1Z_s&_6iIU6XSea@dB4%kz4aSOut~4tSw>rKt^tE#b!YL8Ax^w|?P?rdx zcU{3`yd{;;@(z-p!at4}fWH<-UkKwj|G@$(mT(TdMJi7BxPOeWNo(>WEf$A+=PCKd zdiLcs?=8yDry1Ba(>#-yZ9rcU_8z#$PuB$Ro;3DFvDtfVU1T!eZjItuL;pNd`lXixnlG2$l=7du}i_;c8>9i zPPCMutS_B$=0L-e`4PHtSzQ^=JaF{{_eBp$B9gZ%hud!Ehc$?Z)!?w7A)P^=g_#`h ztp#TarZaE=O{*=SttshdA8CyDz8GL1QNmj#veURzPz(3(5c|7hRu@k=B+$?PX9Apo z%ZotyZC3>g3_!x1WmuPplF}`G5d<9CAWG^5p04rJ*Z8*18SNgq*5fOWA_9+)^m6!d zPd~uN7ZqwF$#gA_gJ!1V4iBlX4M ziwi62E-1SUQ1W{-c}+IG98lC%fZSF;{t`g z3-8VYMtI;6?`&t6O2Kp+ePjiuuzb0=v@(WTAaLb2mC+0fVfe+;t^$~Ncq4frn(am!|KXww=0`E_x?k9B0)r|3j~b7Nht+aDy=NC@ z%1PYy4>f>iwH6o~_JI>p+y*p55P+bqOP0jR5P;*;yV9mLE*Seq^tuCe0(mAO#~pL^ zcIESmlE+#obm5$#wytnONL|XFI3xSi3Jl{hQsQObKFXju*b;C(>(AJvj&flN zVl9`c!8k?H-UbYc3S@}JXO8@!ogG zL^Hitn?B@gIkp?bo9*hOA=1=7YMs^{r-#%`V8`%))21KyIa-Dwe8to90qKFhUeF@W z*;frzcvf;aNxgykdTHGB`yIeN?BTJI;{XnQ7bp>IpL;= zrZ?WBa&UMKb;UIa^qcYj;p;2oqTJfArBk}3OG3K4TNsX_P8g&=$iet0E@Yp&K{U>Klm{UXdka4S0({!*lzevb>5$-)_8+pRchtXZM-E zo1Itm`@=$7P4!kmAd57|vb)r7%fwV1DmJ!X#sXvT;`76nIevIpGPEJHjdeSGlM(-N z0c;`$rG!u$)d9v3Q}ch6$nu@c@MP!=tnKU!Swxg+yD*^>CaomFrhpv}di(&BC4jcN;e z#>jZe3Tk&|<98#A9cEZ(4M#9%jr?rG&7-~H2a`wXG^C;;c4mO}CQB^08?2$!vgPdm>VNKVb*p zH<}*%)I>+MKTy(-^k=PJ9J)&SJ>WrerFe8QhdviK@UkHFZetU%Noyw>T|Boc3}zdF zy1_{Nce8l2)A|SOBtDQEP|4Xb9u+V&hjysIjyS%F!Ei94S-#on0j#f2BAZN2rU(yt zQ)8TKV2_n!2Y)lgV9rrnRK$Y!O#bAS=wG^~IVJs)f_l8q;yJ`Y#8KlBoxS1e`vr!d zCIAPxu@f{`cJ<4Em%I=726C*^e6jEF8$80=$`M-{D+!(?(L+63%p7OAhvY#CU)~(g z3Gc|=(qS2TRJ$CcX)}|?$8}eVu5mqla>IK+_v}A!OPAew8kte05EHJB8gj3aCKOc}S6aC4; z1+#+(re*e=yrUv>;tg2~0a^UThXDqfe&N8&S;fdFb8MhUDvAyQ3v7HwLMIaejK|u? zb5uL;4VJmDNiprgg0fp!&FIAOdoigdtyQVX%R8FnR@$8GI5D-<1a(jNcG+~)lql6# zpDEIPM881e#_5Os0MJT6(_`fqnyjJICS@3*$u6;(U)nJ~TCod;%?%qLTC95K)!EW( z*YFbRg@MZ#O{E_8mI0`gA~{vDF_6QqeTQEjDG>dS8K+k(O1 zUbvd((vmpRzdHrs{(UpXbNfXN(6yN%r~l$9I5~n`wk%crPb#}r3vzhl<2Lgub#BK#ztKS`Dhl_Z-v3f{GEy_+#_-B}>d!h^~`pd{C6F zV``rb_1FzVS>V&E?>OQiu!NsMX%rz(EEy1e|2~P;46*R&U7*#aw7COPh$IzwyVaHk z{>L1WH4(n&^)W2YX15SKoRhji;GtqVuPGE(nDe5zFC}w?-L6gM?K@Q3*VG_M{u72@ z*u4-M*_J=YYpU(HxuR&1{IY?R7J@jn59I5Gt+O=PDCEI?Qn&t4p{x^cU8(%R@5&pO z3WFu+jySCtxeZ(f^*}{tH6o5rb(jQ=x9O%0H^US6RGL)aBA!a3%;1(sTGO&AbX9r; zHltcx?E48RO6Z!)CZTkHOE_s*=?(3Oy}64~^9N2FSk262vER!G*~!kED`;YN`=%Wh z?Sv;cuqQ9U%jz0lF(WXxk4&wGrL4YDSN;fFuZ3d0H)%JsorJ7tstU{a05`HArTv#S zZTA<5M&!!=pOOWKdg8S{!lq$IbPn@2<<^oH^+$XdgL||2?--#i#nT0hWBt(qM}y}s zO}J5?*ZjQ6zZVIF3$8%%)(|~*j))6#mqK{iuc9(&^%q~Q2c3}nyAhas?|6ML?U!JWq-IWx{7y%g2t`Tu1C$m^XY@s` z27SDue@+!8i4uo1QI?!J?VTynja)`jyEiIzEv&);-)kg~(77UP$y$B7!i1#{Z3~=b zeoytUfE(NtO&uuu4tS#cvJJZr!R$)IyQ|PnVo)Qt_#cN8Po)EXJeD-{kQ=2>CPQUk zBqufg9E_YB?Yi<%t9HDVEEl2;DUP9S*S8oF`ixT2@Xmk#8+Qb)Q&5{^c>Ac@P;02k z#abM}WFCzn&i0l5>ThZIl39Uf(&tn;5gJHcrLP~tVY6)> zNgA(zG_NEJVbnMudyET_O}K{H9I4Z>Np>E2K8ep#k1*agr2oV)CzNzLfT0k>5O`1I zlSq0LSAh+=hN&~Cs}qtuD0o;{({qg5x8(TNN$+%brwc8?jEjfGwWA)kuV9-1O9Pxg z;8THBNblk=!&N+MYssk_Iw@x0C#QFnWG=t-=h5nJ!19l8f$xvM|W zV^szulv(h6(jX0EDZ?a~1TbY6Yey)4VX*aRX>k{d)DpN7eY(Owy=tiACo5V@28ed2 znf-ds!Wp_7lQ|Fgw(9czc$~)9A1SB zUN_}=&CD1PA5pvN4Ymj_q-eMsbr4TV^l%w|_5#QHY6Upfgs7lQDc~Q7(H1SPBDDw_3Fgqgu&`Oa7@Zb-VNkjUHYKq1WM4`1G^o=Pj!eBI zpTM!b-r~*03&JhT&@lbGk-YF ziPOGV`?SVq-;@aB={;VBM!BvZ6qD5#h1bqsYCAa2Zl|)k>Qp@uMlrJv8?CH)NZGP!nxW=AMm z4y7qCNn2ancHZl^Aqh<7GNeBj>eYN-D9j#g*BAYalQnV> zKd%sNSl1a!p)SMYz^7yXiG~s=arzx@XOa!^d zhBj! z$6V@K>?!%|!Z}fx^_g}(ixFG*=w=4}zTHa;HP;FD9n1ICkU51Zkh(?Oc!v;qOEyf2 za9@JFCNxRMi+$O~XbD#Es&b2Qj2La}_Y?J>p006s|UBn}G<~!8Cm+ zPbVnDO?1@Hmi`@^8J6Ch!G_vFu>yhLJrD2hT3Cdsk>33 zN(}ShXWfKl6G&5mxgD_wu8jh5ifPh9*^{|;QW4umm5#eF>j*74PY(MyPrk@v&^U&k z*b<*m-rwk723VBU9&T%DF+TL_Q%Bp5sMuTscq?7*K2o;tP=A{w@~Qsy5lY%_IASv% zrxI}3tpA9dw8Ovy&L4takc>_) zP88c>4Tsj~W{4R+>ak|fq|PpTrbI-+ZKUdoK*PFN`k$+nBcgIa`Qr09D z`o;kM=$O3&M{RSMIdMBhCN?_W>$gq%{aNVe?cC1%g*ICc*{{8kFhL?2WTzglauQ)w zlmNIM;2jB(45`|&ZZK%IcC4li(?&|SpYfV@+d3$Fyx$n})OjJeD)dPW`9a^)Y zfF{bkUSHx^H!0UH=2iI1_n!tvBGO*)Bb8g) zKxRCoJ-BErg$9PkSkHVeMaZGkL^~zj4015FwQ#OzMGkAhPqLndgE0siwXEtMFQaX3 zs?jvmHGtcjj*%Txo#8Y)AA@z}e(6E}q=TgV9SnG7%9>N1ZJ#;BcYvX)+-XUf2a&nL z7P7)N5wD)zhZY)MmnqwnD9_IjxlqFVnvFG>ZY7<_%kD!ON2b|^l>97D=O?MoyX z*=I7B^jE_<_aTa^ikVZXOn|Ev&VvwNUjJGnS*tF9qJ3aPnE{Mbc)NQxtT;3u;x>4qCd;k_L zzhgp638T(+ggGmS^IQ$7ot&Q+tpOraQ**V<*lk%bY7xT@yYVJ{ne)5$Vr+^GBX4dJQu?jLdN$!*i1)(2d3R9wc)Z+Uu&8u*6;a%(0~JL)#%)2#_h5vFI=M(1OS!< z*$7FV*kBrGZ^T=Rps%YsKJc7z-;*T@F6(^pygxLMO(00~#3mhnfSjciz|f4QJ39u) z2J-&rta@HBjYxRdlQ=n**lN$woS^a>x*=p_^3Tm(Qm}F7$^H!hRhOL%NEfzT7TGmX zl$x0Peh)DgV>}6EIr6|L?91h(-pLQ1{^^e8T65%4xm53M-T8)16L8 zOFbPK(tCi1=wiwHQZTn05QTKJ`hOh`-`0GGtp-y;`&9OmEz+rO-Mk{o+wSQg8tS;C zao;YIh>t&Yh1~c%E)*!hP;>Rr%HOtGFJu%#4T>J8GFgUhZ{vr9a~#}c8rJ4gQ}a=Z zFx{EW1D}3+Phn3L)CZsVG|s63cG8AFk^5ohhB)*M>d)BQSSt&&cFKBPFV z*gZlx+aNk+v8Y!H;`uLt@@$f&LgC=YvaVK(jBKI8O!8J^-+4J@h^Kos_|2Ei)Q?$` z64P8Gi`CDEFcluDtnVPLgA->KszsY)%3KqS(9g z>JxJEZBzAT5j^U$&*(f?A>-G7y5zYAZK85RyUYLTZZS}m zW|1hNsx~@#$=;uW%8wkjTq%IoZNPrNFr+@r_sDjZ0Zm}wUVDwo2@wm&_CF!s9SSb( z5KG?4+>|j6Q=3)qr;VjE%5^D7Ss#j)^S2;`bgHIOYh_0eLH}yOMI^+FW28y}1UcPR zd6d#et@!Y-yR%5I9%(D!xUZCCeIcUGl(O6iX)NC*aXGvxEB~F?l zBOBY)V-R5Lo0#ZvyAkOb7=U+fAzsgKqj&-vc?Uc|c>7mP*e|&9n!>U20d?eLnai{6 z5_`~TPwi2T(gYz>rAh5EmS-&E>hKo~3_L35Ttu^m?Iqp~+niEI5QGD9cZF^-FSod- z_lshRWEuf~b>Pmn`gv2H7t-Sj5Np`5zw(+J*MXPIRf$)dJLAUxO;sw<9qSACI@>oy zg^V9@a@`r%vP_OTuwIroefn=XNkp`i|6*)?ljuXiCt(HEa$+swMq4VWped3I^g@b} zro3c;1P)gvezsdgS_bS^8iylL)IDGkm^35KVL!~Hm+*@5>kPuUu1%BHc7fS&_#Fch zq?HeqrT9W#9?ZBx<`N zIYauh01*;lC1p|5*GowSR0qvlpHi<$z+; z!IG%51zctBZ%@68Y?mt4~uHxarZc-T8*esSg%PiV>jJ@S>wj7Q^|jz>Ry*euDFTH`Zk7AZsnDP0DQ` z14GL#@s$*$Y(|Z!lO5Y!a(tB%1sPmOu0RPV!;n*U<4a8zADpmHOwj+v(Z(Vc#{ziO z=LT(ke200Ozz_dr=uf5R*`4z#r{f+n+VRKD;Bzz?Ox(G=45m=mdcsdBdO^8N$0RF= z2-7^5DOJ~Yv6bX1!(l$VSowJVuuezD$Gpg5vB02#GQfg3Kwf?%IwJQorK~=#CU5jy zG3zcO2dbaQjZnxB)Em^BAFruaW1ee$jt^RMX1Q+KPY(QyWn6D?P3bCjXj1;;Pi|j|bM%i? zyMC5uqRPWfQAz`V)-pEn!2z}$q1DXizZ7|I+ag$N#~db_NRt6s zWw_}#ZENGjq}v+8qNG=KH(upA9c-mnbB^S5nZ)g6Ml?@VXamR|)+$HP`4vBZq^&WtoA z?N2T*HpH6>F9?HYywIwuolcb=>4BY8P#`ieVqvg;QIX~O7>S=hguABl?lhs1qxrW} z!Qdq4!PnDy%bd0QldVIHS+~|jhql)uPiG03I0Q>(Zzv2YZi7J0qzQGx5F#j2<>Ij} z(ing==%(R)ef#b6nywl31DQYUQ$Cb>zoGtpJDfiQNOaZJWnHn;AI|l8Lw8+~uJH!q zhoP5~n9%El)z3Ql74{)j5mBOf1?yPGo-wD zayP4>Cl~DOufO$%o3szLpEy?-i@WAW?YpW494CGhosxC>Bi9(XoLjhgmu%{3k5Fl+ zlqWs;4ti~Nv>-&ZeO!qdWCPR0WFWk7HFnjZHoj1{H_O>fG*z1Vg~(7j#6o@6(A|3j z$cjKCN!Th=Yd-vL5c3-8&f`a%ZZO-5ee=|(7_--Urxi~Ei}~%+#tK8~x4(7=F-y)R z?yrvK0=7YC6)Aoz<;ts&d3cAF@5d2`@yGry-t(*u@N>$nCbZPx8HWgEltBkv(f`Z(tTEaI&eK_ zw0>$-i^a_#XJ%oNeXu1Ql79OaDrQ3@ZFZV;&F7?B7gqQ@#{8LqE^!d72h!U)DvI z<3sxFmJ4mE_lWtX6ZPci;cX$9HwMA`Jy5EZ;QrOv+vl*f=Z%Cp1AnNB-u$FbHK?6l zY}g)%YhPl9n}WAgJuiDT6@0*mXqD~x0!luZnxHGzC(kpqQTdHAx`kW88Habb0W29@ z`D4nmlG5wrWY1Vcv%;ZC*YfEeK4&En6DVmabwnra9WVhEw$eWdL^79j13P{6j?Na{ z@!Dn|$=XwlsAr(Wk|MLOd7n1WJ0*W70u_O7(98Z4cDJ#FF{ux6O84(l07CwsyN2)aR?9fb-Xbh&d`cgYKk#n;Fzv1P%dU zKiGbBxcWgSE)StgnF(>vydMnC@Zo|T$P%UzP!&bF0ULa~?+ujOk@{OReO*edy{bF9 zYC-Mj`KtQzc?T0Buh#PRD+_qbpN%p|ukdw^>+g7sjL6zA&XuG7Qp$M@x&lXpawv=H zhqr}~yc?#{1$jtDHyq-+X>>-FbSds`MIyPHO1v_H;T21VzM`AF$E>nXkWQP z54bbmZj3}^5tq4k$tiIy(dQRg(1tlb21}fEp%1Rfm{DOqhpsSn&P5CD_E?#zz1I8$DGOHmg0z&wOV<|uMmbG}X6&*d{+emA<4+W{ z;EzTLVL*0#;{Eg@s}w;7+j?-+r+9uzs%5T^P&U`f~BWDzm57(MmkKtfL79DPkKHb9~y+%y;@na0wc z#oOPS*bSKlgv-znoCo>%e=4N6L-UTT0RkiS{ASsAplO|1D6l|ln4rfxlz?!s73 z1Vr#SdwAqL(p;4HlsE0935E{+qB8dnj`+jw>#BH{3t8liZKXHIZ$Wmp8yok^1nY41 zO#u zYeeAQC+6`x$O}PEQ0*SpIH8R}YipTS)w;si8>`NHwAo4nY!LzTAq*?&*skW94OZ9U zx3g3iP4`5`>D#&|yEsy5!yl1+uN`X|TU1ZbE{X#En)z83vZ) zef+2V{mbVOr5+@?ru4JtP#uo-bWimqXhEnKyVR2qwGMnMGn~clO$DYYa&S&CIajR2 zNqEtqLrxK@;NM^W`_JFEZG^H&CN}i|Hs|_k(Bja?3&5M7*GFvga=a9K+c&*FZ00kQ z3hgy|kRQfluqtVbtJ~S>ufD$)uy~ZdNw%Rmf80ku1GmgR%+uuRbBmDz@XH%<`A2i= z01W*7N`4%-Ssjw&I-7f;{&@iiDYS!PRjGX4rseok_hv@fh~Pi$a7P!ouZmhKX1p%y z@7Ofo+I3>C|M`B%mPjo>N+t>Aw$r42U9pbMj1cc)`7Lf_A&IT^9NC<>+-mHS8=Fd{*xEy!%dB zy>eH5a%+VOIvrf$Cz<$Hog^xPr9x;t+=AmVGUvK(qW@ECgwHRBjN`q~n;2TZg`KVH ze?(}n;2h%rycL&QQS7IyfB~&%pYE5}x@~*1#zEE+`bE35E%%QGEkspRw(GIiv2fyJ z7ZS&ce=cDW?-|Wp8+MU)(|q82pus&gI#YmmlhI{MAZ<=}qD<|blz}$VzrWvG>t#!d zxQ{=bNo|lh-Ub+@x!ehh(13FcyM*#Y4lbOv|JpZXVR>Y_vb6iBzqYCm3`}%(F|>(z zG!zT-JCt%Aqo}U@M_qt z%5&`7#x(%~1sXo7R=?PhMIsSYqM#P1l;)}Li_s6{e_^AmM)csO!itS+P0hj-!m|AC;rP{=rSM>2oB+aIeIfP&1GAXZWSL{UWg9~wa+LnaRhLm>U1e@*u_Bl|~c z1^LA9-D*@{I_=1=I`w}G5G2O58l~NjZGpNkz25)t*Z+h-=?2cY??GMRTGYRaQG((> z_&R$O#lATe@~^E!7Ki@tT7^{nV@Z%FE@7&?%+T15=NI|U7IX1lFr@oT@{RL;x7ojo z`Xb9b{5P&aR_W3d-D`$OK@R`_Oo=X~KT97otcZ%j9ds4D(N3q}GMA81M zNHkVKfe_9hj}K{0@^t#oIeZC(4A9^J-IZH={*fpANsmhZxG6WEZ>W4%|Hmvu-*;ix zMAMEKAN)H*0TS=P{xOP{{PBr@H;lCy?ghae1y#c{y-)uG?3cM0_y0i>PBpFyzXN1^ zh7Znv7E+DXoK z*+Q~5?7NRQKamy`11Gx3%-P&u0hQn{Vvho=5+W3Q3J8SWq2p4Xj9&aCY{$(06rZNX z+2OoRs{C6uV#!VFH0uU32I}B!*8zcm<%7uu?G{~UF~UQB_3r$KJ`^a!POz<**s&5Z zX-aqlhlEdq=JK76A5!h}ROltXC8eS2b6eD7o>rJAJLI7J0S=i-Y>UXN-Jg`tS-w+a zp3tKwpCTDtaXlX^CevHjF~7r)mhh=O&vTboWd%-)#7LyKCtQxJlF$&W9dTAVY9?N1 zP;TO7ipQb->?<-+Y{xsXbC7)CD3LwX>WpaAQtdc^c>q!&5wTM`WOtC1pMAibIh-<^ z;owN(H4Z*l*$Wp$f!J=4p48uCv0Hb&f58U1u0;5lBjw4_6z=FZ16w7-nT-#Vv%g+& zZkWzcG%O)I_r-*^+!ur63Aj^-)9R+Iv5ril6@e--H2aLC!4fxt^nVIH3h* zV+lf>N(@D|_1vbQaVk3ANmwE1#D_Uw^SFyc&(6oWhrk~xLp8@CW{^V&!wuFnYJOdX z2PXIHr%LB4x15KXEm6W<0~>TD?IFrkxi;=+3gJl&i4!=<34_1_Hd6hMb}F&+L$>))Zc}3p z_*xs&L6BXYZ_FY|8s=H7G7qp$^LNVMg`~;Y??oOsuH$3}zaj_=5#{_0NQEwP6Q9wg@yf~%v{SXWby zXu``|J;b%rgL2#CG-rtyA3GM`446c;Z{vX;RO~Gct7#nNM%wcCB=nZwL6*->;G*yT zIh$&B@$~M4pi4Ys5*)lSCRD;Q5z2*p8dRi)mm!$P??K&rRYu2@!_YW zQdfCBEOk6i;RLeLso-I8lYXc&PAV`xnz!r_xcYckgEtCgLoEX4t^I~t%;%1?D1V?* z1rtn3OKIx>O@qQx!jm+&=s6kzBS#l4;Zwm{^ITp_6uW5MqZ)Vcym&pR}lBsTYt(a^op@Yo6vHHxQQpfnI ztY;?{h-Z%l)>eG32thW%rlDjmM%n^pOGuRQa3-;7^8yHIu2;;vGj8h!zR~{_`IA{z zimSd^aBjalrdRmF12w%^hHP*wOD>Y4e@7~4wc?)AbJ2Yi_q=1_? zW9pciE0M+Y)v)m1S~(g-&I_Y=muf_p83TM`Elm*r~!B9 zG|g1n`}&{-u|v~mte86Y>ZWS&n43za+u|r#{OoU(x9bKaRTKSVq1h-LX=|~`*hL1q z_Jfh>#g=xt&TnvVIns2*_3B16!}>|1DgjY+eDC@tL8$!Z4zZBL!3g^5XJ~-AP|CXj z>IE~f_PqsNDvM&*obDbQk)@f$eIw5LML6EBuHq@~pmm{{+;1xZX?ex<{5dpX_Sqw|OeyJW# z3UvK8qsU=q*4$310%tJ^uI}e|1G&>fkIfGQ1Uk7NQIA_hF!xfR88>pq zv*9x9n_%>KJ<%|7$jYCHuOrZyGW~d7@l7y`i>aM?zgyRcA9U9zvUR$A44K?1yi`@X ztLsP#soCoGVR2s3%36_d)!Ya&w293U#%7^LScs+HSH?40W@cI^m6!46B?gU#`Z)T* zonLF@ws*4wE8c`mflFlZ&MlM%5DHF~XXM`_BXx_IUC_&$`GirrOcTcnI6T`~AD0y% zgr419{B$qI6sCaxg5LjS@b0jaRzdzLpqq75=tONj|})I{9ER$N*#b`=2-|w$EC>ReI(LY#k%(BjSN(wo={ z9pVsj?S+9-Y`z1D4JCd$kPca`KW{ZPs9s&2mBlcmE0zCnPA3>8Wyg37CU3We1+SZj z3PnftReSpy3e)x0=Eg;?^{v!`Cv0P;^vX3mCuFE{TBs2LJwT#iG7=qqPXY1e5i-_Y0GfvZvP+gQ}< zxJkxN1{39vW00>vR^%*bFWnbdJV_YX3KR8y@T0*kDTNp*!7TM zo5-AYk}}j1^EYevV_5Ysr|dLzNTX=Sxzywfx3n-xIyK$O8K+pmGC~ZwT0e1@eW!^$ z(V%5hV`hs~@8J=k>3WA+@jIXM1l#WBeb?yCLDK!8O{hp}&<{s|sLc=Q@i`S;csxm{ zv7XW5ws8vYn(A4tl=2<3qKPl5mexA6ho-ULI?KZhaS`1j@Zj`rHXK(`%l)Qoe5Lnq z3l$nQ zA7$`Jjt{{z66Z$)yyK`#`RsX>-(WM)jJkzlcBnXNcPybIj+iVC4*85@m;Jg-0;*$^ zWc_)_@8`D$ZdPavwel;A*v7Ee5;I1f}f?r@~oV@Pr5c zdUYCW6fHcV)7yG+f=TvjD`LmBTTDAfyY9`F64`|FkmE9{InOBsowARVD<5sC_iDV( z47D($3q+zMLbXtUb8Tc`lGHQJ7PG1IfPI9^B!@xz)G|`fVV*OYO+lxMP)_ci_YQ>$jC>N)$JL9&z7dE+obBf*pv!GqsM@2>fk$ za0{9x31aIw@cea~=>?Fi~geL&9CfBI>d)&X{1ElDV+YIZqEeoYA;Cxn}KY zHg0v1XBmC^FvHD=0Y6F@dJPc2i{Zco@r8^ZkJ;uYu3}w}>SaM9GQI1bTvZ^rGvC&y z@npDV{^{$H1BFrw0Byu$A%e03IZ@kPO{*4xg%qW`)Dqk2UUl}4azAD)YSeNv$qp>O z`#$W#y868~hmrQT(Q!R@gDePXdi}}8=doxFf3JqXXXD5{YBNLQ8Ea89o$ag)M*;6( zCUO&ZPZrn3-kbPIoitvWPZl`O0)jkB&1`6) z7s&KxhH`8}9X(%c-DE6})slF=f+`;e$ZXfS^!c=;|GeWyo}cLZvH_Q2LA%)JVrx@FVATZ{|jMftL}-8Aa4^c2{<)HDWIn>RHFv<6RUxFj;JOpG0j1h6qf z96|%tOHqaz(Tyu_72QY0x8rpaC@Tp6_zLgfygwA|xppk=B+|GYio+-ujbS6E8?oJ#RT>i_1QFhW8Yp1{fz?AFGPcH`SU;AQ$P>XpHbWg%$}z^y1L#Rcc8NB&oh z^^iaLl;AZb+sBQCITaLS|IXJ&3SSe_lF2u~yr%=&QJXH1>Bt{_5j9+0$F}iRmm^g} zHF84Ff`6-AG=HkI+;?nKa;!nE+U7KE#Q^C$T{Bj>`zZ{y(m^87We7KYL)m#9pASM= z(7U~X=*Ya6egytTZz7)%!98H-q)WYLGzP7xjS}(upjG?OFBHmX6BQo~Dpqt7ZSTP8 zOfaW@_Yu?fo{bsq(Jn$U`x-x}JMe9ZU6UUCn4z+<+9DUCW@(nGIU(4Nk0jLBTD1`8 z;?WjiRgoYWQzmp>mC16_Sg6Vr|n_>>wuXXcB8eM&CvRepntglWxqVdv`G{^ znd`EX_y=^zqD4zK=L+4d)#OdyKV(cbx1WBqQW9DZ!`BHp0@7yP5?Pi#T^e zZb5FKkLWao-|@Z>nXyC(Y4yCVRM@QyzNy@0%Q4ImYwi=kV(x6#CUXx_YTXZMD0Xs= zW`f#(D%5$!T4}d5BhgOKTq(4JhOy0jI;DTF7NJySzBuC7AQ7;FMsmUjTAr$`#>5Y< zN1!t^D+eoyWsGdFVU&ca>mI6YrgbcJM;~iBxjsy-*$k!##Un(AB~&5$Ha=$6ni~@!rpv z{JFX27^ivuPpSIKqY3qq2O-g3uJJAMaHS@Nmn!1XC1d+1oWT7D^wV*TGS6-ruzSJ1 z(8wAPDK#Pu)1{hQDq-pBt%@ZQ;CX)K-T~iVzHz3gtS>sCL?C%rxev4OByg( zp5n=#{E`zxqTCCcS3O2IUjUjgWJ((;m84W|it)*Spk${irFD-XXMYH6sKzgJi5;46 z%|G(AM0obx@pxp$Hl|&Kt^e(d{XBp^9(Y&zp|66yZ*Cj=(@Ii&1IL&=8Zrw~=UoB( zs8)e-ZRveiA^6KX!YZa35`jH1cqZ`th>W6W1brA1YcPzQ`yLzrkbas=G$8Tu6%N1H z`C;zXw3(4_+o%lWBat|>5d-H@4OLBvm+^FKy*=b%v@>CQy>?ymdF-Uk0_kv_U;k$V zl<*2`V>r2s20zw8me42)i$e=9jrsB#B=F%=1P(_Tg<9S__}~aM%4#ym0f%G71k9$w zwcD@F>4cles;d3*5M6(-U^SX9?QinsmRV;Kpf*6PB7leb&JTTpnHzF{LiuDEo8q7u z6P5$_M$YyL2F(|h>Fy4tOS)5} zKf00bZb7;v1Vp++>25)~= zjvLFdI1=!@?DFAdqPAy?guPb(rE5x!PhuP@Uv$=L3fV9AVZYT+fo)rvm&f9H^|j{v&TqAR z58zH}9eU|CX9a2!97A=ts#ry>%Xy~C#)5+pZZ$Dq{PsjKR3KeW?yzwb0|z_|Jj@7I z8n}#PQRyas4_-2G#mjtzPf^@$&x_^_HxQ_`rAeL2BzD_D;cr2IEoFVgDvpQ?zUsNDsE1#pf?21 zR#sxS;c`1B5L^d5&*6<;B`PsZs_tK``fvtI7A#MsypDhy*4w~6(hE=iZI=V4X&-c@ zL@>Uy$4m^1uGQpp8$n14WOu32)RzA7sA97=^0?Z9?0~%qM!ihg(wjw|kM~g-6B-32 zPKOySUY$-W-^MirNcv&SWWRkwz%ZuX`gNeUov!_(84p02l+)TU+g>zIcg0@CV*ibn zX6YlpdXg^?dtVvmxCnN5`bW@J;%3SKOJ1mAt2YM0z?g+ACIk{ zR5jTeD74G<()#m4SX?h208ZcYKkQ5&3$GMWn*u5oqcFEViH4u zMP4PIR#W7m2mxYE*__VeSH#s^29M3xw+&sglkc;Xm@$p|Mh(wj>S#7%$WT<6&bAV^ z_LnOuGcC!tf58iKtID80`YG5ah&kL@FS?;ad&q43Atwilf3Yt;U~((-o9ZRT1o>+)OXL&Ch$SZMf;VwvGn^ISYZ8F-PR7k*D`Ki^<|6 zN!dPR$mxgF17P`(k&^B3yT*v}Uf$+ZF#H$)H<)qu>Ay@9K}d;w!d5QFjdpOxZ)nT$ z(>W}yyXHrl9Dpx|S5df?`7qa3e>&r2>4`Gyy8+kx<7x403Fjp^Zu5LyWZNIaTEhIE z3@R6Bfg@xT@8!v&V9AxK{{~w)<$qN!UU4@<_(8Kod``B;B{XH-5w7OSh|oePIc6%p z@j*08?s^?YF+DR-N6lu<41MNNDmqsrHTVba$8loX`|vGw(d?w)kyb9e7f_$Q9HWS_ zA!LzRei5iuqKfvgiLA9E+TFjwra0i7e8P|&UQuipudmDI&F4uskJD!gtuBlwk!#JJ zAF`J>RWk+I39O9CT=sA=DWOQkrPjC)_;Qs92Yh7jnvn7w;1eK7cPTNk3FoP5NJHbI zfp|6c_?7&{hhQZVi8kZrg%_qybY1t%j_rQ<{v%%|**tlj^0(mM#om#-%qvo%ykb>L zE^oyw=O{q;P(ls1u}evqc(6w`y#Ij8flF;%rh-%j4l@}jh4T1mM2JBuFZr&BfFX!v z6khCx?f3`*bKT28u6@^hZt)OoaeP2$b$lQ}8>)p-C$yu! zfL2JXyT+Pspm{9!u&_woU4gmJ5kRSFKb$j!tsKp9bQ=coGj?z9Pf@UB$5&@W=8nho zSyj^z-5QCEDUNm_UEk)dA7J0ad?y=Fh#mUs9aoOIVwdjkxJ9$dB=>XZM3Tvq?FGSu zr`_)xc!Hz7_JbmI5hTpimYNps%;PdoxkVzlhm~87kGDaWx@+~_0h}_--tEkoSKU@9jPwaks{BuEO>n^RO1=K0`zLIeO;ds8#*wTzAGyY2O>#8rSU*3|Hr^3=zmW z+GHw>_uezf;zg5jZA@Mx{Q!OQ9OpR~+CwZJ$qCTGe393p9?-;--7nejh=)O9my^7j-y7q8rUsfuP290C z9xURM{ncqz&QVXfOG={qX707}ij}cA>kz5Z%-9urr;s z*kt!BdGpGPC`4P#YZliV0gGj{*Q_Vur!(}5p8Qa|l+_*1_f!oBMdn}5Bhk!86*`j8 z06S0NcY2sL$3~hy<3#IwzuUV{Ee_yH$ah(`7oojKbQjK-cOML}3g-JgA;7M>~=56so zy#mv2G=!Mi=PUYxE1hFF)lq9C?tYEpptHEf~IoECUk zmC1)6JyD~}$cvm!3vamI2j6fBrBCN&hF;jODEu_+(mq#Xzs`I9sO;1bsUKsxFb-6! zMGJam<8W`;k2MZ{@#WRq13wYrYdg-GE~fqzX_ck^oE>}Ed{$5&d-L)c?EG$@CF4Q9 z)ajBq`8eW@UPpX6{hdMK#oIj+lNHLl4{@d1_eNY4_sHKH%h=qCVy9mky&7ur3tZ|u zed3x+Bix-K4Dyt=`{ci@ZgkRTbXiX40KGqn@>pl{)w-O5|)lubfG zg41gineC(_1*<*fWaG(4hO9O_{~yDId->$Dihj`PU5k97G+3nkfj-!}Rxl+%NX#r3NPO_oLp=5LNu2BV3A172 zdvsuujcKku_{8X=Cg}Qx`OH0a-RZf{>Rej=+-7aZeGQd7cH6paF#V}gdZmh0%}W`T zvMnD4MeIJvB@Vk%qO%xkK*aX(x+5OlgG>nM0o%dxWRHQ)A)|21YCPRx7zlNZ)Zrv1 zSArKyEOnT#txDt6MF_o?r3t``-B#Q73kOuc?-vy7h=B`;adr|}RZ^SL) zGSQ!WLKhnkT0vVEe6qNy@^wsiXR`!TJorWzYGRxwFE~gQB$uLvcw4LT+MNgug>b^9 z#t~U((ta;Lwwtx-f4Ki@epAqh(1NnwE{y&m7Xub~q#vn%XqE`6kqHLo*D$KlL*+_`J{v`titH>{y7{^7!~*p>Iv?q1xt zYXu^q!jLKhUPp+&mCV4Oldm+d*m?a1)a-27`d{}4uaaYe!eXRvH(lcR5x?iq^`$(N zs4km91UJq~8qEY^QHi%8Q;hM48ypB3L;xEmQrNJqH{UA#-z>?mjL(#BWPKJ1ee_ba z7OeA?rWwCmN5r_V3b7ZKlWUo)4F!?v2PO}EyOzJ`tWXbo`aTcI&R- zMhJDijC}08eyR|+8Ma=L=*)R7UN@iDSW=qYy3;{d$d(?_XSy-gt`gdjO}h;|9d)7< z^Ip--_ZDf8uViA4&TIL(^j|?TV800JH|bPKL@PPk)mg#lA0Wo8+l3kGoAALO(Nmd7!ZI#3nv|KZG&AYt}oe|4`_$ z3{ES)uf?%k6*N1J|(S*dc+5nr%pIdE(_^qrj_73_I{JeU>%Hx|1ch#w zaDM(I$M3RC+_RzRz}%vGR&iRbJCajmaBDx8B_T22r|Ll@6Ep#;uITB3MO~QD!tICf zo2N7((TFEDrSklLO)-1`$aH6Qx{}(4uB`}2xk_DVz>aBw>epRSHF{{xlv|FeCm;r@pq`hUvy#cQs#4Lo8%K0v$(?>Nd!8N@oVoxaXEK2K2QZ(x;RRq=pJEZ8`M&1Q_~6HX z(us}8s8^#(B5N#4Na}OaBYHY=7RTmLZf-9?S@o2kSFy;O*05~e(|jt#i2uq9OJH7d za5{O58RGFXkJPu83EdQX=39T4hkvDL7!LS&tIz>p(E08#r`@-yhQ7*VHJ+JB4^KTM zHobmQIk9O!ad3eL)Aoj~{_y9)nx2Wuh*$q09Q!Bv)0$v64Ox}-wzDp>QF~H!dCSUA z`!yn0`|)5C*7bGIE?YPVMQ2^g7%Qd+^}55nIP9|fES!TrwG!Uu4)kPJK_kMcv6nk0 zHQSc8${4;hN!t(jo@MG4!{JW9b(dce*yXlPCpxm_f$q3LTZzH5+jSzyjYp&Vz_V^4 zHDi}(XXgw820MZYe~8L@l22i=4(LyqGfuzAHoj&+tsReGaHok z#ar00nWqDWoP>eiX_$5u0=|BA#ZhuEl24Xs$X6WL&(>zJo|)T=mGh1s(|?%Iya44L zptt{%yWIf@S*BCT?o^ay{hVnwzJ8u-`iPdx^I3G(Cb0UMZx=%?SC|h=Mzv}vGGp>Z z@Kr)Ch)72bc8W+K^6;bUr&&OriW&ck2Qo2)NpsTLZpAS4tPkhcq6WN*e76FoO?nNBMH4qTa`XG#U^~YnE_O4e-(eZl2ENF@n^C8cx^sRN}WDh*ZH?xpAjX;kK%ZlH# zL8O+)-#PO!up<2)Ck)77Z{B&7EK)&4v;4kW776rqb*FfCfjU_XlMk|f0wa!hqK?S) z%@g~s8`o0L$pAaBxrmBM{(A>5%@ol}?C4vY{I50;Q)=3unXpgAyR{$Rzs23Sd}!GA zf(@f^b_3e0pL)$qu5H6ZioYU!go~m0wjubL*d|ydTx?syIgKvs{BMHlIJI#BF2s+b z7w83wreN=H?c_Gz<$7^|?fp9!=48n-IIZ6)4pUGY}yr zh`ebPH?F9ZGM7M#dL-!iSZt)GU-L`zVV(p8(nqRXfd=Yk(?U}=M>nRv+syTghM#k7 z-w=~=7uN`hB5&?WC|x2?bVU6ciN3Uc>yxX5JVBKyFqJDMI-$XnJTvIQ<-$9dse}D%F+)F^{w6yn|2zsgl@UI1bT@D?E(wWbIY$sp^NF846EpM2u;gU-_Zi z^67l@P5je>=Oe>}?S`;ctb6&0>QJd=wblyw3yJkL9Ae1M)s5LoX&E`eQ?ep>dWv`) zGofZXHg}+r}J;xF1&zWfcgI;A7sPX;njCeI-aEru; zz{)#kUMJWYVH=-OPN&$R;Fd@XJAM$%HB(OPh^(X46X*Yl1l5ss&;JNUKlp^)n}AIp z{>C~!H!*esJwiK!8%Nku;p8qGm(6n!WER8zL|Z>VQtTYM>lZb*3L3A0V5j%mJhs8y zTb#zLvXM|)_uW#D?W)s|OM@@9J(0f5vG>?{Pgl3C)Q$Cx@do5hj^eGvdEB|f1-2+v z0H`H2w*HI_bF~f73$2_duivrdRd($2VXIP8uhY7RKtxa9cv!-KCR%7$ixznxcCx1{ z3(Ip^2;lU2eW3}F^w>Nd7$yqu^X>p%CCR1OOj&yPbj6?{!J5 zjIx^bWezfO7?Cdm(6i%7#^)>2lB`*=6$3a2-tM$9u`1n>TdFso8%3)TL;F_E8t-JF zQ<&01oo7|n3)?WbR&8_WJqx2ra}kwf2=h=x^M-=Y4)spr_aNKig)?~Mo_Og^MgDru zk;zzzj!kAw>r#Ir@YbGnl`^ycoRUxiU`^;%&sYgr8wh5)n+I+XyS1>PJR%$Is$EJp zSDwct4v1e6*>R+n3Tq5&9b9RzO-40KP+>9cdPHlPeUP|hs+?AOWeMVv*owBS= zsnmzSn)emp+TtD7`Cg8;jLGobt}jyss59QBVeUHnz_)prea>b09RBHpKm4uadT6xPVSiR8 zJk{GN&-M1#f7aV%)K4n3N{*IMP`xtOJPivlqdyP$?O+~EE*R9#S}}P!pkS~LDz+O` zN<1C`V89h(#^Tp?Bq$J|lpx$?a4v1%Ykjh=X!NeuI0i!y%3u1|P;EquU~iBbgi|L1 zMosIht<ru&BYnctg#IW<53uUD-TMI!q*Z$Ig zBb{mcg6niwTY#}BY%9|o-1m>(WkQ%d)#@{88Zp?NrUIIgJOI3iVTB_SQ=vJV;J9H| z{pN>myWy+7MmZqo<%kNBf|x53c9+?j09Sj zkSo@WWsLr}65Em)-wgwlT<6?R6hOZ6VdR)cJt`Lc#uUI(A2m^5^!w3W9D$(s7Dz#) ze9{YwzV4{x?cGxZM24n+RDhz8|Aoj<76A~_IhVi0O>i`MUBIrHwQOd1q#E1pHzd)S z#;1KJYIQxFlJS$~)G@hLSoG*89@BVaw|2wj8K`pud=2!QY+a;3cssd1z9L!)Z788J z867uSe@~(vDtl7jq$<7Rs z>RK_x802}Fg{!$Givvp{CdicKu`UNqf6Vs~1I*Xb<$k_`+TWIP%>~amlX&i5Z+7`0 z)xOil&-q;ggDS#<8IkfZ&{CyM5n;x>@?=X?C9d5ESlK{#T$}J2j+S;`SQ1mMQdu~5 zdTr~u)M}@CmWO=gIlKn#8{)d0jS3bXXT&X4yyWqQcYP1Ia9!s*94@|DKCo4>&QnAHtE$Zo)r9%`8ffCzK(>#{eLUS zbVyzoKU2DH67o1@6&}z}3N969Zr&!1Bric(OAfM^1<|1o#@l>)>BU6}z24mhIX~DW zLfN#d%rqV@1&|Df3`m#f2o_o%M zoAx$6pj*U$=kGb+??X9JyA7$3QS~6m{jGuYV`WD(TwM*vN`ia^gXmQiKi*f0nyoMD zJqU8N0N+4LPIl^M{r2=>qb?Bu%D=dVkEI3Z#M|iOUX2b{ch7n1Xk*#WpC1lGn2lwJ z4t571QOm@6FQKLn2M6m>y0x{!{WM0<_IQgWeV6HU7>OX!6@*Sl1DDMt;7R!h6@OgR zIYUnI874Xe&v+5=?Z@VUkJN!u(kT3q%J+JOUJ>L4(4+ZO+F^9B)HoHhV_*;p(SxNy zx4z^VAwJhfpOrM_njGOjhh-heSgz6lbP56fViUOq56PR)Yrj^+4{W2c6RV7Y9!Wzk zy+l>b&Z6mgJhr)b_dMeXalTkwDoL{UHJKLeh*4H}i-G5Wb$CZX*ajPW4`FCIGaFE@ zj*xB(t=d`eAi4+BIR9==bkDrYtOd%!{)PA~c4W*}YF$s%CmlZ`ceO(|`=m%?yxA^v^Jrsr_1n@`@h{1pKBf z*L@ajG(X70l`Xw8_9Tc9MRoi%Z6irlWMZBW$HbX7?pJ~HN=xa4n4e%bc3fs2fVN2`ZurbOHTtM~>Hw>)mg|gaY=Ix(IuMI?K->Xy5 zlzYjxBPjnnY;Wh-Xtm{vCW(YM@;>tXdt*5|32~4jdAiw{l(=^Rp59fixN9QhiJDkp zL`MY-z3j^)axl$EgrHtPn*{bJ!4jS(>l)a>U6(i#bCEYAVs|!KQ={2iiyzUT8w|yQ zIteodA_lTD{dpB+e*C4hswD-(#!BBmOvdw36uu(Qqb zNqXG;3L3c0J8dsk{!sBq{&NLwCVScs-X#4OTJ$K$`IaZWo&oe~*hu~O?S+a>W3EQP zM18^SXX&P!L2r3oufYD`44=iCT2F!*HyT$VHKySw1mpYoUn1wrdRTMUKPu~H@H48R zwf1kfpBy^VyvC}=_oy=|RyFtO&{3DW-Q_?UIjZwApQ{M)jqZ-Wz76yC%>bIxNBU6D zGI1j(_-71{km$i*>raZZC@bRA99IW4>i?9;U-k><$vp6pfuhWndLOl=W~`kM-~Uqc z`w@KNaEFdEHvCiL=`3@i%6q>Q3aF-;|CAwgMzl{O1-19jNBj4y5M^6LBdp=6+`eYCH3^oCZ{-<{f+WfzLH~;LX+6?8>KWERsnh5;M ziv$Q`pGcaFV47dhW2h+qy(x9%;rt~Xhjpbq-S{(fzc`=7!zIZ6N81mj@yr@(`S+DC zrg@F)pHn^0U*O4ofo63{ZO8J@@Zn88PYT|DV(3O^(LTTw{|jbBoI|90!knXpBLDLz zgr_0$_xf*#=wFQq0K+{Msy;zA>0FA_zYRSAlOUVFTpmnSc`#UG{>(LDz_6giXWYA;tGen0qnnM; z9sr4lT^u0Y%OW1oNuDR77T%zzBC%-fDr9KWBf?LrKvP?Y8l${&=nWsM+@LEcG-be}XFGvpuh^5u;;$O4u)baBMe2pV)c>yR~`b?)ga+_88r zyyJ88m(55XtC54hc~r5E&!_TuZwe?l4kWdAU#;u90eVic@KJ1DfPrVev{2IQzVTxJ zn7AB%A8%h{uSmnB5oU%o;| zk^VZhk@1w=C8$3?f(F`0rEf!QrgpDq`(b<`P0{&QFj=^zQMOpP>JLDus#^3i__tl% zUkZ23nTThXL&D6(Q=>8!J4~K4&kgiDfN0O=hNDza;*ROQrS$;!i0m&BIvJIb-w$Tc zuGjaH8YnZq9weqIBGGJ?NNo{&;&u;uuvyzul%4`{2-Xi0?X=PbT-q zKCV|9fJYN-tQyNJNvK7L`a&sF^K%P5aC?Xo6#i;n=}9ka}a zCVs+CuOiJZ2L^C_HTkGz; z$lV-NI(zet!*jMHxJ!DNh@)ILden~|m&5DdpH+%QEK$OtYi&gT61nO8nw=}@d4*n) zY|x!%sV67QtxkEaifHz2Aiu`B=wBMlpB{TC(1(^HK@Y}18Y zn{3=fElX5t{abpLkMch)pZ2)#h-rjI_?vW9vASl*i$Rqo7pdmj5(_dfrWo?4#{1{L zP=K6yi?1B*xh|X2oQb?SBh_B(AisPNN9~3l)FXQ;1;8qLn>N?} z>EwJ*3h7)MX?;yw78_|-v78d}L1}|TfOi3sr+Suq9%hG^|K+jdOPhz)!{iWI#i6cP zspL;KH9;Rzc__Mr)-2O<%f3YQ_z_9JI~E1i7*Q4dvN#tKVgYNSf=f4V$mAkQtCb{F z8K*Ooq~_<+-y?oG^WycqA>$|rv0U6r)}ZkI_EPU$zh-Nc?S|cf;}9;R^68AfV1rb1 zj?58jl5ZdMi!+{%fA>{%h@jA7q?*lRmta4b8EQD7Z624rU$oNDQR59!e|j8>B|!vrg6Ekk6HXfy?RJwStMOruhbG zH|=C5(Q(M6=QkzHm!r*7>7MUb!^do3n%n+{J#p?U-^{QjMh3cL(jbjPs@1(njvDTD z!Kx{3N+Yr1!KR7N)o6E#Pz4rnCN&(W0@pcV!!IYt-!g*TP-luX3J$3<+-4X1D8)BM zQG&v*rF6u;Silh_Iu^V|GL!|1!44}(7a+2lA7ffZ2S?L>RJwE}kh1?r;;BP0tsP?s z@i~6;r)#0zaMd1ZWP8`H(y}7FRQo#rAhy>8aHi_vzHS8uEN1 zU!*Q{;qQ6D>Oal53=_K!AqA$Aao2{w(gxIcdPt=*z4C&_ojAFT0jW3C2Pui1Zgcct zer3Tfl$?X?&vul4Q~#W0UPVL3pvitpqj+41lYaV^>?q1`dvpjUo)rl@XfM8%l_c{5 zmtKd@bT2^%-rd&RXit9Yt!n4sGUQj=E#5{E{M`rfW2U?rea+|*5Bw{fQs>EK(tTa| zcGpXA4oMQIJP~(8^&QS@q;fT_{m4%|dO(~97KOv6^FV*F$)h$s3k@yhV;QPRj-wB| z+Aab<_q`J`&oopmo37+pv~yy_H^{jsPczY395x|kYcG*yIMTHh4S zjS3D>s>E3w1dLeg0`p-PW8l&G1i3&zIqyZd2H#6HmyRa=;j%7oyZ7dX^a(2!=%Sa$n}VNnP{Oy%^?T;e-r zaN??=c!u9`z<7oSDaljE$Dr3R;kB zD0@S%?cI!aMqnkf6QL^UWqW-#JvdIOmJ%|OU^69`y>9U)n$ggBp)OIQS9U2k=Az4n z&c5ixgZHIl821ql*BKl@AqO#uiEau3M6zZ=ziN~zMGnJ3#s1hC33lb=fQAww^hwRL z$}5hIrW{d&G}b+{`8er@IFM}|rE~pD+!qBW(s@p?mjkK2rstQn+C2UJMazzdw5u1x zN(-HqXIxA^&8$PdvVAjCws?Y+FOX#3_qO0m3kz^R)s)|np+}HwqP|G6`y>&4=+D5M zRuW$Mx$e}X>;_|VUc0-@wY8`9qUOA(YnFyG?`ysOw0u&QeE*E!i+F|ZHQM`9+fP0D zDkvLWb52Zmm7OLuU$+)9ngs1ulHoGrthF)bmwHB_8C%ck!q<{%p#3q63&adJ$fbci>+$@kX>>?Yh`4e>@#(zAX%76#0m zabYtQM46FImP%Sd!aX&OgrMeNP_xvC_!Qb?9~31`do9qdqjiP(`GV{tb)zrIUoPu0ymwk8M9 z%z#k0_~tI=<*@W;`?$JEbNoX(TlV1XdtJo~IOt*OCV$42SFZE+kTPzA8}%YS4W3&y zN8KQYso^YnjEfo=auj@vUqfXKWG|v3j0i!&6WJoza7&_OYWca9c{YVENvlwM@zdxA z-nq~sz?&qLDN1~+W7|>GK!72CDj%oxb;Q9k?LKvL62jmik=&(Rm{93T zH~Gr-oH6zGa(#!Z<2AQt~di4KLE!t$}V#wsR&CMZ1~erLQKeWxK}q zdQfbge~0S*_*{FlCpnV9H~Rh)&w8|<=E(Zhk`cO*cZcfDY47m#&X;T6OR<515x&Ht zP%OSeL+Xa@1TfdqI;^5rt3*d!)Lv7GFQ_YNhe$khao_v9nm(AWPbQ0 zwvby;rfB?b1cosMZqH4D;QB+};g+64L=!j7RMdV#rPU zg7m$AB@5WictCb-#8Xy+##GM8*00(oo-t{N>2j*)weZ*ANT_~vt*ug}c8vyfN8T-? z(QWZ4bhph*D6YYN(hA3FBUYsc#9FED)1$!nPfB-)~rqPkG)#o`cAJ+vVoYHVMBMAwLW3EF?sSuf3$C5bZ3pSVggq_bdP~t@Ke*8Y;#c+ z8I0p$bwB5@>)=F6&hcS(!i*CtTfvs6LhcXcGo>`qg&Iae>IVPe0i!mK$&zF#i@tmH z=V&va0HlVTG{v5jaePNgjUOH{9H8%4t0pkW;{mrBv_tjP9=(XmDt@L`VwyOUdVCC_lKG0o1&PwX}HTj zRR+7?C_P}FZso1?MgVz}ZSE)$G^v-^IG=q*AQu`t(vO=OmB66 z?bU#}Js(M{nDn$&Re1vCc`kkUx3y4eg&_7JWo>g8v|iK@({&GA-qK-bx<@wU3#8sw z^p^U?453S)*vuT8>TVPZRO1Bllz+|0vs**un`y0&G(#?^%(4pTWLL>$gnT86K~tK_ z%e_AhdyNyz+rW)R&sPWMyaQ>z${wE0i4~b7q^-60LEAVi1?`isZp29w4W+0yxKNJ4 zy!&CEPO^muPQRS==}FkQ}8zQ#Cm#&uhG8vhmf)jSF$+r|{r`$%i}F9|WT?)u%B zUB8bC?Th@jGvh$InfrmCe&ffI@tg`YbIG;+zFA*}5q3(lG##B$!21STuqTaH^B!!f zW2yib5U8}_A&Rt`^iqrkLUavt6SuIi@$-?kbA_-fyYRLEa~VC$7_Qj zc&Vz%kgvXFx?eI+_d`)$4!zEarJ!wrM9o0ymAvnu=u*?{S`*oec#;`a3lhoq8PICy zL1^DqUU(WJau1iGQ&9!nB3QN$#+7}R&W>iJ@DqVCcBo`3LN{r4?Kc)MCBcdL-uQ!6 zV18ec@U-tGJ&JwGdO^(`O&-Z$E)Zj+gzXg_-9d<|XKPYI`qgqh`V=sOWZntgSPp5= zK)@mA`#4Wc%hY4@J=PgG0ZegGmPBBVl_w7eUcZ&T4+|srQ`8&N|E*9zM>DBGh>G2S zy?G&JvqSp?gmPiR)uWRbvYE?{sHxX)5UQPW!a6kMHP@(pY0Y?AdTRu#Eck2(laKwjQ>R<@cqu` z26kcNlIAwNezX2~7UUiQ7tmTbaJO9!b0kR%Y?8=os0|f6tCZOGz6Gl92j?lJ+%RfN z*Hd-VhTM-Tlto+cCXc)R=B#j?n=IeYKmFkX=p(N1GlUsb5*8Su^nFU;YHQbuhG7(E zm#?2|Nd}X|77y|yZhOC%W9&^@H61+J;NIkK0tzi`*8a3`Rmm8uZ&;qTDn&<%hy~^y z_t^O-_2?U)O;r`WU=^hIdaZ$**_nCktLaGLw9P^vp5RDn!jMSm(b!MuZah`Yc)`i% z(p_q4Jo~|0gqt*zej+CTs^Y3t9Yc+$V942OJ4p?%dV5u3^I3Y}aLs|k`~VdkBQ!u#sNb?OM*3`&?=>5`n6D&TwIT!NFO7pfCXy=$%}WZUj4P_aZxHa}dLBx#gF5ZX>n zUr235IzcCMk(T?OA&c{cB)uf!_e9`1A`PaciIoWt3#ZC*VijOuzx+9fcR!h(eB82B zlu`pE*r+o4qPCyI&t@RuR8p@p)toEUBZ}m!y7Xm^_gHK5=R`EMJ|Lw$0D#DKmH!vW z6!v!}w*$++@wu(FC?I_V(J$}Vma886NNnT1e~~p>3^X9cSLmaI-!(UaTwC8pBL#eJ zy$K<97N6L;LUCMnXi7jhKZ#s@Mdj;(MvbZ>p$c|B5VQ}9`(zzXG|{zszVCTsB!MD$ zA%FjicGZE%hH(WC0UYmP*RmZuN2`8wcf|iJmejdoYgV`6y0 zS$Xlsc93T@68wH^mhE)rC>Dnhm~vRZieH!jS%r?%Tf!Mx&bG+09c&e8d-Gd#;VqGZ zb`MO%UuGK$<8PJv;5Y@N2{Rn>N8dalC>l7LKF*l&8Bz-^+TBh&dT=Ax!Sh_P$-$cv z+z-r9EJ)iFdjTN3g*d2jDRjKYNfM$X+~7{y$^4hOA*YsCMnM#+t&|m&;2d(LL`VDa z>!@HQIh2jqE%GM)2!2A_xtS@`n~_!12rb`C=j<>IW_jN+@r`S6^Y^vLJQ*nTU0M@| z!bUu2AjM<-yym+w6#J>XBqDa^g~Vvg0$5WoDm#;tEL%uHFQ$(3sgRDk1Di5FEinVd z=OuOzEHPNCA?&Kr<~OZ+bZ{qOo{uN!n%=Yep?0(EL>MV6d+qu!LIx?9S?aDxvV70% zB^!$EREt%3HFx(wwh6rHRUU=YW`;mm5<-UPFAFh#?gJsX64mvWtleu8O^A!0h%3mm zm0dHd;9^;s5tN{8$F6iT{Fb_~J@Fo&G{{|3VY)}dh;#)R3XvnSEmN6-i(k}Hm~O!c zi6YD}ru!2{0`>J_PN;+EcK zy{Z=F-GFh=Lm8tM{Xq}su7ZH4o3kArY_6i1^LI{d?ggU;FW^yWTInwZW*99OZgL5= zWMK%hz?!dc_7@o5{^)x6+<30!Ndr@R$I{LGo+AaXjdbBS+0+So+?#V3`>&L4isxf- zS5uMH)iME{_^roIl-@3cnCuCBC7QA7bOND@lFK_Tbl9gh*^2 zSE~9;df{rU+)8;i8xy&(zcgsAe%A{KgHvLa7AMrW>ENp+@sctsrhJbhkFj#DXC4cU zk)EfLrl?|t$=+z%iVQW1&u6&0y1tx>^~Xik3V70@Ww0+jT&BA@+1sXFS?I{EteA*>B&wNo&XNxar}nXF##QMi!pjrMCj+Zpg*h?J^;{ zCVL6K)Z!JwM9Iy)GAcM9lxQRxG z<);CEe@0W^-SX6%S-xJy$R&XY@`EM$Ql)`s5bVP1EWdBNvEZ+DCsGDzE7?EVUcAvW zr;QdqSMuZe_(&K0uGmpoI*y*YN6+AMPxIgukN@El2>Koda&j}NxbR4GkVk*IvSwO9 zdv?a2YFp)9Z%AQ(ysoC-&e4HB`lSi4_-(^kn$1wWjw-44F^97C3h^TEe(rzu?HS(p%Z4Ve$W6N`?6H`q{_l)3{fJ+8H<)3GX+^!fe_h6hHiwfoU0hu7Gf*_V~Zk*5WqDa zJ$ka$ByQtWTP8GIQ1_M9^T#OBj>jcus48OUa%scPiwmfsvrlU=Y$X(u0ZEM9Hpbp+x6MN+a938o!v2PXH=aa zMVda>PzKMd@Qb6G54>d-z!;139WgzQEakjkPx2-@Ejea-jX{%nZ!y-D0H>$$Ko{?~ z$8oS^ux_FiI}FyDb5)E{>zc0$stCvs@3B`DD|N(632PBMon*I@trwe`7=({QG^Zs5 zQsh=Ub+<_Q{73m>!gaau#gsN!m-%Qc4bX(UNjFJqx})DFpx-4ju2=!?^fafTY$!^X zQ1}zoNYrhGHBP~ZyRBDbwM8V?v9l=_SnUgn?K-cbo%b%rK;B(Y%}(O(+lv#bFGbuX zGeMc8QDnFX4mpAqdj3CAQM3Jq*<%RhKU8&ILE`f2(8u46iuGvhW^Pel0I5Is|HYIWw*j@@@J)qtA>hvIGF+Gs-L3jM@BpV_8 z7;NXq%`&ruA6%J9x}v?YY9m$DQYUVvDPYuGj`fK}W-otJwh41gmk^=5Ym7NLJ1WSn zwn67y$UX;LOdJ*`8woCc+3d$v@O!O^wYW(|i4 z9Z|>-G^sgcK>kf`tvlm@dRRcdQg?k1dB16G;# z3CNrWst&(*HM^679%JbMUP052C+@O-uy6>|Y-}3s?4rxt-5iqbsI=|PReSJ^O0R3v zBPJxG`%S~KkKc6~%)f6h8T`d>x}&GpG~O)NGu)~0glT9?iz;Rnh|~d1GfWyyWopyI zM{)IC(kfdkd+LzYC?_WTO2*Z>iTdV@*k)Eg@hbgNzPH2XYevCJD3SxB1{5Fj3DUz} zlMT~{wTVS`QudoXz9(&7gwQC7F}gHUfOt}rBSV@$nwki`zNBf|;y>Z+}+C`JSM z=)M%muSkURFQ3!JU~Uhc_l$1gr4EOUTF)PG+amWBZGd(iw(EZ=BCLrm}uqp}akE=@euT zDN1kMsZYG0Vra7>UzrVLX+7gTNwzmxD! z5L8XU<5?~U9w6KZpecK!=ogQ7iRV`}A7#%0QD6=Wyrxs#m~0|*(_7OACK%QxRkb74 zWLHmur98{$K3*Y3V{A(#k=VHSO%(61!viV;6jyHe9N2&^9UD3`Wgk=MF$nc&=Z8hkrw zs#$zk+>Cp89rHRrsqiZn%Zh2OIxnT-uaapG2>}#iu^(lmS+$D13P7hXj%+aJvsE?+n1y$%6N){j1hj9Qel?g_eO zDt%k_v2M|`7|J+odNnv(-mB}Lo)gvODoN9o@M8NtmLj0l+I zmrmoc#;}4>FmW_2Ug$lArjl!Kh$HI8aPAgeWoei_DQ=XP6;sZSSi)%Hgfs+l_E|gu zlE%N7A0H6Hqcs%q^O}VL_-rw(QbcQY{&4kmiFk+XL(r_s022rG2K0coT~y1P3Mc^`O-@A-b_et!4QJM)`6 z!#K{F=h@HNYrWQM@4fcgd#Mq*t)KD3lAW>Il|p~a(BeM(6k%()t?JRmSH9xmzbFuy z?8Casxn#*C92h0FUn~=sY=2DX7M1=7u$=qpyma1MDg}B?Zhe;=^ zEze8{^-!a$NW5RCbT>z~xG`402@_sA|rd98I^4?65Oj{{qY&Sr(YdzTySQAyDt3}$x-w2LccuQ6wz z%@PBOp@n-0Ti<4t&Qajt5amw!t~&#x=Gp<*dT{LW{K7UTyu0$7jnL>l6{!ew+I?s2 zdgA)FA{Hw87y4EL`RPC!&iC*iCgkc# zgk-9+djti&JJ9{DCx_K_z5<4WJvn{xUZi> zqsQ}dNQ-B1ua(@m*i`7Yiv-n^@NvMEk%Jx6&L%gf(LhFy$C}}x29vn2$MdEsAS(;v zG5>U4#F@hv*yYQa>kc>iRHZIh`E~F`3J0^DFkv7DJ1o5Bne!nz)@^*zmikU*if=Np zjoW|l5|}Hef2VqAKf6TTSO#s#nb@6_o9Af8MsJpFmUN*@wRj$6xO zNqEmHqVHp`*6-b3F9|?#2A7==$e7xmanp3oy-#r?X1e{%OTM_ZmU#O=QQq6$n9Dce zm4-e!pBwr&JJJZD=k`cAepa8=U3mQ#ql0%Cozwaw<)6ek6(D60`fnAY^lv^jhd{xl z{fK|F%aHC~^ttce|Nh1QXhsc@HHNrciZUg%75lynQMxR;7L7)!6s5>H_5R9VxwzpR z772F1n-#Jx*mu<=Z+W}!j<+3V|6gbSuUj@fh;H_0v2Mr1z6L|5Sx<1zJs?%myHU8O zY6EW6XMC(?MNYdX8u&Hejmu;1Bv02qwJ|-O-*OIgZ zO>R>nfB7r{V@Q-oP zrz@9qQfetQ^FhrSUl304$aZ`-Pl{>p8y#ps^nb0$!_4y?^nIW|gUH&ZK5vAS zT!tA^H=xlLq5#Q17(OxpdM|P|e=u^7baTygTH}nmM6lJV()fL!?@0HrM*qjJ({est z5Zj{?e)W5~?pylng7>l%J#7N64D=Eue|*O*x3ut|&;0q2I3FI6i%urOiuL)wK65w3 z08VIy4&0YlnT9QUdzZz3Z}N6eKLPtw!lbOUyqgqG@->a*$@X_CcC%1s=EwF=mY z)AuF)2EIR7q=u5;w>s4g|Cr>CU;omz2b-9}jL<#D=)M%!RttLLB$9kF=CaZGAEf%< z=^9qK>DpAo=Th%$qPxG(6Qf58M}xE! zNFbon-an)ec01ij={=LVSKRHF@c-xh1vs^^`-fhEKASTe?9>A_AHn~gv+?o0dolh0`^Ep+%$ho! z0$n@nplmM9e#^aBzul62JtP!86D89byF4`*6FVSw7kfPX>Q?RbTw058oP3c0x{> zgn#m@0DIxE7}ypVy=+`Lc{OW?j){p`?bIDV(*tst_4N7t`B6dP4%bb~8R}n*S^&WK zWcvlI_C@c5(RA7?7wBA(F!5wY%RIpqmh}|!%;)QIrh9KnxyzOBL1{brq18#OTXlcd zr|B(RX=y0aRp|EONTH6(sLr!>Q&(jPyuS7cv{Td@KmGg99m&C!+P|Qcfha(A-QErA zD%A62qM}w`h>gwA>NC##Ew*_Fut1{=16GspXOs5>yFro9m{!{-ueOs{xkZpMTgb?c zY-ip0gjUk~I_vxTroik02UwZ`DdsAA-_D1kYFiiWT~DOr(zo!GKluF_V}Vue?Oq`* z-Vm}ewXw>xm(pM z?|5+?hm?!_qu%rjAURI0*5;rPEW>E~ZL_v@sHVT2u;@aqwpEKC<*$2aG)+C|jvowO z_bZL&D6_sV;VLeBms_{3`I55I={U!E=-c+TwYGbinlEhrkKA>1fZXdoyf)YOxe zxH>0=bErZ@kl(!>(~a-)9!Ub?MTyZ#XuEmu?dIt36R*|w+pFyer~v-$r}f_gyTouD zw^c`tvUREhyC7H}mhMZ>*2dpy7($za4FoV^-jV&4U*dK%#j?@p9H_~y{;ukN=_MZS z6VJaqqX<2I>?g`H;Z&OVFk+IhWDgA8E!eZOK0RWH#5rBx0b)ew)|K5BP ziqPrWfWYrB)J$jR9PV=gf_@o!u*jN;^N$rqu*Icp;aGa1{Ly|lDxm!%&;nEkVmn<+ z=JLdJZsjHa^r^m~U8o!W$<4dmhUp2K-(d2GZ4hZ3^rofBX;%l!p+% z@4S39GM)!II%MJG=lb!2Kd|*4Qm}83^4_geeT!%T?Q=LC8J)8;5L$AIo}#XCouZCS z38OCevAxoHx3N~aO@bccP&Zm+#OhQmVn4$M%v#kDT3eZOX6oWaClsJOj71sTW0Su# zD#m6+w#f^U&#PeCMzNsp;oDki+u`fwH1i&fMd-)cbT%&njkaF)cxHRETz$9WJtijb zV`!dL%d~NzMV3cR@VR;U(tDsQ*h7;_HqM{?%*ef(ExbnJA_Fa1Q*5gM!8pJ5S9=MUX-j{zB z76ZWUFnf2KH~j0)_G*6}0FGM79rT0#hu6 z8>_6&U3Ey5%+Mos+`yOvE4>4X+O(|`_~EQJ^ttv0vxE$QK*#NxLi`IZ4u0+$Hnf9b zwxFZY7kVRv$$L^LQvN0{>KbuWR5bG3eJGWMA$ej?l}W|16t9oA{-xIQcZrQp-guLH zV>BkiAlkYj+zXBS62GO&Mg53w&u>%{A#5=BEe^Q2b+Uevd}S4(_so{~Fq$nDh5Ugm zOZQ!Lf$I&2r=#3KuNQnWq|mp)_LXYOp!ucQVIy#>!Ab_nxXkA(QPcj(@Uq#4Ab({V z>X*LX`kojm_PB3dY2p&_+Qwf)9%?OCAeP5@Vs<&y?HyBIW$4t|ny?}Dz6oz&j;`2} zXH|A?&g_TEyiC^?2__{nW_o2^9}GyRiAegXv;Pb=NSQF}>^qv%iK;6GX{anENyGy_ z-A9z@6L*=ssqv!jz)c4Gz?B`sLc5w~{05i&L79 zQgTb|%XUCQv7j8N`yUF?RZXWj_(0z2#UFI3FkEf%#5b&t0iNPSa?B2S?2T)W(E`C0 z^~u~)(qrqE(e&N&M!(Na7s_9$9ngy!PM>U8PJkxInwOT61kp>M$L?L%tau)I?>smd zMTSh)&=|sj_2lpfMR~41A{b9cA(wQj?TT4_DE{1OIYT@o2IF&Soq-OC&KcSph9QiYQQQEo!~LZEn~?rT~lYRj&D@8VZ;T^ZUgr&3uoH|FD_i zyS3P{_cDkfYTniI?(;F&TsR4&!MRnB;IP}Nj?;>(ymt#DvMR?EQUcdrDI0nOAYAVf z*Wk^xde{^T7=JtQKl8kWzaU&Cc~>14O=(G$Ku82o3$&TTJNtL$+uK|cWX7DRNMOfL zh_9)=67IVLulYAR)!a`h>e+_NzsJWuNb{FWqm$9gWSJ|$Ul+TuntH4F%zF!?jR*G< zpT5PDDHaRxhq*gE*&uHfCH!z&d}eIx+LY4P$ERexOJvcsyJEDGCnQa`?P*41T7~~{ zW-{{SmGRz2cZ?equJ)enk{X=da2nqx7wO?OF>2S3)6y$_B(v2@r zV6H;_7p9-8bVXQ!4*X;F4itY)qMo?d?Y}kK7MCdit~{o;U(P;-8-deG`RG&g@TlF( z(2VWDX zsR=Of@WJRmE$m$6t{P72@HJa?<$>qf@@fowf|DQ|0))Smq4LRd*@fV5n27aXjQU4q z=+a+CfI{(0&$`~pvD#LVqC$&vX^x{(*q>*2{@95+$(#b=0<4Q@(m`YQ>w_gXSs z>C@S4lY1qmG9=b0`NlMo+q7N~h_L|!XKjSI$TNy@ze+K6h^Uc}*_rEuHtFHK*pq|VHSz}KGryA`U*Y27elmv2{m`Ji;tmaS}iyt3c@b_8uugLC2A?E z1!Fb5D-5XOwl=Iqkf&SoyZR8*H$TRH?TI2umPR8fLoQCB4GcAyoBz4y{uN=t)DaJ~ zzw3DddKO8412qEj99Si6QlV)tp z6pv^i15@hz$MdjJYsLSzNPh4O9p3XM-uL%t(6rvRsP*_Olln#Mw_VK_hpAH5foMwQ zE>t&*2H9<_O+P_O8F}?cb_dPX77C?1DK*3+{I6UEFn5b1+jc+>D$dgsN)H?64(A*T z&h}m-pr7V3OZ=)8o4@imW>n$-(S0M&>S@NaB5Lk#RJ`sVLqLt5iNhnMg$E?|`_=6| zUr9M_6*;mfK(ikd##&xCk=lJKm9jH$*DTkHP0I$%Z+A$1e*uZhpDjziSEbZJoDN&a z6fWln<(CTQg5eQ1|YLsWS)lD3xL zRybjq$JN*zvD;Uv6Z&gOOO6fZEJSD?IIKkeO9?!5w8&g?kzlXoB?TAaLZ?yeiOF@< zV4$xSnC$&-J_khif#>x@0y$fjYaFArc-_v+W7g23-w#f)J6gxN=5=Di8)UttVkR)5 zvHHy(-Z}{S)P(X8f&B&BD#8SQiyeAx?9(^J)eYrpA4(KqW9p5>S^7#y&5-%oG#Sgq z0v7GD>rpLhu`}9Gf)hIrJNoM~kH_Ffoyaz_$a(8h91j7*vt84LVV-;rUH+S|!(-hf zlW7zYYw8|SUax{}Vgs;x!VkmUYK|wkL%v!g8Ol2nU-};#W4`YcJx2>-CM8qAJ+LOo zM5-h=ocnEQ6xrtZq&84sLYd0!n6 zXxT7M!_ri%|8S#N8}+6KbTUlR#h2G-zo%;x<$iSxkBXQ2~qm`qUQV-L_cfl zR9=|Vlr*jZC;a*geyPEN5uGklV(Y6fF2>FSn{q>KB#RoRb4^A-!%l=6NJ`Bov(}Q= zO4B6vPl2oq@dYp?tEhl7P|w3Qx##y&nr8G`x8%te%-L-S3*VG|zCin$HtJMnCVrnr z+@(FKr01hC#++LSFQ6+55%oMVAk|PL8?XqAxt;qqi?F~(Trke-Ny0=M2X$ngu6TYI z4B50YwiC(S#(PPx%wL%VR-=L~=3ei; zSIsEUf*bac+v0~}4k^CfpSG?%S)A9x-GbMtBo7k(Os&m>(?Y3|wblHNvHk-t{_;bj z{JY#CY_Dprm>yJG4zb{RU@cwEhp-V-!-8f1^plA*m>q+KL49E{s?4tRhj`0R62ty} z;2>1rE6&?dN!{q&TnuK4-1TdEO{nYY1ZN{kMiN>`>d6ZZpJ}%(`Ysl<$&%V~?5rV| zM2=1p170iERJBOr#V~>Kq@mOHQG7^@1o41@CZYgB_-AhT>awlNPVD+oRjRF?PnWYRqi8%=MYj?^$svDht0b_p)9@svx=JA(jnz@sns6V< zDr!AH!Kzl0hoYhzMp}2AU~ZOP<&wI()nyc9;<;BwI6Cs=)nxqolq-7O@79?thSiO2 zso=87FdHhG>fhAwZkYTXg_!k6RA>Uf*U@VXtCy(>N#GV>)guVU!lu*_>Db`*IaG=j zMK9d=p>g7gS&yIDpOw20R9uo{VdU|1({j5G(yV4PYP5B&CoIs0!R3>$s+6o@Kyv-F zTK2kCV2Ri;xY|&-wmAJfA8Oe*f3DL%?~Wep8-YCv3}GXE;Mg-`r-@hfCWS&-z3r66 zJ2#{p*i6yY)_8;r1Q|EU2+0!!fr%P@V28w5pJqivMQ?K*A^dlH3jB$sqnX z6Ehamh&fbTq3^6p#&|Aazd~&Eg|+=;h#BQHx{>K+-G)x#hs;cj<=Kvfu6H3Sm$r{N zO~M8?566icSV_L)vdyoR4)1-TGu%%{lvCgQ2;$M%Qy+MdJv|$5twyyTV6PROE>lGUtuu+_;(byokm$Qsw% zT{6Tp@oVb23Ygm%sXbQF%FlC}DOclX-_a+$o+?HLyb(E6tixwDJQ+V(j9$>_s~B$M zyFP!yK#DJqryKsOI!y1Cf3m|P746fY;&07cB_-yH^rMpnfrp%eUL;?^u2*Yc@(?<$=A-(q7y6OH{WkHYp&Ob|J}3w>7~jOIA@!D$`+ z`6~76TVP-fm>nlY=suHc()UD?YXW3c-Xsx-o0&He1poG2^~48%~+_YpAc}C z+yiTLcB_6#CzflrK$do80Io-<&epXv)fywWB!j*tEb@q3<57hMq3Mn(6Fh2bk%+(Q+Tk28AVqb?>H z62;bErT7wFpX5-cPH1F*VYf~MC%L@mxc2a(dBf}>x^=8>67O2noq|ehRgLU#wBGvM z4p*m}n=B8$%Y?+t27#M5=&Vy>$Ir&_^R zc8a(@(BWc9Qs!QNX2AtRvf{@&YR#hdjTfBCXh~>mWy-;lcuBdv11@)#O{;uLH!J$F z$)W|E6$`>-xQ2&Km=LcBW9|+X+-Z>xMdy&VN~9KY#lPeZbGCSf-5Gx7YE zFMpz%B?2SF4@OI_YjajIHzBu^s~2a|*3SonHDk{EiO*7Pg@+V@OCjtsRLeJ=qJhXL zCFWxCE z1Jh-Gbr9?vr2|=?u+sd92nHfxo$u}5KMtdx`s^t-=8hS3MLCiIf$Rq>z8Ohti5MnR zQFA18I;iURoiR3>lEZth#P65ID$1f#K7@U$EeFUB3>z?ON+t5YJ zZOt!jAX472OFh#It?^P);VwF(5Pr;2{4z*W8qeq^(VtT>AwcuhNe(vP0QR}9AD+)1 zmQ@6Phx?($-9hOxqBq{+bScd0-daJDHHk07>sMkYO$<-Uk~l&r>0Ce$4U8X8}XHgVmVZFo1|g`p#R@nTg@%?@zQ^JX@*wKNCvK zlNC+FPIgc`gFG@_y4;pDNussn=lK>bfW%%MjKSwdx8Ya}$(NLIFQCu8a7M372){c= zHt`4$S{83*bJ)uP*#FFBlQhPs0f+NbX{WoXR@QNx&u?kcJi)d@n`K|Nd}&;n1()9m zz0bWd^!Fmip2(@F1br(_M>%k;T>{oaWoZA2jV6o8(CCI{%j?23TNeZzyr(KnO_qL=rP6qM6i`=0E;s$vy7dc&gnGL3s?KXY!N_qK?Sb>7us0^{yAo3* zHtX{3syQ{~JV0ptF~av4atLyW^wVUU1^x$c6qTJ%qiHstZudbd1ys*!SYkYK@B$GZ zS|gtuwv}J6ZH|$grSZV_B99B<|nbg*xv_ zmvpq*2}ML-mXkFK8}s3HoAD|`QT;R-jA6m!o!}M5NF}krJ(68X+!&wVke{WlN1II( zYGWfHOo`M3TXe`9{GH5S-nvwC@r@rwt~{9Q+jBJ zb!UspfWto2YZO?R01EMnZvQ#A#-ds+N;Dj%*M#YIF`6Vi|9d6@6oD_L_)`hV*j_@q zyeu{)4vhbyEM0!=ec#!8sTK@|ckT>EKNt-elG%(@RrkN+1fz=K@S5-U@OiG6Q~Db; zZ;6_*EG;+INcv;c#jwhh^M$7KLHh*?YNT{z z1e@MOC33!GMHg?|GTIpSns;u2`bCuHkc4+-RsY!Yy%NX>{V3@MHJe}*I3JF95sl!+ zoy55%$jA<)8`zLR5vs5nqnCGOhRYEC54p`z;O5EhKy}9)zX$Y0enxNpA{OzDw@vQp zd#O&jC#qcAI0R!vh!+c`>+0yoOc!Sc&GFC>kk!48wZoi7c)EhR~4 z2C6QL5TVMGRo>WDXMET=B1I6bL6n{;URc{FKBL7PG)`+id9Mou3EylD*KcKy+oz5# z=}>ASh%BKoo{9%l_$Mk?AH125uCAC%5BQz zz+=QB;6|2q)=w2By;Js%#4{0lQra@2wg}<=3VK*S>%kl^rYCqth=ttW>RGC`UhCe*a~^#{1t_Y} zERw}4D?yvU(_Jt=5*^)az1iYLwDg`x!(;ijD_mi3ipwVga+h=@DBAvVjie^qV-Xek zSGXsT;!+1F{3c~mkZz+JcCKh@k7Tuc={`0AX7Z^Ljq^qyJj( zL=oY@%Pco{(`QevOaI$?f#{zdH*tS)NdY{*pV0*ueEPA=aY)UDbjah*P!tJK zRV!rL) zOo7_fFcWI6XcYwWpD*A;S(wxB*WmDI(+MB|{SQ?t)Lhz=NTa8A5#GKMf4Asga{Ns$ zeixBA+2a>0j5i%cr}<&&frsJN)x1+9nkyK&4A@No*7lFJBL@#%vYKnf0ujRlHFa@0 zx%x75_Ax%Q$ZK7W!P60vU5YC>c0u4C$$>?Q!%knDlky+$Vo#}v4|>q!z2~FpX$=`S zHG^7+4wF*&;+GiIGfbV2t$(zyjMlFWmXu$YD>fHZ>sm?*)^Dl@Hs02Lz*ovm?~^RB zRe-~)o{4ImT^O7R@Om{;JYm2xZYk~V)o{0Zqvdo71KrZNurPc41_pV>*CyO0x zAm`fgp>L*RJ;j&N=5hMwvF$l7d(yZ_ml|Dd#Mc31Fm1G7%TJ5LOOJu@gxh0}>!jOI zk{b|8N(R>{^Y3oc7kQ2-sJ&MeEW-Lpxl1?3J#SL1vsSl9Pk?%&a90MRs)Fh zo?hdmGofln@A1yu9Cv9rL!TIyLhN=L@agQNOT?m+-K$9IT0w&JdSZc;K?UujLPR`l z=-+IafP;oZYMNBru@KxVTbjP_PojV4r++-7dB5zTb(k!6p2R-%IlR!Z#Un%L$MkhgW7uzM%)Q2E0{Il@7Ms?bWZZ zZGKN(cho=L(*N>9pnBbs0i_Gl#x@to>oT@_jRZc<^^2+PiWmiQWN+-J0UgK;c zPi?y6-h6Z!2e&0jd*Zid4! zh-*4hzRLR`s6VahxX%TU5%rz$0~zX68aw3n`#2cZ%Maouf*_{hSzNQ%cKAPvi+v^f z2CKg~FXVf>wJaC$4dzU~=^XCkv!HtB7@V|{q;4$9Q3blfCO@Av<9BH*V9WFhrpzsF zZnSZKfIlbUefAT$dj9z9%`x7|myx+&igP<57OwQ(*w?$=NqbwAr&(Kv3g#V*{!;>Q zV&VG!nBM1_*#Z2&^iGXt{Z5T^*UguDCpjz^9=dv6P?n09V=5QGu+=>g z{a^OBwzx$ZYdhy$RRy*YeN3T)!=r-3+Y|7mz&vR@PrXV3t@KTC&doKu;xAi3kEbP+ z-%5VTZ}__LI6LJxVb=Dbx8!Oee;Rz&=#J#tm5Ww?{txb1u&AG`k)Lk$$nTK4USwRz z%{Jsr`^0;$amP72c1i)^1YQQ01l!2C_NP~`h^ES!D((x#Z%ZIgV)larnZ5UTRKB>f zO?IUi{o5rjfL>G{N_J2i)>BkEkzNSRxQ9h1gb!PB#XGC+*%?4RYoI8;{q-RO>SWW# zLgnG3gRl26Y{>=Ltoq!Hpk3eN17t9Kuiw1zJ$lp~E!6eHa7;6QAD)OaBL1S^H~Il8 zKkeL74@Bn+6AlScz$6=ACbU=knYs7N=xsrXk4r-2R#1+PSVIwGID>iNy_L$+LDYS?qnw%TAA}6NgpE`d~IK1;jmT zqIgEFpEvE8)3razV6YVr8W?fJ+@8+bYZ<;FWAI8_J4vuDYOmXvy+QN)v4YSs_&gXx z^W^JINkO(k&`SPejr_`o4BQk@x!~P@6E;L${;cv6dOP(nqqQPH zTPtPn3Wc{uFPOlWgKfJlo)|rJb*AY{|Cay$iAD95{xw7Ur5b|Q+=By%_iQ*DA7M!N z%Q8_wKErc8BEU!BC0_?)l!Blng0|_f+T$WE%Wu2K1PgQW1}6B`8bO8LPh}epwLU5! z`MPu%Z{v5xGnxg}bx)k5xt5tvL~MM`Os$xAo{(oq!4sN=r;S)UZ}ysLeaH}#m_dbU+-wV|c9Cm?&K)&8+^K`6*X^JMW`$Ls@*t>%0M zsXi*rw3}vcR=p362$x(ZTV7LTab$WCY zw$R@{Zz;s?4i@GtPx}#AnGny8a=xP+(6PTxbhACozLRv0ede@dUA!^Z2H1>_ofCC! z@U17(?#(J9_uHZ845RzF?3b6gK-RjSJ5k0e65rNDw9x?Uu4E)l)~)rC0Ulm{dqY<<%CWkIVUAR*3ZL$qW^Rx@Nw9 zJ8W^Wn_9sUy^@rFjTH%7`TqJ^=uU$VP{C0sYm+Lv8Uc$uUk0agTtL265+T8BUGZNM zg0t%$n`rLCf4$XZ4WLUnxWlTs$a?P&vxTqq-5tI6K-JJI|KS(5joxqkghoVzAE3uf zsMS0g)dyowb8@piRMP92GJL=Ol|_Fc3Nh$>*DH41yHxdJydIg|a7vf6*ns1f0jYd5 z#G7<{pO|3)Fq;5#RbKiH8t*;K5Q=a=I$EBp+KDs5xP=ZC$zKUtM;z3KLE4i!$>G4!1f?JsaFQl3f^ z+rSo-1eBRO1gGbXcqwxl=YW@9<{0^Oc5w++yvQ?-IFCo=kH$*GF zFVgpUFKq=pUf#Ay@m2giQ4#}S347rlcYAE1Vl!>5`* za*^GYC*z)-`r32wM-*}RRGdAjT(DRVpR#$a8|FhLTXl#E?dBW};bbb;vm}TPtVR7!hKn#KxvvYh?w2mh|*OXgB8r@fpcmEb# zF^X%Z8Y>xjjnHg;GxM%dBItm>l;DrqG5FwT&{zc)kFzloLGL@uF#h}=-6Rf3m|s0v z#9&hm$iD6W1sIFmP@})Z{^N5^I6&nir3|2+DsV&4&K9cbeTwrfIxF;(B(7QjRs6k{vl(i z$DOpad)b(P6PRcR{`pnWSj+mF^LBrN}ZMVJ~8lcZ{8QqzheXuerMnIH3v z$2Zp4Zgr#)!?mFx`o4*|I)=HzrjK0k$`k2?A0^}7{qsrSU!)H{3~$<|okc8K25bmA zYB58i__3a``I2l#+VwVVyLQeY>?9sz5vhm~+LYuZlFqeMd{DSM8$ zjP#`MvB;i{dZ(nmSl+yV|6*hI6EJ#KX~%R9(%1UNM#{@8FLp+!a@Bjg`tHX0+&W}O z%TF-=V@fm@XwBw!UCNPl%AXz~CHX+$6_jp(D|+6@Vd=(E-%T@aXBu%nxo_H1oJDMm z8MnL^i}+l2xVr(g-gcyEk9O{x()#1|60X@=oo88|-Mi58qu6FwbnR0Q1gUUJukrv9 z`umomrEmQ;7gu@mR%KuQRayO$xo;%B6%@(ZhmonPo)23N$F`Szp*nd$L zOb2`pFpmzXLwe$CU!$l0&W&voWIFJ9LyZ^;id2)>%ht7Qhy({h zj7xsyI*C*nP5zTr@?NiVOmLve&}8QZ8_DeSt@ZsBREBz9F|nM)PY$5JXbBX813CRH znS}99fru~u@&o(PolU|Ah-^C7k-Ptx^>%m>frkz-L(TnMzTAVw2LZrUAprjsR42W^ zUuVy}YoTdhn(Y1gkAHzrCw>^=aF1aCPz9*2WRMJ4JIP->h{N;VIla$$CZ@oZ!C#k$ z!%K&?3;e@hcmHzF@+1ERrksHa>RB`Kp){EvTFB==jtQ`i`9Ja+OU=?@Mc#{SFo5Ek zuU36%GhmC!^4EgIMR(tA-wxwlI`aG1fO1U~aQfzt^ecYUDcmdfj|I4m>bc|hyWzkV*m{g1pHnIJr5*?W=M%@OK{nWkX8=8(Wge-(tG`48!x z{HL7^qI}pYLfIzfrl0)#b>&;VnM2(qQbzw`0#NZSZQ6nV50YEK&$Qc^L+xc^{&BBc zG-2LimpmP6E~zA@^_RhX5P-+9{(d0(K`&q5zcSzvtHVRt+rfkF=@LfEe|15d_>a8A zgM1-=wD*q_bHmSU07r7kDs);x|0*bu<<4j9FaFa`C9+LKZ`z1#_ICboz^#xBw|e8A z70&3h`U^Ke#kZ34{~sjx;ei7!@&Z83`unC_Q{XKZVX5d>Q0G$q>#pMP{}azXE0azA za1B@!JFieQ&g*m`&vX3@EAU>3LD-fNBT`Fd_2a?0lR%r5^338L;W(B=n zmC*}wKN{G$#1(G8G8^jj`vHWWL4SM$`t?K?V(Pz>gX?QdfZ{m(DB~&};cFm^O3Tq~ zos+r6;NnTA3Ig^Jb;;zdV%Z5$&Lr|NG{^)Cu~0N51PH_h*ZeXR{qj*HO&Gm*yBZZ` z%oBACs~yN`0)O=mS7toVZ)z=-{HAvBt&HxD*L*zx(Z3(Xa-DMqKMgvW_xJapR12#T z*k|)(Ez7~A6ZKj1z^riCdwG*9Q7`6%#tR}-=EDgCI`r>8RV*{sshh2Wy>y=5h> z^=dqVq-)Q6g@c#--V3c*99LFyCnmrpNQWc-?0Z$bfOA{}|{mur}?GaXmNb+Q5LR zQ=V0C+KL94Y>M`F92`nyn}{C5hWvDe^||Cf>t08y zSWfX{!vk55sCwMyOB<$$_?*wPgI^gZuBd3r`o1!|QJod6!fEq4NY3M%yVc^x0;x}b z&u2I#$dwGl&)OHuygUp%d^hGQ9^|In_dL{&&m)|@$=hdjJ@`kPFR*B*pF=O?WVGSd zG-ye(=>$qCemrkLuD^)jwc}F{`o)KC&nZaOpBserwvx6XCzYPSnn`jlGpH2&@$iRb zUtC7|nJ{UE3}cpBiJ>$(lEQw)r>(Y}6@F`NT)u3~*%(m~e$iWwAqJdzA5vfHjl0gLkT z%QcKs*aN52gC4V#0wK`4}yV+s9EEy7?w}#Y;)dq*vG`86& zgg;2+>6j~~I-aVruMy#kuI0v0 zm=}kP!ST}(7F4^Pwk3O4qVpfZ@Pbm?;pS$*jaqzs%-*y$_`1ym;yyLYPZxE9TYcj+0As@C@FM@UYDzUd*8@J> z;Y;+$a?nUzNs?tp2aKO1j++=;9^;Y*Kj1XCko$VfO*QC~{<9PI5@D5< zNt`q$zu^XlCt6upO~u08v!s!a7M96E{0yKZuV8&T{O>ghdHW~|80id(Zw_8vFl`6YacD^;hq#wnSi@aNjb%2)o-c|)I`us=F&01NT{wkucydD%xs7U-)6S2s7=Sm z@jfm$eqCKC8?=Ii`AICaqXNrpCCTH8to|3E9wU}faNS#9OhlW`^Imc~x7C{IjU4vb zkrb5npB-jY8zT#c52ko!;4odFZjM53xVN;0;RK(${t5aDQ{k}i-3VvFwd~0FNyCm3URA)Rw zL1(C>Nh47O#qm3aJzHt~H-c9gXqpnEcs_2*VHL3>^r<_lJZM;+fexf1?1BVLO?WDLb=!cev->?qTKFN6>8Jh4m24TJv%!98@U-x%P zlj^FH*%DI^P=4k#M149+bfbbRHHvYILXvg-m67nW^&k9A!I%PNc6I%!r&>IQJHs8HtmpM!j;< zm%$&9zIyyr0j~$PY6?)}l2KHmG$r)%tBiUfG^Wz5fwz-BVWSZ!>e7ZY%@`(;5P4ks z)>F#JjIyCA`Pag!`k%w)3N2DU@m2juN0IIcH!0{0mMFpLvLPyQ(0}w@M_LC>DyO&Y zaB;IB!X)3|BkplW*q&`Kro|31!SmpVwD8VIQ}8d>hZCu<;`v1o8&ipFVws2Ary!4w z&G}VVOsN>!E3$s1*Z5p*Fst*rG^Jy-jrm}Kd8iLHCgiu#O9=w;&JO~LBe_}mqrhc7g{!NJr&goq}2#nX8m(=>;3>!$0U z&1^b3X2bJtN>FxF2gS3vUi24)aM){ci&5Y|0)nFluih$lwC?7mwsn zpX9`v<@&imv&`__1y$Vg5H`vS2OKYGT~%pDo`pf=Lu{mM2H^<6%&8sXduL2qpKL~` zpQR=YSgE+@VFWb}$gM)81L1q8WB2P*Dq<%b9*ylk7wHQ*?RspeGE?tcdgw8vL^}A^ z9==YQH*-E`O_F=1KPlj7U;G%@+YQkkD`R}~i=?*$y|ji0PA9JIg`oHg4o4;|wjz`c zd1UvDx=fV*6ttF!Ts8JrXum6-H(Wi~$YpCkPk64x9Xn7OFg9zQst7lz1xuF8%9CyR z7CWXn?r-`Ohm)GH20fNTaSfSdLUFAXlhV>wanK^{pyZr_-+*eS=456)fnAx>oF#1U ztv0bnp(4k-=W86j9EvNP1yId-Be0UAZ-YzaKx0GN%yeo#MXPXz&Qq}}3x=Q%dT{A= z>VD0}JbAXb7G;t#P)0I=*vpg+Q>(%v@zzgTbp90?=ZD=nv$XgNCDyMpvvsDK&~><` z6LxSL#aO*5wR0Rci#n>rK4nz7AR9TNU7Nk7z5Ws_K)njwRrif0noNJx_*JqcI$8j^d-2m15r&S)P0AYk{)}bO z^LgAMkM6l#pBFq731M6@&qnxMAQ_i?@&w-0jx&r>GqK_Iu-J^UF5c`ymX5SgvcW0S zBI9O)o}{GkPj!loo0Vyw4Gsro)T||@a$zK$>%H_}D~Z3P;o+;T8h9r5(QIeqVp4uD z-FA3%K%v~i-TjTK*O%11XP4n!Gr6@c@$ykhzL2Kxs93d6&ZgiR{D)|$NhwpL*>!vm zpMv5j-)P~GlHk0h@@!B2Ja^o>HfwXkF15lxi=Q!uxfrF=JWJOk(6k`8w?^cpWMQy& zT-fqrzmS(<8=ui83r{td2i*Hy#{FKW$M8E?AAW&XCUKWp3x1LZHAT|roqo!C=YCT^ zsp@lKPNYhhV{mfz;4Q2k4Y5OrT}SY+SG5UouG0$H&h+4|@MnrhpFXTLf((@i0MVU# z^_Tkdox1VC9?jwAyXsU2wyPiHsKaYUvj@{IK25#;QDlC2t z*F|#H7S0ZKC`A*(M%N3A5&A)?I?hH@%FBoKeTO$$*pXZ|I+#ea_4#7DSN=D1LR&ZG zT&i~EXbqarQ8>BNtePK2pP!lS_VebS>#jjK=a0;DEIKgCsjus#PxWt3=D zJo-!`_lh*b5AS<7LvlQ5W#9juk!K*j@BbHjZxt2ix2*jJf(0j7a7%E4dvJGmcc&q^Tae)H?(XgqBtYYC9fAdy z#`QG$@3r>%*8axWx98%F(W9?g<~yb4tg7Er^EI*vSA)V0NyxC?K0D-gy&DW2Rl-XQ zL>Vjobr7IO{YQQ<`4jn01IE>XaA&nbU-A(t7O$7^8yUDC+%=NVoZsA_*kdh;WNLqmKsf25+}0L5c#apj>LRru#y>N1&{1_=5n|K z0%eq*fShtD9D9p`amgVDYq)TY3tQ`N*%4B0SU}D$gSYE_sImsBA>-$Q;4&7hxe)Tx zGUOj~T5ww9=1WnUl^Eh?{$f+~a)+9XFlr{?YjD`Ho~#K!>n(8{Ia_a<{A?OdoSa@{ z(@*kr(;2DuhQTEV$8<&lEA8pr+gFn&NOmi$cJfF59qs+q+*aBq74|RCHuqbk*sjSH&V)Vyx(;% zgE-xWhdMB+SL14_t^#p=zfCit(iy+y-HFve94G3pt?Ai1V_)QaXr8n4Z1T(~X1<23 zA-Kmkp**rWF?Ka-f}B1$#L}n|l6$aN+lxk(SV+wI`ahJOc@aI(J{iw&?$veFLLalr zAw|#&ya%l~YCb4-Vma}E&)*#ZkW-x110}tD8c=}i(raaZghhTTZ7;?Q(&jZ75-+BT zZa>+w4BhQdo#2Ly{2DU{GvKBfU~lcP{Mw5F3WXmFXKuKuo!-^VJV*`kYFu7z?kiq7 zLyeNc=zNpj&H%`_u0)8zaD6wMKxP`OTZwE=y>VZL=Ol?Y<9#j7C2&%5}KTI{`C&{K>1X zO+9$cppe|m7L;MY!#Hkkqx|MyEWiYa0m#{9YAR+tP%a9VcA7mY%YwpNiYE$oJwM%} z+8XS1w;GP#)P1)=^yb1hApjlzc!d>2KP#U;&N^%tp0w3P!fi#x@W58pMo8egCb+u- zE1A-oJ|S{v8egSl&6ri1)wA3|rR<-JCuRJ}rS#aSn~2)ihmk+6{ljDlY@00aK1A}U ziU?*PmqAQjdXTIr`8<@aETUJ{Kh)zJJYKR#y4&b91e|bH?jM92?6T-y#{#iB)j$tX zxXlw5M!Lqk&UDUn`J7N_;#qLuR1KN8Va{XKACj0J@?z<N z^aA>A#(4ZKm8yRPGeE#8Rzf??Pdd0s;gdz!Zzc3W5e<&!CaRB2 z?oa-MFE`f{yF9BwJw+Dk?Bv8iF?j{<>~+VtU;xmrm*v=0X4z{=mEb#yLVC~GJ&Q(p*ho7gl93J^~`T?)QA&5Xdsjby#5(_!L91S%vOxj6H2^mszWD-~A`Hy^X#(!NP;Hf8>L z^4>yEO{j?+mm6c^GEm7=0uow?+M5-Y;~g9~L3S=r>sMT1JT81z_XA|zxj{&Sll^{? zLzX<+rWzE6wi^MRmKymEL9|WN|Mucz0Pr z)#1Sgy9$Q4&Xo^l(B!sm-CFvOMEgn4=~Htw8tu#K6*r$BSK8Us(`#moztqLrY0*1# zv~Or>73s7OS1x<{kt{QVDj{d2Y|Nk(v2 z+F3yKr|JSx7yDe5xLRhSy1gt&6Sv}6w%kx6>ISwl;R<@u1IgHqK1j}Gf|} zjJO4QN3jaEQkA$A zZL~GBw%v@k2#Ohak+JR?&t^In+ads;h8YhW$^l|f7Im@>cMBy0+e74Q55)Cs{|ZfJ z|G^qd56Qbz{}#boAIoWng(dAM*f}Vp4wLp`=&|eXQfuH<26yVG88oWyM+2*OqEL`` zaR?Ym{U(R3KOWH_NmlY2`MbKgf?FLVXoSl!X!C#G%|NuY>5oH`-`WCeukr8bKN|Z& z8u&0NeGQn zyfj65TO{y;&j?3s9tAyH8@oO_2jG>!{6P+mU!0rqrL z0m`G}EHIxvKD1>$J=j`xe{XASQij(A`oP8~U&3Wym2R{U+_@CQb{jK)EdWl6$EDxQ z^ZW?Ms^FjzyfucTE*xb41_G-r?7{|70Gm%tDoncz5-L%+`ZhnDjoz0Xb)FWIT$RX$ zJl#@abt*%fGKg&aLA0fwBeSrhEY5N}Kk8fpc{@GZvgF^Lsx7^=cRuF>L_) z9?S;oKx^-nc4Q18llIN7Q+Dhge8hm?&Q|=0D6@%>2ADbsmLjA!)sTkm%4O_ z`V9ftj`|O_*Nryv&m{Zi`GfehwGR~g?s;W^BL1d=!>l9}*IDm|d!OwYZ>KL*+g}J? zGl_2dGZMmCXdWvvw@pLrjIBgUIL{|O%}DLK zGg>yB3Suc{B0S@VI+O0Uhl!>t<(0c@N2Uv68792=H&_L7j#6}BAdwFptt0*z+p+f{ zE9n1jCW`LNZ|G^6X@7p84rRG9qR;vGJmpssbz5-@rLU+7t5<$oCs1x6nAgJMwr(GDMCN@UT1FAV_)8Le%JKX!FDB3E^H8etH;O7xZ<(b;m(o9^=Dey=lv?0 zRqW*tW7DYP0t(p-7m_#JF{Y$X_OQ-LVwxIw(O1#qEgKfQFyQb*c-d32?|sWAnqVdB zh1JYEN<8$YxMChLAqYis!kNWPzaJlw5QnK7)bMgfsvcd|>qIqh2If6*FjWnqp%Cr~ zCgqs)i`)G(@08kV%7TB*ZoHCEJikBT5@@xT(YUH#n3K%k#T$-eIBPp5Cc(iv5og|5 z(%{Kn-L>xb{;dWtXuJc~fG_$wZPtj|PV`8cdrKv6jY!Y%p(sAXbp~MhCkf|VuPmy0 zMBE5JmTuj)18mnj&e`G|6UE;$x65Zdt(|0r+j9xa>h}Xxnb%2pq9N|p9|=K)QfLb2 zr8p~%vN4{Xwoo*?*?&{P0YTTg@cU7~3{vKgeY8VZN))W-Mt1R1Jx|rcMlSZyl(bPZ zZ4DjR4SMMSsgxh&Y7D-gaW*9>6J5F{jOCOphz@JtV5o2jz!G=@*~Wrf$=~+LP@$)G zA$u^px@KvuMf#o-fl)6jZWssBrN{>aiO7GPGdT(&VBN6yyelIQ0&48IyQa99e<)kg z2PP%GQyWymavL@}4i^o(+Lzz+hdXl8;eRHxAiwJ2k)Yf`pU*NmM(C z_EKaSD=m+(fTqZbyj1Cmw=}>eOcOOI!yx|fh*_sP{-0qXW8$UcfetzrbaT8h`Ogx@ zDbg?Vo!3Cl)Jd4O0I%K2{!SVpMQ^nr4L9Asn1`Y)Wbv^g0)$SPU~~Z@Yc$+EL4p`u zk|?p+KH+Tx{LswcS!TX*5(Bpn7%co)0k~slYrGncll{o!5$e!;qqX}KpG0|v9T%%} zeHsx>lKgjP-`n0zk&G>x8OIMjgD4orTMRQ;huay|^8_>Rn&%o>htj684|9F3aFtIb zw5<$cN`sxw!S4h+^uLezgVp!qmYc1()0!apASV)7QVS3KVtD6Yhtrz~U$$&Hv+r~( z!%XQr1n{@S3C^!jDC}d9o0f{GwPPXsXM??N_MJJ0#7B|ET?cdCrV^tm8C@c@UHqQ^E{c6Z_dph1{xHDK2Ee(!47#o_mZ|=*tUQV*-tPTq|fpp3ctz zn@!!K`>LolvD8gp@Og}Cik|{=EJ3YR&kfb@9_(SYXtbb7k_wo{F9pwYc|15*rV<2E z7ZF>ab;Ue|BijO_p~o$7Xl7?(opKOcM9`upNHB-tpt9ta?zHio)6k5~GKnP+QFB?o zLUD}0lgQLl=XJL)C$2i-yNrI8=<^G$!@6K*EYW=u@bfs8SOirgC+XGvSTHw6xGjZ5iL!F2U$G{ z&M3D&ms)1*v1V!OAG>$9-Uay+b{aVzzN3mj59;fN;@p&H54 zb5_9%`Y&u0gky6jo2ogSnF+pY-J{12!O}GZY!uz zme_UgTV^Q5D`bR>2c2z=?FRQtivR-r5()Z73A~@dbbK+z4xEOSlc8&;*kU@i$&jT| zk1*Xn^_B@txD{~=efprHow834z+*;oL>}ZHq<`e_Vo68s3Jz@cs^j4$j+3UaMmtHi z=uX4!TM#cMJ+)9$+^;qSbx=)x&9O@9YFO%J00Xm8JG6swpS@AZ@bE^u7_mae=Bbxv zzez!yENd}anar*SL1^QF$Go0pC=p98a$6iJnf5Jb^shLS#w%I9^Wm7(T&#%PzcnN5 zXYukdmYw2QKOqE=gB5D-irMO3KHBoAKhnb~6)Tpe>}6DNg%@c4Vpykj?ao3N(2l$6r6foYH|6FcicV4}H2m$+P(~vGl1}3N zZgwrhyYEfr;3W2LqlY*c8%(+SV`S}4y&eMjL%0<|MyN?=X_6ic^KK|OIX*=wUQ*GX-G{ug3gOLRTnG7rx8m?dGjlN8<5BE2_w0NP z*M8U`u@eNA(+?u-WH{VN32_c|Hx2s|&(GPSvu*iZM6TCI-=5r_IbCz)5-`rh@R~~} zGn}JX5E6bT)Yv*5+>p<6`Y~fcZP&^oafuQDSAVxa-SQU6nN#* z0@Namt5(rZ$7R^5zvu_8jPd;W=u;}}xd3e{MdKM|S7fQdj%5_JbQC)4}G zv0or^7cGo+U-V1tCmU=2b?;|LDy!~BR!_rI=u5_6f2y8b7!cT`{psY=$F~X<)~iC1 zLDa;7?JLPx;)WDTiM+9a7$$zBCk$;MdIB?UMM99`sUU&2HRr=Cgl&3&-Np6x^keK5 zy86(S6LKq}c`6}s{LR>JXj+>;WoWa69;$9pVxyU|<6z9aC2jiV%Q@Bkh47scSwUDO11C0dN6%L~?L>2TDuPu5nkR z(}t97?(lb1Ogz;Ib;Cu8J;yp=*s7{fuM36mnpb4Fe$Yk14%bC6T)I3(qDg;T+eaiY zy_-;mi9CV43&qz)RG^(Wwc1u3w*fs5uC`E2NCH(YSQS&-9v>d!9t~p6_EHLSEQMI6HpLB%peIL_jOUX;zTs{9LYq{ysVDILwp3ts~OUL zG{xy5DR)B5@7( z{6kFQa>F?9!uFyxSdO1A`5$%G2hV?i$dC;_vzUKc1bOc^`HO+B-~9g|DTJf@{}f0{ zu=j7`7IMa-g);bH(rsy?NLB}ty8Q#n24Kkj1HMN7$@tOtZ$K9rA3}#Cx^<(hR2lsh z_558k14*v{>qP7SK$Vv$AdKSg2o86*f0MS7y_l~6XgVNUaqnNM2tjBFtNV(;68ck(9|lAaNo5`={UW_SLG<1%WV6g5P4`ezbIM;9_ z|D%&|Na*#q#KyHl6(xYPBS_Z)2o~H(I9PtjClAcMbaJYtmxmUK_lIz9sD=+^93SW( zN+SC&lAL1S^L*q5%D-Bc-mq7>2wpZX$X;K_(Gfd3$1b>e^|wA8qo8mvYRI%S$vcVvhTGv&4PuD3vjhT%nMe`-C>dx6y3wUi8RN;;GcWuF4zk59?d-)w zSAv#qRp#G-NY(!lKN$YQ0vBu8IlJXTs&;ME*ouPXY)pjNX>h>4>0ycI6sCD0`tS^i z2-out&UThlv`mhb$`f|Z6_Eg!EFC?thtY8xA{Jql$dgNf*eb`6whmEqw|exwe8!2K zWFHCmH~JA+zd`7AX5IQ?oJm)Vi0;S{w2xgW`e{a8L=Y_u{rG_WJ|4pJu_KnhNh87= z9rPwr*k8yi5{p@-5P^TzJG9Z`Ogyd74^no)L-ot6i?-9ovk{-eJsw;bMa_t#j;sF- z2|2SR!jE+S?Zh*xUs3WH1th+^8O6kRfTX;Yg}BDIMLO8SZAcOzG^{==E?#PkA6D1r()Bh~qwPg-199M4%m8?MI{#I&Y z39eE$2JYb4nhod)Q*n9)gw9Tm?^>E83}vAE&6IoTU3Ca|M2Rdc){eAvE&a~gPLBN& zG+*4I8f_Qc$45?!c&y8aK-|^+sptzVdU)tc;LKDe`gSZ^hM!!6XK~+)=0yP9ZfpIb=tQ zc6i^8M<>sBkD8VOl9%jsaDtC2U2j2xO$}y<$d_B(u>CR7lbCDtm2!b0>?`ryxl61$ zIwP`q9aq0`~p>L8u0`DZkz`WiGBEjiDKi(s*3MtuGcd36Yj%T;VA(x^*lEmfb!A zB-e!O5P1vWZ&dwqp@HMFl)o1DE=TM0*jeb;acaSupoy6nm2VV>-|5FYR+RvemZe+) zKG<@W_Oow|lWxbcwkH}rT9)Uz7F_VF4SIcDuxS}xdJR=#PEN%%-N=z`a^(9&&wY>g z1@DO2uWd|f@25qFwdL5(iD0b6)9=h%wL>4X)D-z^kv&whKBV4rsOInl&8*N_&XmVC zxS}dovXK2z>fT~F>a=9ddCZT!StI<|hPi|#)Wvz2OOz27MTd#L`H}qtkds>h^Y2+8 zppWcVnz~~RBXN^s6@JExZZI6(dO@t~Pd_IWKoipE+YQ-Ae%_Vy)9Zgx%uPb81^(9k zSlgyWqER;o}QeU%aG~T_9p7g?Fu?FCMW$QvR-PV!_R6adwG+J70l!xS#Y?Qalm5Nmy3Cqz!s&YQbFZvq$o;bCHQbfhveN1 z+fI7PS7+tz-^lj#bu9~stz>S=y>eby^3G(X-%K+r*T4Gy!vc|Q{e8=KCmfTfaZ>ow zD@%Sq>{gZ6i1mR&V(zcs?v*LfB1F^znoz)P_m5E|!8QDR0fF_O3kBLfXgxt|^0299 z4s|D>w62tee)UW?0n06Z>+ea<@o?}k zfzlO{f4M8Lo#Ye?8_J-#5>^f$H#pT%mi46C(|Dm}$itJlNwH8K9Mn32U`uh@{hqbK zpxbY)le*2630%x8k^s~qSU|y9 zd<2ng^3bX!cCpwWMY>2shrNuFhQP(wUCW;rW^IvXp$UxwT=jMkfMx90u=55>Qu{v4 z>eFc3`$~_!Ks8T(QA(3p#;r}-heDynkd@zCOUpQ+D3DSuDW~23kGKk?4sl(%V(_#v z^MbgTXl8@@r6M>>oFL*4uvZ2#1^3mel|Nl;8>BN~)m{6YaWqQ=R5zvnXhSn8ypMY` zPFFuluxhCIjoe(EMcq_1?c177RO)jfx8{OYj2)vIg|XP@ujGTjvmh#-GH5ax5^;OQ z|FMv>kn*<_pzGT$h?;WlSDk!B-cHr<$79>YJ_8alQHwBh zHC_<=_-huE4n={`z2?(Lq~DUIwkAu*jwmsZ$ zb&`kLn;w8ocjjsK$^lEP>Q!Pz0R+iZU zf7tjN=V9&D4!-E_4!K3={^`|0%XvG$7@{tor&~8)lK-`c^-(8baHoVa6R_{D^EZ7h z5y{-vnhOQ=DMHZ2E=pt;K%RGb9ikGU%ByaJmWz2Gr}8@%3<j_dg zZ|QrpxG-lcU?bK2IQT7`896Zowp!<^uYe(GaTZ*)68-f@@yEEVnEndazRw0=FN5Og z)A4Vc;QJ`Z&9?`+U=?x}N+>#21+PShw5@#dmWSI(hro5@&^?m3lY;x0LR! zHdE27Y`vv@i!>vlwFn+rZ)4{AK!Uu_Rs)5FypHA;?~uVnRpoz4ZY=MFNR$azxFu&% zw`!Ok-qPWGHK*9^6Rk0paZb7|hR<(paO6Vj+Ync;=QcBLmzS7^wXWZAg9QJ}dvy?d zEd@|6zv}1KfkLyP6rw$*2k?cQ=vPTpy4N6rCpxK1eeaDcQ!d3oC7Y6D`rUD1RWejE=kEtBhHH04sTXRb z#Z7fiCtBz~vf*s){Qg|{IV*x5{*EbYNab6(BRXX9pNhGkY%x{p*^F`+av21=!25Sv zurSG4CJeEB(OC)(&HmYIS0v`%vJ1y%T#_3$hJccQZ6Q5v)d2>^J;z_>V>F4uE1s2w zF+=rjl^80y;>Q;f`TDc!QMtxq6W$~5v3VLgQ!Cdu#PJR`;aUCE(^2}iC$D9yDM&E4 ziYC}D!MgcT-+~X*<&_>D7P`H{lxMMgcb!8t&~E%moi8gyvrko<%^*|?hevb6O)%tj za(`_^1SfwMR5!(?MI#h5GGY3fof?E?K&V6k5TySrDyN9|U*#DL=|5uzd8R9#g_@K$ z@(}a~-*I@dsJ~FYoh2-;XU?y$eFJL{CPuLpduZ6<2XNTjtJozSG;$Dv5!~p1CWY`* z_K5M_{4v@kLjZyt?nzV9ydr3VjXBb% zpU97zc@ipO?=B``$N+Yf?;mX;rLa-kYM|p;&m!=QZg-8bU5V|*#_I1uQJ*!@NzGlG!gkGGU0({hE(Dx9`Z((!F4Y68d^Prl7IP@x-lZ@_zTcN>$#FCoRD3etI_*)K8AdGKl>kJa$FLE8 z0>$i2F%g>+dzm;1(8S&zlb<=Au^6kTPINZ0fIKt*)Hq}Om=$r7gBPoPe_Kw>>#CN= zyIv@lx!-=7{JxU6P-4OaPZIGYL>#G9ReE?INVLXF10IkN(rn^@t@HIiv1R7KqN{7? z94u+A-h(_HKWY|a1MI+nWyCJvpVYiGr zyE-fIfu4fcDIx3;#>XWvZY_GrRDYv(4iWwj+JjXGMg8_I)2|9g_9@NJ9AAyPjim9L zKReZ1Hvc18yvXopVS%d9NQK~LVjB;Un$H;<4U@9zmL&$1&7bS}CpRFqt_YB7$ae#l zN7813f4hY%3AjKll!T_&oS)5L?B;b@4OdyRjemc^39;#xL23mgc5gcbAF;VBjB7zcd_3S#XUFsb#1vax7X6q#@gqr7LTQo{6~5 z*sWkh)og;)C1z0A&ItWFW>HK1Bir?7tY%t_nW`X&z&ecP#`vxuMz(Q3hRMyq{`+u5 z%ut$hd|^Yhuu~5WG1bdfzc;4U%1v2agFO5tJ|KEG@=;vtueT}LD+g_Vh?Q|48goZ^ zJW4Cx)Y$%$q|T|n_DDjSdYC#7t3s~*YHH(1_+gK#_HGGVgpvG zVzWXcSht4Ko|hq1v_zX}x*30#3td;hb@E*TLRLFE?0PZwE^zod{}*&FQbx3#3{^pw zDPwcv50iwYyieZ_AVTo>7ETEE@nxz}VG>Spm_~NpR-+pOL+O&Xnn{-W-|h5`h++d6 z$h(quNdM|5)eEcj{4Z-p&yS)BQW>9DZPm4lrO z*Tsl1lw;Q)>4}^xshkxU;Q;Z}2zG68l@D7i2}CI9gaT{kG^@}LS-YNu7b9CYy)o^8L_lQ1a5 zg!g>NvzZlI)Q@@OteB>UElQM}^wMNW%Jf0bBC>pLgoY*A5bO`P-4@mU9PWr+`$pEn zU@lLc0vbjLK?t4=!)mFW9Ou>xV}Z~*$vKFY4AX`LBE$^3DaOLO|AJ4D&6YE7o#x6? z{SKBf%YQS#41&L(7@W%As-cm0-F@Kj#`=h-5Vt3Dwg!(+eQ6T+;EZ3)p0c^@v#wdE zPCxp7R|gLomoIWB0VW9*tH*xhQwol$T{k=LtU+@GKsM7A#ECSI6$+#7b_(^314mXpxnBVF>zd7Hm>A8ib*=W$8lLC_C~sEpVQ%8yBDt%*~z}C zZNNal+B<`kzDtU+AQj?bBiEU(uyB~4L=gRGcswI2>zwGR6FDjMWzZ_qJny|kbHy|% z4hv2^4c=7KrdfUe`D~u>pTAwt3hW^6FwL7>v z$>F+ZmMo*io4DVqNt?=q?_yK;!jIF8Nu-UH4>wa{J!Wt%;zH+2CG)xsN;?U^w{npr4vN@1NTz7B3w@i;N1dFZ|Bbi7s0%m`$HYip6a!+-ijzR(QCrv7 zrgTcn-rkHH2GIi$`7`qHhZ>g#Nt)JSd)&<1 z#{wd-l@eKxK{BT2U12)i=T3ERcY{swxQe^$f63{3h=EA@E?-`<-;g~9PzJ2P zw`tSr%M_f$b0U8i2C~_T0xyQ`*oG;uRJ1r)w{=h1%_)KD6I}_hWGF^+HVs;J(m!)pRX5*%=-`@!K$T^mBswsd!y} zg?J{z*o8pK51668Zvc9A1|ySHEsMO{AiUKZ$wMIZ_g8_%=k2X8VL@pNIq$b<+ewgA z?l?)mJe>|lE+tM(I+$v%(oV|;+>y?>1cdvr4Apx#0c*<9ptTr#Y``k9!%C zeH<#Ty)&+IYo6VN|W-(;$70V6AHa^AJCKKj&CUR)xNxTF%|B zOY8HwhNWY5e7wM7cV+`i62U`Y;wZRzTKoNM@rI+G^RRN(?VhjQ{YMp$KBDUFx=}ca z-3Z7>X1!&dOZ!|&O#A6;yLZ&G&-{S8&Spkkj3FdjO+d$xdYXVpRL&o9R<2)vRMK!C zzawJM|B0y+<60oE|`l4gU_Pw*r<(aP%uQ?LX3zQu`pZE zzKF0edVy-Q^Kvww2ToqO4T+wkLtDr!Q@7xw8>p$9j8wmU_h8YzbGllND{!;8#o9jy zR_?y0EV6u3X!+Bo6;w^n%Wak$&c9JKhs4MJw1|;xIB`%>nOrAvbwhL2Q?g(3czoFO zctkn~GRWste<~d5kh$E*BW3tNRdsi`*zQqWrzZuhi&27gDs`)j@t6-pogZlVU6F!Y z!~BfMQ}UMAjc#AD`yzsNdtRK@+M+Xppb+UQ>JZLd61HundCTePv`)C`m|YNUouoV# z?wiA%*T!Q10AJ%-9Y0UIYu7Vp>sL6Cna=9wDlenYN0rMS8~IW*T|JY@-`1yC8NRzZ z!7MFyQ*`@#A1T~flhco;&(NxP@4+MIkg4_tnjMyqxI`1GUE$W;`@O}gXP4z8RQV%I z^4nWrq7Wi8|FPY;u6BpYYGlk$b>F*CJjNJWi@4=>r^@i1`FHG9Av{j@=tyQ}y*@A{ylhzysVHbZm^jwHi( zYbLwvhpPabgYs<()0}vWh~dtpRu$?m4ZZI>@eK6ftc>RASu&Eo%HOKrs)awBICb}z zC@@XtR-9kt|01aJwP;~^J8-r3qax)!+oU%yR^gsGTD(V*>|q)p!mWb7_&NHX*T+*aamJuBhIxIU8sosn zK5_6&UF&^X@_bVV$|%?%jCli%z^0f>W`ZrjxO2;n*m&H8BF&@b@(Io5$t*EDdf!MN zuJ-5wxvQN+FD)ryqmTptOIfv#f=yW!#+NESI;UH8>(gvN^3&GMnl8g7a}BEV%tdrz zr}bouft6~9cM+xiVsTEp%|c{Y#Z7OO*^$zdk960mRU~$Jq}IbJ4h>JfFo`cn!mqtX zl+NHmzC}z@$^gc?+e24VIY3V zjn_m~ii^LZFFKs%4Sec#4r5$rE|;efuc{QyXFR(ceRF?PUdJ2EOD%egj4d^CJou~o zX;+UpCiUgqJv0w+ZYA^uOStY2MwQGvc}EuCRB;zFO?uz|s-SO(Eb2iJ36k7hx7fg$UIGa=a zO%rl)7o+!~k@x#AV!;?&Y!4IB7xmgQosX+e+K{?|*CQ};2hN&|=>shfSgRFXoskMT zYQccx3$tpQRbIB^ZvKN4o${La7E6^3YH&6nxI}(*d#mPixAJpJN8_ytnp~DaQ%Jjs z0ODN^rPXG((}gmpoF9vHi?$DGY4h2!=>2Cq?peKA@pbaan&ylf@icxqU7zxasw0c6 z$%W!Vz&0*M(H~N@Gy??RY5fFZRFxd0H0>;R)n_#MsmtzYAH=d}K9DuQPh`STHogEu z@C_79ITD+zzgdiVP_@xFCAx&hs{7PoD#Zd~!jC;79Zk;_bR^0wkZm$LCs(Uw{tB@` zG7Vm#Ty9bDuBB}1=lGL$2dhB~zE{U}ZQW7fJV;WnTv5rWJKEgTQpLKu6An~zN70dH zkga?5bCWeqyLdspCC_0+KEee#U!E!kz;XOOv5r@_+6nhphmPO;Up~1I z=ic?aQ_}!XyOD=A zqy{GR*ZO9+3vyS{ht<4Q-9vpG*WMLPogtZ94uf1!P!JQ^OEe_1i*|2Yd2RI3#OiRhpM7V6 z{F9G^;BZ7uBczgWsoAv_5lJHhZ&H=d-b#f+ZjJLvqjJmf!Uo5XZ~f5H?@Z-I+lA1@ z^}ONJQ!=xY`NOiEcE9Gj^}#l4KZ?~15Lwr~4;s+ZGWPy9`OlwfEQp}cpdlwxQPQaC z4CpSQmR@6L(?Yv5^M>!qvNW*V554VcrN-g|)*)o{J4={{0K3=-@r^f~byq(>%AM*M z-|_n83ulFDC!4cfS2pRp&ai;1SiB!LmNZTa;S@-!QZv3Btb>6!hGw@M?82MR8|}A) z5=nVU%v+Q0p)CeYF^9C5A`@C3>wg$~4#S=Q3{+|BY1%Qehx%g4Gy$HxwEg;34tNw_ zw62~Hzv4A@)-?EnOuTQsb83vKBxu(55;?jO@(W(9wUQg|c?(eom$kcWTP{w+W-bG| zdD7$auPlVIZZu2VR~il$c6gSTz*P&^oZEz6wTJZ}$Bb3T%Cov;f2`rsS`W z+pY3giRI%BQICM5q9uubZ0m7tx)F8d3*RDh+|o)pi7UJh#a2r5*K*AIOkG(OQ~N{R zB*`v=2D+|_zFQ;hH|eVqPFqpI8FZIU>wq}Ve2<%C423w4d8K2e9& z8J`HYS4JI-MOpOea+MoDa2{=su8_lSF3&`P&z3&Ru+xfeTx}*a$7ZtSj+Xu=wg%vJ z)yXRD6ymD9JMpnwu~c4j@>S)QMb9lkmA6NVJaVMc<5_P7YCDfN ztA3>2)IldY-;-wP=Z`hBbT6Hcaa?0}L=XFIR0H#1*${o*B(fJ~Ot$qih=qP=KAst3 zR5;AHkXZNJW0H$PaK2U1LU}iX{}r`|;je|k|2(w>mCUDM|A&3_g5~l+XI@}hZ*@LW zAwa^$R~BfNYE9@tV?c9yGBc40Jq9`;fM&lvDenQ#$5fg{CK!MLg&yy+8ELmcO&P-Q zpgg6g>PNjAyXEYBzzyy5y6sgOmyimh-~HfMV16cY6(}uF1VmuMhIZ$s@vHe?EP(5! zhG}Hoc66vIyv;66Iy!IncUD(r;C>}^;G@W01cn5nm|CKFWC2(*KtBw!@$4=En-0hBN{xb3=+LtSIhMUv1`H?O4+-Ko+7Q#em-c5IPlsPvh${FMwX^a>BCBu`t z-8urrWU@u0!DaZ!VE=;HYOiN{bkX&2?zjM(^Goe6%Y;j}LR}=*fvYnS&U#SivVmrQ5H&$b{u$t zqG~FeNO@I7<-Ua~{0kqE?W3g42=`*`cU^pl1#<8T7(%T*g0dWco#IWtD(%98H^x)XKZndfHukg@|J{ z-RXc79V`M~+082$!1Y4h7PZbZGv!$aYmLBY7bPluNKRMhgt)+}RAuyEK~`)44&C1c%M{fk9(>UdV+ET2^5oDgX~us%&t98x()$0f z_m*K%Ze75zph!rGAkr$*-5rX6fHVv-G)i}OhqOvbcgN7(2q@hH3@~&z3?1L-IqIqB zJnws5-}mc#{>*j5z4zLy_S$Q$z4pEv1AT~R>D!YDZP5{BaF~xroG(hy!URwaC#zqN zEMH-|`k8*sxI&3Z8pXr?M&u~f;Av^FIaEwLgIXK8sTZ)aju;m#ums7AwAir?xqD)y zZOa+Aoo{sqv5#73tFl36vz%lia!zkBf9uH1f2VVqO zGNhdti4@>c^BK?wzR!CR2;42$qv^b+8<(Qy*1)Fv77e0IU>j}S>LHz5sRa3=p;rRgPaIJfcJ_rnb^sz1vul z)3Tp`W(Pi^5;tKctFoOA|33GS;b{$-CvLXbiS74|8iey$6&=?t*K5zys%A<+ zX9zi!M#$@V8oD$VH>FVF(1kZ2e8;Es2R_CA!t+CRMb~>JtoLZQ>Kk%EKIZ`@>aT^6 zlr7*FoCFd3!-;^q(cUYM3fQ|i2&X*yMN%b@BoCwGqq4EWt`1Dpcq^++U6ptE9zg<^ ziX<)q+P=w9(z`QU5d~Tk{oP1>`=R?yMa{!aCls;5pTk|h@2^ZA7=@Qg+G_aDivIW) z;Zrz+(dL07qddsJw^FYV)<;%7o`a*Xm51E*oweV7{4A$$e`ne^+N8ZZo2s9 z7`+qL@1pUu#E@Sl{tXRmqoMC{ukQ#kxFm;^_?zN>ClkBL8tW&$97u#0vjKZyd}u!) zmEe3A=->~5{!WV5UYP3-3ja)RyizKU4_y9Ykx%8he;=d5=y&<5+ffa1|3HZKn+!jl zjla?V$vNw&Wul`8t(*~gNx)o4$4 zu|ofS^vA-dodVw`%XczIagDZIiQ2e!sDD6ekxVVUP46n4ut<13>Z|`lSP1YoKe!;A z>hEWnGms1pBY|wxXJRX??|hMda-rA0Mom% zxwJd2+ojdKrg*!2ezy8>M2P*)?`@{#T2xUXkRC;I_l9_Wrvi9&=u!X|nzGn;tw=?> z$4qL{nj|&yJ7F!^-$Amwl}{>Q{+t^>S^Yy4-#fR2-9dp)=a%Qv{t)0#;r&!pxGcR) z?_oF9I^4+d{i*j)t^6?x7tUih+l>D7{NHu#AA#LMEM^csU75NP+5Tswet?~R<+axr z#v79V^gqD)ZIqg-Tk{E~Cs>stKRW&+SSxb4mT_&+=l{@;f5vfc3T}ytXM{$7n1_D^ zCj39f{ZT)@&A9(D?ys8if39(0b~idY(4hYUYjjlf=4wg;{sw;Y`-VpTvGFb`tz=RM z&FPs9Q+u?&P?(?qAbrP6KI^ouHZW&@}qu2H_% zcZ=V4N3T54VjNp+6*_qBl7Ns{KL*}O;m3UWbKV$@Ar`atn~x<4FW!IuX1AP1^$(L| zf^Lp>!1XxXex|4i25aZI2Sw}0FQ}=Qo^{QXh&VJ}%nRRk+h`1^AFGyVrT$@+;aT7g zl$v4g>W^p?iIs@g#w?kIge;N{R0QH#w+563fVLV9Q4=KKZ3^8F2`{{^a8z~^DxXhLt7H(R=?7!}9 zkH#HJyD0LgJH--hU_qygn!>A67JoPGaN^Z-yb8i>frdey+)I%jSxt zvF$uC{*9GVrv_a~6Y;z=n3$M<7>xq4_}FSha>5vXF$x;IyZ;|;$NyFLKRQ9T5TzOC zOa@$wXadhV283=dZ6i;t81Pd^h;l48Da|$36T^Niw2ueX?`W87%&JctQz6=;?iF@5 zdjEVkM~|T5I$O>$ZeM*q4wm(^jOH!M8%cusO7Z-X?hezO2^QB5ljJ>YqeQPF!;#MD z{>fjjizHgcl26RSzRAeX(&3W5GFztF*H`41%Bu%?6$ngM;5ftw2`3>|B}=FM!5p_} z{Xzk!Y0{di>R-CwnkPE>iM*F^-7K4jKNm4!(+5_Sfu-Xsvaa__9?q#nxFY^ko)$Gk43F7*J27LTo3zGd z0d`J<)blD^nJ_qcL>k(wO1t?AaCl8U@Qok9*kryy1ud6*4p#LJ7;H}4y!*I{;bo59 z`Pl=>smr`3Zs3yvBILDF2|r6rhX;YbyAN>mxz$=|7B#5AK?~SMec$*2EXObx|2fmF zUZ=JWxQdaM3yR*HmcB?%vH)z=Jdr`2gCju#+9k-MxE67hvK+q32+Z}Qiij8Hw4ngT zS8YI8+p2?ikE-!fHr`nb*H8uId2+Nb+&Ic@3i1~|z^Bl3gq@fp5JIcrAL7XYYF4`J zt@tI30o=EZ*?zg&@F-x-n$Zt#vy~851vi&zwg+t4J*DHzUJDYk3rX-LZ|shqD?Iwi zO|MNf_6_HOuW@3LOU%l(LlhFT*L8#BD22}jn$>RAo{z^7+cHc6CX0tHbGIA2GA9tf?3 zR$wP-Plu|`qa%mh+-&X|c`W@{G+0OR)%g*`?Mn4&<>siUBRWx`Yn_VggmJK>A|)b& zYD?aLOG>ZG8mOGz+1aAw=J(+CdvEZ?((|yD4x^;rACLxj5PF=DA?z-$n`t4ZhR$1n*&un}}iM%`H7Q*Q^p|B7P^gu+tH21ZlBJvWsuW;^HUa{gS_uW%WY%TEnPEWkiOy*`gWlSD+Jf5pU>~|aQk$P0{1R}m!eqxwg+)%jm zg;qMLOj0m{KVve3e6-%x>ylOoU+yEj^b^w^g^hEX4ZU|RPCbyzhrUcd4Kacvw$b#V z*4ukYk6I=P;rGR9Z|?PJyv4F7u*xANe3&UC1a3@E7q~JkXo5x0C$m8fjz-RsQjEGB zJ9#4k+Qqm{9P)bx6*VkL76Z~9EWeD03{EaOlyss|ME0nV{_u-}D5mWAC-b~`Yqw%C z{@6ld#nMX`F(b)Kn+{Px6D8At{6Wf1ZdMSVJ-h6|`ndRQ%IjDhPqHVAGd1gxSuV!| zn^6a2G|nfa89e(^M=w>)N7OegLg4JO$5r+ymFqgrHkQ)0>^oPsw70<_>v%jkb%)qv zoG&i@w8p9E>NNMYhdaBQdSVPeUePUCnpN0+v=9gghb_HY4|*+w$}(m!9b;(Rar;4~ z`DJijI%dotWaY8>!f!4pOW-)MdjXfmKB9=wuiY^?3yhedwnyrHBFTP zmN9}RV0SN4!dZYTG~b<%&DCWX;J!)Mj?rGdX|I2waAlOQZaAFpT#VDC41Hf>Ybn5P zk*a9Wpj=t?4-729guYgjygq#0H$4nQO`$M)EfG`JeH(A0O8DZT?8qpIX}v zmlyb9gSUaMreA}(F?JbAE_Z|C;{||myV5b*JG{~jhIwut&0$F`INwPrCJU;TbZbyw;>5&RPc?3OEl5?-09;(+vy{Ba0c$NLx#) z?s*}~Tx;%^FTy_tAL!7#ZjK67=%kzBx9tPYjyDqtMyO1Ds#MtBv_C(k$%9}^U$=Xj z%7;1+NxWqU8huyP$f3V=3x*m7uzO?4^KiF1fHWiQhsJy}H`mS}bx7zfi$l`wi@X=f zT$qFUk>`0KzI4eG-&7Oo0?(_hB$G^auU;Z0fu#vgJ~P7{_vGQ0ZgbPQty+=<_zu&N zcRpeBx--q-2Vh}av`6#6Q^dDU>a#AfQLhlH!-n+lX%9Bk7aGJ91M~08U$8Ityp*Tx+zH9zH8|b- zm}_v}+JZzhHbp2SR90v#u$F5hjYed&$NSdc^_0ysL(yxY ziQe+D*)>q+jP-%5t>06{PH^p3=K4$!nlpu55148A6R99?^id(DpskYPwQgLVDewEj zD3A=@>YCv8bYfvct5n5u(N{Es^{+9WH+g0tz~0Yu(MUkDF?d@o#7Y!XN-ukngo)|S7}$uE3fXTS9p;RxKIEMX_p*HDpz_s zf^*S6E3DEjl_D|-eN3I@Y^!dl?lfuHcs^CiCvz2c*u#cPCisHDmM!}9-57E8v@#*z z76r_MPceiXXoo-eBir%KvzZ2RYtAR7qjY$u*Ol!}(%qqEGnrM-d44$#scLsjAcsX8ZB#18 zTkn-Ou3XX|hGE8>l;RQIkIts)q>rik8t;5je&BqS8Z%=WCk7C3wu2imaE!LYEzh8VIFWdM)YU_HM<4 zPpjwJH9VlAZ>V3C4YuX)93ub?2Mtf$r&~HX@}y%l@In;07j-xS+kk>iXrzc%FomX- zm_X082`2H-*2bT2do-mMUag<+)uia+8_u)?S6n(fdxPkhbft#izO`494E~4loBGu5xhi%xE zE0V|ckbFybirUq(NC43y-YV&6T?FRlXHkjbM@<9*I(RJ|;biGeO~;O9un%GDM*-T= zY`+2v;)l6RZi+$2&4S_s%^%W3BPsLDz3PtKgl}NidSNU8H@0nXFjN4fOlG(iC0=sw z$S5bai+?l&DP>*BTyif{8eme-i2~UuZ9Pa8WRa?v2k9@px?I_7m$tt(Qa#ncA);o; zn6Ij}F`8As6IvtUd%Ka?U;$2P2@3aRp(CrP)ZzkcrAz$n!Dhz%$U?IV(^+*c8x+Xe@bsxN{Ks+Bn$Lu4$a~i@a8CgpXy&_|h4Zkya*o zv+kPmFCLoG4Cby1Y`)I$mXZcoHW!r^x5J7^o1CGke7i*1_iq%oBU9m#!n8+hKehRy zP=(4(zIfM(V(g|#vZBSg44K6Y2qa*7(^N#q-8f=euLDbfbt1T!4UcV?C=cYrOU^)z z%T~m{mfB6UsHNq#DBgU1Aldqnp*pPh^>)L>?i5Q-^$6|uUVGR`@$2U(kL40>4Y*9> z|FHPC5c_eA_70OjbQQ`D33(L0HzYrHDz^yy4c+cANz37PLn3zKR0WM)=1Y=QiRN&} z|8NHWO(6z!9a=iZX=yns>+2$=bRsXM}EmzL-_GxbZPt<{Bom2 zniyGOGK}!JoDNUo44s0aPlSrfIbpU$im3gfx4e50`8TcEe&tQLrM|@g%4y2Zj$vU0 za4VIlNDkDWxeEsKjMeAk0%1kFW#6K;Dr}%a4%d+TtI}U&Sy0cJENXB)%j`zsR)()D zd5TP8y1!mCsQ)=$JFWPafb0L$cuhKKc1dVR<7eO_++u!5V_Ub^d@h$7QTmzA=43?> zqtqWLW03oWI&6m3&(hD5VNV53`sYpnc8N;M7^%fp5m(ofK?NkU#`i{f+u54Gi0{X@ zs$3O-&uGU2ruhVt6Eo8dJ3emiAL&$hMj{%eW~yD9PB$kGWt0Yv0xs`Q#YVWZh4-iK zj(Y#r{ZA=<6!uzp5WHKNO}rA%z~_9v<$MJX+Mz%P%{h2F2a&I`;6&B20Hler`uOK~ z-T=P87ho^@|pVdo{y{$pYVKv2-V~?rW>|IqaZiWT?KNH159b zKIN3J&zIuDG;aYjmt^YxEhGGm*G4?wGbB9u6?eP?P$v$}rb<5Y-1`{=r*feEgbR`i zuzb6W$7{Q@z>#ugkXgi4(X0heI>D~DYJu*+MJAl7&>xY}2u$5Rc*G!LmDB z?wsaoMcEv`@Rg?dl_Y{Ea|ohYA2Z>`=4BQ(Op0)4lsA4)Y4sTF0g%?o{~2en zO(Mhw*BBKMm&uYJ57s=153+{5f`Iglw+Dxu9=#i=FOi1MX6-@q`Tfd$v z%n;hDV`iEw{+N{c$^Ks)AwWWb#@|nndh#oa_76`LW=atiQa@?|{@;cCKWKjvOX~lr zME=LO|NruBTF8x#LD{2K4KKzySH#fs?1DXmH1^k8@ndJ|&m4;PN(ivT>lSiQg$N21 zx@#jS$)lbVI?iKRX(1t zE|8admVa!TFw>b>V~@rapRgqay;b2hkO*5)c{XPgn;B`_Y~{To~bx zGUXemxSX3GdL*PJ3EeeOQcZPBxHJjZm`hXuSPtU5Q?1wXC6pK-O->y<2U&!m%fHVd zhZXEj806QN=l?Oo{5RAF_3lhlyA^yd#XT4x+>d{zjgfpr7p7A8u;@n2AD}rhA4?9) z`Lts{;8AaA z`2^p}vRy03;(B+6rJsAxzg&=?Pgc?hC#X=yWz&(elW3bxwBhnF-cy(ShMHHRS(T5W zgW3ZF7>aV5QdEEdOCj`xbe?82eVVypiN?cWz!kII$K-o-@+Nxm3O4<;&8i0&q?tA1 z7d_37fe9Z^Hp>%j>n5@zUywg#=jhee%9mT|FFFTysx7B5DXS$Mqpf>}`1B_Y8crH2 zJADNT?4p1dGw3gdmU9|G{#_PBDcL6~ff@BjN*{AP4qyAd2t9vjXmYlIZl7Y@J8N4w zO^CCMG<7jgnnlc0bZKLWH1jZf{RH~dGif|K8W>H0ld-x3i&e2Mo>hyZ94UF!hZ?Og zs{xXxqLn(>N>lTE2gu!^?op)WPt1NxQ+u9Q@=7$8e~D~ViUmu|Xb&S`oo8EWHY*bp z%IlQd-sgLC6m`Af@>J8>5}$eni=1NuUJ$O8>JB-frdiB{7fI3Pst9$2qbk2+Ios*g zExHBkF_Apg>LX>fu#~o^|3xC(9cz)0Xgw(pC~Zy=#z}e*2aM4>^!a=!}E$CCo_i% z7U}8ief(^9loMk(B^x#Z6L&E7u*uW&B*|(e>5kT>KD)T+E)Y8fs9ke;$FqC9w>T6m zxRHh*&MD3`oJN{@G+A`r%vV_iiGAt5)az# z#dC1n_vanVX*WRrBNqi$@PjpOye|i&w?K@v3LdqfI)^=@GBORce>1>fT&tA5ZG~dM z&D;88JmB;53YAwcD-3QnQ5$Q_n#Vk>KDt>9B|=5l$6XAYC}^?ggWIWq7TzQ+2mqwh=%`>XF^T zB8JQUg@-zSQHq;#+9H|d_yLpDvh!DMeZw%N8kPrzv@Q8fTbW^H!TAFVkxCABu`8A_ z**A=m?qwrKfv~eWeT^u+3x|d>bR*cF^rZULutjuOt%AxjLD~i?M)DP1Se*`sR6jr4 zo>!e9uSDtdvE7iVm?ZkKSq{_6tV4Ho*1Ck{Im?kFGrb_vWU`_`vchgok+Dl5TUWvN z*#p(nvTwywKfO7th8DvSecwzez^*i}Y4Xgw_$*Sk=tuVFr-S@!E~QG`nWl1M3sl{V zK5DG=4ZPeXF7o%4-CTaV&TAoXxSjnx_(nQ6^iknBs5{OQiWxd|1Z*7Z1gns^<@c%P zQ@GLbC8p=#lq(zHt({?o%U|Zo0G_DjDZmdyC8t`u2FTn3lR8S-e%Lavm0QL!o&+LTNf|4?u|Hc`qFa z{%q1}q-n3x^ij)Q8*)(exOg)=@7qB*S@>}fg0#)4ryYR4%wCz1^4*v<-9;$vV3X$h z)N#j2-C%9t4jGTqhv$A)(g(nh7rzn&f90f=E&>-CG?PpL3U1RJ8+m{=!)p<|f?ncB zEDEm`zh2RZR=$lDoG3@&GB$Lta{CN$H8^F^^mccwd^dSy!cdHMx~ooOlfWc~K!xV{ zVnvDiX$+y+nPb>qQQ7qVp}0xOP$r>k6Axf#Sv}gobXlr?nZqJD`y}rz!DlHXNoUs( z!NXmu8~s3KhZF9;vn&>o0an+o@}>tz4bGj(&xqcR8HHFkz&tEsUL3W13%GFbX#0jW zZguDTYjyT=6{xwu`rQhOEPKJZSv%2bhTYN`ctQ;^jT0sX1+W`Uye5K^=O5q)Ak@bz zE)y}$ZeA5M@1#%4ic@D6FUx42#v&^JVPE){PW|@e9dNHk`7}G-vf^M&lh^86(%0Rx zPSn@8q3=fi=!#{VPu^US8%i24$fxexCnYkzKlXmF=(2*du}T@aF2J~ZMqsor=LLR0 zAlF<@-2T1(6Sc6G{O^V7)vs@7aKP7L^N{cjn4dlx%Zq%*@MzbpN<7}9R+pm7wEArL z^7V=eD>_*yr!3riV}tyvgi0cWt!{li&Uf@|g7HdRA+Pg#T-BxQ1u|#x*hU+Ii;D)C zeU02RB!}U=rMjMcE;l;fza12bE0jncGfbQ;Uj=&WT{A2AhRMMXgcViQT@>`GKwxBi zlDLAD8XsDlOcd3hMe@?D-Hn*?eSzFoop31omlHi4G3C$POiwMT`hQhy{M9#Y!9bd( zb7MoS$}kSrPRVoIT&5`62bqHQf>`3Gz}43l#;;BdwhSF8ff8gpV8cly+J>bxOoS)# zoa7qSRo3*+$}tNMBDTh+BEo6PQ%52%b3u=D{MAC8;qp981RM?AxKpFkVh)f;u2F_&T`NnDJE zK^b^EKykI_`8**5xx$ru8{=@7Hqq|25U%ocN zv*jkVjS<;WF(V_p3|OgsfMusbeC24P{%@|th^>7?iISE%{P@eLd;Ej((hu{%sA6bz z=Geu7vMTL27i4Xwot>s)YSzKxw8xwFUlImhi-;EZO$5^P{PD$Lp)Z5`>AZwno1ish zaoVbgu(>{KrvAUO{4YwJDuYms4(%9WfFrT<_5Om+BHXZgK8{U5CQ z4>A&;!He^ry$b$S-||;D-&_8vD)k>*+(Mv2#ctw3{iyd}==@U+??1O~k$_j_$@pYG z`WN@^8xnu40R9g&T786<3r0Ss`B_5zACUiJN$L;Y`~|uHvFbM-|BqGJ|I@19X6FAU zpz!}})o*6yq7BqzYd6pzXiOOS|ouMwswEnxO27f7v%Gh%+@2buVqk=yxH?v5xx7V$JTE0Ya+Z#;p{->?Q*=*)?$v} z4X4(jmTD%80BDCBvdxnJK0E8?KFA)zX4hRFavqVGhW}77?fJF>yJO4CBEAvep+hDe zqmra6_+*d$S5w1diBgFI0~2e@VQC}4yiZje|TCJ zYw|glD|!_y&zq8w*npFF_=qACByVQe)y_4-_rU%lrEGLaw(e7G27ly|JNRi9mB5qD z(;k4UQknLCJK5kcNb=2SeTYol=BneaUY5lp(3PSHyKMn(Bfnx$MB@0cYXHr)SA-t4 zU#abiKpmU&1)a@>>8udEPzu<`$IE0L|8(UU-9Wo+E0?{}bBplTbvRYa6n#p5x|5E{ z*G;slOkwc_xDhOp6P0462+?fNrjM6(CjcGb*VS;ts0x1di{#MJ&yF_Fnr|UpM6W3o zOHj<{RT?<@bZQ*af2h{>x@?f{W@~7Kk6ESE;U7c29mgEzPA5K_jUD#mrwZ1&%C{ltV86nuiI1nf2u2kM39;Me|^(El)y$hILs90zQS5bKfJ$J)ZHHyo8vR$3BE*L zq04d$#bE_gSDE*@7SOsC6bQ@)jo4i*eqA}vYT{CBr7%{<<^a&yAk#3K2WGpm0&XWu zL_$H;YjeA{9I)eB$=b&R%UL%osg#&;po)a#!I&e_VCDhz!b{o#xyzDQ3y;eNvVcI3YJX!mO%iVlo<>)KNG5XK0pe@u# z`>`aFiIc#b+4$Tqh6-=s*$Ia&&CKVn^z#Yp$K2bqJhH7R^n)eVbWv}6U3y;+J~}+& zZu(0g@~1z&R~}fc?`Weu-X@=Qi)TzmPeMe_# zeOJv)G-vPf;`8CFuGe|I?l2Ndo^7vY#4AxKrO=a!bA$134`N*(n`T}>gK+ExM z9++EhC*_jH3?vyLzVwM=NIkrqc@L@k6wJNtL@WNlBdPFX6(!z@W+q89PwppiuCJ~p z>6q6XQ)TG-V=A+}(!|UvG-LTrwfT+=0GDC(9{R?}O?LAM4GJPDCqjg|fUhw(AaXal zNnXVpR{Ka38bD);wDS3G{b*UJ;ispuZ)luW9+I3&`Ptxf(jGV(vpT!bIjuSMoo@5@ z)o@J^-yK&)JPL;w2kJBp;}*RQ#Nn7!6+6hWk9XSC$fAA`f@Luj3Nj6_Y-BPUu6Q3O z$q2e^QubtrM&POZ%f_MiIPKijJcQ~HkJlpF=Dd>zMt1nFq@MOiEx;&Lk=4CPhKa#d zd9%v!s}duUthCaGc82|)W6a|Mcw4w33fNro5P9Z@8meIau%%RjrgAHxc znaqzC_hWlX+`7cQMRJTfHOJYYnS~S|&@OBP5DhHkSG1poDnwPDQ8XS+sZ)@BVPhgU zj={7QtJ3V5e=!?YMR(xYt9qS}c||Fgq1Zc%XN3EE zv~OpaMSz$LfG(jxnuBQivoK%=6O@=-NS~)Y_)T9!2a5h(l(P^ZzsQ&mjHd0 zoTzzOI@6eCqo2Y~lbZ0ht1MJB#(_Y}^n4~Ib-<%hmONB=_%vI)aNI39m1R63A$qrZ z3)yj6_WnIiqdvuGU7%L-YYzl8=CZnb(NY@8TObxkeACr&dVA+LVG6MkA5v^8o>IQP zC-~v17H=*?GiOYCR8*tVhx_~8ds`r?af`w9S3RSwBVYN??C#aL98Y~IXs`a5@>;=A z$hqJpfhTF&eJR$=Pj}o;9Q?+wO}tie&Z&otd{OAMj%+{%?3}>%H87lmBUki2B-)lYHP4;EaG!(~slSxeuGMSX1*^ZO@wyGRp%58NIRAjmpTX@o|Q99F| z?!V0H64y{09#ZYM{-TlfsR0k0_vLL~ZKZLli)elNFr$I8$Z@ta#!Tbuy&!e_!j}g} zF;EQnaxU93gxc*!HO|i`jl6)zsh3yQ-H6wCnTn&2WwOIWWilh7iArc%o7C6CCzxW8 zOtQ9(|5!*i^5AuAd^NeIbsEJ~vymUE6NN~tt%K3YWynh73g9iWX=i{EL-B!uFW7S?mtVilsfIaHNG{C`1Vg(zdt0Ge3BEej*`9O(x%^H0Os6R)&8=8S(N>49 z=(3GRT=a1SW+;?cs=a5O-PQd&vNaxPa$bn=V@OEU!U%tRY;k8Abe@N}%gWyR+q=K? z@OG8Ok2F~RanL^iZfT@!+1u7KmEXboZ%u`BP?_B}*q(*;2o)@ksz?>o5j{l@|KU<%C8{V}@ zv{vZ9Hcf)-Nzuq!t=@mtz5gpUtyyg6GM7eTG+Ek%RUos|;%X1ILm)^FB+s(}Y29L& zDi`6Z+_A=#sd-}0^GIj0>O^GXT_uGJ6rOKV2TrdfPciJEBkiyt2q-DLOw>*}_QH-x zM;3OzF}}tekq|GxWtY6VFM%%oC(Yj}9ej@HsB@Yve%;?UVa0&cLwTO&WRZxK;CJ@K5%4)nAUeF`LSwJHp>@x^OS6gYVb;j)GKg#F3@3gc zPob7G@zsj-i;4?#;O0#8(;i!874OhdJF`B;bjcO}ueSR4x1CRRvnvH^iV^BQHSDE& zGz;ako2EMPpm7Z*RWpSPA}inEAnvkA6U6cj0gIMKVluoiLc)7~-i zM%!}pGPp|01`loyWRoRt$(zXbj z;H|dhcX_IhcJwqp-Bpv&)(O$a)k;}&OaaV)N-4yJMY;-`qMA2~R2^*`9V(A?_mD)oyv$ zp^t6gHor7}p(9|^EYrqokMfXz64}DuYh=4Py}V4jy1A5>+D$R3eS^b!jVnjr*D=7d z`sST6gph+;P~NKm>sX|@YIdT^yfv&DW_vfrj9UE2XaA8!UAT6*&g9g+cW%z~h%!|+ zSjILt+oRoA(lgc8r^~ivHP^ce+;;Xa@v9Yclap@I^P*OZTi7k`UP7DCE*ksK1Z^NM z`RbreLA!p{=Fr-wf11p5O%K+l_sri?ZY}7sq!~8Wqs#QKi0D+(xYY+4n4W*<{45Bo z$>OSYSDO8tWRGeJ&aXWqtOk$f0LxoZagfrdBexG%Mbl$Z5Iw%O9>_{Ezu9p@-}QT% z!8cc8RECOFAG!D3{Ml^cnj@8kR=s)Td5T~zATt4erDc^BW3Id~|CWX=0{Qi5@;s1Z zSa2%za&PjJP)VfLPRTc(P4ZE?(Fq*k%`&2Pn(jC9*%_@|z(|*l$*3IX2sarYuP15N zaMP3C^PJ)4eX;HhDp_!|q?bbJ3>y`xa`4PJ%N6Pd6}R4I5+~5A8oVKjKCwA<7&&oG zI&@#EB1v<6+3XHEj`@qJ*s=ANfnOG2@L9jCqsAABFLKY@;n8g9_E2^=SNY={ZsdZd zei3!)WgKenA1tcTh>ReqT;;JCbdi%1N>R~rTi|=(B;_prD zekR&-!QGN>MP5!j?HOs5AAQ63bVzEZw~k%(l~$}bS$DpCR=NM??dx}O{OIkX%8+PV z)nS!bn$PDa zSWgRH+(t z=Xg95Pjjs&fJ4YlAJohz5M4cc35(nCb1qA_oZH*wwkPc_odb!P=$T1Os{L(C=85~C z_jTXV=;Qb21(I=JUNiG|Ip01H$-P>lP}-FePwFIdP=xw+RX|&^IZ2{DgR}ZIGWqrQLfmRv)ZO&W=mGgBM`A{{rrTuKZ$ct0XsEQl* zNh{uF)nGbK1TgwQ7KB<_39#pZXUQP}MVqB}W^iH`&&99g(=>gNS3;00@Y7~baq_En z{F=r|$|l0(__c55I7#qER&RyenJF*d!9}^)H=VnNP=D%>kHI36VlAbY@HGaZi#GF8U}k2L z!|eP=9RotcI;OQZ`vRUb_DQxkV@3x|R(GxTxdEQ`#7L5ON~}zu`-4Qk$WmS`uZ6#t^PIp-5h)&Jf_<*3 zF?xA1h1drh034fMgNVAA8Kj}1)jjR|E{Ub-05l>@MC<)`p4h_5_dhDKeb~3AEFq(r{OOrxgTg>H>$Cx_z5zWa8d!+-$cGSZm`s(@sn^n^O{l)QfCVN4pr+!fZ zNlH(IuCO`ZMhoZJdO1R|dxJ52EUyeS;l>>+8im9nWUCkc37p#k0pVS3D3M%PcKGir zRvu&X;q71R#knk*O?thlBx@MMt8s%7Cc0pWwQ(=nzc`ZBHe7tE#$hslYge%K6CTlY zjZ7F0vcsFl+fg{t3#$lEUODl;B5Zt39?z!aDCdFgEq-I@5Cn4z?>>>J^tLyIv2ac1Xv^R$dAC< zcL-ED1ls&u`Gll<)?+XxYEG|~boTzxC%%`{IjLvcAFdfO&NR)f&ptA|AXQGC>v~~y zMZUi=a+P_3t*nbVzS}KQd_b7Ue}&D)g4XUDpO~d`P;z|8UlSHC;-kIK@`cV9!&T=(v;ShJNo7Rie)2j>F zTCN#8aFdDP!lSX~A^nS3yh*EjH7H|zk#dpNk{gTlPGPwy7w0Zx z!`4g=+*ek1Pte^rJ&F)>u}}JT9x>ZJG7xi;Fwg9j=$g6`tx?TFnD*W8_OUv>*4y?N zc&H{p^nS{m9}uc=Yk}XH3nQN@rK9)O{=&$8`kPEd77)5GWZv!>DWi{qAy!9=t}5#g znN7tq@8I;+llQP?l~9ZR`jkGaduR%d)%`rp z^3KlOZEviGgrTs2k*ola{1UXoWW?Tg(`oawR(u`53r%U{?=Tr%%@kAS7N*v8N zL4cE8?%D>!Mg^$RFX&f|HL15kH-wVMCHu(tz9wCXXAfiMlShY?cc06<5)yGPwenr7 zeZGKyJwDX(1(Pdd%@Ykp1M{xnT@q|Q3gX*a-6gh%&vB8u^zx!;$34-_CkMq0BXq8c zS&x!f@b<9?AxzYmsA5F#@t&-K^1QyA=!BtArGST&Ygu&PrWUMe(GV9n$WCUBG6cyZZ#^;qqy== z3fy+4LmmL04(UnDVAg+6jO6O@L;}wTY;fdTkb87-N`I-B&fE`0sHAOy03+BVd8ja$ z9=}|GQC*>5MY1CIfMaw%_blFDN5}Q7C$Llr(0}WmtHb}gFoiEn`~&+IctzOhQlDna zOe!ld)FIi+!W5m+5*FA~mQ@0hc-e7d<~I`@X?1vo7@Je%Jp<8BD*!$zZeqctrT4jL zyYt0_Gu`H^>-($97Unmq(ofixN#ENu_@8TA=hht{+uevGnz63V#a8ZEx$EEGGAXx) zg{=?zk;UZC6bE&4MI^xks^|ENhZg%@Rf29KyP>Vi&m8UC?RgR##s*E@bf6i6nQ|hP z(_|b14(S(`B7>rl;RkUcI^|D^id7Mo$sAie_Qkj_l3w)P$OJm5a^j9W_BV;oZMPy@ z_uf=@oVetk36@BcI0Yb#K}F;>&v2$6z78}WB2+5AM04=$34q)Ze+2s$D(B6z@O=&-R_`Qkmb%6PiZ)EJPIU!6~^llNd04Zu+(y%sMixw8$y; zXjKBQYh84oxfm2da4DhihTG8}L??E~Hi7 z<fxV&;UJ(ZQFl0*~6L!FA7LW2~ z{LSsOAysCXJGr#fbZ_LGIA>qKx?0pl(lY)81ymdws?t>%7Ed@(I8es-uIBRxR^Z_C zKU_mnp)R#;cX)Fa-o?7#LPEHdZPv-F%>3{(Qaf1QccCHVJr=|hOI37en2z9oq7rMMM z$f2$I+(NlBS&JYD`y&nkv>`#>rJd<;d+^=GO74B(X8#CW%*>~&ttbv<04{g-p?g)P;J@S%!sUO?Z%ADarWwRiFzwJRQ!cD@YOt| z%JdzctsgCW06wrTqO~md;RZM}jjDiUCz|CQZWuXC+26_RIekEV{E>+F@++-!lC1d$ znXYd%J2<}JGBRWEzC5L*y^!9ud<_I{(2aHC(`CM%Y&a;AaYl0?BAYP5$~b2l$?~YX zs1Oz*E6_k2!0$>60bme`(&T%BHBJrI>NzsX=SfkGI6Km8nuQW?jvppYqsbpOTMxr> zE((RqZ_8IR+>Pa`Z$BI8nb%42jR!wS4dX@cI1)CZ2k$PwGxfw09gDtG!|=*0Xz)jw5ISF|{D0Vc%eW}Nu5DNW0cns^9B7a)~^E|``zkw=bc-#U%CO%w~WJOW?bXqEQTU~M6 z=Im;kRaHov6+FKaJfK}6Kh?&L$dt|PbNMqL;&Kf7mk?{fwOW=7l%I3mAia$925Esh zsyqD956GUtuXo81?D)6%9v*uZbDL^c^|5c2v-Yh)D^T0PZKk)0uGF6e`RKw^X)gmb z=|~j&TM9^7(}yvnINrhz)mHRFmdU)PDL_V!vx4 zIAQ71gUYjB>Av~_rA6TJsPnOJ!rY1L?O|?5fNE^a6H-txDE!v$megA4Wvtmo{Z7E4 zC-1_6u7;cB!1-#l&RQ@OoP9OuOiCx}{N_ug3UM&M#p>EFBeC-t-dz$iH5aao_+fjN zO4tN%5feEd^6_f&nt1G#O(T`}&*%2-IGK-i$^EKkeN#(SdY0|EZj3b#LhbGChrqzI zGFknc!jvkR_CkS`8%I_HO}|^RFN@t2fhShXu!;3jYDcROEzDh8Zxwmm?I@a2Mqa@- zeE}K*N?h{~#aL|>=Oiv00KKjYoOh128CsVxZkIjBb>Sf>=lrRsz~oz7&t2%$qyCupnrO8HH&- zwokavOF7T76{1i|K;#jOPBdMraco2<49L$UN8DBL&Lnzr@6o8zHU8NXq| zzy0B$8SMagpB`$a%UK>mNXT~mvzkySNM5igyGaQ{pUx0#+A8ttfg-3BJCpY7KGsW0 zSNt#*>~mC&Q_4u+?G<1j|DlJxiba)q8m-;=EnE~<)hi)zESQNy!Q>mPxivRKhTUo z@gSC`?+asy*H17$L@FIR`mt%P_!@3jdJf=zmbz>ub*`?csvfSTDefLRe-pDxLLWSd z!Qvt}72-IEU1EP_E@KN-u@QSL)95Tntt&E=10pK0!C^Ld4BIM6sK_K?Hz(}y>hEzP zkg273=9K4z-;$tWlk|?TAvEP4qq7cZ`&13=FXVT*K$AhEuWb=Qq73O+-R!6J;ihmv z+^~dJ=;Ol3MIG+^Dh~Y?Z-l?N;?=sgt-E0Lixo-iu#A#A31Ro2B}%Q}MfI?od4UR*Tj?uKzRsnZmj*O3;EVM9yEN-f;r_sGv+lNvk4kGHK_nqLnF3Q~h9G_Y z#Ic{k*&78E<^I_++Ti&UV;X)ZWv*6K<68IOX=j~pnHv9k8(7Ia(g>gL!=NKS z`%G#yXpE!Ncvv>%jsfdTO^>MYJ@o$M=>s_&_r9>=5{Zz*Noeyy>9PtsL-%Pqd>DG6 zzLzjuDKsn)XL-ASh1Jcqx$6d{=r4&DGF^y>#k>9pCqaA+Jaxwxnr?vC?gLy-L($fo}6cK?#!RS?61rGB=Pib;Yu3RtC@N0`zEJsR?q9$uD zo~YhLyBY+`yU_u%&rMVTG?MDB$J!Aolg>lebn`w5PY$@e^HQE-A!hUyRC$52MLFVO z{&H;!cfaUOy}cmfJfpS&7>!NlMt<^T2(vzS6qeJQ2UPQbR2$)^IuKExP+P=)L{GDys8 zT%6^g6%%x4J2<=$=}2w-WFp_WDrnLU5A?0PXCPdiJ3nZTXbbSpLt{QG8N6pQ6(qD} zcx8_d(c?X2wJ!y1->NeCdyuN6YK%;hCcNjDSvm^y()d`2NZI^xE?%tgP=UXq^u6_r zJO$BF+pxsZxlG~C541NKkHHB)vN%DF5KoF_1(62kTLC?W5Tw^vX^I30bKRq&Y%4VhkHtd1*M(-A_ z=dHX!E+iFaSK8ve`xzdw!^@8Yi?1+(u@`fx%grnfww!`_c5+Wl^;1GMP*^i*q2kn- zQtYO6hpUkv#yF~hi5x0H;Ro2=Xwax^!k1Fg)=VAFN`?F9FLCVcKcFVqk6LsitsqWm z!`R=Ja4H^SnHJy$6HBJzBH5W3k<9x6fR8&tPK1ZWVKPKlunP}jcJw^xu7Rw-hDS|+ABVe0 zeV*>bTKy8H1k<=59vg}ELQkTI_};Oo>%1^csucD#FaFjpyG%=*M(!v8kj7Mw+R2er zMGQ3!x9zx|&yM6n{cP^j8KJ%mX{5b)q=0MJ9bTfOZuv;$1@%Ug{h%+jP%>B@`< z%+1t8t8zSf3X?HyQ3MmIQmj|hI*ZzDUcV{px=ZnMtgc_oKfj9qWz4TtOm{Pe&96Rbd*j^w z8@A=+^O0V7Dm>fJXXw&O?{aDZ<-q*)=bz=HQBtq;L~ar~&^aSNd*aQ!(bP_lW6s9H zoiFvraA!1gb89#SM|O=cW}3*hePn*Cc>*Qi+{y9`MR>1c2DyW!{ncaLbGfVLIH|+q zG2@CYwEH6$PCQGcUZ(^n-*1H;Z=04K4ZeltDd4UY$mf9wiuMa~HV$W#-0Vs2(pCe! zYM`UTmnm?ww+C1QxXhKh6=r&;Cecr1HJ`oE3X9qNkaUy9nu``bmGDIOqn2Z)Gz_NP zA%JhlR|K$a^?eBicUwF|UvFFZ_;wcWCE+o6GE5<0DEWvv45c-nOsVB2<{G z+!MN*x`|En?p2gaA|kVU_m{vj9SE;MqpmokZt;N4>bzmkKK7)|sg|Bb1nHWWAUkz_ zN-%HENWrCr#(-%3g)JF@F_{hN)GlfV|DoCy$l&C)?%UFok_w1z_wv?IH~-Bx%+G;q zJ$2P!W(>0VdA$3q?o76RcGkh$51Soah+;27vliY5Ho{42YrjyNeM_q$uKq)p*7ibu z8%~j195IegO4oB&BYHq$Edc3Otyzz@^a&RqC6ufaLe-Laym5A~{7GLE62&479?geh zg!A9XOzI#4-=_zx6yY-wg=wNxO+~^>hi{+8h~g%u6aiursu(dAVSvYT9^To-wir#~ zG-GPPBf3;@5P40wi0y58(mE?%9f(1)9+6eNUCk@&*S&H->;@wb&bUjA?E=m8OGd@y$X z62KEEfGjqD?HX#zWYCnrTgmH7yEMfNLoC=c-FgUlED3g?_JD^~nSVJhOzEtoSDo%t z#;`4?;1G513-5tAU>XnB=NETIDIUWLyxKKzgCv4&SYHsp+jlbV8@%Pi5SUL35_T}S zvl@O?MhvBN=*FqI8mYL0Ma4U6yoX6$$>ArJzI;Mddna(~M(|~;1ACf1xoYdq&IBrA zY+ne7WxfGwK0Ca{dM~Hiu@K-~q%Y((=nw~t>RE8&#La+vgTd>XFRAoRE*b9T)w&$@ zF6&|bHd4IcI_~MMHnMd<4LRh6{!E5;2N?fR(S@y9j7;4J18^S)z@i&b2gcn`xcZ6| zF$k1uijieMgd?dvKi6<4M0Dig*ps683Oid5%8LlL#ZFt#FT4Sop z$g9}p6s5upj1#xIG`j>Zrn@bi(gl#Yw{iG}V7BUB?_MmJucppp7<$uFMc=;;IEL!R>?95kRulnx<+SkIIfP4Ko^1-EDE8 zT5&b?gpg!Sx*vVF8Ln*(7KKi=05Yi*Iu}tNsC`Y8_CBH_KZzCSS*%Y3WN7~PNU`#mMYY&{Y?z>u@tyQ#wj8-Jo#ZgVmTOY z-4$V(DZZCK!>*ilk9Tpd8xLhb6h(lVE8o!_;rI_5OZDzlH=_T7;P{B-A$7rkEu%pk zNq_iCjWFNBjG4p5flyKjXv^grIx}^kTud&sh*TiFw~HZ>`EF{SGDP$#`LE2b#s)D5G)Pfia@jtMDr@IsO*D2Va8 zV|VP3!38p@qnGpulz{M-DI2<_Y3o6hT8(5EOL!cXKS)pdmAf)Q%pCi(-_V^Pz)0*= zZ1{YI+xNK!GWnFJ&pT1R4I2k4G_*HQT(qxsseOmQqT^?&UndC@`kDJ-l=R~V{IJ@o z#O=XUJqxh)qUH9NXBQ;fdNr8qKDf|QTG6F^ z!4TZ345`ATW9;=xKRGf~F|shc@wh_Bwmku)PGmimP+Z5;#F{!@ z>E(4TI)oF7H{bK9&~ENtSImxUCzY1N#78pZBj+jZM~VuIF*O(M;q-3K!ScjaiLZwt z=}05?nb9oP_y;#mkDKhs!up$U;nnXSQ?{n56}$`?ga%Z$em=18cHLO^XkU5kzcis? z=si8Ug*e>94blsrUW;K+`zNENrZ~@_ph&*ckY@lEw%pY5r;)IR#Ik2qIDcA{`e7BI zznHz*aB|lcP(Iwg0$r^HKPu1E3s>}42!ZzRXKz37U$UVsZw9sxm04d{E&e1kv@MLW zO*!M{>j!RReVYZgkfqY!OA$!7{g&nW3r%R2s8!Q#YeOY-BQ z3e7lu8jW#|03r$>k!*YK40^^q@}ut~pEp*<;|I*}(HS&~5Gfv?gPEPWffGm(qBo)S zc@z`TYSwiCHyMHc%U-}tFJF*j!g_`6`0bIKW2pm|T^V|p$1~Uvv6g6*luEdNc}e>a zsD4E{lc|NHC4{HK(Ao^2&F7^1fvS4^52aOu2Bnl9o=JPGgiygr1T>1m7SzrLTr~LxElRVjRms9s+q(}Hr@J8Sv{)GNi~AM!L+{@Wm^ z{f_29X@w;J-RpsG;Ge=oO;f&Dg3{`mksx zreaMqvqGX=Aie-X_bP;C;C%v_%oyryGW1Z2-bPz7eZtU_h(WgfCC1POQ_qyp7<9`0 zV?Je=!tlz4sL9)_UH(l_E@(VEJR=H4&*EaucJ)ryOoMfT2k|+Tiw+dKBNXvzdxs9w zwv(QI;IZ)~M;{#)DRrOlyxramX(uMS@7^1;{{B1AK*9hDmLG9YXxF-yIY=U;!&ZJd zczKq%>Qq^W@KEGw*nveYR|OIi0j_pU+muwWjFbLyj zJLVN}j5hIGn#-}IjH9~_`qm)hNoUG~Fq&{UN8)Z}S0u@^(UqX2XBq*Q?BRkuWhe8K zaw(U0Z$G4Sl-*D>*EB7Drf1NaLQG$s`>zN^$DAmPL#zM17EtHWzx&m6j$8RI0t|t4p)V*IKZ=VxoWho#FHzJLys!F;llixML9$^~u z48ZBv@GiHh(Vh=bg!_^A?}m0hFyh{};R8ef0gf01pu2mmr*8F5yR&F-mVtBwn;D#ppH&JZ71R8!_{g=yU$Y#&YdF`CN!@SNb`Fqshs1fX=@@~+Uv4? z^@~rOuIO>MV_jm7BQW$S3>uoQE&6ttf@V{3S>GEsT4`MJb>^9g8;Hpke~z!llxJkl za?^b3ef7Na>TlRIOQKhL>!19x134{}9GM1+Ii(F8x)G3uh8*d#R$){uGGMY)Csc_A z_nXY=e3wY6>fkGtP2QOoHymv4y3jO@xi2E6FgCw@q)zwFh}}ZjAu!tK6eFMp@6+?0 zz~nXx8&71&Ba>bB%hz)WfoaP&g?2me;*H>URyZ=R^E{I@A~`rsKp&E{YQ(-PTrhOh zSg|4;&N^0X0~MxU2*HI(WHXDNXJRAf9h9~`2K!(5>M9Vq#Xt+`+C%J|&o}$5hS1=S z=B4qyqmCD(FDdDMOc38nGfeFZM|@%y{ki8Gb6{SncW)sIKvqi&qo-g&;PS9?modjx z71y&4&rhz`myWigMy4O|iRLU_XwWU7`uqcMwrG8kyszlwd(A44jqq|}Z?c7J(TQxI zWNT?>Ma1&kp}q{h4o@^qv=&=WMHpfqOGajs)Q~yuyp6FH`i3$uOrxpffoz6)+eO8~ zA9YWz^yOxP+R(bj-kB0tydP8N6h@sZP|3Njz2f{i@psr*ekqdCg5*-|3C98|4>qhc zb%GB^SWr{*!5ziq{>{VU0ZK!UsE;e9yiQb9OxOlimlCr!tEmFPenYR8r+Z?2WRPe2 z;m4*N1o>!CR(2{!J7Kgu*P&CyiIYibuf%%3GIn|JKH;hhxFQ8whFa_TWT7h{poy|k zJtF+EV!D(SIX0{BaaUS&rz$L~@+VyfPlWrPkiAywmwOe@3PAewH{h2;sk=kcb?G47 zfbfbrbu-f_b#J=EDPl|c!(6Uo_YpEVma6BJfNCm!ehyymeDu?mb({D0lvxM(x48}O z2#>TkAcgL^W3RMI8J3FCB3#=DofPr;Ix*XPEu;@rNJnnDMzNUcH04oRpO!@22BN`Q z$)l$kr$T6=&WX)udMBF1HnhEo3vAyWP?JVCs*;yK(cip6;Lu{Alk(9I&TS|Q@ud_f z)|)1oKA0Myj&)X!IDPbxKqtt+`65YroL#~DU3oTAdh+SZJI>PAWRWL|Vrned-QB5x^cF4pY0!{C*L(B@*zL0D#LyPP$M-?O;A~3< zulh|6Us_>7_SzTOW?IR@NT+n+9%v5F_`{HP=@Blibb1t;-OfYbJ!j1pgYa@1hoFU0 z^Sail?$v)M@U$;7Bj{2N_Kia`d-J4xJd2{D&fo&mMGz6Nm~l9RRLq;n{8~TZ-W7FV zSC_u$qrLV6FOEdyKQMtLZ@ckCy+$ zI@(Y}P>!hj`h)+P@ud2T@l-Ii2Kl$^kbipHfB)095J5S@SzYb;YsM4fFUHdwTNjhR zY$~LQU_6B!Im7==wf^NE|G!vc=dp-66=JE&q`VrP{_TkU9}fmx%Oi++ zw-a*oNPO6~eCCU64HMoUi?g5{dZ5ceV1UP_Mj|B7Q0T?qxmd$`xkxB=?zl! z8CQd_aLO&~bwz59U7~pP6!mVkDO=EQNBcL4w6%?)#b9?EX*M7d;fBCNb^Fy-xLrNc znF-bU;@p?AIyqZ^Xy)&?K|?xHIx)nkMZ-n-Ja+pR*UV`g>4&TnHP_#<02ym=3WQAg z2$^c_K<;`>B$B^nF=nMBNQre%o|7PmjtkAdc2;S<<%RpZIy5jsynmk0{~@(;keFU{ zKl_CES%T%io{$QH&!z|EF9dpW&(HEm$&YS&1RL*!JVMH~omoSf5&l{AMYZhDc0T z=hI=b3z8UWS+S3VUII#*KlxI)ui$+;=!leCvLEji_D(F#fX^F^sVyk|W^NV=5QEdV zxe#Ktnc#CufSJoEXg$WsESFlU@P&^K;Z9G+D;O5L1XhGB`g)_gfM1LpB2ke*UR15u zvTV+HL77^WMvCUlbLP{~A z{-8}SMQmqI3t_QV!qDI+NK2lIiq$t3tkqz@VCdpkPWG`Hqr`z=^^ZtVhzIA+-;bn= zg|^YScOBPAIuy@=;0D+AXo<4F)3e$NgefEz8Q!}k?*)@XCSO#&Tl6!$8blG9uV^h9 zN2uWbW_zA`ds90V1tiRjC3ehdKk;R*u-hHy$aCL!*1LO`k%)3 zZ@L=bj)$;$qi};>^_H4eV)Ystxk@SF+N4>;eAI!N66GG+BJEN`!b+7QtymC<05isI z|EYxhm^(ijHZdXM4*~8Uub9JCsi9N%B{Cc1E1YvBteB0rZP0_=vs9O;-)xAi_T489 zEKu+p;d;{&Wq~_^sc8t!e(%MW|pu2N_-0t)5$Z!O~JvX&BD2=jXjAUd$wAfIU;``W; zGPL2P9ZT%DY#1nVSlt_t@-eY6~@t z?M9^Uo_Q`J+^(xwHuK^id3mPQ$w1~ zuN={`6S1?zZmF~_1>m!@v?J6D(NXuCVZExNNG5Ky^^X0ols7yF9`A-9J!`I7OT)Di zzvK`((fabNY->g z!lN)En%3=}{z8=$l$22qw9Gv0*qM2FP&ocT#RzWq1~{RL`-V6SV2rXQ7VyYy zIOy4o3TSLxa3)1BU`c+3v#EeJt1VoSh|lQ*YB8ou<%fMDtTZv|XU&`H08?QxmYwJ% zbCBQZqz2vNhuHaw>D=HcUMf+v!V+u94THI(Igw;^t40RA@1)H>AYf zA}Bp6#}@z#zKK_G()&WBp=m$KK9YA?NrVwe8M4DC`axaNbYnHBdOoP13^|jct5uwTW==Eh?hqq`|Unib$at4mTcF9%t#6v~5{F3`Q zDp`BG6PwwyhbM%=)gi3|t@I-qaEjs~i}8FKCk4w8+fMbj&mM3h+g7rF#j^2I z?Np%vs!j8e>H{6G^bJMa2vf)64@e&Vs9>X8{R$nCjqbj9ApE|L%TqvSMNNa;&*^b@ ztr_mO#x=&B88^yFRgBA>%0&X*On!bltLovT z9eJF0e@?}>>SH=r+B4EK#c`8&>Y^D@(+sv4&!Y~d;(gFcX{&x9#h{_!%>}TPdUCAu zTkF`Yx>Sw@%Mt>)Wv+GjXuOoY-uPfMtuwPCKzIzaiMcXks8vRPF>Lw-^>o4IxID+-c;ijz=%*EC_V^h-13yphW}2hM_qhGQ zMsDg?9-9T;X>*4}^>eaIAPeuDIrG_Nepm6^k6J#bNe6}~SE0*zFPw@cCnBJDFYPmk zd)h8Bgm*$-_s0~&w#3~mXAXNGYT~9wTDP)2U0qRn|CRi_|G*Y##)vyBh5{PHbRy-# z7{4;eTrXOi5i1ockEu6ds6Wjm$;iYEdpEtJ&UxM zBD(#^@A00)ZwShy3&z#sePFkPC*ntt!&boS$gDNWC$R>AcaLjrFBr6DGrr}s%6-tL zAEIA@Og)S_mmY|tMSqglWPdqMg-=E`9$h5bsIxM+>9J8e)B)>~^F( zugFN4h6;YNgnBvHwxHI)V4a=*CZ2tm%S-SjCTY4guJqe&^vISjK0jE6_(;%KI4haapS9 zVkc3;nv9E+@Mku+z*kKv#+rZ~eX5%tmG0V%^(wYQ!j^(={Q>w}beMZwc)_^?DWCOo z;1uq-t_M*8WVjQ;t)pgafR-$pm2eKlsD!7X>sO5LjBw zDi`32*{RmV)aHZlOFy?Tc0q%ws2Ab$k&Fc3hnW%K}RNa|gor`v=OTNspYCX&iVwpZHsp0$8X?qZ&e}OxHKi z-=W1W4JlmY3(wb9Kvl(;_Jw(pIQY>?Ag`s&mOKZ@-ctXJ5OZ3rn(MAqvw1Cy(xW74 zw+LSw9<5|izG6psGb?)S_P!wmCUOUWY;BZf@Uv0PG6o>7M- zhSXBq)xEtsm|X*BpC0To{ZJ~4?*L1v$0vCcJzK|;DwHz7wZEf&G^d&++QGk=cRb^9 zBHrLSh-VC)MN`E>fhdcH*KC9(%>=}xiv+~RcV`MWa zXoHl0$~%DDb5M30t;`noyMs={G0NWD0rnL^uAevQyREGyd@gDi)Cgv5(V@NDZVs^8 z#Df#(nt-z{tqnt>jlBoZ7Q4YqH{9~4tG)IR1^30IE%~_z=W-bUFRv*{y?c}IoLE<`{Q>R1c4*3^=i0+ox zjA?Uq6uo^R96tK!O_}_tCQqPvTh_R4dk+yXJbZ|k$u9;SQTr-Ce(2^t#$p!&fyNY& ziGXdS#G+MQHQS;`kq1>~s8o(m<)AtoxHnfx)X)NI>aokTA<03G978?l66hHi=UvD+ zZiQtN(B2*`apj=R%@ zO}6{v&NMyRgSx^iJKes)AjfV&!W!i@zC~dPy~v zu`y)ED16nvdi1-%PJjx2gAamokvZQ6UJ0}#=@jF~%I@}>%WD0!6Dap#10dK}u?c6= zdCFx)2)wE#fP@(q<)d7mWlFe@5>0H_!#8G#Aldky?lA=u0$cY#&9=XB3-~k=bCIzB zw}YBaGdqwMixN2EjY~+#i_QC|C8{tLC8y;uD8>EG^&|r55p(ynL8;N)zn`numMp z6Q8BGeIjRl>f-dNr{WXGZEpztp=h7#`cf)1n5not@T;6omLzBiXvSK{G$i&(R6HT8 zK^8OFNay0-3MIq0cJs!D6*Z;d)6QBwT(*PXKte|^()Sv12>C!{Q$F9(Xz+kRiRx{V zA_%d_mA@AGDzkF46)Hf#=4N}k5>(l%3WqOL99$-&;hk&TQhwIHJ3!o-S0xpj?v{9;k@Jf%;(SzoC!iI=-EC-u9(_%7tZ1}R`(7kF4@|M-6rLv zNmo&%(vEOmXP$m*wzxMF={SN8QkG*oiB@R`;=6h5AN;#LoYijsqydrFZa&}jD@(B` zXjr^o=KOIL>8{05kM6NH;qxnLjPHP7q3B72Mw3*a!AeXxtTs9+d5B-zfj)fUmZ6hKUH7JvdIW zxUSriQx#!f%jWid?^h7ySezMCO^?P{Vw2tMfCk$8f$l3pDdpewvkVyrjqQjUuVM8- zSrce<_ZaQIf;6$buIL8a$w}_s1XscdOpK5n&Cbz^1aZ)hB)|V{u%^KXab9;wQ-}9qYPRn<3lg7U< z{n;lbjE#@WM1kg&pQJTf9_8U>}3~fR7!R4F7I|XpPR8v>(sZmP*O1G z`79fyAWgsgR6nc`e;*&ULhex~beD1sJoHGE4*fZE*8VX}3G&YW+|Tzc+xD___{W_X ze@j@KiN`}og3g2{s5=$g@pq-I9Ejf|Vw+hFnt7{MHlGkhS9z=-vg7jC9UV5AMc>@o zw0xQT^9xecF0{?+H^$-#nqV{W=ub!9J}NcRE;I1%UmQFI3Lc%8d{EFf5G8-d*FyB0 z`WS_JS))R*(($T0{!jCif2$MBi#U#~(br3Do6De%Yf(bm~)-Qu^pW=IWnkGD{s% z+?G5(Gw~0VZxG@vC?YyN*WlH|{F7)OCB9({woEjPD8eO`7p?|SN4Tu}oYToh5&E(-c{D`>Y^Mao`xOdg#a;^$g zldYoaMxqU#|5NY#e^b*e)PQbGSfAMRN%{C`qo77bp2K+Csq28lJPSrlNP2M$}f|t0akSw2DNX_GhU5d z)@%vzE7PdjPAh?t$A9;+{hO7#5JMV76frD-P9cMwa2=1*qG-P0U59hvEnXD}yHXq1y0G>TUTqRZ9^L?9=VXVpB zcT!zEe?bS6`QMcFAOH8B9BGgpVEZh-EV*1|7{Jzbr%l!`a(eG~5k3}|l_yAJ`zdqW zzXAg`RA7C#b6?OkuQDsNTr5VFX;e~rc~}?ZD0kA6jm#@vva_a8M_Q66$if5v4#2)T zq>1;{I@(Uo3gf=hVpopvpp>8G!5Db?&tH*$Nb!$~S$i20UlEmYF*D02b%eJ}?my?j zy5~rY>i6DZWY+5kr|&LWj%xL&XuCo5p!_}Dd6OMrnQO7BH@n3lj!)|L^K_%Gw_nsz zoK$#k_KJJVLA*h;Kcsn1{G~i&`f|+OW?ELm zEE~h%qIa0Q!}l^AC|;!`r;jj9$e4t~qp|0cxM5v?Nc8;xNjpFm3zmCKqpEXroVndH zt{zig?dd+{tJ2BjBI?0Gh`o8MEWdGCj}pm6ed-uu5rdY1>45jux;M4OKDwb zPpK^WcyBL!uF-h!uMDsZ@DqkKi`e55F<;+arnKGA^ockd=Q;RcVC^c>qrh`8K++M7%?R4UKgSlGOTE920fYcVd1GM z&`hdQYBR1>O7+Mb^QuXl3wEEbY*eg!?<{A@o?cFpkY66szV&x3z^0Q!_C!wlFSB0b zf6Su1VU7;=Xw=^11K#h?GZitvnwi*_4t>E_AQ5l{?Geh?FGVF z64~x9{j-;uk|i;Y3rl%Q{^oaX{(qZ^ECxh{!Lvty^d27|fqyyFe6P5${-RxwPN)+3i(Vzrb?a&H4uvp`$B^iM4T>KCMo3;eBpOrMVg)bSW{n9 zllhX|aGU?oIrfN6kC1ReWAF4@HrBsS(~!-B2IONUs!W~s__ua$ffuoER~m_H@8L8! zEL*|S*jGOS^aA*9yrP_G{Pb(+9Prx-(>2F>HWh~X_SCKM;6x!C7dTDE-qoIMm*sLmgPVEZNH91Ja261 zTiULm{;ZzD@m%Sl@*&OqJ|Z>1Xu$B7+8iDQ_Q+j^Hih2#bLt&J=I>J!`)N~4IcP)4$7jlX6}==NP#rYL319vhU_V)E+xEM+c46m4REvU!^~>s=<(mnw97Wy9zfjxKC$Q zsESpq-(#)s{h6A?et`GxCMR2OFY)YYz2U8D5_f_wL@}TY)U?e>)0)S zLF*eQ!oX+Iu^PvekE80u6B_(nWK;Ueh&7SrezvdulV;+YqS|dKQr_X)BF_gvi@CnR zy&|?n6bIAlTvhB84wzTpEPSlwO-FjuU8&rgat&vQ#gWl+t&?|<()D;97rmTdS2+ew z#7L0b*U5f4jZ15K#@&(V79^r%(Fxm~=c4z};`r3K{08(b^x; zF+HyO6koV&PcJOvNs)NppWrEPz>5ZQ;}smZWf9z{LS8JrIJ$9NIZ|gou<^ZZfb6ic zT3nCYQVNw)-_6AvdY{hiIyoszroPd6MTq)Ftu(zi)dYoq-$vjbhG=_v6EZsDoTvRW5rW)CfiM0DkJ(lRIZMRQe! z;+C8N>>`D`t2B&7edg~aN+eQ1O=0)3xyyPD11Q6$&LO}1=A!3LuKcEaufFd|xDp$x z+a5*1JGtOq9R^GL*P~l@Un8fke|qDN?gNcS4Tip1`2pAH5*4j4NKz;)@bG z42_q6m5pzx)6neTP`)-Rp#W`_QpX8_JQx%)rzth}=wt1TX&32u%ueP*O???%(5je=PA|0-t-nnujZ<{@m)b{RO(JEOJQ8LRO3U_`rkMz%+uj$F z6!&M-hAUSEo?YM6tu_DlV=^e2wHf5twO(sBNHV8JRtCF$F4+i1hpFfy$Frz=ySWy+ z?qwzT19ZQ|7QEL_4fM7+lt0Z7)OcJr$VJ@zqM_~$*IQQkO`>$p#=hYaL$s-i@#}o1 zTLdYOHb@R1g>&lpVN zW#=T0Q(X`!PhI9KMn2!{=WpWtxOoj%d7~!h-nJdvw`Z%~+aom{ z15rTPxBg5nP0sgU{CErFmGmf1=cZ||qE6eil&^?!AocC62H#@kiWRM@zZfuV)Zqs> zS75jnN2j}fjuejN6|c$57r`$%C_y`Q7~^!S3a$m~$`#cG?yb$upM^gIG;2?XRc)>M zsZeO!>o~m4@#AHZAPUhq?PE|K^b}IaUR|&Cb1TL%Xy&ko@1Ls5s0T!{pkg}T`x*4liOBw3&` z8W)X|8hV&AIxV$orTR!y-yc`SC|JczFA*AjddH)Xt)pVo)#qxo6Q7mYgVvW8n=fP1 zv=x@CRrhJXa(=wI1CzSXLahBTizI8Tl7-L?Kn~u=e!|~N)eR&P*&{7D0gvI`3z9Q z_s-rp56pHpdGo?(*OsLk)tqtiJXo6EbM+sNfU^pLJye^b-y8OWX3R2)OXkVk+QzQ< zTNc-~=k%z0&9y4qx8VAI-(^DO!yjc{{;X;Uojesv%keT`FIf=RXiJ_`W}JF%ZJ)|n zzf`pK=0h!C2#QRjd^eVDq25z|u-c#}n=yRK@Fd@YvEAKpf`#kq&Z&|%aHd{ zRYL_<Vbx&1+U&v+k;1tWEB{c<%N}%bgl3mMuQ( z{damT!60(rK=1jyfKt2v)miSkvh;AEXXt!ilyc&}<9)!s%;;Reh}OIM;^ydmvm`ye zgG@ZDRM6n{qB)-z1I%&PXz!X<%QUW3(PZ=404Y}9CmvgurRKw~G`8P5r1K=co#-%J zqwd=gCPF+<&13JDjStO@6;*7d) zkJvId!o=Y?Bnx1iWQ?8nLW!#ss;&W+`>1wP?HqG3-XN-bvFT)Uk|9btKd84;o5dQ1 z->6ocRbL6k(#iT55)rJk)Hk_dpxD=?Q;O;htf5cCTEi z6l`8Q&zmbb-nS$# z&*Ny8zTm0dIY_+Zwv3wBrBi~us$F?@V#B#OYA%maF@L(Ky>J=#oL8yJkl16gL-`?; zv|)K#vPy9)J>Rn3ARC2Ncg?1@;AFGV{VoVb>FLl9S;N2f3aM3K5ecNEG#5t7=VpED zS+zH?aGcC9xy)0%r@e6qu8cc-zd#IKu<+?f2sb~wTIlU}QH^+rx${+M54360%;O{H z_6K5CDLV+H>H<|wk(p{5qDwl~X>xaya6fCjH@W(9=Qrr+?>)kD}FWU4Vy#fIhJ#Va)qA~-NxiOl{-VdvKfZ>@)T=% zwo?Rf*WOZYy%~}?<8;=_lQu-KogUY~l=PVManA>@DYDz zs&;DrQmq1%y}oN+1{?U&MEXr3!I+s*S_) zVg-XBPX!f5_%6*s-Ne--YO&!N_)?x5K|TL)03=Vp^Oa_FyJJU%^Vob~)1+(CWanqR}3{edeQQGw`f-zi!;#HjdWv zf82eMx5AP-iKV1qxF_Pmx-`g<|E{R^(0Z|QEI2VK!~cVPs;u;+HeU8NG7Q0}(b6V4 zSu89<^+N(oq0vozzRDUC-Va zpo`%i@B*S@Pe^o4%g(a_S5AffOONV92lH*|qsoPm$>BqA=@HP`EdgHsaW=t;lU!61 z5i99JCI_L!1&4trZ^=L;1}-SQWt+6_Ga==m|0P!6#CnIxaxVC7ZZ%;Rm)|25rR}0f zwN5Q>)6qm_Q46e1#)D%Wa(d}l>Sgl*ptZ)uRJ!s(gMwHF z2A9=p-oR;&F}H7>G<&%Xl>(B5mi@%c2HPj!+*sgS+DAHbF6f$Yr{vx1DCdj}g^iri zj$0tZN?g9}$xj`}5T{bvtJ(sgh%2jBv!}&of1?5I)CiLaHyFK#r~1s*H<*SGd-#o- z0|gKFk=4RyeJYO0k$U6CzMTx=e0ji^q8kn*x2(DU zepLI84P+V|XVn)wVx<5tXG(gpQdGhSp>;dpN~MlP12>w_4*kSga|&^Slay4Pn}Rqo zMzum%$&J^0HD;8Sy|USy-m4?lN#F$8pk-U2!HhC+h%_G9V$>t84rZuYx%KFuT|$fSE^r*WW=z|#o9Ls z=1Hj&cxus@?7GTs8SLRZHee1hm2RoT#rf3ABQeBElRiOo2^|lmd;@A&Db-5_O~%e! zGz|?FhGojQA>v*J`tN)_vJ19f?dcRD(5j~v=Ryp3bKJ?FdC`ue;4VjGp%YOolkdDU zlx{?uuYvLfzd)VRIo3tCrRpIrIitLy6!aE?H~L0uj4Vu{yM7@F!Yt1u;3bota!}fM zaMxe;;kWcjBQ-#u%q{4U9|%A2<)KmFYii17G_?KQ?;k!+DhC*-7YrE6A{q6_03#YN z#U%f`U;FaV16c$40R&`!BpsKaSOE0}k{S^HGiSPA4KS0bxF(*z8}F}Ce6Pg-E)+`5 zhWh7wpSm%CQFPHtIQkER5&>M;b>27~_Mc^tLj{;XbA!(RaDfl{b%CF(RHg7|8UByr z{s;3~_kTxmJOQ-i_49)dlV>$>6H#QMK+**JTTbk3F6)0HR|iA^yKz=2Vpaz{)L1>j zBF!>1#WFFBJh>c-orP2}CrMAOD)+|4a2zRS8n>hT*$-&r{`Fs_4x44$7xxYNaeMZh z!I#eR;Ya`f$>P86`j+(Y%$g3t%<6sjmf6gGbC$i*hOFHi>y+>b$iv_-_ z2%?Lq?ZOIX(pRPUe%8QyZ0ohtnaIYXrj%oI6=bh3u!2u4mUN1s2NSA8Q#jBG!|*eA z51~?as~)xWBL{B7%I<~YT;a9`i_=Xr>NURRRMk?w7p9w+b2v~{?ly=t;KH&{?^GGl zbKz%b-lt_yL6X!g6c?cjTFKrrl%W)=bp+VhldA2{vv6K0h!;4s$};*;47gJ3Er$_* znk)|F_5U5q2=Lk$DXq;o&{P=M?Z9YDCdh2ShoZ4r~)kTttn&-tH z?tPh9+O0uQr0MWt^-gpQ4K}zdF{#bNSo~vNh()iE+Ow*Aw&r3|t}5$^sHLrok6S!` zY>fkiJ%yFZZXKVzx>59j3#Y0B5b8R#LAW8${zUz^rec{@E^Bujp*4R?$*vMztKH9E z3fE2gR3;%R}RF`No|G$jiM>Wv7x%XlSCmG zy^MBICTDhf7dY0}b2MP*uM-D(;@u61GWnIUMyc5ou;SP!vczRi*Y}c6mYFnJBzGuX zhu;nm{ZzT(IU)L}@+b6LN)n7lhs8j&Q91NuAZ5i;gR8V%8Vn-uKjX?^MBB~fC&gRD zWQrtYal7`aY=VWNvvIt8fP8O6sv>RL`bK#1{UOzveXrd%4m8$uCk(>u*apt!4!V@y zICjcveJuiUZDwcFd6*0M!9YLu5M7+%3ct^ennCiqilV?RXJYXLZKY!;VJ{AmQ|lGX z^Udk@Jf{=;ByZPnHqlwSrM>Ynx{At|;^XkNxRGChF=;mE#`Q#Rgn7?r72`y0>Z5u| z!ioL$1pExbbAuGRqWy*bI&vEB0c&L$0ajg8t(Ty zHR z;3hl?R=SJInQ)`W;b2pIAw2Ks+@;n0O)cY)N#0y8RM}m_Q32ExTlxZJB2+(IA=Ged z@H&sivkG>pmS^pAEhtIJhs|+jE{obTGKV_q*!o6>C5@;+kCYyifTUa3ef~`0r8+d?+u+yYViWhv|lHm z10!f_O8L!da=fA?+__V0>QSci$+k-^iTqd}Eu-ah$k*WBJC&14k<-~-GejQ76hq2` z<8(~Dpg-W}1Y(jE++;qzG*&yDW<%-nj0=ggt$b96+$SXuof3?M)+tb6? z-?QaLFa*`G=CG%fgA^nQ@6_k~16r7onHG2dS1y2&Zyv$lmu=X_YEP&PtOU-ExxuSB zR;hKkfin{_rV-}tS0qwgs-=VNd7BeR;ag{-jj>ZSN-gf0f&0`u@p8F4HET%5tp4Vm zs81`|V-qoQw*{iZ3%fal9o9Rko9eXSc@A35RGQR?=dG6G9V*RHjxu=|BS3H%^O+Vv zfStnL6bFXDj}wLu=GmyFL{)1M2{ z(}|bjmN{m~+K`0B-R$ZRUeSjX!VRlff zgLCO`(K!TMcDjSLE^*d~*^5Lq5`|Y99ptudd`mD}qmFrRPa?&W=z5d&?BVGSHOyUBei2JpuOf=Pw1~nQ`Kf zEZRaf0@P8XXylB|?t-mSnWT^3QDwviskn=Fe)J)S9wrDwTJj-Py{d+ATm!{P%HnFH z7Rh~n@HqLjI&-pPjZ=)CEL!yS%!0d@dE9aTBo7P$XVpN_pje`ryEd0yW#RJtr$oT6 zPIdr+x)E~7n5Dp1g%R++r^6lnLe`0F<>rt09(UUIl7d$ig!2pPi{$aKH7p`T;Y6(4 z`G%}C-KxwcJ7MG=xzoPxS^60_{S-LvkEwEarOR5PvxmjSEp)^S%jYv9i{3~cM8H^z z-~R#X#c<6KfHtxZQk44Mg%1h}@l*qZFxgJVDf2bb>`;o3 z`DQJe9MhaMe3Hy(n1!3RfpI?HvQs|W*LxtE4aan`W*XMGV6R!U<9Wn*-&BUKMFC7k z^VRv-54eH{vIY*c9v^#2l_Fab1^KD^&+Lj|bL#`)Vk*wU)w9N$9V6f1{_x9y_hwhC z5{Lv2F{f^EmB(e>Msf4aXeeexc|Ryuu#F3>!`HaKeal=8eZj4#P>RBViTF6ka(i4O zV9K^Enfg8>N*U7MHRkI6N^W6(uZcv8Ck~Cfm^RF(w#Qq z&R$XM3GNd}%Wd&-QwSPLFtR^VupJ6wbMd6L2BW}Ax=h_w5hF>r&oGTcj@34uJu-Z<4|?HWUdi?Oh~u1ww$NNuLrpyy)OS=;+g4-a5fW!P8`+s+by3|E|?tv+F-yNJDc?9 z=xlz+24u=+v<%V5xA8aO(JWL?DWrQ%SF5+~{#X3*zs#QS^|0CU+>CSwdLre}>%-K? zpS6IyAwx26N;T-Xpl`#u!K0uRyWe4xF9jU{Oa3A4x{|3bE*&wHg z))&9M(Er67f$LR*-MlG%8-y|2AO}Bs;|Zx0rueOvYpFDsRzZDJ2!5WbajEp^*DTSA!~dk-fAO~0 zcL+`ar2ZfnECFj9x4@EYk`F=txAzaMcmVymu0*|lnfiDeg%249eL<^lk@0JmzU@bx zzcq;$xMu6i$)X*2j5{(y6;i7V_iA9A`A%&cS^Sj31zkW<5eLtqi6LR!Zh9#D_%F$( z8XHL$CwYI#G2o!uPxxE;DSSz;u!zb6>``43aISg%{BbQ~qcE~&dA{N`Dr9eGlh_=Hz}8U0`SJdG$U?o63v>4E$H-Wyaw|i@X5jd;4lAwU+Z`f2ADk?JwG(Y<*pZN?4zKd zD!)h4cPo64cYG4#RVk5stTq>CqDxg0DW9I{?q<8>GF8$)mDFO?YrUE+g?78&K7TmC zqIos8{TkiPCgU|I(J5wgGdxwR{8h zwPf6oRju?78|?jk=3jsncoGDP1D%cd9E@l77RA>USwr*)+1?4KCR;~oW%Wdt>cK5 zhFxUwZ6auF8dny5WB6wB&1)QOowYFvLCn*TiA@_s0JstzT+ElRgwJk|BCzpZCa%$^ zH;yu?4DG4I4)^AC-5sh}y-j?aN@*V#ZWQlaYv^WnU0}k9S?n%US4Bn$?>=OBZr6*Q zjFg?ODq02o! z`d*G0Cd|rr@!N+1_sWP_HTvF3<2q4OA9zCEg}GULs>;FP9>eYsfH}82-O;}V4_V!e z!~hUZ@0}-jlGsHVMi!y?al_*NrM`j6>@0XTO5bjvnSWV(3*u3|dlGHGHzFNzx}Tv& zy4GO7{5dqRH25<91W<(TVwGk{M3C9}YT7XNdVK$&)b%6n^Devz3!6 zl7&6?y>T!&mUKFcgT?a{zT$;bVvj@QP-AUbI~a&Qx+~-hIVyM`GPo}_0y|H@!5tH~ zOTAq+X83mWSrNw*+^}=DX z&k1Za)faG95}m!Ap~&?Rw_M+p<0$DNl(?b39jzg7BI44NKZ_jnZkFCTU!@*;d-*uf zY$@X|_-QrimYL#WskPLik7T?oPL%qW=lORM-=^#{if1p6xV^^qx{_w5?(X}gr6)ZC zyiP+ZQdiYnbu1@IhQEC-rm1nhzeJ+87ZgC>Q*z4J43OI$91biQYfxB!eg6Oyt7ALX znh)-h({gm&!PB}8J8PVDa~cH-4&!W5_7K|KtZ2t_tBuy);}3XutJCz3<&Asw4z?62 zxd`w*dy)MENxM%LH+2CboxayQHlx(jNBKURj4VS!q}|5_fO81=WWddW0RWSO;-`L% z1$*>_wN}g8dFg514e7$fsW!FGwgoe83x0r#1LBOk&c2U|pm=+R2G-VW{s^a^jZ`)( zu9=z87D|0{y7^`SN98tEG^pCD)QJeox zDiLV6ix)IezK>GrT@!b!nbIh~1Le+)j_)Ohz3kv)UYaE&YIv~&9DyVe8^8B3N(EU^ zVfznOJG``RmLVv~2?ZnH*+N06Fz2Gx%uK?C3GH>3nJd>7%>X`=7D&f4*@E99!bT1;N@?y)8W$J! z@}TWk)C|M28xebBNoA!pgLWI*=F8-{)X zr-I|C+PAr8K0Ds-o*xQyPA;}r!tlneNAb}?ZtrRDoF%|wyjdfuO)6RnG!XW|oq~IQ zz(uKhvz%<`{_5y!(hTH$3CJNbVc^f-+ksGnE93Q2p1-=^Ceh^Z2Zd{0^ObDfYD)*W z%~tbE$9up$LE1-C+NbOHt~*ER=n6xGWedf)P*pu8Eu~=Rn$Yo;M?5|GaBcAYYi)IR z%FUTO@SY2F50tqaajFPWGfBPWR<^`+vpgO5J^wVWl2c^@srL6|^Fj$2`;R z9Puc+P>t6vWT3*Ogvru@xZL{)wp$^P2mCy@*k(FCK)m|r0n*y+y*T02n6~NNWh{U1 z(bUS=b+LB4e5(rJ0p0N=QU2cA8U#;JV8Mgb*FGV}&hr}-E@S~ts3k|}U6W3l>K_bGQq<&f`nk+_O6t>78c*0L1Ns>ZrN8m@_WR}pXawtvkdk&0&vQO&eP#+;!~H{tZ?5f|K#D` zg+Afh`qpbmFG{SIytEUZ|dy z8J)ZHFX0W23Ni(KVL%4wj3KH4(v4BVM`DtcTK9cxaDKjc&qg{?4SX)Vp_Y+$$oy6x z(u02uoXkaWGP?8mF84O$m|&;#CiLax6A$`JDLtr&I;ppe{26C)M4U;t*R&xatiwhR zAUttNv|6-w(86KX=+`H0`(au?J&|-fAXgvE<8He6EKnDSt_m&5*d2M(e#?HEH6RSo zc=pZ3l^E;mH;z?X|Kb%wa z&xQt;=g6%!6SJcEy39;kio$8c@uz!ck5+Yu4z2rZ!b^z4Q>z0$4=yLKX!M@&v6%{g za#r<$IKbB(RD+z2%=*4bH|Qu)b6^&ZKPxrOKUY*hUk<$7RKL2t;!P|D&k5Kk=n-RQ z{Ja6?#v(o=h8J+QUp(?i*aA&+=gNEn$9?|pa6pwmbAipoEXVz7fg28PII(WakqA&p znQUO28Es{9Zwh+TYViSX0%J^NGyUiyu31p)aT zVY~X(_16xG>4Eo-2_Kt4SkS$hf{vgf#ED6TgJx^y&S{b6WFS%8qvb*qtl=#o6#blS z{u?^%88mj?vM=s-)~7*1y`RBeIbhx$ZK5yY@glLkmVDOyRifH1?Kc1#_JfJN_~wf( z54i3x01r>3^QY!-qslz`;ifhSINdz)jO+)P3=ech%r6shQQ%#o{}sb}u_OXYttv4u zF%Vi>m^x5MRqL|^%gQzoVQVZ(?yoliE@~~&VNKQ~B0PS9+Z{oVY>G|;ba$#(B_!xm zL88GvH~Nlm-6BGDNhkZibHF&JG6o^jU8gE#4cxHZE>x2z`UjznPH>aGXICngx*yMu zyI&e>H{N(6nGe1RFXhQU1RreexwFU;@_T>!I9pfj2*YhoB*`!>Sx#oFn=u-Byz#DU z)-J(QRm2oS1xDC#SM*MLhLOJQ3JFe5ej|K51sM0voph z*_CvImr@7&r^9vBw-W>IY{~6r@S!I(qe)#8w!1kF8*>BK9Y;Sykk0mlVBJ2eoP6GU z{Xb^gIc6H37dt_{nnh8oEVew0w*{-5^#e)ADsjZeC*6(AAh`Bb(CdTCtIV2^eca__ zdMatB5&!f%3BKZUzpXE7bTG>FiU@O0%Bkdbj*alfG}9Ur^FW%w&_-N6Zs0vD=#5M< zYU55J6Bf!*ZRxEt*dYQE1Y+Bjp95XYF(m1#yXp@OXiV{!Y`o+B?Q65cXpfUXaEhK5 zW&gnY&4*`Jh6mU*%?bJar_HnWKa1uOt~V1Uu{aj8)s$s}F@17fI8tMMjL6V;3347V z7Q%lb>e^bCLGSIiaF?|$uldaMV+#)=y@R)w=r4kwgeA6MMVWBJXe5%-ve#iGx2&M|98 zg6~>^M92cY0}S{T^vlU15aHL^G5AxG)1f~~Yw*)a zJ`KBWEGYWqp&b3HT1<9}N&x7IWn{BR$H<#ABbdcQW6iY561WuQ=PNUr`)7zMxHQ*3 z=TzW#@5l1bludVr3b#w^4JI4c->ys%Xn74Qx94N1==+IM)|QS1QEFRmmh%T&?UhD> zprcW@)@S{vRJxbPFTf1$g7RU=>g6uE;Wm06e4fSTKHCX#w|wGyOiYA}RW(hjnSJD? zDCXMNB;JrK4}E}NdUCJ*9s9Q)$Tsyas zGBHK1U&JL-vAH|dSZyPpb}SPm|KZCMjP0@n!5z2HPC=lecNQD#Xu0WBN=Ntgy?uSs z)*f9J>mt7Ajhp4lQgq_p)Xk_FR*+HG@u-`Ys&wyeGu%%a5T;Gb z^YJm7gQW6miCX}Rw3KaHyJy65x3_Y+)NW5F(XMe$SL}%0M+pv|V!=d`0{qiTr}WB` zU56v{G0_!@Gi6BB%9YuG9tnMQOSW~_K4I)|xw~3ybLnvQ^0IaszxxI)NhOHQ4bf%l z@Rip%;@M@UNdXYNlP? zpgD_mKNF*NMKL5|f3&yE-k7d7Vug&j2>$(c91`Y*xxUw~VEY=nk#fN0U^djw1)^Rx!#*q>GsR5AKMXY%+e2E$6fw!5wsj=aZIk_*lC2Gln5w3UFtj$TItpV z7uH$VA3ugZQ<@`7&#f1)@Y1inY^1HOQtiU$rT33^N>R3AEVd@*m^e`WuUvp&*SDZw zeGGnAfFBRXOldj!?#k^(eeAiSb%2U&kTj+I@=~F6osvT6M=Gog6v693l94J0Y1am- zI%)O3K^~Y+1JtQN$2v2peVNFyn?Ev;q~+0GqqyM*_3#>QN0DY7rQ1QMyPKyUe@?C4 zbVk6*pL%F4srXXhK)F=&xNtiU!CdF=(dI1e5Q;I?5~|-$+t-91=%boy9bE#TA!AawOtsA)c+dH@W=lf2LrA<8axWa{zyfJNSQoO^Ak*Y}+C;ErgK&J)nDzt^{sHOT&(dW4Nn>A5g zX^ajpj!H&8t(0qGV&$_!8CHg=aSUGlURhL2*uG+@Fh}=Cr8o;q`yBa>4kxtlr>)0F zA&9HY=3!wQoL1h3?TPfIJDiRtsT#PyHLQmytR=thUxcgtm$GwIkic?7&q@uh>t}d% zk$Gb537YuUYMy}BsEC6GOk6p^nIAhd$7s4f|8{!;9V3Jg3E4a?hvSa^v49Wfj0{-<7TYaGZDDt=xaSj_8ldhOqK;P@{rS~3D8l6zum_a7C%PYW!j*L58If7a6f zG0*>}%+ps49oAdPqIftX9FxlXI9hK5+WX5`m*NmenYpl2J=*RI)ib|*c|IYQy7(zd ziKLpFPlf_$#UT4@{Rw4T+aD?P8Xum=h%iJ47a?s3DOxoF^{{QRe6JFabaSXnp8Uh` z6(W9Jh(GWU}`M%~5C@!mz@$_ke3`Ih3^}FqAN1eCD+) z)2~^pzZj0$R>_Zjm#*+`TJZH;0ss7n_+!xTW8aF`KeoUpOH@`Z_<4(+i{SQN z7YV48k6(iakO~8#4TDoe^3`4W`31L**G^R5RLDp#ESYDKSZSpLILT>Ika+}3v14Ao zZSBh3wj*`?5`qWx3}T>r=}hXlOi^L+k6~J^k%3{H_rKOgUL!4tO}PEla%&1}7-#j( z?#T&;>gH(8$7-9cY2g|X#KVujP)H8@8B6}x`mV3C9~FN+i}?9c%K9@r#(ysx|4I87 zr0wh*uKe^ti~NBlL=*-O9$ zB7Js=42Ug>`bEuG^S0_oC#0WCQr za^^3TzC6hPH=O@;jSOff9cm;E7@QbTs(A7XoGu9%`sqWakin1pc3(RypZ^+e7ui;B zr5yP1Z|K|mOGr9ENbCY6U=nAay2XJnvReO=nDsgBFNtdai6Q%X?Eg3hF@7z|-==|G z&Iq*3d*cV#@IJyv+|-WwvH8>)Zxn@ACt$+$Hn4J&f5=-4D9ALViWm3+JtE;7PuiI# zjNEHyk$Vqz8FyX32KVmO$OWv2L(oUdxA5sF^dXplz)5+Z5=2dzE?8wrCIRuxFc4D4 zl0+D*{?Wv!AQ|Y()WCH_^K1FpP&ipU$MktIosKPsQ@LiSnqMCb6BKckiQvxGD)yRY z0>*BM^0!%7gBe+pYzwBpEFikyC=_&wrao17q^OSac&W1Qdwpw!pAnT6pN@tSF`L%u z^Gp2-F1~>YW7~S%WjX)Qs1DH2E}8c1$qvw?j8*fYX&^}5RL-V)3Ebr8|A4`^r=+8cNBFEtS_HheZHk`$Hc)gvTm_T~S{KU4D zDM|wsg;m%0DrqdK^ns<^Kaea2*rqEQzviTXi7*JHpBqeRbK$wPOtiNyzoA+Z`*!jrN2>3L=F%V^qd^+|-inlfXg27DMFF44xeYX9_&y%cNm{{HE>WKeqB zcOGB=G4m&fY^bx0?U$*&gOH@v|1hAGRPLDsYg9O=hc4AD%ZeEx3~PP z){8-vObw`bZpQofDp7+n2aSaL8Ob@dK5|*ui?yPkf->7v@4O?W{k?2HMP>)|=B(e> zTwpD}xHwXMqt{)-n;jC5EuQ7|()4c9_0d;y<&3AO^Mfgq{>cMH|LphX4B*SeJ34&m z5f5<4jjMiI*4E8+B>|wR^j~YW57{chcuL8-E`V`1Vvq%T$_+23A!Z?q>;{nCXW&H#*}Q`z!3XgyL3iTHOQ2M%Q+U<~w4G#H`5`$`EE zRz(14WUE&+tN~PBeEfrsJEUH`;1K=I@a4wqlrh3(awY?(FND@!P0M8}i&ha*G`>D0 z5s~9bpN6x!&B6o=+8*T}oUyeKg_Hf-NYjIs_;YdhZe^)PZy#rGJ;@>U-rU4N)Yp_q1w(N0kBn;9;63A|i>}?U z<3UdEUkE#{D!7}XHnnlW{cD>4Z4((=09+Smmerkrx6q6xV-UjVmx`8?#a)S;(g{(^ z(nwx?Q_D7@3fvzyiSeu@%;gFXumx1-v0CAYQWyTOnbCW1Sy3mOr_<=aqLwta~3qjwjW zQa39Y@>Ac9Wr2f(;?+xMIm_o^hUEXOR3G%qTw2#o4`oMjd%Z<6ke~EIuaIXy23p#aU3Lp|op^-uo@euL=j8=*lEpz`$6+@roG) z$bUg}gy76h{6}IM_9cvZtPnqxkwW7Ka_f{rrF3FPYs}c|aj&a`$ar%|H`iG(UZp9n zlhzgS1?UI!i`f{ZU zEkz~BaJn16AW6P&MhRuS_|r5OSdaF5(7!tgfG6|{a4Q0BY=Np8XOFd@x6Ig_!C7uE z6znI+JCSLH9^zpmf41+xKJpq9 z?;AzNIQguA`eifdwF;2ygk_69i)p%a6`sO<#?#L6z@7fs-of@w`HQytkGlDG?IH8Z ze;>_{o6AFA-^g3O=g56n2B8z)XpQ5Hz2|4`On)^|{l2qO2OdZ>e48kc5zt2FrA?7E z(!zZ~d>pa$t>%(h%jrmH%I=lfSGhXKM0)@I-TT^yb10!^$doW17|W68*YI zXfvTaSRO6|V)^T1_O&qxXEcC~6i-PV{=<98_$2+8MH6lFc}8FOTil78VQJJTtPEAz zu2rcan+XHPT?{=W<$ajuvVd6Fi$~hvxj954x&;YQyy*j8@mwnL_dtLhSiBzYV^&G9h@=Y zsd2~(mA4&X@J?h47cq2;C31WNi;iEnhVk<~9IW=OuPu8WzfBd{9Ejwt{jD!Ax#rSZ^=D zHCLQxi*GhBw4PKKankW6e75^u18b+H8pi$?jFm@{DTsg&NH6HyU13D)sUV7IQvLMZ zfDfvsaJRta;ZYq4Bht;=n^gQ~)yVG>4=)1zY~OUfU}9;@G|Ls$`~H-dDixWDJd?zoJNYz{P2=^@%>vQ&|<_`qy`$Io+KMGDTpfr;veg4rxo)KNC7i_!x z3Jpel@^b>aKnwsLF@=AiPV4QjeLS3xP6*wqem9d6VtRFHtTQw1*v1jTF5h||5TAKk zj8+g}bAqh1&~Z3$n}@1yuBh!gw15CR4+qN;dM5-FTN2uEr0n>EP^j)JA3nrzR4?rGEm9jt;&YnVfk!!f z6-$lSp_YbYtGgFR66tQ;!!%g)rEFRm58@dLGAAB=7g2v{EsJ17dp&CU@u>Aqf*VT@ zawwbZ>sAr5P{t@d-rq;?6+3ub} zom+g$7TZ8YtvB_!Ug^o`NU2ABBw~l?O;D`!x)4rds{XW3GQI3@{ zgxv2v3rM%07PcJfkcUo1WYMiq4ZFR>_Ax`n+;iK+U=@Sw#L12!m? zarjJ%-OHcIw9-IHOwe2Xu}qLa(0N07De+g_cGGsAJRT#dR#yW7);ZivxGPk1!Db;| zUdS$-aTODa&=PbdjGOUk%L2EW2QSmsM-40_SarwF5#QMt)OtU_v9zUH|6MD_+7%(d zmB2UKU5zii(iI6s&zm5(A<)-8@lbZ;k$2zSQ^qZ4o#bRXR+V(NhgCXT-ps2i8}- zyvNhm-6|9x&JuC(O$P01IAbfHoy6G)YSj`J$yMO9(Grw(28qB;_rBI7#Mhw_G21I_ z7Yf7g!-S8M5Wk$&27Q!|df=hXmR^9Wg4#?hgkn3oB2G=gJTSCdsX7E_&i_>Gq#fQRU~!GCEN; zV&fS-8l3lBKakf}^ImU-U3|M*QA}ylK`CfsqS=zBBXQGKG;a62gsa43{S`)%W`4i8 zQ3`GEc=Em*-IcZgIaT|K;7@~@yg2nHOmW6R@xnWlQ$%~6D;JM`ojPpk=jmPjs~wS- z1TT*wzl)Qi)aQsIw(PfT+W`rhF%WEVqHUnCNe1l@4@OVp)CYV2=d-AZoUZk3AG7;f z4B3Vxxu{v*ou%q>#?tn`pmBtPuuT|sJ{e#MN4lU81st5G$q)}fjV>=JVeNxCoK$5d zAJ&K@HR^9)+K;E1Em&jULD>n~?<~2TndPTRb~RCIplsY1WI-)0TtpQ&vyJ^Op*VJ4 zzxLh^B$Vx+F&HsG8mswfwC{O3yadjqfbD~j%oyBlO3>b>wHKVvs7 zV%T0rUc#Tfux|-#2^DiS+wsyC`{rXAop=ym8K@FL@0%IZE)JZ3dSUQebX>V+*rnOo zZe-DY>5T8^`hl08C!r#(`96Nf@T4xyv4^hS1c#&xE(HwUWy$Y7%W)6+0oEtdsB;j-{CuQ7bRThpO_` z{q3_O3rvO)w(r;QHmh?u)_2ukEwA`#FpaxAU1ssdC?FPpDt3F8L`K|#fFvOKiN=LI z@FLN#`Z;-9qo`2s(D&Q|i0x^+hE?*juZ45Ibr+S9$K%Fyq|=y^;=JDuC2`ewlfJq& zlYPIgS4?R3zbhPVLsyP1D>F_ZM zo+;LVV7&E@UHj49vHltNtyJ%?9+Y3W)8fw)W@{4&Li9F><`mHnl?+K$l$Kg256TaAz+a#(WMZ;uiiTD9k%jF} ze1{tfh>I;%AK$5i^u(ivufKJ0lJEKZbHLi$C=H+Km_xL~9F+9Q$1OXT_C@oT$`EW; z*Ivq_Q(ZF%UQKR1D_scuN<#5b`)LLmTA)-};60hkYcGs)*XcJBSCXj6uaZ#|Ji>*0 z<$Jy?fY4#5ll9`(i5@B<>Pt&|`_D=_IQhRI#6F%kA~kCHXRNeO{mY;Awyrw_D`j?C zVYhH0bf~8ZN_!l5Mn51;6I$1`s1#rH^(m`;x10L;#t9^kvYzjTo#7>Z zfe-a(t6{>&7zY?egI#NwwRIaD-@rw>t;Lj{rVM^A8creiK#PXX*PHj(I8wFr?O`cb zn0C6R8`=VJpUP)xmzI$NJ8w2eu=E`C1LH3usB})TfO4VBC%yX1Uv(82wH~E5A$jU0 zA{zIYU_R+-wT}c+t12&;x$HN z(Hc2VHmm~O*cS9<{I(g`m-t8^0 z<8Sye_swbF*2Ji>{qlyCP!#Am(PPk4C^_(pw|%HPg~k+2bHanvMfP9%L{(Q!xzX=(jV;DQEmDYLThbG zg!FB9&9zcL7_|9Ooo_sD%v^Xa;>?z(4|?^tS8o!xj}OVkgZcD^3jT)$(8)szZ)-QC zG`z82eMK$LEH`Bp}leL>y2uP>aX~OMYib9p%xBY%U z;a$j|msF{jMuFJRd@JQ8GT0J)ZQL!=^9`Q5$(#y=NC4N|Q<5fjn}*P}r6E#w&*@yc zfK=*#(Ous@6m?`ZAkZytCA`!Ehr?>T+?&4;i6SjLoDucbXi#DiR*L`y{05a?wBWPH z^5>7p#f;iW$!JGgRY9I)X-bV9lYX&(3Pml zb8*g5aKN&RFS49miPaRv4Y0Uyqj1n0AV7f=AZEPcmUi|+$i7>vv>H}*+f4MjLm+Ui zPdFNQ6)JZr_Ot5XC8LqaigHS6GChj4bEbaMkY?z%0Cb*Hpntgy%V>>2U?@%5k2)H8 zbqb08BbpxqhCG1_6#ll3s9?Fq3F1a@_q&`;XR`ZqoTVLcnFeRt>TSa)&=R7IwHiBU zSGgPwoxEs@;2tWv(Wa3uAJpo35&HSdYpkiFW!;TO3WLplg3yOm4%5a7>P8Dlr-yCo zmDCxyb$<*34^9-=N4&6Qx;-QmjklB~Ln17D{x&Em6uOI%P>y;I0_6u_b;maS;?TQd zNOhKKKj3|fsdLKtYb7-QM=Kikk7A{G`*)ya@)E9XX?_Sn9hz_1{9mt$L4jC{ZCI`O z#L4hmE;2!MZY}Z%NnyvL((&s!eSz1eQ5Bm?h1!jf_)R_DZz<9j-WFcjvA^cCNQ~|j zy`7Q%QKt{hGQg=R*bAhi3BI3cd6)6M*>*2=;npJFbSPV@t^=>Dq`14BeQHO77C7gC znKvP7K!#bA`m2Wfs}v}j90wflVVR;BK_*kRY#vlk5}Hi} z*))B%SX$8JO0gqBV4-b3E!qj^o;hNGBfxmZOgaH*#_FoCgvR9LC2vCod{x;Xtx64{vR@m(&hZ4)h9*lR61`~KPLW}60 z8-!6#Qol~Piy1)BH-kz`c{+ahIFL5$HPiyQkj>3A&0P+6$l4kgu0^fi$oD@dA0bEb zRlXAT+J?O=hnd>230y2c(7lyFLpgNqTXuKGl>)mVyfEviS|k?$RXh%I?oZYQ*%*MY zDH~ADjw3xKZ{WYUdN4VK%d{W4Z;%WO!?$N6iBct2xehs@8lEUIE5IM7-|90j>NP@| z)wXF^GOL#wQl;#=AcVkPh>w1?m05Iv>G3Ea9W&9_O_ex$Fmrz_e%HUdJ$(&wiCLgZ zKAU@6)mXaAh}9$L<&U%-05 zxmyhGrb}!N*e$jXPbx}{Ehx)J@I+S(N0hjb>wE+ZoXWn|<}}>&F~xqIwc+gdy35GN z5N)j5S}O6CQ9R~!33cNa@VM4!xawqaaaCDpqu6uMN-_Bz@>n4g`?xaGMz4_e ztpFGVlkqBe;@2s%)iS>`ENBk;W&z#SQ4|XU-HBxBfdr>1)%WiE91{4=!a$d%8zL2_ zj-da_K%edECk~mD>PW|5_}>t<6oP4Dy$7QVsREi_Eq;!xL}IwB9Ntd}+fBS^rQS;OYR6Ovju9x&k-V-`yB8kha9|S!mctgOGJRwO0UqW-(&Xk{^Vmx4t z(VrYJda}FgGa1vyDcQcvZo_?d04W6ym1up?91O>pJ)A+)^?L7n2%Y|x&<$M;+bSp> zC0)k@cwDl+hJ}`Z7dIr2##JRe8H2ECJhf-b(GX$_nt9{c~TwmMN9( z|6ej{FKlzBXV(jQlf5&7$#vBw>hft#>c{1;yw{~SIhZ)vzSrsl2TYkFbDs%REnN`d z_x*K1=4yDKaSEalfqEdS$?N?hZ3Xue2UYG&?Sd(J(poI zY^Uzr$DBAzhLi67E*^D2P$KOJW~_#iy?tEG$f_BCg74HAB1qGhbJ^1w73{xfG9Cn% zFbtn{h!l9EPDM?I@is*OW#L>(I7v@}nwS9Luq#jmtk5e@b#oFBx^Z{Z!$)p;jXsSYJew zdnaMGk33GW<(_*hVj{)Jgz-84q8Q()L{_So6EoN6YSV&>lS>jw;lP0>CT2e*tH*T7 zdo?c(Z?)uNxe)&)H?bsSlx)AGaiELuWrRjp2FIaA9WDpn&&XfysK$Clm8*qzR~K^x z?;;i<-uaWOXLsfqax1t4;n@%k4i$YS@q3X&39Qxcx?g`?hLce&Qyb5-zO-P1$d4*G z?vrTmZzUTy`*C`NQ^;3T#Z`lmcB+6^1Epc{IxWB9mENx8(hCfTe~N`&lQ&6|rUIUd zTpWs5GN()(?Tb9`azUgemC(g@#PF9OhYo)u*Vx3Yx1<$*M9u*)ZS8U{YBnB80;r7v zmwEAiZp(t)RDlX$!V#@boVLRZt0;dvlAuhqiP#%ZRH zUnzBiS7%T4k-on~DI#72_#+n3;WkPh zw*DwatGWx35qL1@Cg@bsVG-2rGrReE|0mh@9uKIai)4@@I!II_Gg%@18ke&-puzrIbRKoXdYJr}k zB00l>eMUtQfgSr(cX*2%9DAn>q=jW%-P2n0Y;>EYUcrUS>GvNu6NeIs+jH7gOq(AG z%cpNi*i+L~U#@n9ywz?-h<;@bTj|60i-Iq+O;G3E%*AE;gC!G^<21F}BI-GD6a4OQ zPN~%hAN}I@z-Tr85gs=j%H{@$p>y^w@$di}Yz~9Y={J_VG0;_SJ>Z0u5(l?D^$0o# zT+ra#+~@j<8CV3hzGPy~eU|*CiWPcP@3vgqQNYao2JaCDcUFwl+JFp8 zfEe-AB2tQ_?4%>^=z%l7o96tT%h0xZnHh&cZ#$3y5Djn%tZFZ;B>*ZD2B4#9WGBa>N38t1;H}p!Dc?{gCpg8Vk7jrrropYvd4t6zNX7o*lg?bmfXHz@x&o-$(@$HC z$4T*KSOn%F3p`*rA#)w{A>o3TkE~9ZhzQ|p4Ju!z(OWFtfaQ6bt?>PhFq=z}xI>{G z<8vo2P=STuF>s8V)&u|ND3bq29}jvR5u-?xBVtmi`=Y#oNNK-+imv#T6a|+}^^hl(nq>)kqV7Vn=A4(HifZ4H-E6_4) z002YJpaZr>kTvjNm`|=b?jMG&-a35Lv0%43o~Tzyc_^FQb%6wq>_wg`hsRqEE(;zt zMrxVlDq|a>srL+QdW?P>mQm!+liQkc@L-Hf;VKqf2B=>Ber}Zg#R2M>YV4a)9`^R- z5CGyS(}_>LRQ>PSKVjOdT#s*Rfxp4h9}K7?Ci6EhzCpZqu54i?Maaz*I(U2tvbop` za7L7;#z07F1mQ05IJPZKtJmzaasYU!Ts@zgq_LeEV-VhRPe#3D2?@N?-+LT7;+Gad z2pb(o{D$N3_AOo*=Og{h9c3of1@~OyI&jKrO}hjnoDdOd3N9FW{$)N;oO6tyt~Rov z69#^I!~H==OC(XD7+6;~xYhc(~K{5*`{BS2w8BX*r z;30=vCyLY%tx8BaUeW4_d~bC0z3=n3lz_k9;%leoFc+@Dk)N*o0RE&OCW$$RomG(| z?zt4Qsx2PvoECACWCwu;!^+)cb?u*6THD*(@0w?aHbfu$YGkWd)jtF1sVd-9uU6Ho zlmi&d>7RqJoOG>=iADY^<3~^JW+y^jhKBwQ_}kS$6qi?`#Gv6j@VC1sI0Ar63AV>` z|J&kB2_S1w!Mz%oWf{w?d)zKAZi$ciN2_t^yx(TIcIaaOP#G@}s#{NGS-t|4koE_S zz@^UcAim5wQAn{~e(&olbju zb#}JFKrBOK-}=$%dA;lUDym>;5b>7Ma%0-t5YAZgZR?77{(9Ss=mP4A?RP=p0TtnMAJeuF|p@Gyeq7>D+E=; zrPUgF8_F-(Bn`r+>jqE2mLW67!LFU>2!)oSC$ms-E@uXuiy=H0-9G?302DT?K2WGo ze8}n*c)4n*^EU=+buTtShH~#=85UIP#DHP<;_i-KLgB{6bvap0*U8CIod}rmHYnMT za`qnuRR3Bv)mOn4YEm^)UB($M)1zw{qtEb{0Tgz%3nG`-G5_GR?mnA>EVFO(a_)0ZT?5Y7hy0 zhCL*je5aW~C`bci^Dm&U?3V^3AfoRdPd275iw*VbaBM89+=G{A@iXkh$=TRO2KDvR zB_RdI;qM!47k~Sx;nJrg+sQcjC#>ODZ{Ti@o#HZF@2E$8`XfI+Wn-~$7XK%^?t?Gh zCSV^v^K#*=Yg+&o_h+um>O=~;f!+@QP~v=J(2T(I)Aw;5006a6Mn4fq?#e+5pHYWV)-K$QT2xnmLo{<6NTr>hVSm!)=q z^(mnNcvNM#;B(-B4o~V|Gsu4c0W&4!Gl#j9pmKylpotlu=g(__(F%2|?Mokx4ZU*nwt z6qLj;cmm8(4FJF0h+XIv2Y!I^FKh`~WhLuL$Ryep?t#2{`oCbqjKKY_fvozV7yzl5 z5Dd(3_NY=J6=3EH|C+JF`KJBT{LKTXeP51S%&s~n8uLe}yIh$pbBH_;QGT$TM8uZ6s=)h>UF zZqwxclHZswoa>P+vv}5@-wKx8OhJG0 z-6MC;HW5je^Da$nGhU*zG_OAYnRsYe$UiNR!#~<3ZJ2!p>61BK1D z@!JN?j}K*nU6bzd;T{9?C+5ITHB)4X@jU!ZXap9vu^g+uE_^nt*Ami3We%P{n;1S6EJL+^h#GBO`7E2P?+Q zS{@)$LRayCqk$-VS1Y4Gp{IUBXxO23SM4G>GmVrF%QAImJFdF3dhpe@=*Xi}b!?sF z6^BU)aY{0XX?7v0%gA&&Lr4HP9l&uy#`ni0ofssTD>dR6at&D4I^A=w{tLx?zzBG$ z1@|BOfR{=lTLK6zkYH84f(dU(zU!QKM6%cSC<74axNQ>de&v;17UUkS6SR9} zzLj>%h)33?s|#86b7?d-x0VtsiBLS;kdzo_8lAqj{Go`YEB0j`nmgawpHnRYUz+=- zP7bg>2DNhDma(5gorLMa?M}adZ~uu#W68yWwLDyXSb9Efw1#-Oi0h}Zn(>O(-!L`V zr*pO-{a(WG0U{AX(Kff(I-qv?*E$4B5`(Y!MnLK9>d}t3lmz0eyJr{uo8n%Pcw*a( zVTjr#E*FT`JX+4;+laPH1^1Htq~j`IORXE3w?|Om@*Un~mFg#6`4N3g!Aqih+rspV zkO)*s9O$p*yfc18AUlXwIO~K#b=n6Z?{$XD{o0V%Jo09Q$CA&aBeJTiqU1N}Z1wz| zOvB}2JC}xKZOQ5V{aYFi7~Qud7E?~36j#FQ4x?dsqT~!_<|f28|DEZI;5zRB;v}&M zLBVj+w!F+N4VS}xa=2tJEclNQy@UGKb3i4CeGsIrw`_xZH8dE_6<_k=ZjOx6(>trk zsY@5bn#jStzaxK*ty?0j-JjPYFK54I&IMOXP^u%P56|??US}k>ZB(}dH72V6>i-oM%vU+Kp`nV`PO0nT&<{#I}yaaib3aR%4JPr2z zFQq%3yc-gZO`4HJW61T{O(OIMrkYn=QYQIcx}$&~;1}*lONyA1S)er$(9ko10}4J+ z{j?2VN^{QLtvy!3w`RYMk(^_Yvox{FWh4FFIfQ@=e~A4Hysb9~FagfLBU>9ssMLRz zjFv^Shtok1-h&_>XA;BqM4%h)<_z1`AirGDh+d%HmMtqV4q`&(A4!H1j^OJAD3qd{ zMwS8(>Mug{yQQO&(cZrn>i`~L`EiIas6P;hL{LlL-;ChjfznxUsn_M+6K~4t$hM+| z$Zw3#NJBRWkD&KX+)+q0FAqq{jFCuYvp>=!BJ6&-LW}Vt!nOU>o}=#PDM>W3cy}r> zE&Q;tZu%x7f{hq#<}|SFD~9e-w!Cpiex;mj*zTDt9Y4vW+p1wXAL|2cf|#asm2ukG z$oyG|_v*cOo8DL{8#}fdBKt5-mddVmAvlXzPdcg~cdS{(94SyGgq3KdLz=U-~OQvI?cq^mV0JnO*I?6F^uF zcopY18=e!Fa zc)=Lf5*fU#c`Nk$j>cRL{R7JX>&m{i9uRi!UZPn5_uAPYAvXhTUQ8diQYP&&sinSCJH0J{z`$NgT150gU?^|C#S>L1SpOdupszyH z@TO4xod_IPlOLlsS4xAlPdN*&@7-tnR zlCsx$?sqq&W->v+ha@bAIDHb2Cb#KvZQk?!4uy;MgpHKp;v!uA5}z1((S6G@42ET0 z3BfkEDDH2VC6lIK4py_gx%&*^cC#I&2M6=QRoHqVo?|;eV2d7d&1vyoRcC>5 zUp>f~QNrNh2X$rO%WF3#{~HyzoF9#wiF2QEJyLMJVU=I55zU6I3%Y(BE#!JfM=#;Q zc-u%w$&c&DYm?OJHJK&q@n{O{bv13>?1!;eJ=pNa%v*T5UA1Ryh1VU3hB>Gr@~H_a zhHo#gmr?wfGrZtFWr+<_-=VFU>2Nh$uo<6Y-AE$1uBW}%^ADNIRJexRiQZPPrXc2j zAj4&b4UA03&(28vbZr$=~#Ec6vUq( z8ex~dxr6vhEEGu;5SdTF4xxm5(^C;X&N{&BP=$$$XwBJFIRf;d-tnk` z5IfqL*1X=LO&*b40Lk7ujNEzo5-IlRG^n*`<;qRz5)Sju$bDI@*ykUYqjnfl)#9pD> z_bhtg)ixyllEf!AU`E!rV)a*+16+ayVA}f+AAuT>4<*@B<p*J6`md>Rrk z$$erWzg+n6b(n?9rw9YuY*L94gjddR{AYC))_--f5Zvr36#|G&y9P*$#YM!0(qotE z5J%Ff23sc-{v5&ZU%O^5Mmhp+p#n?>ETD3mS4c09aIJp3`-Bwr@Z0ntOQwHi4Pu98ma$eRDy zqw>#PU;5=a)l74Yqi;BAbgV)qFn0%gRx_j)h1c$RXngX{EkECXi1ijv4Pigb6k*u= zvF$|E_ZWpTaaFcKn1m@|_Xf5J!22tyrl zEzeeHV1p`=aKxf=sNath_GSo1o3r^fKzygKx+7J73^V? zn^hb|MI}Omv>DAfZhj~UbDXge>;OFl8lgKnzu~bPL=tR^8{FXw`dF&N0MKt2nYuof z&Rx&FOvi(0xOyB>TcICAbDiYd%On`tHXU?bvxW~CiOJ(C*|ouf__PsK=C`9h+lu2! z8!e}R|_<_QIarWFY%g(ZjOUy)xFpA)q1XiHj&Awv@1rAd1W}B6YYk{T-y+ zl2FqO-T!FK|9W4DkrC4zG9IID6yi;Pu!L9YPJ4~xrhi8%1X4T~hUl#7EH34lPZ^wq z(|*U~YOG=L8iLR&dVpF^mk^i7(MH$cN(nc{FPs3e3~!agPh^F6oRa~G{@&tnC{zet zSh36VL%7qwm=K$BMTa+A7bU--)YYCA%>o>_%ACu&Er+9Jt4FTiVXC__{D_3SPH{sx zQtSL}M7Yi(*t)wy+x;W;%GUOwyYu-tL=E3Q%8y{Sb>}1Y#s)0-5lXB~xDQR;CHZRa zO<$uo3F^QdhA$ld&KUV}md6hoOX~YwXXDv%+=sXINwHfRd5f>t^U63+&xAf<{DtR) zdOS8|fb&7)tAIUuC*di<*E3qDBaZ<%YbCl7s|#HQ#_~*`tn@-Cg4l!t$WJl0xW%Vq z-oS*dcS+4&D^9&`QpwHP-|wiMuG^;~=&ePm(na9zCE4Y`u<4i!w7H(Hv!p9OU_{06 z|4sHM>CfK-AwuoduBy@J@i`5gQy)fX)f3SHfT4w}in$t0?C}>vMmvk@C(1#I!e_NQ zv60Rrtc0Hn6|Yo_K0ptp|8u=t33y1YCWV}tK`Iz=TW?j*WY%!9f*B6IQ~UD(SlTtl zwrivQs^vTwpe9+B`rt?(?-9UUjmvvN_fdLQzb!;`MB>9O->1c_^G0IId*<0uA_xR| zrYlz|IsgYW;C#_mQ%>J-8BrH#V>DfHqqK*L|5a^3;#Si+C?M`}Cfj4eL*D!czRJX) z>_r0v96Vx%j9wqsd7AIg5Q`f~)#%x#1}VzSx%O7~TI#D=8*}Q0&hq-H z(n1@jvQqZJlyd((Wk-d*rEkla*^l_29sbRo!dy+|BHgB^Nn6o*KjQ7M>ZH2DU!I3b zjJ}#%{kHFKvk`etb;`v1#?-u6bPBw~l4D^`G^SPnNd15W*O$){G|3ODc(C(10;3H% z`0QBxQcKC{W5f`&Bp$vmw1|uIlxc(cV!YxuIe}KSC0)29UMMbVl@Bqa z{=#U1%cO>Rs)_lcu_WJszq|`U`&7fjImp@itzfcj3XY>KZA7MEm`OqP`jWbb4dQyS_T#i*x?AUs0n1Qxzns?;`yr@HWuIV31&d>sdX9q%+I!kQ60=1?Roq1aCu zU&A^z&Fo84$)x^S66@3NJp`(Yr^5?#mw()P3o59dUY1wuV@Uc_n-8xIfp6Z-Uc z=7iE5t0YzX3UBzex0AnBdnmN?DNh+veHhcWWO~KYJahoj(23BTM5^4$p`G7wI&h-% z9vR=vqa@oA6a-lRpm+Hxe;F_5Bp2rlBADJtt*RIxKd&Q^$t|h{d+mC|G|LdwuYTs+ zjSg44fYo>D(<>9@ZYjsFZo4x?HliCSb40Q9&u~#wo4t;0A}qnPjvW9}+ z-gO9XDLou;)Pp|)7x-M`Zn^tzxdW1I*vCmlrhBw@ldKn*wHJO=vrd}d;gWo(xw|92 zc$2bkeEs4F0H@^O-IA#G(`LHUo_leA&!0ADj}$f&bY5ap|G;OS2N37rl@4 zg~uxM=^(wu6@W4#^dQ9!U&vRwqV$K=YF2LVp88^Lh1X zYQvBU0Hqe#jktaiM1sF;3p;VH3dIY7UqAem58Trf4v34&Iu@&sm0FUbT)bUVt8_Of z=)56nZ9^>|w*IY;gbF)uqzi{wr&61+lU?TkX+A_!c>#6eb&b*kmSX-WNAT0Cy#~ZP z)cpC^N|YuhmI;Fda{^e0l^!n&Qt>+`w(usg@30hNcI+iiz{g3h<$D1!u8Vu!!dnKo z=xkJ>N;TObn)Z&Q-N+gQU#Xw1$0gN5Rwo=5ECB5y4=r{B+sNh(_y@w=V)6X`l5N^k}W!3BQ1#1_E@ zcsx5LG{cYkusby=8w?DiY@J^w4gmr_F{Gj;BJHM!T z{nubWL@40|{sNRYSh2=H#mt5tcMg(sFX2LT_w?eXdepjF>JT*c80(|b#tTlt3oF|% zAR?XJYvcTQ{ICbvuNN2bptOpHt$ccUvT=(o0e7ee!4)$Muym5V1wLM=>rb$ z>#@hwM&5{$a;|Z%2T4^CjyL{AKCfrWgoQ+;EWgl;zrte>PP06RQl*j(9BxNc)=Tch`68r;U*t+(77B>r#S*nF#4k82KYI34VF zUPQ_{O^UBcZI%P6U)#qxUXeFe_GAt(FXPQGO0dLd@IFTdR0jyW?ZeQ-@_ zl%MB&;P63}eIp&<@nh@z5Rh6kj2;n0cct8eO-h>(LN_0#0_ry_bZ5FhNgp&{pcds- zwHljhq(8J`!)sCz5X8JsQD)<;Q)A~;!DxCPqp>TrUf(4ZA=Dtyr@k0=b0Mr_hpNzD zLSO%ip>>RiklCFYbcfTSUTqzh2xcJlyyjL_*;B928~k=zz0YtuSaVMNhPG&r7u-u! zqT$s4DZYerSE1l-SaWluraRV-xm$Vy%r*FokvE2*r}jaUNfvKZ*h;6O%DJy=HUa;q zh7!F*X*P}1heBElKjlX5#x0%r7``#gmnkau_-WrRAybeP&d7lmGHdILA9&^L1#Hqc zQ&8%g<|<6*dmH47OH7&=3Aoc@c*h(s-}T)xhBP02tL9X#5R{A7y0yJ8I|HXBw$=1{ z1;K;&uKd_#pOKKZzyl20N&2t0p`hTVbz97rwPr3Szt2Uf7Ajou^Akxe)=SV`q>gnY ziS#V!G(EK5TziQD@9VF3$?1A+%0Ij)@^nuOcfk8OBigsO_cq5&&$5BTGbXzb)H5(9 z4Y}`bzVqXtF7JJ;SVdOO`lOUpz3I0GsBu;@5%e~wU}pl2@a0?65`$<)>Vdtiw7~^T zL-^8$H)CqY3Ha_(*bD&5_ z2{DT;Src0+4T;tB4FJg0+p8u_?)(Dgg~gWWG6E|7471vd$808z^|eGWzlEZY_8R`Q zD(XAbVg0_SG#ZI22c4fNS?khG`|KOdFX`Gk89CDCUGTG$hjU-IxT| z?oKYe=ENec-xX0&ja?w<8_dgD?^ci|E+H7Tupx>Ccc<=tJ>c{mE-XPmf4D&B`DQ@7 zV^eT&xgC#2xTYn~3;zCDvw-sr?J}rZ#x5!@E^amudGhSbNi#J?SD9x*;VJGlt*xV) z&}n!uE`D*!qLKE?T)WFVr2V-v39abSPwAHkd&Oq*{xs7djnBjfBjM<{y>+Vdfw7kt zQ})oBTP|YR{Qa{!%hQW^x$%Ppqrp}ZA$$vWT67Le9>Ld9>(@o*^wNuF##uC@-QlR@ zM%FXes^fyu7mYP?yO`O6;rnD@T2Cg1p_{^c;}@<84gwhpx{y|ESLu*=vx_HpShTK} z9E}x%dYAGK@qu+}=i2LZu8+DNrH`TC>=D*C7Bojz1I=vvzCC&_C4H+nS>HIw7=#Wq z)%+pfF(h2;nwx(#aFWENQ>7-Mc{VjK0s5{mqpdyj;fq;U)lK_Q%#rLdXk{I&oc^Jm zExVw%@w6y`7hJ5uEU3c#GG<5?bI+JAJ`o7eUCUoCC$8gaG-(##2gHFsq$x;n6ps6b zEU?#~C19Xe?@_gJ z)|+DX_|1E7!?{VrT5G!*Qta`;WOsOwKluJ~eZ^~&A(fnGu^^AUe*TVorS}7a+he4h zHgnIXc%?(jj3b}r;Oe~%rsSy;hQqx%Ix+B_&G5NdNw60_9Juf-0(#;Z-PEuUK!b(1 z)iP!U^D0*hvLL|5ac=LXQ7h|kF%N8B%L}Y>@fOKQ<4hSVcawr-pDHWPb+lh9X}*S3 z_;5OM|C2kN}>=EhurUh!Qc-Y!<|Fq7n*SvIv9^9^5}2X1|nOQ3P6S$%pDUQ(ezydG;**o~HNFKygq| zC#ko02A~A)Uda(TK0K=EL)f1XKY1&e{h8 z3WY)c)5we@ZjkuTV>ptfaX?f#{ssq>|2p)+g9oT7zl4MUn)V5PYJ&yPQu-gIW~cLx zdBMCY)q~t%yCuZeeD+GacNOs4LIybxpxN($e&x6e9S|U4%t`*~Fn*4`hlN;AQR&5X z{rrJq&iyTvQgxI4c~nXLm{U|ZseatklTtHA5@s0BdClfky^r>*-)TS1!MrZ;_l3AN zFp9xHqlnMPl$~v~th%TsPRAy@NA|=1LBTnN-+?ICVR7*?I`CmfIN%nqsmKvQmp3QN zes!J0E{Ss9D490z1td)HiyconQLO(44hch`0?g6}iEt-!Z*Lty3o{e8!#Kcbeg5b= z|3GuUz2=m6YP)J&H$gDlZ(fS7k1L}nb#q%HN(V!k@_Pm3>3+c*P<2^sJ5US{v$qNT%sgtSwtO}3e0q;vY5qK0T8O-FVahe&rc>h9#Z?%t6R*_s(DBu=4D(QWX@LD;me(wOO3@h1Bh%5Mulw zrP;Z}dme`ob5`7j$ixpYc}16 z4ko@~0$<>rUO@!7sjX|}t}V<}uAH)Et*=Sz?z1neEu5eKw5r2k79SH0v7qL{%Zbh%AFUw!jRe~*8!wNqh9+QIUg~v%5i~NhLHwPV9o^_;IqQLS*1eT{(t`Zfn zJfr`Zj01ygS%^W*FrT(O5`66L4D`)hpmd%4XhyJ^(!+EQC@bs7+QBY`hr4#48f7m5 zxA<85N!9s2GSBqKFDc=cq*L>j@$>hXOL;$!_QP!4%@1%oHnlo-#*baw^$ z=68JrrI@3_t~jL;hj~7USKMyvXtV~*uS%U%EqI|!G;2n9THFRi<0~PA% z1`K_H;%gf!sq}kHdmBXdLC*J0kO;PdIa!bQWirr#W-^>im`RV?UUNrbJn{q?%=^83 z%-j;}k0tNTIShVuI-HFAd!iqZp@ zW(U-LACd!ji0U=H`cS9l(FA5Sx7Ae~m{RQ^)A{+AD_{7`A>t&AS$k;}|HteH`~`~v z%tVWDMh`F(UVsC-;H0dCgM=xh`{VJF7jiWE#@MgoKL%IsjVe~J#1@a4IEM`*Mjia| zAvJe4k9H6NJe3#3Zp}Tf8U^|#>f?&Xu!aQOSa{yGie1t?Vo{ zrs?FkfVoQb!#C%_td2*eifG^9$0kd3Yv6GWtCX>K9)!Jqpj1qL#vO%>ErayEetQm}w#wPbuccYaw%ty_|B9x%jF?FVEk-mzuCUSf_zY-DyZbnUh`%uB5Uh7Va-*j zLNyWNv|oS0qqn8e{E^xY7RHiN|C3yWhG8Dge@+z=W(U{=igaCTxd8`_@#LUcM$gb8 zVQA6+=w@(ltm4pUcNr{@YddsORC_($Lrz>gI!d>|ZY3lC!X0yG7?$q5=@z;JU=Ea@ ze9=+7kiM{ZX*T!+<;JOtr_qV~oqd;c?PnN+nWNo10seXx9aJ5#tJ(x>R7ptCh52$e zTY$hru1G}5Sdx+so4eGP-Uia*t(V#D#AX{#G#l8^7`R)EN^QmiGN$R9wD4fY1Kk{M ziCHznO|A81Ewet^&FD%8$DcBn{P~-j6aXRhOe2CL=#=Mvzg{3=nCrtKw*PL7#B6U- zZ&{s3{gsty%Lok8fLZwD``M8HV~7Oy+lkje(13-G{bV>Q09*C3KM=r){%axqaa9ld z13crjGOLF+C6g%ubqTt;l)?`uDow9di^pLP?$1}gpzzde6Kf`nh>nT-Q+F3ANaVUU zc>fOzAOLE91410`sMxl%AR=iNrzD&y*O0CdIqNlC$YSEyy{y;9WF-}8)UI%xs0h%^ zigVpe4BmY#G-Hwt-6^b2xt8j4RI^Q+3X>q&Ee}rwjbF&2(y+frj3rc=D_dpjqkSgao$-N)<0SvA$Pzo5 zk;44q8+zT&&d(;pE^122x&`%^<|!aBwpfj+PT;Ea1L5B=Vca`Q0&6ir^y0ht^XRx` zABbG7seXf>{&V6fP<#104v1ov{*7XN)os^94Qk%(RImcc*ajK6g)xDPTiaPH+?>x* z2vLBK@v>Wjy>aYC(PCt-|LF`%kC?8mt~ox3`q*LgN~~ArbOj}5w_;Nf(HEk$Rx9ny zyS~}F3&ReN^ND)_e%7CUpaHX4 zZ2Xciy(}6!J-gF0MWNf21fJ}AC|WM3(Ur*abJE7iM_elUWWnv zVL4d(a`rpRS@zH9LdPWmS0Jvf9SVG@3=kA|Mgwgi>$G(LtcYSkUWk7H;>3G|w>dM1 z)5FiB{XzzzD`TtAJ3z{j^Ry}Te#}w=f_vzHgZ;Gk+QC4J>MB5nkw35eJciZ*7TV1D z(J&VvAK-jAC2(nGzd}HrQ~U{{Z_EWRpZKKB=~|LhwS;@08PXCTu;mT1#-71I!dL|OC{}T*`>Nv!TKV^QHaBp*t)t}{n-a>g0%lJb;MTbNI7HGoJyPE;XVbWjx zlbWp#OR@pUNRlQXYF<#>;ImysfgEs-c%MHrKYdvSv?2cz@R$yN#>nPiaszBA7l53` z&4!|V&uF7dtAWg^sv{2-XjT!3w`qc6r}hwDj?qnVAT*9Wtsx9)_B~XSZk-?ejXd}_sYxKYI0Ub|Q0mITk zMGXU5lXyxQzeoK{24+U@Pga{(a$&FclyT^Be23$VZY1+2`GW)AEly% zy<0^SYRLmcO>%SDCV2KC`_tBfhK>DXzL-y2%cuXg78z0J>_=e!n*lj5csVMOp6$&R zz;89Ql5PMwX@F!i$xeM6$QH+i{&dK0`Z|sbXi*hYU#^0dGv=AC>Q4c~a^mM>1M*w~ zfHHjGgLtqLkTrS0|H<5&W`{hU(%o5LF;A#Qp8Tg9IIajlucx6D{K62B_`rB)UZv&( z!(#knu7=pjS!lqogCfy8=9%2t3}4vY6qDzSHdPd%eMX+wQg%;H%EDOVowVE}9R zXk)Y&v-tKxoq8TeeqNZ+m|+*@UBpCH?F*xQWx!nIV6#yY&O4k_w-sAEcz#9SgMVge z(Vbh*Pd(sEA?_>w>qcf=VJ(zJ6Q&3(O=&F|?JHJ8$?OwWLopeieD?o1?S7jYO`8CW~{4O*!*I+fD>^697VzqRRjO*3bfQ^})i_$9ezarAshu*N zF9Rd$y0~U0C!4A;C@2|+{(+c8b&SCEs~#Z3d}|aj74Fi{=%&WtkB_v3PAW(nBlG8ph77BF4EZz$gj*23Yv}y7Q5|N29EIpa*l0Jf%`e5f_Jh>rrp6>`@LZp4WRuYd zkErmP>}3I8u`bYB+X)mFHP%?f9$#-c!WqOo@f{+#wOMXYka~A@mHgx6`hH#Fu+4~9 z!EfsVnlcVq?X4zy(l77upvRH9-TX2sBsIG#w!C)ZIEbsQ@6Bp+qDQ>#zx`)N|)`$qzWlr7#ZGvWjVHv7R=WxOl zkzCEAftuV5Vw3xS6t6J3_v22L2xuj@^=LW=v5>n60g9VW0vx*xhVo+XUhgZ&+=-iE zHL5Md6qr{QSb1c0| z(tOUXk>>0@N3^)Isx+^_L`NNKTx5x2_c3YSPCt!CQygDCCw>Fp!Qv*xf7!u~8K1Qu zlJtx(Hr<9F5}?<$PQsPCo?o5KN+(0WMO;l!GCHj8+K(oVvlUgsYT4!5`Pqi!D&XW- z6VGr)UwPG^mD>*lcu!Hsrx}wCnI7A~RlI|kg)$mN=#!D$hDu_pO=1RcedEK+%;Xpk z`&`#8rJ>pf<$72CBh~}*GA@l*WE|XxDL5a+N$1R(f-=>JVwdXB)c6=mrK60v`rcf{ zn--fDk`a=mqGkaFYSEG9FV)M#qm8myNm7Ae*+5od1qw{4lR{3;rW*w8aw*~Ivh(ys zKmPsT(AoT~7(Io#O}=CP1<QW%)2~MbDfQ~j; zg99#K%2P?zbDG?w$p{5WxrgKUxoi$@mC=UFB`8PlxA)!rCo&&R73mqfFpthPUF zIzu8@K*5-pAMVp*!@%95GA?dQ%mJ#`BTBJYbGQ6PD0Zik_0 zfrZkp{xRdp*EmG2oMq!(i{?fH#jud!O;&wgYem&1VF-_k^#)QLAPMNjuCZc&J3Wf+ zg7z`gnJ-ER3lX zS+hLT9K*H&Z-E*zZxV7ouxD#f7z`HNRA~LY(lR!~s9+lC z?0@WxPzNhtx>S5*y?6`Sc1I&?)azBUNWB$c?rsXFuI&1`gegO@8N2LCxniN?`7?lE zH=E$QRq#`@p596-UsOynOt4p|D4X=}2I7~gz}O{Br@Itp9Qt8aV)>!)Yom|wxl_l2 zWfB%-0{)7Ra{=P&nFR8JFy_X|S2HvDvGYpwGDu{{LI8-!Wb7!{r(kB(4G6FuVLCfQ zwX4+4@JJ!VsaQ@h%^OO?Phc(@X@9*{&hT!tE91k1UecNH~mlf>NlJD%Rrlj{R(-kI6(X@i+CPE&J zONkT2uiYRr1NJ7zZx=4JJ5^q$h2IrB%c8~Za^9G7Z!Mn5>*vU3Wi;F;+{#i>9(LJB zX|B}qYgbP^-3})gvTZm&NBSr|Ux1bx5_oc&_U;xv zLsyKoGyJ-O#cQ}69pVEat0=s#COZFqXB!#Ecvd|)zmB=`?2`!^gO3EuUhzRpE*6u` zemP4+Gx2;b)n$+s!Ubw;kB=?Rwt0lWQ4LrI>!a2bkkCvM5u6F)j7G`w~WgI!%OSQB(^Xv5jh8RrJRYx`rWWfb! z;?0CEBhA{}EjPimBdz<^v9Vd>*B+V>W%A5#{FQFxY*;hmVgN}3*Y8?&^2y$Br*CRy zaQm~BQc}2~j-!{?i^<^Cm>1}YGNm9+6QwzcO|D%d0<^O_#cHwo+wU($g_$+y1n&dI ze9JkUDT>VHoHZsV>DJ^60cfFukwU!$eJD$fMuhW1R-dW-ocMZ?5nblUAgJrqD>M!* zl>gPMb68v_U5a|_JK>ySsIMIU$#MbGc$g%`sCN8*_L|N$0n=nHg?^b+HMSzDoAsU- z-)_dAS9hf^LB`aDgI@7*SvWVZ@*c+#$)sFw&J;Ic{HGD|`<37o#nwuUwvoW<5+W}a zSnAuDW{Z9^u1EZEM13$^n(44_N>oG!Yi265PN$d3UMmpHpE}KQaTy2mXEjvc3Ya55 zv8e!3!TM$Zt>z1|W(h06L)~JFzRMRN@Am$Yfq6apMgeUK$McOZ?RQC19o5c_`Mb9^ zS+rv-R`diy-CQdqhgi-Uti_7;Ss^TpC8beB)X~%7N*KhlT7(LQv*Z1|x`f$-mSsK1 z7r#r41fwA?s7e8rnNEq7Q*xre*??#7M6qxQks`}tt5SSd3jlq0+jP7xs%b~L@wL&d zFKR1|qFOjtq}}6?063ctozod4-~Ch9NkG7ULycMj)HQ$L51-IP_VAdf-J&C6K2N&} z1ahx|`y{s${Xu(WTv#`uJXPBV*=i-WOkvu?GUq2R!iizD}P+9zQ(*yH6aDj zJf7pL=66I<7Rq)-yZ1lP*S)fIsL}3J&0YX?s(ju0K8Lq6Cr#G$d7Mkb;dG3}GM3b) zHf=0@VRPs-;}3D=w?9O~Ej@OMEA1T`@V1jPHq_x$M`Oal5UMO@B0lx~{KJgd_jby{ zth~#@w(j1sQC?EKCD51(afN)i#OB4)aoxUqgUX7_@aK(85=V3cA%lL5DgE=K?&PT( z-y&Y;DdSD37K0bQ(r93mr_Ah9rUvdYv+fE)!A2~H;9!i28Cf=OqoCeMZTWpgq8P(vwomgpuW2G#^PfLzo=bwmwK&GlGkKaKS4IKLV{zji4$YN359G{ZlLs@M^4#7}b9EgI5|5#~&~SyyPmaFIZ_6KH zIET!5ME(0H>$LtOndKs7TvRO&g$&IvXY8N_OTFYkfrX0 z@zDk6wAC1=XMt8N7FY7A4yX6G;-Flyyj@3-Otd(#NPr`7J+{4$4A*^}!{UfyI>zP0NX0*tN$coXZjhK$rI0uKWDldKBE($lS= zkT(~E$=Vu9r(>Mj(@5RIJL3u3Yn5b-MwQg61)?smbK4_o3@!F_N zDAWu1Xw_dRE)hH_#Jc0!NbF^lP3jW`pC7okN+?skxQV8_>3g(^c2V>s)Ylx2nti;A zub}u!`&qy2hESD&L9Phx;m>IQ<+>Bu(=pb`vOGPn;^UkbXu+rgfch}6VBw;BFphzB zA7!6b{GSI&lTi1P7rd}zFY~^!R#uMvgII1=%7JF0VPaqf>|}M9o&7pB@k%Qq<>|0K z*6IWFY=snPRId09TLOy3`^6if3gc9i_#R&Gw8%;m3=o%KZwZ+z4iwC;GsV)FNJ zRcl?I6^$w{K$}cc>SzDdEGW5>T<>(PZey1&QO#&y!8a1y8&gegh$=&-a}&m$F;U)^ z=g*Ju8um!OBpH_i8y4^r>O;pW9?dRWx(gV{q(YRMc4Pl2mhqitK44z}g%QHNq)N$z zEPrZblDuubAJ@|x#$`yJI82#oUGc|1PNu*7icIrq3(%mM?bO^HqO-1wcfpQ*fQs%O zsqM_MJWH^lH!Svm=r`Ot&ejo))%MaX78PTvZ#c1Q{`nlG(6ea z`&4T7X_>b6wMg-+`2!zm<+V4Xm90{-?hY~Amn{|~93IjMhPB-XUu^gJM2kmAQa3MH z?l!L=1V(I@y)iQrwQYaERM&FCxVkZYqw8R8p|g4&8vuUlNoIWwKa6@=u%#~CayUCx zJ7qt`7JJt(4snGcYcm@O5#_Jzdmbft~MovoXN#SPg{3{tSJQyL;es6nM)tz6qhKSK4BI_3nvsO#9AL?9I%gE&||wr zrv{BKM#FmSHxLbit6t(Gc5ikK*N<^GF6DidR9S=Kmib#P(FrTt9Q;Ywoo*#UEUlcI5{zMA+J85QvQ=A<_M>vH?2RN(GDT-U2QfBP9r{ zl;Z^cZ4rj?0p>)p7xHCyz&q^2@Ea$s>YyAwU+rW;VXgcPLB%HLw_j4XHOgwCvX>qe z!FIYoh%l9%%$ad(XRH>cC%rvf-Rr15%)Zeok#2M$Q0wn6#rf7SFwa$is>4LAFA#r~ zTJ8I(1Nrb)&Falj#7BlO^*3tigx)1@Q5527lj+Fy%4(vG22*N#TiE@k?KDp06s)HN zE0K5*fHgi&0XC41E2}&LqYh0^Fa)KC*%)9hl=)}( zv%gYQk`<(_(}!~4kv}XVqwTgsH6DF{*+-sFDYPOGinvOU(pXW~vX+GmObk(6<7nj~ zokOPMxW#o~G~V?FuZ!qW7=O}6millIGX%{V%s%-IO>>;p#y98Yy#~~@D>U%l!LJNU z%>Q!o!g>^ia>+SZ&p08lMe1P6yvY^;Z1C<{q2FdOU53^O78s^6gNkRMQRNTEB97qZqUD;Dgvr5uF)yFFbBN?IO(y0`t5BPmymu?PM}iN`v5Y`Tf2=KG68O=>FdKKXDtM0^yXKe*A_ zcR#_U-^7TR_OWFrXgYRoiA(v$@2H zGgvP5y`a}~RbTUL;Wbn9#NlP3L9AGx?8i<~@Jez%D7h?4tni$)LfdNZudxOlu2uKv z?~GUwa5&9a{}2eOuwPNHl_ea0Y;@ha0IW@&+VX{)`t3-(a9JWjA}OD!5FHC=&t2fM3~|%LI=co zm?z|ge<}$x2p>JGZ{IkR6VjS6CUv7S87gftBma{d6go%?B8(N}cw69s;7L{;+6)id z>@bbS)6-v$1LgJ6Vd#d9ORQdCT>3gvJa1q+RZssc&pdfB*w?GjTU%tr>GY-YrvBax z(8C`S^i`EK?U6KyBJuG-8MvPUI%fcs2(3fiSF%(Gsw}R1EL1(<;=IzO(c)%EQLGm~ z+u29m>6__%de)^_@`v!!rA$Q?S^4qn>{ze4M&(n0v-4S>^AXj}*FeDeV$Gtuv0YV* zLh(n2rwJHqZvJo9oMqmA0hBpcK5Ap5y}|((a*GC$xr>)er!a#wCyt)amU@4LZxzgY zgCYHZ1H-%ByyhPrIY>A~JXNOXk+Pg5jR(C)<}{mq@cKhE44-wzdn^wri6at|Q%Hri zPjwi|eSKK4AEI4Ca5*C4R<8MWqcl2xvC?8sC3|jC`D*+A+qR}^R%Y1gMCU4QyycH7 z9!J|*P`du@<+x-H^76~xzq0`0)GZ^`mGu7Sk}%Sro0^E_spr7q_Tw@3+<8p_uW4Sx z>Ea6QCfxIa(E!mY`;t>CX)R0?(n~LmFhayh&ik8T&F5F1-4`({_mpU4MEI3&E0OZE z;3GwLsB`k*I6^h1^?el__mS{q^{oce)_MRne&bxzNMlH)g?0h(XtUT3$!OW1uE|Hk zs~kPO#R|Oav!yD)^{8SY#80fylGoOznntMRD<>8>NYsUSr=%T(VpKzgg-hYGiAb}+ z?IvaT@T+AD} z^LreubaN}$XK$ZxBa9M(3cF@cw>>aq#E1Fbp}4NFWRc?^6hO}&tsf_Wun?3&E6ppq z)C^-rr;4Lq)AOzRoXrVX^+)J3Yi3#{?Oj*aL~A&W)^uL&xhTJ~dUi;;Y03e402nLX zW1aDb;tldBSe4Gp$#0|C5^C|MCk@r(U+puQHgv`@R5%e(dR{jCP*gOp(#u5xhMdXi zVPXvc$IYX6Xsiuok3Lp+t?_jum%CP-Kp00DYOOjk2wbpOUUHKgcS4z4a5j5;v{--7 z0VjpM9tQO-bMygdK*TGG|(U&ev0RV2NUwhgtFfRtz`R9eR6~nyF0u)4ac5PHT^9KWy zcY6YboG|I~h9^$9_2Pk}xPa=@`o0cyI*HYku*B2i-srOw0pgcka@uPugQFRKMLpq| zFN-wkgeqIdRvLxkm3b|5nSE(E2yUs~@y{uk1k((j2pg)qE;{J59!7>3BJflg$;Nm1 z)UL~Km`-H3S!Q@7kaj`_<&SE7DuZUIfrU9Ou%@M=3JZ)$UwK$VH%)TUNhSoL*EWNI z&#E72^!&Vs!z`C8Hd%?4!$6tuDl?*XL`U6B>ccSvM^n>vMo{ z$X8A0Et8?uqbZle25vTq3~dcQB6s=dOrcIbIte9G8-T|oq4(7QV>sEStjX}g6AIiBdwn2R5jzxhIF<3jT}GN|HRTqcI%4Pz z2cDg7+0wX|3hVWGDWU<8=T{f6RWh{bj&q|b?;!{kS-EMEAQ#}*l<_nxeqnJY40VAYg&OyC3Dg4@ zrZZ<_Jl4J9FMwJ!H%{d1ki8^Tk-8|4+0e&e#IwP0i-M z2GWCB^irFgu}F~^@_*(fqYCkC=zb{rXj0NAlx=4fBXU0g_mGZ#maS1WeSaAr`|qwax%0%@?)^e21otWy~KM-jq^a2sgI77fqFb%;C!& zTbo4yNWjL2^th9ol<~19jxloqs=9@IgG}FIrf@~Eoj4!-9E>6<)*pdG=F}U4k)!VQ zzS9$Dt4|Ix(*=9E>SS4eyLfz^7Kj~2g5XQdF!N0UR>*^n8GX^O^(QIVkm3!`!yosv z+Imv(dE0%&)BgI_ENbQEd3EG?@pzZ;4oNoqlt(v=d)q=xZ7wsXz@hye-+ssNiLNEf zsdLqk06j5|4aZ4O#ExoESEH%lHd7D4Xh=j~_dFeseP=WxXhs&UUVbqYbCk=>P0}dP z*P%+mcRh-Cc8b-*xvVpjM^nVg+GRWHaP10_xC_N4 z@#(GtC|UXHgWG!(Bizi04FAMharvlbl*;}9 zQv>x$ak20x)P~Wo;cVH$^s?Y~SA@<~_zi@-I<8}ye?}A#t2!Tv5RJX?qL?o()c68K zpz~C8R(oYR_V?`ycGpvxSK-jL-u)df*imUT^2KKVPBH-YL5g>QUrw2S*}b>VN9zG! zQ0?SH=qUcvl;Og;w=BP7&mYc7F_)D^2tLZg>rdb?KKoyP3`T8>v|6e+`MUzgb>}9l zo>k_qe%;9!@&@zUs1y}2c)>_$0w^N>M(dD2v}|;#Oz*Wmx@*}=@fe}|sGd}dD|Zw- zJmWV%=c@z^eew7K(*o3(fEM#7RNDoFK|f_Tr%a2kQT*8im$f-ZHN8qU1^6~CDDo*< zKKurLuL;Tqt3PMq)vIWI-X=^Vt{)7#WnT)6|1qH0nlM~=N15;UM*J|1+fJ zG`G7w5wXf={zQM(to^CXDsTH!R^TtR?7uDxUwdPKnbGPJl5McnFp$xQ@5?M0Py$yb ziPHyThzgcsFvrL$e@vyuFXVvgn~(*-%qZ~sWHVQ#>7uu+e6d~GhgO{IMo4XmltBG& zj03@775rjGZMCw_wY>G}8`L)4u0ds$cgZ#8x8?DD5(9`NnMku^&1C<$ik&RI{X8i- zG@su2K-dMyzI6PsVRCX}#MB7`LcATm-Zs_E6HE4$%*SC?A#2tpb%oaB6!?3Ze-yaz zJftj;`O~%Uz(g!;SIE62&fyZ!hIYX@F!U~LA&u+r!~I1;{h~E;E;Yk2F(R}W zl!T2=K^#L1<^65VeXR<2#5|0d77XT7{qh8Z{r!ETfQd!I0A=Qd78v+!0zM>jlg!0qvaw@c)KQ3mSFW)oY(icJBXWWPZERP zAtJz4uB>u>QcC9PwerYk_YzsVUx?>1qdod!CpOVRi#^d}JkO!W|8F5;CB|5p2WeE0 zFFC&vWqz;O@7RzcvKub*dOCwfJ6g&~dvlpElK0N@gSC6DBf)n1ce3%(Jg%pLwT=*% z$oO1PXxE>t;7& z=d4pf@vKF4w4+xFQsY^2yAP527>J<_N$%;mHh8C|=33*p<6RCnEmKpzrOU;3N{5^H zGN!gs?;qNm;_8JS)?fhlEs5`C!*l}ugvzIWxjy+f`_x8nEaQe%B-C6G}3%{1X(oZrKelJbcUlYJIj#UZJ$%pfQ z**I+f0+L3(AvJXWP-DOM=$`^qg$cYVPZs6-je-3I+x;e)zyAHxfJ758&0_Gq-zWB8 zB1bS|NydmgdMp3we|qTk_s(B>&F1w6;eTuA_h$WmA>B6Ss=fc-ncp9}g{{JXQBWqg z6(RpTtNc%&Y#1>*McC5{1M~ie0oeZvg=C~qtMmWwbMRZU?}RarO;2j@{O18gW1`6f zC;f(~{zHqH8JzwVBiEOb`1=p|-+P(#2BVWZ@5XHZ){p<;mzq$)Jmz{l@(Z^9>nG<; zera3&wBG~a{)c(_?uvP=syx^1KM#QMSMXLDR<`heXc5!Z|6OXoPvieCwclss_5Uul ze-Y;YuV}To*S+qFXCelB?HsK31FvK%`0eq3-}e2>p#P>mMxcHg0bqABmCeGbd=2Yx z)I0Z}Rm+jnfV#t_@k&>RuT!HG*(7#0Dnm)vk%^Fk=#(js*PKY}0HOSU3Eci~Rv>K( zyNU?;_K(Uf#5Xx4txWD+5ZtQ3!PW|@j2S8?K-`V^1T*>XJhYd=@<=?#w` zlMWRGUfAn)%VT3knQeofGv2M7j$PT#klvgp(nYd zWIPw&E*_03IaQdLM{(q5OWwtJZOP1I8l>1Y_KL-e1fkK+$IbMntMWcS9+98*bbA;{ zclMR`NH-qUlLdFLc@&u1=e6~MU{6=VKlCV#G;sA>jg~&Hi(z)JLc6C_nS@i&#TLaS$dr*uSS+S^ z=ctGb!MDtxBH{s;<0y}Vr`_ItEZ0TmM~A{+x-=O@D~-YpuD`Uq6r+T3#69%Tz6gWb zNGF%m)Myf&Mc$okLEw>k6i029W`}?D(b}YHzABFbS={=<91qD3aB<7y?E&?AvEa?| z@UlxgpTLl#zeuv)g?Z!YDsHf9UyLDR$dX>;!`Uz@w_`z?0hWK!g8ypv^RoTW&DBmy zhxW*XU{0IdP86Yqok;?fU24Dj#DKd{{=?p>N)V5b?a)uc$CVoeL6_K|F1nqlx7-I= zW{(oZYJcOA_F%Tno?us%2hUJ<}?!4 zM0mGb(20YUGZx<-AH6@#JbzXkaH-FUvT@AW*PFJSxxhVKeMUszNS@y@9-YPDgLfFs zt-&2@eysM>mu8@?eOiGTdU)#h1?VfWZ$Zi=ZpyMUEz()JxXbPUP?c$P0#Kjy4W$(E zjBK1gf|^$@n;Xe^<5AWFg2*0>nXf?b;)sy@fAFn+NVQ6#ze8Y?8&{WA&g{NV!K+)~eRsuN zAS_Z@GRIL_wIfG&%XGgA8u0A6>nL%!F`2dc9&XQ5wPI3>mCT8h0hSt6H;cH`Jsco8 zQ=$mVxOP$p>xptKMl(eZ4^^0#TScctXK&6^i-Sz!=%`^H@p=Y1Z#m4@cc(LXH)o?a zdA+L%8=g3ddRd<=yHX_%%Q3FW<==FF8A=myahrX$u|ouF2QOu(@KjtGmJ=@;-9N}U z97_mpuBJ#g$~A|ez8^dn5S2G4lV;w^mhSwc2mLKw2~(v@L@|lYcJk`_Rb_X`c*t$) zG0@t%1>n-P*TNB+3_hW^RJoDw6?QSM*6#{d-@JgnvK(=w@-=@|k1RZgsr(*P_3sMl z9RXH5COMjdI|ajLkOsek5hv>VSgvzb83YlFkL0+5=TiHe6e`~4#CO~XD_wk6tW>+J ztmwh_CbBrSf%-7n`@~4*n!_LgPHhE2$}3-wK2WCC{GlGqyqCyxG!Cq}DBSOA@GqK; zrf{)P`N_TjRlMCv(>wG5&Evcguvq1qSf!79J+a2W<0TBEA2dol%O6<_$F1<5>fNa> zzhfxs^Eg+eyAh(ht-np>zT%3Y;&iB6dG1WWCI%=Qwr#GqgYg!$4+q2MU3{p;6JWPX zqgUp^^W|+jj4uB^)Zgrzpa1;{4lm)8xQuf|o^*F=8O3!* zQ$yohC}B2JKc8C5T03SDWe8-)Ue3Hq;eNT#eC29GWO-u9d(aqN!0UD4oZ}IulTog3 zZg~QK+Qo#q%)<>><*x6nq8{iLXf)3E{+Ut3_yc3>ZsJD&W*QV_oJ-uq*C&qZLfh=EXPbjqHKG0^| zp{U-qx$t8MXZP8m68~!Gm4!?59$j_5L1K*&@FYztJf;U;0vTWl`WJK|X8|o1& z;mKa$jO_%#U}-cpdBc3kSlB2#CS_O<*d1x6*n7F0E`m`_*-YJ@(;3K7-?-M8`we!K z+JcwKOF*$MRc88j`Km&jHBjwt(aHsV{piPb%d;^7zRSLXW&!4voy?J?YKJasejV^O z5awX3L_La+Iy$`_ZheJAbmZ<3UZuK|6@5TAdb9GvazKyDKtT7yO0z)hb`0v3%8t)& z-TNsId9&_|oviO;K5yq3MCVL1#thj-0sDokq63Cb*J$kqo^6D5;}g>C>ZmK?y+tAR zR0GPYmFz60VNSIV4g0+btB=k<{s;9%kIj#%9h?lzP;W73;mH2DXE7#MK6a(VFZvgQDS4x5m@&OpQlcDa#9t;^S{j4Pr&=#Ih@e4FJ;7Ly%m|L&|l6UaVqq`>n?4 zk=mkE$A0<^6U8~@cAdCmhP~{UGVHII`A}J6qSN_%0{4S&Sjwk_k&^H>>($$t70a3_ zBR^HqiSFw|0mLi$84!d*nVxvssYm#jH?NoUCm~dsSm@R3y|w+Us-+6AaVYuRo1u6o z;f+eO=poc{Jkz-5XXJCGL=r7+^5q-764Tr-2ZqyUwd3)duq1V z@UXag&P|DC>&?KI?%I8uF%{8mntX-fTq`&G&f~nHU3N~jcz*uvjFAM=VGsPeb1Ln0%FAF_N=1fdd~ghY|h>= z@*FG=zEESIb{$luPK61yyVe~ggE2}jphi)MEZ3d$Mh51}xM7n+?`f0kI!nuY#OXw$ zQCD8nQvaMBuz=EOlj@LB7MPKh} z>|%57s(<=|Cqeh=4zgbb`%?$KMHMuHX80`A#k{Dp$vR-AkJGv+yn3m#lS--YQxT8h z4_44Mu6wNVcX{yFBcj%rGtPI@N~JmM&vA0Kk=Fv2t@(&DJgDmgAv@3BJ zB=SA?CKn^6Jfhx3w3A7k$Qa2?@w27A&>IMj>Nk*@3JOwp&LLOc=ek#SGwz0|vE$~r zKj6u;7xsHn+u!or{{5rh;R2N1d*Bg5H|fl*yF2Na-1~9gviZ`|`1s-y4T#I^nxFE@ zLhxhFXy!2C{kd2Fk|g)E;$p7nG6)-i`1TEVSs(#f1`_}?-|JI@Z zedqtL=kqGY!Vh5V2aBiB+wqt!9C(i7475n|i-)ooRWF?m@nx3v`ISnDsZG4)D}Gw? zdYX@YiWrYc@9yPW1g0Y4U#{)D`QHcdk-SDKLVRP76bSq@6|wiORa*g3i#7Rti_Kj+TI;xyuKTJ?9UfJ@^vfx zI8(%mWK1RY2vjH99xvLxS-k+Umw-~+$3lqh1=^O-V@9t*^$*}w5+EhPDumXD&n{m+ zAJpBxh4@u_@UNusZmi$W1t^wFuIjUcQ$fwVNt*bND?so45UpvxP4wff*VTjwlo{!=GI~(oq&paF|eLabxb^Z6C1g*=~&5ifc3uXN*26nv2NoQt!K-bmRz1`+UX-|c=%9|7Ym?PL7$^8S9W&`XM zjw#3Y7oB|)g&h?L-b@X9hNd8BUdrU+aVB0KFV5Jz;0Qj7IYc49ZyHu%EtS*Q|gZ-!jKqUu|p_?LBloq87S;mdA z4H74fq4vAq$){2C)mw!{>6A|k zXw+ZWC^2h)=X~~nnU(foVJTi02l0ESK*F12Nj6Ce#geO#KQs#}2fDl?Pfci7S)l6Y zXa|#&!l1g@$Ipjz>G;N)E+%y(PmfievrH?a@2lzsjAHV^y>ffx=+4S3^z@S9jZD|# zy*r+_EUMGr+_EL>DiMa=$#wyDTrn7RF6u~!j%8RN$<%6F-w$WJX5w9$xV{#D_$}(Q zba)wPs+2#YGXD5v1tw)`N9gKfc)N0rpsSOo#B$J0udD03r!CK}S%&y6cEzS%snu{Y zwQ>0C^qdm_oYXORrOdzLk_eb>=NR& z1e*@tBO!b~tYvgk->yEAcl#3;H!BvihA5Uk0XKwXKIq)c;*i@d^l7-e0?$JM*|7`j zJL7Y0flA=jTO3C(`P-alzLMfRWid&y4IGpCFmK7_X149-b|e^xr3d@4`3}nw2K^AJ z=!SwXrU+Ks30qDYxZ%)lAkFD=I53&k;&*+7HT{gmVGdH;U-Evo%DZ;%%+R{nNZqgU z0*2jJBBizTI%!!O$;B^WtfyQVH`%423Cxm-yhm2$R=FMIu*3!4cK#X4(}-Aem?^jX znb0y3r49D#XJY(h)EXuK$>WyfY1LIs-<|Epfua5Fx8!Un!d+x0PoM2zkBmE8I2}l@ z`*X=BKfPy!E3Yi`eD0#|K`gnEMZm&_dFCUlQu6Ad_dO?CDr+UA&DFLnCWc&BWUb40 zvN$bT!w#|aG&}5<60us?+bs>nW>+cMyPWVNbT$2f?3l{Xw5REAg~@Qs`FMM?XRw;|U748%w-*6Sw@{o9bgrqlP~P(s2hTvNe`!6x!+(iF zWx&MY7jh?G0U9pJh#|CG(BkcjQV>O8F4>z;C*s{D2k%H2UU16npPHF?+dm|UCZpri zyL%*#w`&mgK*>P>Uqd=3_6YirWZ|*H-dqicC&Gjl zku}e;9*uhtAsIB6-?gX=*mPs zlcM-=1AK(XX*>_WZZdUxnJ$kLYmUv|dmLa*gkEpth&BpGuzyr1VGtL@y`OocW*FT9 zuApG^zvnV&l(kY%=b*sbtdEMUym@7n^I~!3RrbbQcpaUK)*Wn@qf;RsT#{AKolPI7 zD~)(sKFYk#i@Q7VZqK;{?=~Gb1RMKy%34~`^0(t#)48Y#R7ft+x2#0FPed_Fb>ZLt zY{A(+cIf-;^vk5%ght4IlbJEZ_z8cm%7?P*@tQ*}{wYrZ8oP$vZDT2;M?)4Pp^~)N zmj}di(@umRSfe5-M}kU&NO4lp?b_(!2qCaY1N74~_(R+KfCZ?5#ST{zQSyh_LBtau zeS86N`apbRm+wp6hdvj26oIh^k`M2(!#$bO3;9x2Yr4pgSAs;!Twio9{It}3HtrZ) zIFVqJ{WP}o!^)N`Pq+H=Jtx*k4R4x-{Ngzlk!RK7<%#=*{-%G7%id@Er{D5Xm9lyI z#JgjLAFaUreL<*g z!QSVA<30L2-ZV{~TSDxmFaLV`7{>k#6QCaHe`JWAPqFyO&Km*h7PRq2y}(Y@3;tP( zU4pez@L3Av*T>^NgUAKbAH*vY=KvhqF?w1R zowgT+bCa1eLpwcJb9+MF<9gfPHlMVQ?5H^o<*G{ur#bJimqE`cErw5n0iZ_Yn}CGow^Yq?dFo`u;bdmO zqAg-l9_s0E_W0cA?Cu%)L;)mOJDNsQbe7he9Q6jsoOoN+OHDEeClaH zi5Z^vzP&+LxrkJ`fS#KJpSrTWV>Srmdxo0zXTtm1o;bObzO_);fr$|7i%pGN(YX^_ zWg~3Kr6P6y#Hsn>`=PN94YG-tA{V;JeJtms%1_FQ%o+XGrqjNo{akO(krJ*H6}dIr z9{;fKs5B+-X|CBC#Ah|M{wx z_$baq%wX^`!QQ=6JfzT$C|^&_XzE6L0a0w7b6iSA}k)S4vKi5pv*;B>H@$y>}9oe*Ca z;q~BSz-||}m-Qn_nA5DbQbNBM4`y3bxv%^Rw0-H1G3Zy9Fgv;*j`eZ}reh28)A@8d zH<{uFs#M`#6kRqvcC71Rm8hPRfg(wxi|_twowptOC&}G74XmaXx8q#zfgs0YKCoR_ z?!c|PBc!Ir(_HTs@XHtCrybhj+*d%~&h(fU?$l_=m29~6vm)!Zy%l#b+w^JW1<<`J zF|qsE7st;u#Hdh@86_uu2zT&d?tqhr2$#U{`}U#}2iAXVdeTrVGzX^|^b}nTmkIOA z1nmW7sOyxokf+muA}gtViLTvTq|=0l~Ko&T;}b^+~L*O-TUwtVkO^+gBgP#Sot@S=ZiezY-W(y$3_n zDlbgOdqxV}|NI$sfmQLtfWTZwi501S%a^yK@9# z5kj3ay3JM5ajd-TlKY><+VsYs@HB?A(nghvbsY+iaC@Q9zm|Twx#I`3*&e!{pz~Sb#-l(t``@HV)L=}vBI8{~p zosZnG_I`a)&*oZ>fMA-SCw4u8S*n%fb|5RsfZ+jJ z1fl}c|C(%=BDq1L0lNH{^XzDkxjIS9Y-{n@jM&$cvLN~>&l-z3lkxdVzK*o>wB)eg z)K2-Hj~&5?2acq9Upx6ubYmc$0e|fM3Vo)Q?Uq(1_;7|Y{I$i5O`)%RSYbF}Cd0XU zVM@WRDT>IWYwcH8u-1vwh{ZV9!tki0p=+^bfgNs}n~I0o*r*bq2lw^rYO&RvK3<2rEC>X7j?wA;%oB%b&Co04r)c=2v*Al>n`D zT}9y}GTI*Qq1s5}Ou2)NuD($t{WUD$CALMr+}Mw$4l(3C+xiE=ktv^nB~Ln^HwV*q zJK?k6Ho1lIGKgW0rzBRGGcZ#_%x4fU&6lP6Vxe-I$09NE@;<~)m5o7Q?=a3^hr0bp z@2W>YG91aJHRE2UkkYBS&s)j3kthLN=-LHD7_91DcT2duTRlJW2Uzk+6sZiYSC&1^ z%0!~UXNGLb&AaS+-j|Qe2^a6sPb*h4iN^VVrQwvE#jar?zUTH5i-Kkk2d?#esT`Yl z#BxDM=s`ZrIPJ8G731R(IVMN6Qlw2Kgl^&IoM^w6zXRaFlk#hw1m7k?-m*Qq?`5BM zXJ!1B>BIvYy|nf|0{}v%)AMA5zqLXjb6t&)FbN*i*7_JL7@$Y^G63AXlb0bi`O3b| zm@-syBKdD&h#TlSOg$z%Txw# ztQ>5^{+CAc|FHMgVNph3+o*)n-Q6WpA`A`Eh_nLI9TG!#O1FTDbVwtvBP}&F zQbTv02k>{k^IhkA&-?$m-altxp0)SdYp=D}eXq5jKw+Yfz-3{hYdA;8PpnF<5OCao z{fT;_cFeMrX|QoKgAzop1+EU_yiAuqNIAc1Cyr+8+_#m-F8W zPg4XY$C>GMJ{wnF>BDz-n>ygWaCMGs<_5xtDEZ`!hK`3)lr{wRqDK`dYzGqar2G2_?7Eup?ba&y@+*Ez72?jKYx z6L9#2<5g4W{Z4%n)oPRsc@l*(^YY=z^8N7hT;DJc!YXl$8x=d&m^fd{s`QBf!ZPXI0_&dq?N;irR??w=>6BT>0mahG9T_uE7GopTlV6z~Zr=nrzQ?0;$j)F*aS(>uD<@17-5@Gul- z)cf@fFhzHOJM{aR7Tx=0BL{#5qDZ@L)4UfffrF?nhWY9p2nFeW)<tKNhwCSB&4s znAZ9r)4Rt4MrI@q=-{NvOyT|$ZROo4)F(Kevq#;TpaeoZa&DS%Zm}+-GO^_Pic{k==~I+0*RU|Yv#+aiug?7UZDz%M|w^b?Eydr=E-0Lf`T z8a=D-K2qvR^oG4;+j84BFx|Rejk13#1IHZ>-hWa1XdSy7F8&W_dXn_09rAOW#`eLk zj_4kwJFEU@c^*uW>R40wQIhb}K(5-PN0)5|3D3e1u^AT1ox|EutFj*k@){V3eHEmJ z$WvZeJ7Q6dw_+d9zi!?_(1+}P%2S;G?25C4{b9Aa{~7wu(aV`Xh`GM+Vz(0U_ttV+ zXV^>v%6PI4bct$7YUoY&O>%?lu=b99_2x@uPf8h7^-p9D64Aor1$$IXppwrSN{ZsttEMxF$uXOC zL={z7r_C73dT~NX{qeceM_mwl#1=m8`2O~|c5M1(q#B$!G)Coh;D}!29gy0+8Te5< zSDZT1?^O$hZ;#O34#4!hGndX{T@C%vvcq17%33mVs;oWokcDA3`3&I-=XtV&^gfDQ zzz(^QA9th)Uo7J{!l%Kf%Qa21MlPiMr4cX7n_7sIZ<~_Vi)u&Z%GV^Y2=S^a#s?Qu zYjYmW#A#;lB%yhn;~6?jxv*Z?;<#x(`pKJQvh1Ql0nWNK|19`)`=*ijCq_d2^PVe9 zfPD1ZLPggRiQk(s6Gl;v`Q_y<{wB!`QhO;$$M65T;83z~5GvNOm;SM=X$nSGz-2>hhOV$D>jFqUbSuSTmXsuDG7~juQX<|%^nUd)$q_2n zuyyTK#~O5hlpm(s5?Y6RsiQOLG1V6R(-oFukWtow340OpwCU4ZoK>j^`P4Z)D8ewn z&d&!_Ac#TE&0ir!p87_f_L+ry`4Fi~HF)JKeUr6|Li}mEeZ@C$LcXmm{sHmlJUgMy zWGDTse3_J5*ZS0X6}H2^%*bJc{9kbAoc;y|a2HIIp(obkCs6@~&fP}!3bjEG4#*)1 zIrPmLvq*V~xM~nT9jo^=<);lStHi$k8A);fkaP)=L9M*!s{>6p0)7`Aqg3rBmh zC`qF04^41+HP6%)cq88k{u1&hdLM&r=kyp+lG)_L4ZU)Pmelf6!~$EqJdx&b{j67s z;jl-4IzbF;-Z{oo--$daPkZbebr%Fz9SNQh0yPX``ag9_S~Q0?eLxDToK>iURWtF( z`||aGq4b7L>GziwvUHKR-(?at z!}vjuKSD0=M!>l0ih;MCvdbe@*(R(Y03A`6A*)KE*!Ri zm&X)v`8{o2?`Bsk;%RlQ<}&f)MT#)a$X~ZF;XYkoZmfzK{zbI+ep2$=uFiS>c|ERh z+?QpaZ-Zx@-vUqw$}5~@a$=Cul7PUOgBmXA9zJ43{OUf=5t4QwN*~RGSp^W z$`7G`uRaMOBLFoiiuOG351lcez-SM>SWc_R(=yg8r+~=w4r*j>SxO}(Kap@ftFDsU^o-a-|3NCsvz-6 z((b}RW#>r?nkmoK!Q(glam=Zp2 zvxK+!TSY$!qukn(Y>dGd@3>D*!kHb>l;9&b_Frc|8MOH+_3&48sFdR9_Cg?Oj)--V z*Bu@~<*(6IjfT;}pSw?aBrT2G&7Y|5M6I~)TM2&*?8gw3KPx#G;nHn~0KSM@JwjES zY;62kb&D|EQ-q9-?)l6bdA)V1by1@cX2_>e8ky{$e)bN>m>sjp1dcsd zn3m|UfP?nSikd<)(v6^DM+1o{oVDU;S*tlTTTwT%_GYs>HFt#7_f&+&X!3@{;p)r1 zAf!*rEc8p+j-Y>4Og#t3})OAYs6k5Ta6bUN4EA2DYqX> zkxl75lWHa9c+cfp(y`?nYtMs{4VfXK&OoJJ$9ApRV^UY?DAtbrgjT|OW-IQd^*2lP zg2CexHs9NPaghDb4c(CRjX$g-0Iuak3;zv5`pF~jxo}c@UA@24+6P2MipL$P!nU@L zxW3&VztA!10<(#r2&%Vw;i3RlPqhzs_PdEuI2`lV0yF zI(UVT-sQ%r*uUISVn$g995sRmO{SjJiNEYIFnd!^XVLkT(K^nk{bx$);i3@r*RHSa zkhJTmv>DX0kMhN7M4=9FQ^DYQlO`g-@nzhdBO}$^b>Hz%>=sGtO1u~m(!|vMVBJ@7 zT_W^{=Xrk@&oLiOk-%nQgTF&ds8MGabM08^q(U^0t2bh^6OGZG|*($_mdt zoJ&*3Q37=cw|iRQRT5T9=*2B9mAegBk^3VotHZ1;^qvNcCd^-3=3>{N>yyLI`Fl#* z=H<-f2oU7x6H2;gQFn*x1$Vj&14pLEeFPYvbfs?&~P5U zWlfUchBW=ceChzG^7)K6)nq}=d0f3?)_C5>L&XkTx$a+Id^@-Ps_4W$P1t_>avIV0 zq7ZWv?YH)h#)ngXL=$4Utc@+iH_=fqdqq2^-sOfkk|cefhR*q^O)TSKT%UBJNG|-4 z=to~n6DE5hPSr*8h9vN#M=ne4QV;}P70yFll&K;S95!B?c$(3Exgp3Jitl)6!VRwE zYC6l)(1lGj#Ukclg!8+H&pT=UtGy)kL6qY3;l-oKDiw?R&}3qkZucab=Ik;3ZF>8! znkmi7Z^BngUre0SCSn&URDBjSn*7PbfIBDuD6c7}VYU*6`9v020ZKsUcWn) zz%utRRYZ8|`+CMYhJ)9xdwaT%Sle~&^Q50+oQbo?=MAK~`OTCPiTy>}?He^LJK-!+ zUOWXwOIq1?;1qH1R709#<1^--#*ojzc|GXmeJGs|6&OA;APb}(oqgTzZO@(bX4t>_#Az8Z} z%&ZdBZds?CZo@A>25zu6?MBl}=o`*Yq z%n5PdN~G0GjWJg_+~-AEtyx5*CX1=qhVnnViiUxoe4_4eJ<-q!9@LLLZuzm%SQ_@)Sv@tMS_Vc$yUfDJt)P9(O%AFPYBZGG_=MNa9&X$O@h2I7B+Zoa} z{zh@m)Q^z+7<|>T&P5!uW_lrL zt5Z*lr<^vvIuC#fLEyxxQt7r2D0py3ydTl{hmmmkLYx$+i*?iK_cp=8wm&7B?6BG1 z%M4S1JbYIJd+xI(us+KtDWI!tZP01Y?YHQ%++gM53)VTdzxrS;a^Ysf#RE1L{0QB9 zQI@YkySZ~{D7})UGsajBuk>w!Bfhs5EZn?dfNmFqq65si_j-&Wrbm~ zXOb&@ZJtwn{Gx`gIIyd1>R)=MR0gia{Z4AM9v|@0&rA%QkgK1L*3VJNp%CuO#HE`H z)y2Ls`H+d&wnBMR)*?Mn%E0YRmy^ck@WnI(arg^kZ@SteU@QZemMIw%3)FU|{qi=F7d@?_}Zff_bfCtrk zV^4vITif0c#Cx8JB z^E*(?qWhsg%_$8!jHwibP)dy+O(l+ZxF*feCij<^>L~_B_S52yb6KkC6?@f-5R=YG zt6+3P^(H6mMjYatzaNN!Bu8@D!t~mO=><{9)VY#iFNLeau_`_1xf3k?H+u?XFJAuk;N`<4X%USU75|Yvfo^vq-FmIDH`TT4Jh2^6f(n5#w~NiUpnGjgIzl`Aqt#;!`eRmX9S!cBY3VC?o{sjGhO zV!(@{9mGXLW^aY*KqZRpSY;AVYN7*1@!fT`_UCN<0v=pS*jvRT`M$*XNaV6mr$m2GMB>sfuHa;j6xe8iA93QPvaF1*Imzj z5)p*>&|`_{8>{C%(sA3Eo_Q1UOrlo+#jxvTe}|ut=@Fqvr{e~WM@eOmeUC5dZJ!j! zK=|YkEP*+}rI7>d*ojk0jF@q~KR{+Yc#D`C`#n4DhIPckO&DuXfOR@D&S)Ts4_EWt zPM>gUm$#f_s6q5t#!ih+YzX9EKh{m6){-2X+as3$HbiI?#!`tax6E6LIDdKplwFGC zsK%ye-iD7n;i&%jQ&AAO&i2_2=g95w8WG^3!x2w1g{5tu{fBeHbPA*+f@0~|7|+DV zRXR?a5`MDx()$4o7b?L-h}0 zPU!)?gDP=CqwjG7M&gB8I!Bc9f54$SfSSQ&-8Z=;YglN`T?dB$2HUZGM$NzvT#@UN z>hay#mBlH?2GWl3`_#yM&TT_16zpbfMt2XP072~zSVZDks<|Hww+FI-J7xydNbv!h z-M@oo{b&xb?>-8|JdAYb1yw)AojG!MJbK~P z+(I9iMlPA3l1F41ltfDEC8K z;C?`JA?+@>6c4HC+=KYk_6H1?QX{}Q%=Cmp_W^JZ(g6C87Pd)hBkvXGh5G<&3z9xe zjpy+_pgY6k9aZwc6b@2RBHfFUK)3|p+^S3_#hm-(BmOY}e0-|3kAL@0m}1-|r2u+6XJdPhMXeJ(!13!lj`R13 zdpEGAi&NL#6Ze=IaI`l%;Z??HPa-1D6^)2fJ`CsY0n<`N$ERtdd~e1Pf$?vPQTRs1&%+ou~{hs2ecr4&9;C5Sa{9rtF07Z*cdSmoJL;yJ8Jqn&0 z^x=L1C^aN{>!o@dsHz}S@9(v?F#D6|-vPcn6KM0gd{@c%Pn{2zLY(~hAHFXC0HAZ= zvqU`*Bk_RfaLoP(kh}H!9Xb5g{m|k8qyA^7Q_WrXDs?dUr?PqK_4GR(0|5OXRqUMq z!+M}&-toXeMdDKc$_4!OuhfI|wX6q-y_@i1y}GwKY9DxN0e1(?e-^sU0yK>IeR&pf zKSyce2P2cQFn_?;X%ij*^r(&=lY7(}Sd&32dZa3kdr=Ng0m;hab4~B=J_6Og_tc57 zTiJt3)3hE`mJaFmT))#XrS6@HpVIuRnhyfV=9z^}oZ1Hp>*7Bq&iX$l{y!%EKPG;O zCZK*|U57YG3LJ2iMQHsJe zU^riuZES>CWjm_1_U#P5vLAi_do4TQLmX715g~=RRnakZd0g4o$x>A4h2flA30{&5 zI&w6$9btDtM48uJz(c&^{2_XiB1#GQ*zi_Mc}uY{T6GQYtPQv=d+}>&k?F+%tRro) zG=bmrjM9u+E!r)Zm(;o5xLr>gYcW`ekh;{t{Lwn;E^%!FBH>59e`knb@hWeoFU>k1 zE)Ax`d{yQq!I{;>EivZoZVMx~hs-CwpMtae40+Btt?Yity0$yaf_lE-4vgI-+!BP< zffR9%`qc;vWahmzlsr9Fe;1T%-Iks0MY%9Wiv)ir&|3N^hA{K$)c9OfLS>?aWGIXL zW!(_Wckg9|3~(6EB6tW0YQmD>M=Sb2Wz037%-f^}f(Wj6v`Xd!`0FuC*YIo11?4Z5 z1IK{gDj#74bqGI&YDNu>w~lGKr<#!^)rrm3&KI-$cFOeA$?#$v>>P`Wr^VQf16lG` zk#Ne|f+Sj(fp7AA^>ejz@GZ>3fuXL!D~!U?1_pS99Nxt;iK-`y(cx>@498KdftI(e zc0)2*e}8P?LNQ(#5U%iy#dmun!iF)kklQ};v#2Q zTYD`|Uo}UGmG!vk*Qj#zLBh6(8gzRBB!L32(S0BW2hNb(#lhl+BA9OYUnNf~EFb(! z^pSX@ilraNGp^wP6#ru`v3zSbOnYHIvY*8-u;5LJLuND9Y9?2hyLj3-4X5%uE{q*(VEW#~QuEmDg*N7coqCUGSC)c>C!mZ~z zrtz7kihK;5T(MbbCuWT?f&skcu7dxO-64L3*AGie-Z22gEk%EM5vdw}uI4wh!7!z| z5_kJ59g)j<#|;NYuDI9LNV2~d`X_wzEAROF$G7m%jZq}wt(rWXU>mRZRrxuj=NA!Q zDJIOVY&>)HCQCy%=NNz<2TC>qq4%VSi!(&oTtmifmB{^+>#>W}_5j))tq#Fue2wp% zdor(h9RmIwcDfWpzf0&{p>dqr!~Kbn^Et&w~vxJ@&0(*AFB z(WHGX#B{1Wl~iyR$temfKRsgX)r>G{U%jw4U`)D3Z}5nv+Br9j9g&C#D?T71~mR2#@!uSzyh;c%m~z-4@$yiF*XL z`RLMuWyos%^yj=gPL|k`LX&_uZmBoBvefJ>L~R5;YgtNJ6!&OMi}lL%S(X=ii-%uvO1(9WEoVP*@~}cpqTcQ zdgfE~>*vKc^rm|RzRE-mdFQ4LggWzTGq}X_{oeVdxMcj-@Q`J*fGFW6S^gPIz8ut3 zCfWEr6mgmSQ=h0krD&aoUb8ccN?da|E@Vqv=-&4OL=ZY=&z=(Md@%2P@Pd-S)PVPj zLtWkMJgjzRX6CocPUyxF2oFhM5wi}DdaxOCmgSpNZhYr`@b30jT7$0RUr0-9Z;<2x z^1=;CytfZQJ}TW!bC-(wqy`Eq}!mtMmxA`T3< zgL5YM_F5hBL$H$*h}LDJ+v;MRnNs|O9zL41uxxo_xXr;S=juzKvtr7#8qauT*4_HPgw>)kP5+Y84}8ie9$Usv_qS<8ZJ;L zaTdSteg0*;fv$uykQ$B!q+9SG0Rqlpb`aWEb6uaoAyyb_3qI*w8J|@ja?@ntP^#4;!GD|Tcz9zI; zBmC89{37bV{_C?M76Wa9h(~m`&j{eV&w44a_RznEx~fRiX4RfvZhRlm*EN5yc40^T z+`lQH!R@i6KT!lx6^kUB2y}wjbSufc(0UB0B0f|48u_UcPm?{hnpK@DaC5y#6+)Wz zf9#>=<2-tv1%HF!=C2i@gT;MvBVVjX82Tv5%gkPb?lN*CgD8>UBh-wrQhX|I+u|{8 z+MoPAnXzJz+}Hdi6E=-+Lg#*%5Kh*ZoPCw(PXi&Lz06;KXXnb}Mk5rWUW3ry?Sc4S z(4v%}HhnDnIS56#r7Tcq_sQxC*;KWa&*^x=ze4r@)klryELCRu1Ls?9rgJ&nGUe;7 zUm|!(4TOpQv!-}|t<*9S!&(USCDOUEn`PNMhs-&9YnZeXsXNX~aFW_OA7IRr~sbvN$IW7(ppRW8B<4JZv#F zLI)^=sI`vLy2n<4LcX-tj~Fl=SFhROjhLUQ*>gsi^Lnf9wcVPj24KtuGtTE~NCG$@ z!C5_&-C7(e`y-qRiuZPQo%PP^S>x~V$o{mS%OW+winPjdDl73BWTPdlto}YSoI70| z7#KKP45P^!-QaeI>otDyga$7;u3l+s&Qd ztifY=7<6CX!qWrn9$%KvZpvqDo?6g(jiOaQVO|*Dnb}`yi4I)#f)4K4b&$@Iuu>B9 z5-Ym-gpjagwzBgmI%bWNh#h#n(c;g3OC7wLNn$d?ps(B(DGBxmFE}Bk1Y3wyV%1+J zG5p1D1D*1`L~ZD%+LM>K_zlZmgtWA2{2-RTnRKMo_omr{V1;X6@%-3@1<$rXtwnKQh5_7T#nI18z9 z{6Ho4_Te4YA73oStj+gMhO>{h+NVllTDRESxo6+!eRVx!F7}zZ>LAn*cq}pH=5#sE z=3zYVf!U%HD0t=LonGAWqXXM$FeR~F7g0HpXqjSCcD)_ExQ2k8! zsZYjouFC#Q&5?!UP&Aat82pY@ou(BloAfE%5}nsGYkTmqUq3g(nC~ zuV>?2Q-#|=|5d~K_xW#dd3~Zl34KxMVE@Zb-v~|iz}GKdb&lo9W1+l1fd0H>GLU~A z`?E~6Y-!4{QjI(%d|?08LK~Xx{M)FHo%>(i%bpneXT%(85HGK8l;oFN$M#^!>T1*% zNUbpd?c1PUjPe~_vM)^^16a>x%(ewWQw+Npn7jy6Zu}@|2pbs8^%3dy-j_S;Vvn^% z%Jl{r)T!xzn0v}+0vs(q*!}OV_p2nTuB>9^G?_N-Ye)aiGvJbrma0eDDgDaq+H!8qC%R8Kr?Osym3^#&;XWDv+$<@ z7H_wh6FJxdg*(D?B=f#_mN03o|2Il zI0E)Ul=fd8z6+j{l1lBnmP45D2d7LzETYk8s;e%&PyVY+!UYetDZpNL=1cq}Lac~1NiuFnqh5Woi&_irwl_6#a<(MX^h zB8NK%71vWvp5!A5EGe2Vtb;$Bz5QCtiHFwa&gyj`m>HIYUB8&@`WsbX&ex_VqYW|- zNq>>`w@StFzVrQYrTBDQVq#(ikB(IYLMNH`UJXpLiPHDG&F7B}97+Pch^T zc8;NmDxuV!5j5KyXI^|z2ZJQ`*eYC3=lX@MK0jVkthrI&s=Q0JzD8jijbBFiq}Ef% z;ubrW7=$+nggrg-?|a%6pVA%!Hye;^xqr`|&XydACeq%CkHZQBE<6YUEGkUwcuS@>R;(7FYa06?FFg2D2DlzLV$qOPgLGry5M9flk*DFr4}F z@~-CA`0ZDOPLz{{EpL)(Lg@Hw!;o>~e6GQXleG(JTE8){eegA)44pChD`$g7~(G$0x<$a4Bf6KE8*R@ocMwU14Vm^!Y*0|t*Db=}hX`~4S z%aW12;@L^P04#9nzn~^wxnp#(^cF;`Pw(IAA+d5Dy$8u4HB;RPX0w<8fl6L2a z@R`c{&cLA`JcrFRAHC>_F>Ysre^pCT`Z5>7_DW1sdqR6sRXvVmW|P1*J7zfS(2SHi z{NxMm+}k6f49dhX*F}s92pfLtLF`f|9ug+Z0%Wv1@?HCsqkQ4pElwjbQZidht43HO zVux;*lns)ynO|_+iRIGpZHa6V^Z)@c(PYsGY^8-rC&d+J zQy4j|E2qegNtDRFO}s)gVv{2jY-9%}s7BRH|JE^n|6Ld#%*sI)6e}HqEX>JJO`HFQ zm?N9@@9p9IkA$45$In`wGrL)8XT9g0#n#ij8#en+eIXgOsKQT<<=26;7^xY zn*O{qIjLkm(F6yD?>a*%)(*<$4r>btV!s529`ky5zG)jK)f_-)R!IXBE%Rl+E)}w= z9_J}|d?{{{cLM#}cLPc9kd}US6aIN!ZhFF|Bn7N&Bf95NQlk!TR39CNx~*f`8;QK~ z8C|PT8jNMm(B0&hk-$?$CPa|Qs>1vGW@+a50DT}`^WD1$$RLt9%)Ug(kSTAn{EcR| zjnrvsZu+OAM2>pD(?*!%`GL8TN1`I7x|701>uO)p^43<`ZZlK-^lepgaw4Hv{s=oIca{AC*GfMS_~9hf1tt*PqqB6imoXyNLb{O z<~G)Jl8QBZ+q*hI{sm$_*JyF4iVTkZNKG072}Iv7J!>b0MYvzRhbpb(2vQ{f8K_xH zjXJbb=h+pfY)fb!UrH@0rRspXMdPd=+dKT$yXpgfz24iRU&GNKj& z-G_b)Uu1g1cYmjm5V$TpsTrE0H~`5byO#GdS&1S1 z!Z!yRM3f*Y5u4cHaen6miMs5r7yDAE9s4G6a0ytrYVoygpQ0&tYtEuM(`lC%FQ^?4 z#%C-W4>?|Bte(CXd)eQ8Qn@5CHwc>a@~F*Qpoa<;3^dU}u}lXT=vEY9iVQCnb3<*) zdOJ>z8(A}&0)n$+AFqv+qLR7=azdYeUXRIe6^7-C&39)oK8rG`^C@=4gV~m7B_zeS zP5bV(Rw_tOhhm!x7JDCiM5O_nf}9WrKdjCZ!HlxBuA3v?9&IjPq= z-4Dn_{hw=Gcqb-3`Zv^JN{?apYxOE zJ{{{U{el|dAxPjp>%NjM+MQ3^pH+w4tqBnt3g(nbxMnlEKSt}2!$=TI^^ zOD>xVnVac>Id1Gr^tQn+8X`1POBbYF+nnAE=-~W~8b-K`7 z#l{Vd{AY~kMThiP1@SyCdZ)-4?&r@dpKxl0r4-M( z!+c2`m-U;y-fne^U$u){nc|>3^+X{Ebb!`nCyU<&ebeXS;#!I0ZaN$kPUf>A_G;cC zurrNLpK%d@G1la5vwt6AHpwo|<~(U0$Mv>W%=lC9%mVW{#G)5^wK)`mK{BtM7)zKu zateX@>FQ#%T&;4EiFlOr7mT1J_T+YM{i!ObHOS3KAJbM;Qd(^b!64@~<`{~o(zsEY z4ZJ<|zb%NlocG=xpQtI;O-}N^p7b9NW$Rz@TK%l`YiMXPgCxw#)S2$^aHAmey^UHI z%b@xnMXbDZ!a(H<@BJkiJN@2^mP>eJ{Vw#|x-1&}hYg8OfacmBS2-nSc8&cI9_I5Pn{^lTr9pF?Q&T!5isxWNKVfD87rwj75(Cws*)eHC0h$P`2>|N?n?g?b(&U8N8 zl9~6Pf|q*phQ&Bv)t|wUqP;j{pvMBR$Ws=l+imwVnlP`bhMnwk}T(U>YyZTd*4dcMKy0%(9I#y_vHwRO^iMM04^rMWO;)xbX%u z(qx|t@^S6hYqY=5j4=CIJa@#L!WzeXbO{x|LdJq-+BfKylf_GEZoX(VolmgIDh_~r z@hs6@k9NLw>o|O^p}-(JeNFirWb0$`yw;ZK5B{sRG1Vs?x~yGES(V>Fo2U(?Y$a>D zqS55UFwB&XM+c5bhkn#Q9d_y6z%x>V+}|zNit=QAE)TdfA~Eu4>V5XYmXSF>x_sr# z$=&Yus&9*FaN?z}D~O97Wow*zL-ak*?wO!xc+5M5{xm#EqY|8{dRv{(v06SN`$$yc z#fG>gi#|n9SE6fBUivxEnc{HykH)RK@ytvlXb4LwQe-4Xg(-NkWbV~hbUbleluU^q zPijlygc{QwwwL&*62EFYGCsR?Xwn>jL_?Pq&a7!fxK_)pXA}_gES6Q%2Ohgu(nPIA zcQ_1uaQ7GRXlK*o>WD*hs_H8MG0aBDO*jT`i$lOQBQcrX#heX~Aw>4p=z z4irP*tq5>-cD7!lo01}!)o>&Vm%&8ZbSYKJ120=5n9WnOH1qaq9Y`ufYq;%UPx%~#e2Qu%mfZ?1bkv!{44wY7Cb5P(rB@U@U}>ZyH?)RbnO zh+ru~p%-5T)b%2H)jP0&U-9Mcxk2?hK^tY?xajH8gz;RZZFMS4WH>5D>7WtAe{siy z9iGNrz1%=oHMMTWd9hrg)xQ{L+}sX6iQxFF!a46Fdc^8wKP`6){Uu$gL*}hK zx|eDlpzdixgGwB;%wJ5G1)PBprrn-ezln63Co_yEou{5gWB4pu?*zjpMSF_;_bo5{ zOILrtbg-YhmcE)X_MtxiShZzBp(1>qB;97w)Lt*FRel>~N%lv5eI~ur)_;jQW7ZL` z;cT=~g(UKjOI>+a6AwnoxA_8+c{Lb)LXvg*`sU*aip6FvulSOJo52UpW|Wbnt!RDE zXqMQxNy@;Z3m((Kx|jWN9F2Iv?{gw*`ReKZ!AY0@f)()ql|ois4t8Fpu|MZy^UogVXZSBH zMEZ6U4L8}DOuMNQR0!1;O=(Z!!$=)-0>|9n=9&5VJzD-PiQX##b7novh^EI}C-mhU z1P#49fWBHRxvu|O>?O&pY#M*7#u8YN@WC`}>L{dS_aY#hQG`kcmUtXfP$8Dub0HG5 z60P_8Ei^cqx^GrNirXWgYFXKjsjPE}V&v3?-`6pemx;LP=!wa?i1e%kccyUv%uH;e zGZAL?@;kA<1xA`T#;vt9K9}_Kw5!r34PjJER?~u1yNNO3WvQWl_zax66Y_gq z-P3cO?e%oZuH4EBsRg$46oxsCP)xRpGJ~@TvyI`?9=U^>lcpoD4_zIVS5PrdKG>#$ zFxz4;x&jZi(P^m$9Y>5d(y3X1*QdCB8%_zI+0%nyS9Z!Cj zVBfpP;WvosuYA}Wy!4$fwR<^`PvD;IYU6K6W9C>4%SrT_qTNY$`4vUk(CDulYx*nJ z9iR~cOp+gcesk(IxbG^PnB*|`zj*6IA?_!FBeM6%`xL%fH6#X5`^G8GJ?Ho=(|{wZ z@%LIwwtQi%xLIs&Zf-4^j_Ou=+^(D^kS!RU>wkL!z6CCqGw|7$QIbDT@;@h0+9NQQ z3yzSZ_LO#>6YPK(UM-PClk!M9BSqjcn}lBB;jN5)*GREicEB4?avOQKhfhpD|H2)! z^fhHpG-?JtYlH*itaz;pOy%5v*%Qw90&VvUzrnXpyGB zdHmjKEoBgfixJ37j z?e^Sch9CUlyw|@qOLIG0fiMcRVam9NQA!TO%S=Z9WKb&b-Zl-5Rs__lWe=FF7@w;h0TLS&Q6o z4ekF$^|w3MpS`3YzO|>Yh8YHDFeKMFvD>idFQgOQ_6leE4H&N0+c$3r(*|dX)koIE zU44ye^lM+LVWYgfp(H5_ybXx&81#%KQZyxFP1Em$7^wQJxcVJm3FoF!^-Y6sT3c)Q z-bLNg*$v>|xVDQa8z5&cL=<~~8R9S)96ej`m5%%=3;MniQBIvc54Ci?1aFAt569QQj=8X>w6m7|8>{u#@o9oO8= zZL2cgZx{bg0mFD`E}Z)%M?w=oTj68>Td`1nJlG(~wEBYQrpW%VXLZA23125@{V|*5 zY>rIS3(#l10V0@khDeVtxLF1U_2mPl9=dK%@c<`&Q4Xx!aPMi7kKJ)Lh-r0S{I0hQ zC-Gq`)M4^xD~T%amr`d9Cz;?C3W?0)z}E(N(zll_x4O=A3KX$@zlZW8!Sqk~?yOZ> z0v{y_)t>%o1UI8e{I`>gZ{U~+Fulmlr2lo&7k;1{KAu5tqIKlWz7q0x!|P40=_>k1 z5u}r(rt1==AHH90i{C7ZSC2)+62@RvBxU-ZuO>xPfMNlHVvIDXN>Rm+_PdOEIx730 zmIHUWmQId|uV-skSK_ya;%v{J75`KUmQ&cMH~NXlF=yr60h+AG&F=dRGN!{G2z?KY zI2^1nG;5A}G_SX>B)tt-=ST|wi~O7G%fmJduCaOuV{<_hiO|ShE&`99i(mVDva==Q zcJn;)oaPI`<@99CL~Wz5;P-fTL<5u zIqsqHh)Fe+NxF-Y4#A{~VMWn#3|jcfQi3Hv?wob!$Q=l)`h9?)yC zR>`bcv+B|M0-dMR+Q|q5jyscZOcQ{0eNEEOxw8gId%nP5S3*(hSM1PyZaDoJMZf!_ zCZzEUZiRRF3A2irTqSy>@R9cuj^WfNt)LHg*|rBetGC9JSvAY)W!7CU;mWPZB?V=M z8=S_saAvl~{kOZ+{0Dy|r~S~KB)R+wO&ax7FOK>7R`A*c#sc;u|7H>48HBHO`FrKF zS?bZ_h<1H6Nr+EN~$c9@^b0}X(tEOk(oXXVt)gfJ&PkC{D#_!g2FXlPw3$^ zaGNxtj1h7Kt(h148f#1k&rW+$Y)B)+7?2@jB+@bw;*L+;)9SL`;~XG+%A2U;lQ!{XQ%&Nd#mRLcVOvvFuTxSrAQagLIiS5j4tPhP7b zxr%X#A{`I^O8$hUl@TTc{X(Fu^O-`=jf zsTCE)W#J(V+5>@!3)H*NL?yl_VrC;l>PU7nE)KZ5ZljaYIRpi>Pfs19Gn~_99l0ZB zRPP2NV45U}Jg~-FljpzTGDqTj9A{v6_YUtuDc}Z)`G(vM#Qs*Ed#cnR*G23kHe( z^)PD4k#gWw!F^7%N*E-j2lEy9#J4XD^yEpUx%X8$25%|te4t_t0$vwsj0thQI383I zS#g-aZU?fXf|Y}vo#JpbuwcTH9ckmxW%p}hhnrL5qmy`R6^4flQMe-!jf+xRO1$a|c3seSpF;)ptS(YOfg zDR+W@s6rHi%DC1%HU?J0zfz7LOGnuA611(j^TsiO+wHD;jU*YX5wS1u^{2nr7KdHPTuT9x{I(}0(yg-oIs>#nZBl|D8%@Lga(KlBHD_$ zgF&M$o`{G@#cyXFSox2$8a~tNcJR&ThYo67||*3Rgb$tB!y3hqrBL1)gm^v~*$pJX(Eu!nn5U!h0kK;cL#7qH55Wm~akNwON*-Y0{P%w=NnQN&c)s&5pX)#Qdkdm?yJq*X7Vkgl8 zM}Eb}!s-u15!41CiAaH-u9~{6&KaJtR4%iQs?p z^6`;ELocuDN7+_2os%9(?eEP4QFwveBYI5XB%*ozWDgP_F{Fy?w5ehgO14s<75AlD zkgQAqZBKpq-oSQ6E{lwSK#Q561bpI;X#n2&g#Rz+0!lrp*1vC`Z#We2fyUX0NSf$AAb1xk{{}HCXVjHbi5BKhokpw<*pSD0vED-r>K|$7G zR7zPwC0mS2bjc+=ZnWgs7&S7pV`q3Oqe*7L0_KjkRA=JNeC?w1PN<0cfIS|^W&LyM z)ArYKY~3N6j!>fUcbn>iq;M7?!$xto=3hrrhRZ~7!G|ckq8R78B`cw-GGvxcMH-YRv;D!Ul(t7r9bGX^XDOSII ztN%38)FOeb+;YK5VAVR!YXvy&Uj`CJptapLH@o@6j4H$8pFI-LR|#dL)-q;^Fi0vn z^nw1bTkkz`XBPJ@OXQxv*Z#%v1M@C4F$nyZ<^0L)x)}_SY3LU>4ZR>HcEg6BbE_E{ z_m`tFE!gjl8v5newq)M=O1&c_R4$d#a7w(%dR?Iy z0Z2qdRFQ69TNaCBAnRd+^G?)N6nfW7Trhv1*p&cXsr&QyU!whW0A<->;-+|v&X4{1 zOFADOPiAiBir1h!>qL~1j7#F%18Ja#2xWg_B{W769PLrz$|ulNRVnN(tB|0xp}@*+ z)x7E`o`}G~*|$ma6JW!p zbPeK>0iCJr$VB!J>o>mB^z=+qBHljATHM6c0OMef$T@QHG-~cC5JqE~*KKF1AsV7e zm9KAqQrGStIp5CixKx@m05I%z@$e-j8Scw?@O~1p>!<<>lz%{5^>(X={ipQpe;y(o z`fegPP#^$$QM5OJoir7oZ75*?)z7~uesM=5TIsia z1dPjm%L0V*nYv3uj?Nqn{5CKHcluaaP){%Vt6F;0k`OlDdDCP+P@lhQS}$dc@7!i1 zaYSFQAP-x?hc+4&Eu1EKgJ^O)$6l#BnlOdqJ>J;$NaL5i(0}rv&*X7IocS^pbZxKK zXH%b`K?!ZLORVhWdP zWVR~t^zABivletB?}5Di#{|HE=y#L5tu__E+Uf|ep``{vOT;s{fdW>+07a@!1X9P! zA&M871z+0TI-+W8ofM3qo-u7*SX&xDJWSiND0vyfS6?4XTD`|F(17nqIvRdjbUxeA zdP>Q$<|96-7Sl9uI9DnGb;8|xxaT;06jU1Ur;Rr`gzz^BBhz$d$(!#1ypkE5T>Cgo z<212qeSP0-moy3c=;llW8M^aBD)88CRzEn}GRehWY!qTcBf*{s;Y9LQ_3>On5PdjV zBa1|Jk{GCTyVk9J(Cx{JP}axUVrJ^zzifLEZLk9{SV2?~QT!LXLH|9507aTk1Xciy zqImOxId)}Ak}2By*oTsEpnp|qt7A?<9;Q}?g3ru)$qY0A^s&Thy0m+GtOPU_BLl14 zu9h9_+Q!un{uo;Qn`Z~p3@FA|`5OY8x8PPh-Rc!=+4hDc8~qI<7R4sMOvODo$ySdc zIdR}@#JF7L&;=jAdSKAn&Kwlrl~!K`@xwZS<| zk)(a;u`IXmU!O-%*Lbn{+}UD>YQ$gO!ZZ>y^r>%+R6A}+hwV#6!-a!=ypK=;rM8YC zgA7KH)wNW`f;t|G(9AO47ypv7?mAaH$Pg1JPEYeMT!`zAgd|EO75kKHJ}GSc&n zucmNBoM7ej7K(tLK9<@)An-nMYeJm$Yk6mfioim{9SOm{_jvrsRrH>ZzP4<*MyTPF zQIR5^l#9Ra{zAmtMO#*jcpYWMg*DhzZdd*q*p6;%lcyN|W+ zbx%m6QrpLvjl^8Ww6I-hEDu*y03Ap$(+GAnh4h{3L|f73Cdt|Zdj=atZIh_y{vNz2 zuTlDNBM+bbEu`$lGuDFA@}Go@u|PqUVjmNpBL3NN=m~#U*<;;rUD56s%MIc`M$H}j zB_-a($KMPEP{*I2*2GI?AhVv*ZA6w<^b(WjvmAQBO8xRTa|nNu`4Y{uzq#=emg+vo z`sm*U+mvRFoV>)Bgu7*Ka8?5Qg*gL> zIGfx-k^lVF0kip`$yPUG-&mMYy+1|2hS#Uoj34!W#3_Wk>no5TBQqkq3rxd@|;YBOW&n?bq zUQI*;ihK@EnhET9rxj&0--dcZR_hQ`iFy;i$kqzVb!%e}MBL_bPR%$bC8-+Cub-Hb z9L(t3vW7yYACy};mCuh}o$H_>UelUg&%RzhW z+K<|6Z$md&UJttr;-oj8C*5(rLYI-UkYnDrkq~}l)$cNw@GX0dI}<1q8$Bydd1QU% zk=fs*su0Gewk-UFa{?;RKbrVKik2e^y(VHr{uqO1uCr59-%NhfeHx`=F zK}R$gmEWr1`T?G~L5A;Mi?Z{yW`^`M&7~l8sMNNRzYrM|= zqG!xaI#~+G+i*i!00n^?C#2tox_EwZ&&;j>uY^c@hCqZV=OA6zSL&wEzMw$)3{1>~ z_a*=0-vBoWC^C^+9^_1@B}vPif@+a=@a8+bGGUa)DJz@gMQCXJS7a4$USP+5PS^IP z?(}Cwa8FL?bfm-U1=L*}r)y@nPc+rGa)07rdo}A&5$4QbI^uo!Hht`^iscazA=<=Q z*!~V(rxL}~?vUDqI2visVt+4rhnl#a3H`4es=7)K`m$}rZn@SgU;M7S*$fI-9#G~A zgXJDvEZa}WV&7#_`m0;p55E6Y=`e!dDiTQQmt?s?siiTJ2+J#xcTM{cjrg?oG$mN# zN%5g~DK;6xYn>J4o$TpJ5HVZBo0KrVWBPmvOee4Ufmb|P166Kb=W@mn{WsySk;nzH zB!AA?&bPZIpY9Z)?QJYkG3WdkiC}`&zPk7axzp{RAeq>Wa!;;Mld^!ci9Tj(Zzj5! zSCHjFQJdMJQi{&Sm+|=L{Jbd~RfL1UJ2SA<%N0~+d~^j$d-|tP<^X*Z_ecc z0vUanqJciv)Ng~}v_%l-(-7-C9@N{@tId`8_V^{E-P7t_>%ACMWMWv-kTg`<&%Wd& zU?>%bf0a2&Mo*#6!@xWQ4G;HBl{=Oj-ov#HFawUwCA^rD1q6~KI_8c=b$v2~zh2g~ zHM3r_NX|=9rs++y`;a8+0l}eb~prluH3~yULX!rnwwr^)>nPima5Dlnx*}_F|ZX! z(6TB@wqO0C~0e>*f_^ld~=K$m84nmpf^nsZF9sgA;BzWdRs7!(^U& zer&)Bf&Q@KVzeW``e-+-&u7Q%w-%>oUxRX4%G0srv(>Cct&Rp#o>-DN*Nx8f&_gte zAzV)wt9HuO^uy-98uGtZo_v(1Tq`2x8?nKqpq-u!|{;Xu}T%+VQQ zbLh#m={Btt;EeJ@{ChF+hFI;iYYfe?qmf_lte9OLZn>Gd;wIo6IU;(`=*T8=kj$gG zC9;ww7>wn%H+yBlIgz5E&o|ou_h1fFp=_6m+xf}0<~lFK`F&HdiI@I{45-$mMZp)* z89dxBoRMur?^*JNWR!vz^)nlDe0e-LnWARmoSCzZUOUtLno_nBiys`0FT@GLCZ{!6~Sd@igjJ}PqL{)Op3U;QS{mq^`Y1{kv^cDwUl zq6N7y0iJT=d03nnBgKx!xkBYeC49tGh5RgyhvC?kYd_tLJt#l?PtoCcMGaCU@Y>b* zdRdo;Ww`&=jWwxHK>ttUnUN#;?24l9F0|$YRJw^a5A7N`U;B*wEG9OI(B!MUD@_s8 zMp#}r$@4gSfgZASvY=;HY+Ff&h6R0HGD|Yh1Qm61k=pVBsmY6Jr#|6oIepWoZo!x> zI%A;c^dIgl$!SGG1n4_O-qE#$>IfQIkjDND&k+eVK> zUs!Fqp_P_Mq$1S#Z20^>nQs%Nbx(?w^C8>4bGP%~+6GwMoDF7behU7p1)u~1c|t&e z9R4!jkfbIRf^8$~Hi~%jh*bZLD7-KM%Zfe+aLz>`e_HF`?Bu>d^((7*_l;Q&91ef7 z7ccjp2!htO`8jSU7FYXXSNoMa6P53|X2y*h*VUc2m~^UOJdB{kp|?NE%ec4N{IZ$M z@s##B_f1zV?n?GBaT^3eL_Hn@$1xm&v%ZxQiAK#*3X1Kz= zO#M;MnIxBQdUJ~lyIMMmsdbAsJF~3$_9#mYPBDt)n5xr(H985J=5?TbikgKQQ+9-F zl-wL8ihiwJprK*q!btbc z3zBbMy?h;A&I=wH#WTg55*uuwvuJ&ZXU%KbH+N;ti&c~0;lYeK6Zl)0X5A@(sy;N; z3T-Zatmnm2np<0t51vo zRtSEVIr;Sgsj_+mDkfvfFzHf8&mofgGD2h@e}la>lqO2(d%s(QO<-{}AUYs`A$5`D zqG{VAdhq~R+0ck7Yzt20O6Mc0Q%jf9?P%DCns>S{X(tk+`BP5gS&2JbSEe9l7u}+* z;&?9bL7^b4Pjov}_x1~YV$fdi>C?IgRO!xjH;D+bTfH?xFAAMr=oKHHS6BSS9a9kg zDy6=H(Ta*gOXvJ5Uq;W1>b}NuTpDqK-sAduJ80IU+!V;ZJ8om7XPswqQ2D#X~e$6Tok)r{;q21%FZWWaG zerM1>N6M&u(a03UU~$H%Wo@|0>#yTVcc*8}skWXkbpl3h+53UbMzIUA`S#Uu#;)ls z&_a!*U(gr+5Se2;pU1J3mWBpa$k)}YVw-=>@8k&gBrBrKg7%`K*>BlF)c$c%MIer9;s|;I}2i@(OxDhB9g=ZP%qiQXYa5so_&-RC;O%-No3ACP1X=Cz6KYX-8Wx_;|I(A!6d=JUu3;zrXC~Z*vtZMqNL=dY zPh|^1?&S4V8%BqJRIn;SQgTjYoC}=vfE07?k?O5dQ3KEFIw0Ab??MAQJ zX3{6af4rP2jL(laeiCTw6YBn$;a&S`4(L+33WfaBri87M%Y`aP5^>XpKp>s*W$O35oRfq&^u@iv)+tEM-dFFj=<= zFQ4vOsmwsd`t@I>_KpA69#A#%2D&m>cQA`@&iT(r_I$sSy+@hp!Yzf7GhpR|OmOjW z@>{-!Rx1Y5)zo3CMM_!zduC^2f*MAe_H@4b)?*-+Ma5Lyt0nF_x-=vrmJdhS5r>%Q zDEQJowB^ZcUliJmdHP#51`%{FP-`kdkss)~>smg=kKlxIO?f)I(b9FzCY-v6S0p+r zSXU0&bcC$}eMGy1TF6&QdOZcxF$et;lGiHOe^)o`J2kp~z+kL){tTi<-{V|a+JeSZ zG3v?oHJOt8Kd9$7XFPyF4XJRH+(-VmQWO210Cj~L z!~W4_G5Ct4Ma&tlK~gOJAZqO%wKV|z$ps)Hx0`x*EB_gkX+My1GKMfU>)o)#Y`C9x zy^H(GI}mW)=vZE_wEl&%@QNOq_J7EkNDBF7FxOgm)k#vdZh_wwsU40(ELNIf#-bR; zgSN{rq2!;=_nT8#PBUG0F9R>bPoF}e!$Fok-dtKMwk|LB+erp*1pSXW!wc?h$8(DG zj_gsaIQ*|v`E^vkElN#J;?y(fNGZU$U|iS#TAaF2Y-V$t@h&-5hg+fxkgat)GTPvh z;G_af{1OKdORO;KuJXAXLJ8VyM3=Q2XkWeExlFR?Z)kNmfIg3-c{VMy=la1u{&!8$ zC}As;<<{|r{-u<5UGHdOuu2qa?r7Uv{Rtw=mYYVw9E2{nt{XQCAS=)yb~EYq@;t@t zaZn)dyk{FWDCWp~FV3%h6B%+u2|`#hjk)7i_;Apq=p*-gfGiNK?N&uRkB&jbid^%^ zEj|%TR_VX|)`4UCf+G&twk)PGewlI@xNCGA*2vA5&YcDQ=hW`M9;^MuFqVeDTTPwY zVwaN7Jt9+#-`1WjH0S--+Ub5<`;VfU31U(!QyRzcnxI8}>!p;Rd}ojg`r&y^F`r8*iwH(8!Zd&=B0o z=D0eOa@vg7=S|Q~qJ7ojkvVs=#q2Q;JBrxIS(1g`4mnuNDG`dL_<(BVDuet?B2QVz zN)w`$Q(m1&_j}YzA87rh7p3R8F5 z0pJ^&tBb-aC7zT|Civ2PRw5XnPk?jLL{mHM?{^+_Kz(E~8WQy~4vNb(&f?9_&Kgoi z4y%`GmSLf@qon{46yF@Dj(JK6Q;+0?m#0nFbqc71ya%0<6@Ucq#jGu4I`ZyK)3}CH zK6p2~Gphk&sFsdTohuu*wl?G@ccqgR2tI15t(h))am70=aw0y4X=^Gl0Uk?T&MtW? z4U;bQ2&)Eot$PGJuwGkcWD`ase#@!>zSRA(l1DV-T(P zr>li5^*bUhv%C3%mx;ps**~G8VB9wreZJh_)_v1*4vqe)gVlH}@{cMAIewpe_Ttz) zNQO&3rt~6hLPb3=6i;oDJFyp3dnL?>iSf0@bUf~3=8n5~^W}HRBC-9f-A$P@hJ`gW zbRVHa8vOZpz|5Vm9= z07SID+u%YlKBWldYvuB$wlCPEgsBlFF*QQCDwH?|vc0W_nEFoXLHKRja^qP5PvWgw zD9b-=3qFXrXR3DKxAyq`agOwjktRqDbtPuF2#&dkr{4j~e4$elHT~bEe|@xz zG9Q|S?tYDKuv+7PkVow8T$TeHzR<2Wq7M|1rKx=LZL(wAt(2OkXES#YFPm@U` z7>JVxyN?4Zza_5%NgXShq~c5kf`Q1VSGkO%y67W6fl>TVtEdKE^q4|zUq7G;=-NzV zwxnQz;GoP?NW7YofA4qm-X(Q;_kLzz6!F3YAs}H&+>8*M!3~NhdKcbpU|5#xSwU38 zaAYP4f{fl<5x4&OJXS4aEk)wZ-npMHV0ep|;#P7iPTvGB7}Q?b)@ z=T)7cU(RN!bh0Ax$2Gl(2Je6Tv|`U|oB6ZmTkCbMGr8V(a#UBnLH6q#CWGmlz#n0* zqBA>`p(yl*%2s~b@^&rh4b$)0#K9K>@R$WcXhf3Ce3L)b&_`jN+x6%nabBKUTKW-; zH({}aEZxVvx>EK%A*4@bOwPZaaon@SFPm{0#h7Xut_h`L>0Xc@$Dy&MeM3QGOdb-M z)_xO8@S=DCm1{QT0MFZ#2Z&p?9hwIm_8wjL$sm|$@8`svJAVVU@=&AyM=Q@z8{?W0A(JWIk~=_U3^zTR*4FGt>6Q}@5mN+5nQ9)$ z_PcXraM&oZJnV6sTo!xSxN-*K44@q(^rmYmp*NDpSk@$2*(d0y`Za!p%Yh}w7x3Iq zqZaMcafdL=oM6s5?2(AB5jQ!xi1Uw-*)}MTQWcEr{$>P}NuW_{;9OR(YsqGuBREs- zFqkY;?L19p@w5E+ZVP=UTZ(HHk@>fcy6}SoT2*b_wK4JTZ@9?{hX7}Txn{j(9{Hc9 zkkLb?jd7~m23TgY>>I&9!=0{Cr9PY$f*%*kJuK4Iq*ru?5^r!#0y8lSyxi2+c64?0 z336Ks_7(VUq5LeX=%>KC+13w0a`y*4?AJulxi(U8azE>X*&7){gYIcl@~$ktL^i(o z+kyplgRo|0fBz9xnU%dEwUIn{G)RwAglkz0M(x+e^9qZlp^zPp?~IcHHe*e)PEkX) zUn9UtL)%{WSVEKL$A<^{7@&QfdmJ|?MQjAGG={GbmgDQo4$T2pT)>YafD~Dl8&p;XE?N3lR;K$~R;Jro>iP`umLor+gY2trHS_=c#uqWD z7zsLD9lZ(%Q6NwZmkRWtAxT`ZJE>t@&Q=^}$qz8)kkb9K;lDs5tt|~YgL(aW+(;)! zK3fT5zBpqHH(#1-hJlQXoHYh!e64Lg+Qg$skRm0tEx;8mJ=g?EH);$84>`-=THuI} z7uJ!sWZv}QUW}oEzQ%O$w`X2t?HvkQ-m97CC92JBB$QV}w&H@o-)j$k{(kCX2b8C}89&q2S7vayIs53)` z&{X`RZq@$(kGfr}G~@K>t9Ftl&YV%a100jG^sdX+H{=#F5b$T<9CIYJbG`(F@f>|# z8=~OK^rzgeoV!pLgJkFWdeT<+Pk`;7DB)ZLv18D&lC*{O%Lt%y^%I$9Ht|sUP+_|s z)1b9uL-P5U%s);B_kQM3%ptQgb4Yh1*E&~{3zxK*1%%2__cPAh4sbxV`^#EN7i6pE zzM%RWH_m87J5HN%uE+7;oUxAX+a+^>kr0j0)0}q`qwiB(^>Jbc5f5#QKvSQgyASGq z38)j_j}%LD5^Y(E&@2eJC~ps9$|&s9cFHURFIoiYN9p>#v_TxqVVWpOJF$Zt$E*(5j_h8U=e)PjYlb{)IN7wc6cFWsCF#mNV zwm9l^N9Loy>~^2DZu%&GCA+sF!3)KnAl3M2${wP$?$H2VSys2X)$uHVcHNzBh`=qX zn%BaX&%LJem3)Z?Xq;&BgY5RWzAba`=Zm0%vwB0-(4#CL$%&lN#9wQh;rCJm8c1Ql zkP|h}wOyU2bGt-E=lI8#5$TYuVZgUf)U_?!>$LdG z?@d}@Q4MQeHSbY@Z^Z)N4)oH1{Z%bw|#Jd`v~V2D_?UoQM93GZ%D9 za~o}R0qj!-0AaoRmoV)Y0Q@v(99K*csJETc7Jn*>!5ZE};i_A8CXm|*G5X5euM0-h z*ABheCVzN$wFuI1wmqQ*K#oMAK<&472P6U6d`XVj;68onyMW1PoGy|-E>xrb__$(=)^eP^JW;); z()a2B!kN)BzbgF2*?`+|sy$s%;*gw(2(ka-J+&}Ej;6&A=U&c>xu1mBiX)K~GPBRR zM>8b5Gsd3UV2QrI1|3$-7%rS*dGLt}u-CAND0_h4*I`>V+28;{A+CT6KtbPuu|;6`AF(hDbRY_xhEshmbiIf@JAh?+TDU@D z%-7?;=7696Ddvsd4!Kqq124}SJ@AZ#%tc26jXn3s?P$!JXNwU(&Cq!NP-dOhJg=ZR zVHrIHrOL|+Bg#?XHX9U?eP?RgW_k-15_2>v0jD4fMSxIf9-E>sW&RVFRs^AvC;L^w z#5w7I>j<3RcB*gjA^J}PC_qv8*-oJll9q-$c^tZ3$)Tw4Q_7m~VP{yPLhm8w1%RRvF67GB)I%PM~@|~JLhoP%0I92 zA%Avig?COu_H{SxDV}(5psJgGzG%lUJ$x;ZDsU0hCvU0}n?KjkQyL+?SRMEnkRa2l zBqi&6gqiifS-eA*PJVrHnIx_dV>J3Kj8E6$>IQ3`Z`7c?6@SwU*K#*} z1$s9!?dZiCFJzM84n>J*hw7%2q64AC)!o@d^KvJ0li!ReA8c)-F$;?@_H3nx*5$)v zzIEr0`Z&<{+Kh$^WLXPoEXM?av7H8({%H%bocdcT>kavGvL5dD&arB($$KZ?{{CUe5_KM3d5 z;a7lSd+3$?^Y1U_2_o#g+VFv(A1J0FK+Lp|bN9~B`y(p8=S(x; zkpF`lc?n@$-CSB}G+>{5XAWf0-8?O5op1gfNa6pD3!u{Ev3&K3RgGZWg%cC^@a*-C zfdtgms-?mWMVQg7ni6uG1!PV?HF2mctP|j$cLF_=HYBn_W4BBaGhjL4TmMG6_Y*ah z9KE{7J*(vpX`*Z*S>>_vhOG4HKN{=f*@V(pe~^hV73G)l7)AaTYs+Wk(v%WTpwQ~T}Ui6Y$=pr>%nV}Zt7Ro&oQYwUO`&R^Cf&J-uU}}&Ydc_zXVClm16^|02S6td@uW#0ZRs*%Ie+k@@ z3TWNS>C+FG=+c&Q{@C4tZ?pLDKth2eZcH9{^N-yX-W$p+V{P za3reaUw6__8;j8v=-!5`b{W@i#kSo(+w?lB#l8gFAH!Bhlf?Ly*p~f z`m3*Y6QC(|e!j6w^ydKsng5cB|L^%BQYhGvJbO*<9c8+eNy4RSl?Lt2xYVPJ5V172>iPL~1p`4(biptnHiyry3DoL82p0>&wzi!huAH3h3B zPnUVbn2DGAhcO;yd_<@B(|(WAA4!d?DHl?0R@RJWvBL$vR&Vyn1@c;w(=a7+K*X$z zYUt?5%>lgk|DiNT-!{Z&+nU{97eZq{B0k{|Q!(5|Xd2>%K@>>8TU|3;>sl}fMBLks z#(13hc2MVf%5gk(G*#dp_1c3#4YAP7*YD$z)LRyfTUOf@ZuGo6EBnq*fo&VXo&zSm#>H(_X9m{oq_DZ|&oD;3(UDjU%7Hc%9*HuZuJ_%QrE!_?hr(7T+^ zqNd{EqjItk#?X7JYvT^nmKv?T+bfLGWM=Bo%@h6J)9goH7?fa=G3`c$Em z_%w<7{h5^?gc3Wi=(qFJ9#)w`D&;tT3N3Oz}FlB#M-G_tiR{hd1=89 z`<%rjhQ`ds1{XK6(^&GUs9kVL=J`8+8C;3{V_bug=I;KnQ7e5ugexFW>JJz1V|x#T zQpfLnP+%S9h)iVnNDSo1DXS1KLSXs?aK&8w^|P)+2xPa%A|UPP3raRUE~HswG(4Mn zb7;5(!=tYUS@l+8I0jVeP&f=GYA2#!|M0C1d(#ncilEX5vYQ+L49ovFm9R=j5d&cH zVgQCUf_~bn=OosAjXLGgPap|w$dq^ZG`=)HcM8{vEGT#TOTApn`={$u863SIyxp>X zLsg+zZSryd&eY|NLJI~;MDwqCMA7*IA&+pZ^4H5VWXlhV150 zu+|G%K#Yr`T1H3_;`(X_lvdN^(NTEOpGLKPnAdlYLr8SRoMPV9D21XsaO9xO0U(i) z<}qBed#;v*nA8VMUly~wTU1!eGdD$UA*5^r;N^ky zPWn`=FfOb^kZWSzM@#4VrL5Y7J}#PbJBgq-#cr~GZkuv!gpoIz2RR|E7W}@loGK05 zYy?`r!lbI%ke1j|3EDr;Wqr8=?U+V!cYkYXQ13vM@Et|qFZP&H&h72?hDYYm1ZNx= zmUtO+y5`a}PaqUcB*_vyNRqbcjH!gK3k8-y&;7KQ1MeMp1*DVjWp5#-uB6=*^;TPx z&lPESbn?T-bjfe+WHWGJ;@5WXA8w@)It;}4usJtS4vuBsxDWYD>1=6b-4DwW;NC9Kj*q|I(dN%RFOp5DQ;J& z6Ln+lrmB>O{T`cfb9B(eJu|p{nPC;|Q0cH=<=Li7@d>gAHXfdON2Hn~qL`j00*j_JCgDGE+l{n4w=wx7TqJ>&2DZ`sY_F#2` zD|_YZ`L`Mnf(z5=AiEvc@E#FvQ{R^=ucUw>$OEf{?2(VEPFmAW?-v2Prtptb!h2X4 zVj<0!)dr!G!;y53XGBr^G4}y$ftT7qaYMS^)rO{{FMMVI_AgQa_m3LlKaq{YN8kdI z;SN3Be#|s#zy9>`{d;)$7Xk?%x%s>-R)Q9uKUhr=KEVJnt9Wr|%~6#)LUJs}KdLD! z3>dn7=HpG?%2nk>#r3;M#{zj((~~5U2-VYjFW7JE9_esaj`i=fc#5O!QK!CQRh`9z z8?52}Zj@9)9vFhIx?qtT)(~c?KwQUt7X5AneZcq@RN>1JSG+bLST#6CnsHftaf&>z z5nL-ckPsE?_W9o7{K1xnZ_%eCRzkgcn8L0+VZojeCyFBMCQ&P%?OZ~d2F*a2A$7;@)7 z8n`m znPZW`b|>#`;Xq@<2@7h(R$PhzCew4LwX9fA56+2GNuqATZ%Mg*)zh{I;iANIpThf#SXS;3q@9R&iB|NqEp; zV{n}kC=+9Mc>h(XfB!lH!2o@%;4ImDZ0Yq#)hF`1hP55aH|*A`_&uIG;f?nNy*aKM zI-FHJ!63Q1@Wk5J8G`eq4*tx(m+u(Og~q-#ZH(dBX&GJ@avmbWQUV(F;ovjvQoBgsw?cA+yqD}d=3C_!e=PqhRNr{_h7Ul#_3vi@RQW z!Mt18UT>&Y*|q*^v=9QTt`JMM)&=RGn$Rg%Hl*TYdEu|y*F@)8zT}cU6wZcFH>{U$ zAUB^)e}!XRV*Pnt9SH8mbENkxfQsvHKL;4k19jdbutn!^f-^P`yzyBt7_^dT$;eeu!422d_rZvIu&~upN`xwuQjb^fH4)lBu ze&Cd}=WNYr`jp-K@Td688%^fqe_g(1y?Yw!E2t`rEyos}!Ar#LkDgvt@9K)Td2)~x z1TqX4lYZ6-CyGd5(OY55hRHCnd)hKuY}-bUW6UX@QKHqdgznBcV_dpf_}c3g;PLaJ z*ooiwU4K)S74;^=h~k>Z0>)}n0|V@F(;JPqPtXNzm6;}&ug&EZGbO_aE~wbsRS3S{ z-5!MjFZ&D1dBUC6`SV=Iz!_&xSGDSDAv%vXcif2P-8O6pw=IR1=Eqw*oCyUbrIIQ< z@A@A+#r3Nni9*_|WJWKyD{i)JIS;adcR7l+mqsKKtq0N^xCfcA+KuFg$>8O^teiaP z>dnos1NeE{w-)(Pkrb^(Tm0p|%_T7PbrU18hmb`QcY$j_t zkBPi$I2Mv;Uf<^IQqktx-xA@GlXz;Fh>an(y~{~;lrITJ&^>63_T6cX@Yfo zyK!mPR+XUpXLK-+t@bX|u6|;a5-uFwGFvJwSE#^4Dr^=mv%-Kc(~o@CfJ^!pJV#4B ztGBCmSRi4;)IrGIy7;rQVEW}RjRR|t5B7K&9bNq8fdyl9>Rg*E>Y%ZDg z6OJO4b!z6cJk1Dzz-GIYo7DX3<+$ms$H?0%xBe#NDj;1a-l)$jXlVWxf9v-8@J-js zc%@$)xk7_|(R_0ZAEeL}QjxsmPMjy(7%UR|gmqLap9xYNywoC^wIftA@0YE+nNLJp zaM;$TeQL%I?K9z*I__LNuK)>UZ-8H+Breap#osm}6hH9>+;>U;`e5FvKqL8d51AcI zo)KDUF`wXa-d?8MB+mX;;aXKuipj|I!?$iH({%!hXew%*?B0TwkFOM=_$I?n%?2`- zb9oNCWYMVu_>|Q&>_az74iPrQX0lpLQ98?S5MELBp(Ar$b;PVWrw1oTUsoU3Su#?j zu_YGl41S464LIQW~T?Bm|_pMY=&6>5v>sI;6Y1k&td_7^EAdo00CWp}(#2p6?gm_5IE{ z|IPJWGqd;Fd#xw#`+nBS6d;8=FxL(SeLMwaqk`OMR@1KQm3Yp;IFLi@cz+I&Y%}!A ztvLgQ1p!Ll4jEudpu@oUOv7}|kx%>oof2Qjjt4Os6uP*053~a{Tlyq8=wm;%fwvWi zn3Kx2N%y&!bNE2(OyKtWt6*2M`YUwziyPg!)4wJ4Y{gH5Z%~^PzAXy&R?2 zBN03-Yj_8AYZm!FUdwM5hx7j#LI^s^L}6U3mM z{W1+yq5*%$frMi;y2#qMpWnYJULJg(nI1NN@$s$Hstc^1(5Rxz<)S&6%@VWmzE~%(z!{nJYKkCez#uXk+8i&L*F)OxGgdD9p%qTGy zZs6qS3vI+j=*QPDzUk9FIt!9)jJu@w!d28@f~a2P_#Bz52I2FkvLmpGo(z`iFy{=m_&wxnlM z1LZW!KDhcs?jfa_Xr3Ue#T_G&QEueO5qly+J%4Q8^*E1JFkYIry5N^z*3(q-(@ZNt zws!aWvY|d?aasUUD&0~?4>q7W3M2MVBb2;j@QzQCuRXXnRn4q*b|YP_DEy4G$>eN1dnSMB zfwzyjAh&wGH-Qi{fSox?EoHr4WU>M?nN(?MiQ`>TD6YrU=^4$$wkc~oPKIB`2H73i zifej&RWOLc?G~YLBg;*$JiU=nlXo~oU9k91X#0D{U~1|74M{iZ)OW;i@US8ixtiya z4&P#V+&Ljv-^g^YRH#AwD#=Pq19*2|y?I9+gmoMIl7`N5;Ra21C_k}A z>Fp=g;<={%JO|k3I>}aTx;EOTABK}K(=9$@F!mb z1~X?kv`BE1t@IA6J55|742u7HibQ2|$o)KB1QWvP1^RA<7A2h6Hh$NOoWXJdo?TvC zPrRP(nADKng_r0b!xstdH;Q3!nMDaV`83(fqgyPh$7D8H>IwvXrVWT$%#Afhz8fB^ zJrPnCLRa(WqM=kw_8m>4>qY_{RoaLIx}pm zOGXMfK_j2WD0^EUnN9hz`>D?K^n;_wel{aG_RkqmQn=68jft_y{&p76M6%N`(9I;c zkb-R`o(vLL4WKSAX4{)%mPwx1p9mKb5J)5zzpoSynOw@oo0`Si=lR?3>8)_MdjJk{MFV_*K*h-P7W4IpPr*)9NfCq+pAdw#Bz6jtql!%JgzL z-lo+FK=OvNEKX5L#p1L@Tp4L^qV(I5R$zDtxjkvIE}Ve_58I`_{&2UV0?6zX6S$X= zL~CdJXYqu2xJfq9h$!P7m_05{Vm*+T6!oxP)ASrln_dtm*HnGXC~7~)+urYXKbNqY3TYVQ0=Tz_Mr$Qe=zuvVLTdV;(${oMR`KYa2NLq;0jr>l) z+7LV3-E_*X2@BqX(hy1`Q{-2AMKD3sBCSb&{?ZV?C3n)hsX*iM$6O*EKgGLim_y34 z%hQDW4`r@EYKrUk1|evk-zxK97@a>D{+YFnO6*YQ;Msv!e9X=r(G*+1oAcj^jIlqa2|cGyU$>7( zgNZ}uf@7MGB)%6N^a_|Kt(NSk&6Z^99At{-Q3yARw_HF5Uv_iR-455`4wiXe@8#ic zH=p)3f65*a32Y8xa>xoH>uRb{Ey)BOBxMYVaV+3k5X>k$k#H?CT0-utVz|GnM5>=be^(#2&2r0sWoexve6)oDJyAXdqQt}`eL z?O7U|dTY2zo(*r;#;>BT2vtSL<9{qf(Lp`1il-Y+lPCrZ85@2bigK+b@R8SganLpr zDteBLdHLg0!wXyjqndrGMO-%uGl2GQ0X^w(%&m1F=1(MGzFyANgnj%tHI zI9lvXxj_Pi!OdN#tya6#!)#ZQ3DSe*&}J@>G=#(Eg=d}hTJ7zWRVh(tH9olE15Wip zm9+rLK^$By2RmEQ{hGq{F9D5L%EY4S5;@1eqk=6EsC93QeBVd~4}N>Aj0url|NI@!!-UbzHnj#m?V+%MA}gNh<%yfJ;j9Z< ztI)}q50o3&_-;_@l|m2Zt?u;8-7l) zi1B0?gK;Z>PUnhJq#t>~ln%;YmdfThbuS&lYq(G$%*y`AMDzP-c&oO$F#pas@jaWA za#UVvgEib{3yzQXSJk=M|4_C{xAD|yNH`i&4TxHBCZcV1H@3qxXj{ZiOXVkCB?pH_ zkc~I1x*DA!5Z?+xLmdnhYM?7_k$L;Sf~pj1X50KDEFH=Qn9^u}7D|~TY-MbN>%u^m z@++*EBU3PyR5r3k(+L-(czp!7QUGQUVIqIP@{sKV{dUdqY0PR|k(DK~TNe^{UKP1* z5)=Mrh-_y;Iy}?Jh0O*=Y{vpjz&ybazH}#PWrYW+-p>n3|E|EZE)bQl!swpDff%Qp z=(=S>!>3=|cj#i1OK)vt(dr&lyqQL|d$cs_~ zIGq1W(VRRegu9%xrR^>&>b2`(!2{hOuTL)eS6VLQ}?;RO-)bc_OEpEVb$bX3!m9G%6h~{t2XB?r^SXBUG-bA1HAP zE2u%Ey2{_5Q3*h(tT=QvRetoy1wiE#j}H_?ubqn=ja0-Z9ppS0Wz!#&ht&W;2GQA} zEP^l)H&mpuZ)Byhds^2ZNSAj|Cyj`DBQqChMvvAr@R|`D3`keVXt+n4v<*QDj~n`spLyy*C2r zS6bZ9fI6MLJB4BDhp!k0OuvleQgr{uFN92jk{mrhpJF)YmfOKGJ=(S6J^c@naQ0x? zE&A>c%PF+Eh09nV=Z0v9FH_#61E>CW8Z^ODt%|P=tk2K@VkE719Gy;RSaKPc4_e9@ z4b^<0Wy-KPyxt7coV?i%6=D*HXN|`cyggEJ5tyKwa1DqtFm&06i!95~oM5*KyUhoi9xQ^`s1K{$rf)#QMDyat)g~Th ztJ>p3SRoc=bDnyEWo(lFz?j6>3NSv$h{0^>Z)b#Hd zNzn=cDSLBniLB)$cG<`>Y)LeOg^Cp@QS?9Criiwnv)g2zA=hAs+NEQbisTpxl z9ceayY1Ni?kY#p8CWvcL9{3BD8~gP*;{CXw(_2kS+lnExw5BiQRaISXmOQZ!#H#HW z?{90>F)to&TCr*lh+&%6_bV|X1gsafbMUAEs2K2AKZg;5YjV?I-#1V`8FCQ;EJY$n zft%^K;m5t$pGab|aO^-rr{^`gLoXgpf9$4@d~(+NYbgaftr%!(NiDJ1sd1Lals-!H z8ARf`0k=zp4I`V{Gme;cup!kdycRPtyk1z z2rFh!!#3y5Ns{d>ZI#NJf62-&F{f9UEB}?k*q*y8s*vHix*TFNn7b!N`Nd~c`^DSa zV!N^1%B?I6`6-Z( zQ$4G^yJb*rqsx&5bxD1tIPIT%FZ6TQ`F-eFCIc$A#n{ZCVna#td6#UCXMS}eam6!B z8)CK(K8FmuObW3oS}2Dkw8+%HI6bUp`iMnotVOAKovRXBmov?6UOQb@?pQwMynI#$ z#tI8{P@0}UZ;}kbQRw;V{-fORenMiDB+jhhw!lotKD~jzhi}1mhp+L0Qe?99b z%BX`2GyjB=7}7mm_FVS&WmD|1bpKohxDSQjm(8@p(0#g(@1now(B*f}BOJew2?7qn zv)vN{o=D&X;uhkgjEiM+DQ0VYb*zG`Z#5T3yfSJZ9}Q&P7}B>dtC`%le9>!~Mgjl5 zUs-T)%P?fv^mk|kzc0%1^%d5?`4Ak;q29?sDk>I9pH7p=E3L+#wqg=l4&1NhAO?o-@NcC0>OX#&T0N2-19+s*e)Y$;S;YdzKeb}r6mo@(l7@?15% zj{A>&#aoJ8SFJLO6B{+aLA>GuSaNyAG7NY2T=zS8-m^4j{jrKI#HAq1oO2gAy53P0 zU3$vxkOIx~^%i(3Wc=z^L)oU4Uii>|SQYRhaj_-e+^^cEF@6g#tR_D#% zb+0c0JkUx?4+E{I%5??_36{O0y7(xw5jqO%L|SY7E~TkwT8H+8oYR<+SW zoBzOm%`^9VqOy{IAiZ1vr}wAOLH~{J_vnQyen&H1TxAyWzwh%IALi5Gg(xKiuU}n^ zlDrobisI=^1($F3(eNog?u$?6{AR{nrY>Kd95~(->?@DlnRM4@)o8?+lDYN27q`n8 z%!l0{Uth!HiRwmE|BZYKRi~}5u26NukyUUg+ViHBNg&JWvZoauW`;Obc=z#QLSC|I zx+%6-`%mNB)gS3EUFp@FH-BxJTIjA{kT9yJ-~WSlJH2>|{It{-v7fnT5(6ts{byJA z)BJP-27}uC6*urt?t>2FM((3a4gUC}@{RBAz9E4zxUZn1+eqovrmvkkYmpn5&-_tX z;|jjNs5MD7F1^yOS+;;6;Z##nOflLrv{(A=y;6|&F12wg{)b{Vb7nU(ckX8!kJ=)7 z>V*qzq)U;qvhzrbw)i0)o7DVXxCT|7uoe@#;*V2avNQa);qsyv9xz-FG4G~skL>St zcs%bm*Xlg5LcfkfwZd<)eu5MVe$8RI!MXzmKF(VoJGNj0$Or;BY#D8qW20)eLEM_0*@z;!V!-=X#zly%k z%8DB#Lum@A_2B|pa>`oxk@hbHfu;0Z=+~B&TG1I@8En8n&^8T4GP`VGEtGS8m2TQo z>kDMDH)V}J_mAgh%=v&ODjsRHg5~1^VYsEmXH|Bjii^j3{b_Hb5ZC~$8w>oZ7JWc= zJ6)?)jNyNq<=zr*E%d;d$_flvu&kwWqDE4^CaY8an)>93c<4oT(_qM5ur&587 zDzMV<+6#M>gA1I!q(hBh_RLbOuprW;hH^Sz0^CJmo0k`4u0fdwC!G=bX!#meQy8^Y z1mw!$doq$AlL8FA7#v!7gX^o1BW}2RWj=53ZG@+CM0JBr{u6FEko)Dr5(!buu-~S% zIa;BZI;!P#uL1egU^hJEy&zeFEqiqCHNkKS(9J=euA^OL@qS6GWt?Ot`U64V&Fl*I zN1lc02lPTdh|<1n{3emfUW}o%Gz9H&E?|#JlFf8QA6h2Up;wH4MTYK=&w8j z5ATRSzr-ew>kRRHAAkjSdTCa<7ms7j*bo)@s|*j4Ca_NRh&3+5P-CZv(Q3^3Y|dgj zgLOrj=>p!7Qr`;iM8%UK#g6l^z9|fLe?CcKWONFTC=a<8V<-fPvd<-SDs3S7?uPwc zo+o*?)?aLuJDGP;h%sP2@wSsX%c5+x{HHw?;A6j{`uX{0?~F0H<=LS*`icJh6SS64 zej?#M)fI>gt4_4R+WlxXw ze$TV}JWvQu$yzIMc-Jn$DAA0M4d&8Gg z26b8iy!6{1Gc_2cWomiSAz>B5uFwD<+SgSp`g*Hbh#kEe?ck3ouO8mar;p_ed?n}U zjhHPEMQlhN4ce`N*3!DqS}<|}?9CCaEZV!~g6J=}IU(oFvGoq{w{ZSvpX}ha-enmm zWg}aZ&~f!C@)Gj2f|!Z|$(FV7f@M@j>&@WK4tjeFUxt}hou5A3NyXMBu99N4hx@o) zdM36vvapmQUwv|VM-zh99qwhr8*{%mHqE^{r6+H;>f4B{{~3MI3`$l3j~jq`@!w@9 zgRH4?S2`G9JNg;oH3#G$ehI}v^Jo@tO2w+ft;wM$;3_0HuLk zi@{nWTthJ|xnFG?xbBF4%)|Nv4i{52~a=Lz=HR=c6s^13Q z-ffOO=+m{ab4h`lp zc-4DNWzH;<$=JE~;~`MB<&%dUEAQEJLjBj^fLGpftB-Ec$3xtAM8!oG$HK2e?v~b# z{wN0ysi6UcPl2gk>PMzokbpIWnwmxDU%(vwH(-wFZ!7v_P)FbXysGW+;cw)N4mGB|E9JC zFCH&I2@|r*$@0k##(Qp0qZo|#O1w5wmAl9 zBOrOO+7tbtR%-ZbU{3Pra@dH={ns^wkqsh^cA&qsp&x5R$ToIfpmDFu(ykn+>`EOH zI~&c6T9lB?)4ZK7WQl`HxyJ+u8i@x_73rb|-eE6<@sKug&}IP6Bh_%#d1(2=98DPf=B*JL39V+y@~GV4P0jIu5Suy0d@~~ zop)Fui^&n$0+r@|rhNIcI}X@Y0wV)YDq1yh2~ZMn#z!}CB8gcsIKbfmuos<2rX@q8 zInIyBRd%k#S@=>fB&w5xIFIkBtmy=@lRUI8w&xl+Loa`X87eQ2kQInHvDFOhgZx6^ z3m&Ey&*a|lr8vG1i}MR_a>J5;i7m2X&=pB)l~DF+)v<}-bDLyr0Sc#H&89N?Z=!o# zsYR6Od*7$H{Zz5M)0Gx(uH-M&?ftwjidXTxe+qkG^};cx$`MFY_f$a*{4~G6N%=|J zrB%~3H;T#&#Jz+4BKOjS$<4a}_U!86C_s?h1_T|>4Qux*;|8XM z{nS~Nq3*NS$e2$E=z^B!A&J>v7P;B|C$8>O`Lp=;DFtgz?{awx0f!>LV*({=2hx*a zStQ#z1k}T(vy}W}YF~#ycI2F8*H%Yo!#m%H zE$2@PJd?QHp3&>Q$Y9ES%#xM8(YoogAZKqSK0zrjJIOJ%rGDY9y+FI3u!cY1B20kV zqj+-YMX;x=1&$V5$xMvwl+gXqd}R77$2(sEAiO^`DK3F{`<46{XJjbmQmx|cs@~6h ze+5By)r(8s8`d5z=0491MD`r)E`Awe16J7kY{j6zmikUyCMWZEgech@W8p8Bv>fbc`*7N1_}5C{aA8xkdD&`n3Vh31cfB!OiO9d-gDbK~8Ch*<^^u zW>tUr40o(9a>w8Rn)Qm*B>Wj&u{s8)CxwG}lO3-oUvvBf!EH?~Ly6glM-3(f`LRAJ zKb3XJ!gQk7fEGzNO)5FT)W!0o%=aT9E3>2tr@)y;?Fv;sqf0-cD{CY)W;jJT*&VEk zb*+P!n|_<)n8bx-y_syX@=73%w&I&5vT^=VKG{#@cN2?e2kA_MS$L7kVG*QJid<-3%O%z93^b z!tCI|aIhI}Y`xS|?{%iZ(>^KfQDgWzfy(;MQOl{C`1ZvqUu1^8UWtHy3DoH|K$DEH z@z_xtD5n5NOLHb&5p`f#VpL6eHPk}I9n?(yi;N!RZq?q*0+6uO-AHIj#Hx1d2kKhC zdxyr{dkih>IECre1uEwku)Q_2pId+(wkebO=)ZuCC7ufZvoL%+r!$oON`R~8?ib9m$RU(j_UBP@VM zJREeA!p0epfjKhdx%?m+WNF1S)tjT(N*pzmo{<=Gwy@LiFyPlzwpLWCF;@;%yDi6^ zDwh3#lu>kDuOA+#Z2~qC>g^sDJ+>-{N;_d{*P+wy&lbA3PXP`4`Y`nh&9^sJ0phH# z9%LL(!4j@lY$BM&=_Nd;{iu`qFDbGj0R8Q&PjzRFVN|~ON^MCYP93s10WLopji?S{ zFd$T5&o%M8b&E*?Mv*h4L4LG84WfY_s4I2&oBgd>xb9V7-U9>bVnw+sT{t(0tvDlNp11c zv`*-ty>Lzk2iB4(u>Z#ewmx@T>i)P?v8Kw<-{|jr^0jIAfR@MLDA|d2RH9~z90028 zR90uLr$G$%hf?B_dSdw7SZ*iOPRi<3rzxoAy^BogIZeSE$gg*JzY=>-J~_~%50r;7;V~0yHo7FEzk!^+=^mKSwm4ifjlSG z-fUA9%l-|ATZKDCoNUmXQJz#+K%0 zP=fFg`A@#?`bUkB#g9P-V!6;uJiG_C5+ z^>B@@}}bB>T-SaNu>|uMt%CQ7aKHlm9@Tz74Io8zG~SiS~%c{SB`fNow#S_YlK?CYqL`B`h%J+-^9`HqX}P;P+ofrXiz8c)*3E-+ouvg1<$sd z)%tXeo=Ujxd`JV(>aDSx`la-KjsCmUltu~{3l3;hn^e<<`N2Hxs#79x6Gyb&-(|fsJ zeRJFtT9#JcjXYC(^rRgml$m!5${qb%x)IMJkv^4fHd#;J&{KK!<-cM2Pw7VfvIG9# zF#RrDJp?p)m$1vhWb{{5;8(yjA|s!T{5dd{-$KwOr9{(}9WTQUk0|_X+>@5HZt`o~ zd$zK9T$5cK9i6<#+}z8x>+LI3!(tynX(l4GZ!G#NZFRfXaKkAe${nMoAGKvnDxUg6 z-z-PC{lQTd8x!Z(5-(McXdLcIyBDKxDfAkm9%>{~W#p#K%JO!Z=menVvHx*w~TRJ7i*3}eskwPCRHICnL zi=e*Fvl+;fJ#mU4uaxq*Qg2hl1bNav?PZ$JdvJQC4x8^} zzC^q0RUi}epbZVQu)j2}JcDPval?P@EW;A(Tm;Hwek> z5&2jQ-B=(mi%_KklNeQ-A4T3|Ct=U&uJf=&`T-PV*bXdEAPOOq*dQGkr+Hyx`ab2z zeH0MWn2Fuz<2{;{-Hd#G1uC(RjT=e-<6g zF?;v8i#&ouGiPVvhr~}%u=3|p@`&iZwoLoSJt=PneqA119q~KOv&~uYX$bp_AlSp| zQuf3$*P9>%+_11UEPiV4KGUR9fg%PgPx`FH2kzPtC#$nTT{-!iXOlwPg$`;MJl>qS z-rE`;xs(qP8*kHWK+!Nn{{xEwTQ82;pu6Cka;|MJ4|hRiC>( zpEjWpaJ#oUa`XL@EgUq%(bzmWdwtv|P4?T$0Hvqp&`b@$qRry8|9*!IVUdcgi>nIn z&zh>F0Z7&*98ZAQo}ak17Qys;N<5lS{$|8W*3Zd^p5XZgMgU%JVAL_J{2Mm_=7|pY zc?c}U-&ph0=nq9(Vl^|B)}W=`d(q@(v$)Oj6+QCO{<-IkupW)X4G-VSI_=&@4fX^U zOjD$=dIoWwi`D-H1EQ}!o9JIpKQ-gO?F1=X&tx-@^4~k!q=0G2#A01B=c4?HZ5C9f z0%TL#p0C!P{6`b+Z;rXb1p)MAaO3>VG4DeWkN$GZ6@LamZ?$J(QN%F~QD=D-ci;+> zz7grtz zcK=x#plC~?4AY+?^A!c~_71VpRwAAZqrWNIOk$yx)<1?T06PZcK>^k~nX8lt=P=Jj zZ;(#PXu71Jv-b#&-E#(e3tM}E@WUzYxhw}mb5LV&-fsmW6H4jS&DLea}&1IiKq7S&m6pO@vvR4j^x}o4=Jn* zSytEI^zIzm7}b{mG{r1-T>#XyKA#F1Lj8MkQ8NQT!6&LePtEp!^Jc_ur#v*cVw`h= zoIn+FX3Q;w3Kv!U1nX;d3+E{1#Em)$9UHLCcJd1nZB7q`%fCBJ5-jo0EnqyGu1eEd z**3mD*5mDxj^;nULR)Apms~j=AC0bffa3x!Fkw-aAxx(IsM73aoG+p7Cih)0YC3tKth#?QdN;H^PsEuc({Gkb_XK_UDg8RPdfqDUF@bAZbD{q% zKwY+>&?A}Oh(Za>Sfjh^*u5_l-FxDobq+9>EP(~Ny~p~^{i@=jk;H~;E372xgrlot ziMY3)=bt;7pZ2{egHy*A!RpXNFW#j}>+0IcSde51Jl(weXR&NrZfR7L%6ba(TADqs zwCz)Eom(h$+Lk*oY@yZmF-rCPb5VZO7CO=Vpheu~3}H8yqt4^5r)--Sc6ZyNc+YYz zKXS8!U3jF#+hX^nOD4-DG@!s_i|1PFU0l?2!v5Q^V0Plp8e7zPv%1P4;Z7YjVed^L zL2Kjg)z%05&ZC(={NoAPo38rimmv*M5`d3c5b$S|y?FEdqn*?2%RWFIb)gjguR2Qi zw>qkImAvI&HgFEcEeT59y1yJR7gG~T2AuwEHt>@d)oiR9!PjON2p5)Ef&)ILmYki||XOE;)RN&tlrTJm64Bsy?qAU*{i8%yZ)B=Pu z`!9$Y5&jD|)T8PEuL8>!Dr-Tp>tF=VVbWy^2RZk5ouQ%$F0R7Y*hV$bZ$R78=ebwc0X2ee z|2e&^J|AQi7dSxc7)BiML#yyR}48qwiG;JAY-9 zeR5+DBe7fiORiCwhf?vU_DS8wgFKBi1xfx3O`yjOBo_}V>2JAyZFBfGvaI-P)WDX5 zyn^YQM>QClyVk1Qkvtz${-{l}=nJB*tX|11_gd#kEDUj}umnbB=HC25wCR(e*i)D7 z+;)_ilbV1n_q=1Bf*6nMpLd%t-?|81RB&gn&2QorxAk{_PzmddcZ35Ih^eTyHr=0% z6|u3HfBwabS+G;0_%__4R9-`7X(eI1zCft}R&(}Ed_@msQoX}yQhJe>fX}=)&V;^W zkHH82w_e>kLa|bw5j65qW!*+6Rz!5)c*&ESTocaGX6)|IT#B9cdyUV9IeB2GN|es& zZo`Y~)s)@KiQ?CGlI~D!{Djs{@7Qm=s?la1e%hA5FxB~SyliDrJ(9e&(CffIG71vm znM)Gv;kTIXa^ScHWEf00U>Dy9B}VL}$mt|brnq59qOAxBCW?h2P8ur_!n>@WO?HNt zwUu75NZUzo{D%G;N&pgYxXx)GeOu%p8R@r?WXbgx_RNW2l}NW-icmdU)0JvAt6XL^ zIS&QJVy3^e+cA%gieYVN{Z}FjQeC|F7AJe!Lt@1BMZ+!gmh%L{?X@K)!0qgfh?p#2 zJ)CMov3$JqLj@D_J6ZtS{NcuO@FXl~q!gYM=YOpv_XlPQx^faE zh@i_HS4hrE6~p|Wxti{7*4|=J^2%+6)SVt0W+r}6mMDiR3Q3{P&id=Nn0wNE6+Apq zk4hpVPrVN#*#95W;97=Ux)4y)yd1I?kqD{O7V|?wF|Mf!ZldpLNK7&+jp9WDu8nqG z+xH&Ff3*PF%(eU1YV~JaI?G#O3xxFB^h`aKu7Wdg-%`4{Ce+y)?h=@6r08R2^0IG@ z2;}>Pa)`_^n!_<@j-e4WT)X_XA2^cS*>7_{N{?kE6H-r zqhNg%1NECxg;L6HxV8ns$Q;nZ$AURpuf9q}-)nr@U6jB*zjITJYIu!Ix_ zo>A`-FWJ(KP@QB`o{WZf!(&Ardh*VjM*z{ge{qBOAv*)v4%^)C-=!IY(ZZnwk}uE zmRH`P&Jq-iTLC29ugCW=F}jMW4&m{>UxA?A>CjA1@;(6S6x5EMwB!KjfSR}Z0@`)o zWz&zKYL5ZZ*)qXUyC*PmDGb1pn$-FIxtvt(;{}P=0QC4rhTG%!e$V1$cAQ8@{jspMz=` zcEhAJ(}HFk#`u$K{YG!aVqYn@-wb#AGo(gNWGeI%U<{5&C$?rwqXBiWD(#+;2Lsa* z6N>3}{!6%_P*Wcsq`uhpxIYcjeAffB=I{hCh*#?)`JVxFeEJ{R+SGak0rd1{7N**t4(q(_Gx+&T$ z_}4hntB|NNz1P37=DGKqXlT*r8Zp1!rU{XL#0j?>z=s>EHnzkULj6{4&*-OnkuQE@ zbBYhg|JGAI%pd_*-BW?t7F?tHO>+TdZayo}k3~lo?b~Az{jas42Iaa?5${y%k$AR) zl=l46Ib;vM=bgj*wLR|B--l$`{zFgjob#WaVA<1qts0?R<%YZcW^M*~2_BR6VXKxs zQhxu#eUErh>5s;u`J$=&+l)Q`x%Jb;GY*rSv@GE)q5I&4gsq0}Rk2>)@?Rkp{M!y; zkOI!V5*v!6_h_vVF7>+J5pemZfds)IE&5I6vOi?bY+LXjiNW~d+RyaY)QGBxYs{8C zwXjw??k}^p2xO`_<71i*Y2_V^LOAN0oOAoN6EfJ3e31LaX_vcup`C&}GFtKecd(lj zCe=1<%v-exclq~*0tGm$+IoXvVxFiCtVM=fr!CG)l<)fs+MyuM9w}Fi;hti;*6bN}NktpKRS&>G44R5Xzo1_IS#umDZ} zL?gz-V2o79O0xEX&A%Ev#5?)T!o(>s!1Z{p~Q66dG(mNAkVJ^!Eo)+fNvrh?%}x{6g3qc}Zy;9X_$MFqfY` zEkD;^x0<%{rz5yW4pyqEzEcsWg)@$sez@{umF1`loRwQ`RcV1(Vbi7L+v1`Wpnq6~ z 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 MvZhkmQ}fXO0#T`n!2kdN diff --git a/docs/assets/global_search_modal.png b/docs/assets/global_search_modal.png index f700d8405d9c65aa8ccca9e4d61db3dd05287dfe..e4ce15a13edef9e658c3ac8ea2ee02d408cc3f9c 100644 GIT binary patch literal 33186 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 literal 33318 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

    Q*Zh=G_i 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%0A%1|dF91e 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≫k8uXbPvPZL0z9j?w6SgrekhzK^=|kP1*#PM5 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≠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

    JOoV>+J%ynM70q>M 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

  1. 24 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 +$ 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 V{ix@=?$axs)6+J3gw}c*`JdLh@#Fvi literal 45017 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 z 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 O381ZRfUHz~5cVIXx&}}H literal 85827 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ņ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 - - + \ No newline at end of file diff --git a/src/assets/arrow-down-tray.svg b/src/assets/arrow-down-tray.svg index f7dd8cef8..4dae6037b 100644 --- a/src/assets/arrow-down-tray.svg +++ b/src/assets/arrow-down-tray.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/assets/book-open.svg b/src/assets/book-open.svg index 2890eff5d..e70281ce9 100644 --- a/src/assets/book-open.svg +++ b/src/assets/book-open.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/assets/cog-6-tooth.svg b/src/assets/cog-6-tooth.svg index 9e824c249..b6703873e 100644 --- a/src/assets/cog-6-tooth.svg +++ b/src/assets/cog-6-tooth.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/src/assets/cube.svg b/src/assets/cube.svg index faf2fa101..983eb95fc 100644 --- a/src/assets/cube.svg +++ b/src/assets/cube.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/assets/document-arrow-up.svg b/src/assets/document-arrow-up.svg index 0a0135fb0..351ef6e5b 100644 --- a/src/assets/document-arrow-up.svg +++ b/src/assets/document-arrow-up.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/assets/lifebuoy.svg b/src/assets/lifebuoy.svg index 6323c6f51..3eb8581e5 100644 --- a/src/assets/lifebuoy.svg +++ b/src/assets/lifebuoy.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/src/assets/light-bulb.svg b/src/assets/light-bulb.svg index 8428c6ba5..91ade84db 100644 --- a/src/assets/light-bulb.svg +++ b/src/assets/light-bulb.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/static/en/img/config-repositories.png b/static/en/img/config-repositories.png index 24f6ffb68d8972c1320302b1934c1056e8c2486a..defd4458d784d08eea28f552a4bc0c856780af0f 100644 GIT binary patch literal 57515 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≫92D=-epB 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 literal 51690 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

    )_fxZ`dj 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 literal 57324 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%0DF~2CAIeOP{NwgCa)qN3OSd;5O5Q) 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 UhV=d$U7$epboFyt=akR{00>GgV*mgE literal 42374 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 diff --git a/static/img/flarum-banner.png b/static/img/flarum-banner.png index c42e8ba853c1aa437a59a7d7b9288d1ed7afb14a..ec2fd48a75cee88a9bc63f9cb971bdd923e5c2f1 100644 GIT binary patch literal 45496 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

      Cbq|N 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ΠSCqR#aFPyKL=AtL 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 A1ONa4

    EGCLmICFbtB5UEj!o>JDC%#h6Z$_puGW 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 diff --git a/docs/assets/install-extension.png b/docs/assets/install-extension.png index 08000b9ed6511c857dbfb202118a3e380e33f45e..71c7a7388d67e0da94dc0211ed273a9c1e9038ac 100644 GIT binary patch literal 39422 zcmcfobyOTd_bv(#P9Qi539bQx1rl6?OK=Sy2<{GpyF>8ckO?jW!EMmsu0aR)!DWD9 zxSVgj@A;i?t^4P_cXh9}U0u7nyK48dpS>$uO+^k5ha3k00N^ReOKSiC=u6MX71*fH zTk(IEw$D3stIx`x0f5>>T*Nnw=W|+fc@1R%0Qe372nquL?w>CO?E?TF9{_+uQvg8d zCjda^oYSf<@+`nKQ<9SgJpHewpra(^xghz(($8JJ<~w$8}A5(e4mcaTOX5a zW1rMuX6(rnWxhrG~~ z5#_%pFME5`Bfh=)&l(Q;-=+RP5#Y+b{l8cK|B~Q!0?+?E;Qy)P|2e@=6WWsuX4X`A z^%hV}Mr0QQMf0#NVao?#o{-`F+WX^w_18FGJ<9nt>1GOxxBaP-!zWP57fSM6>6yc= zJ2Eil6Lf`}%b6X2`#;Nz_GKjO-00&GMx&!gN1ooeK)KoK#1Xe9;<_cb=QI@!E_L6H#(fP+&mkcV2$5(cM&2XB)k0;4Z(oyBR_v z4)61S^<3h5*Yiu z;*F!N=9@C+b=#UdS6u+tq8;tEkj7T(?979fKnJs_@$s~}43kbF=v=?pqc07)_VnSz zc@w$s$5p6QC>oX-k1y!Ieb6UyZDE6b$;RHu`vm$l5_rw^be-SP*fNiZ z4b=4A+FU$+YI}Ml=tOpm6e%v4PaJg6!*bcg{SWOrpRh~$QG+(}?TM`bGyM zOk{@Vx>}~70OM7p1{q=EeZo}b?6Bt`iOkm*HuS$B=5Nz2maA0(k~y?&<&4ghsHykW zQy-}ou5V_rX?HOcl9)bk69P!pCZ^-FU!W6yQ_(_8{_zDr4~SqZns4_!-WVFnalH&! zjIhyfJbD0hxEOGw&oWof%{VOFK0fAu{<+2UHA#lre9&0-zoU0!|6!oYX~*O#1^R?c zo0F_s;$x>TAF9oi>%7>R$QKeK#iL)~z1f9a&xzk1>?l!Gai&SOBxOz@AD`|Sw*Hp| zp0IXA4ndzD#Md!wE+)6~AB3MyO~mUSuJ|E0y;fYDdlcz-vxAf8kpb6i`99l|(U5!& z>gy`wogL^C0aWHCx2vbCs4q74}&~y zZjKCzNQ68Mr{$)zT45&o!)s0ME}T~KaRl7J$a5P1%WSZb+((+HeB{n)UYrbH9&pzn z@Cuw)es=rx78pN{LeF6AkK$5PL)Gw{5L2D@dar386gR$}69QK)vw zFckeDjx2)0_seR_-gp52wm3Z^^Ye|`Yqf1W-A72~MhidYBZv2>#a)2xqeNtH*uZ{U z*{WiJ$YIYqxjA{@W)c+H8Ms?m_-}2+E)W?Bh0r_7CPt(@qLH7E$|851kOzq-em$e|3GcT_a zwGn;~Xj6`5p-$PXNPLj$05wJDM_P~8vFXjb3@*-8JXE5fAf4f~VdL)Ir`o5o2O5fE zS@ZMEz{^hm%bjovi;;`M$x5SYQiE3L;~JqJlj)FV<^k9mJVO` zoUEqJZiZ7TPSLTmKxz0%On)WJEh8U!`LuP!HU7#M-7Ubp!N?)q>qz<@D?gW#T>OKF z_rhK#t2%d#al&@JcT*IThvEV601p5he=0chc%Yx{(%D1DgbiNv1}@!svdt8jz*-Sl`txMW~GH|Z(QMmDz7)wY03uM!0S;3~~L zP<>isU{HL=`{BbI%<$NWfTtEWwqJaYeIzB!n5GT~%z^hk7r0hj$_X@?gVG`(BRem4 zi+!nq@f;EA_l8d!`MIkd?lw19eg4cUaScsiW4%=t{aP#)k+b~)D^wLM0vg5Jvh`}J zU)Ci_odGvk;(q70L^SY8&_Kz%R7=<)F0{@0q$Qt{>O@tA+ReYt$ga`-+u=Wk+gxfA zMA|~~ zyZvJjMFmGTxtAm|@w#N%Kl(=>X!X%KH3JkW_LylR>}M&xN`NPtb4cTrq+{oq? z>0PUD!)LIA2@sbOP(+aoaQE|L|BY!-^&0$3U%snU-GO(>V-I#3BXn^F%D-E2ia+MS zoHxm`)4K58(FaY{C}o(m7=98S@}~dzfscHLydyO(BetTgZEiSPiW#3O&L6Bba;nAu zc?fD`2Z%a$4JfHU2^;I+km@3d?C0s8&3%9h`BGG{EjXsyix3~t9MNFQ{FXGQN(mp{ zY$!S$i0tly|BD`goWcKwgH41VNNd7Yx`vp=&MOjWVq$Sx-#T2{dR|0B?;Eh_Q-~y% zM~ZOCjN8@0ZM}=qj@IseT?G5;>Pv&CC&$%}w_*WqXy56??k1%=ktUBPUH3{md;And zibeIh)ZXMG#B?&Vx085Z3ukV{OTIenJ{L<_7jTksN|0lBiHxmPna ze=MnDt5dCBZEpSJ0$uwe)cT|c!crAM{)IkB|1=J&16LYyz(^|^LeMZ5{fz!+=uSlc zexKQm403L$oU#dP1WaK|CA$g^OME2WKW2LPU;_bloG0T7Ns@c;o zXo(XVThm|&jrh^kw*4hKRqP@V<3 zS76Rw^I4aghE91xnL#TMRlcdDJ-PnAe??4{kTkGQ04pkLkgI zQh3W(H&xbFSMOc;hBb@#g6x+*roP((dfQMdF&9hPzL7W2E--U!ODKq28xZs};_JWV zIsX|fm9}Y?(_@d%eApk>0p26kDx?5Z00!+R;Mu>~q@mfWtNq`7U)<~GD1Yus;NH}JYvLa_bJgwp}SN_ou=0(mVF0;o~YgUt_tO%ABE zt4NpSv+}z!AefCx$m6iL^Wv_|{-NjOHlSuH0L&WH^h-n`{o`VN)cXjw2su@;v*?H7 z5Ntxth1%E3Oe9$aiTMIcx4nJ=K8tG#@wQm1epdlD=I2W*iat_m;b(;(Bc+nsKV!0rBi zhUF%4qzrXz-zi^gQKJJEV5fj3deL1+nreVd6AM284obv(|IA~UyLRg_R-x1((m(Y) zKGPd4;bAO~xBeGyQUi%%@WXJL0NAa`zYd|c8W$d6zddvt?q6Xk{_0+htzzPxb#A8L z87J9|vW<8}8Ggn{OE!hB3%jEFF^Jb_D*e}O4+qh_DQU^>yh(8adx!kKs8VdO(oYpi z*wHkJ46~Iu@x2Eo;+a$EFHrzLLzCIv2;Ua<93F@3F2D8l z03R(PCvwoaDJQ6X*PUIj&3x@(!y^-u(?C6d&N6m>>yx{mbCgto`{DM+G1~+u?AqE; z*ck!us?_O(p6_>$;(6addIXH90oc9A&sUbvC>A z?t$*u0or_i=qBDe55RirXBH0;b^~|1e!ID*d0Y=Cd8DD%WJt1p&)FiJwo?MRk5@$e zl{Ts73h+LIU@-?8ezkx7nydXrb6_7Ab%Hx*J2+A$k2)Uhk}7$>P1ffbaJSDUQyNQ- z0gb%;%$5_5e6OmHc8Q}$w=*?cG6M9C0!~z)>IHqZZRV?u7i(RvARrP3G{H6QMcje^ zjET`F)}ASqGT^x|6n;~!@ExT!Z?EU->?-phSdaGY+qXh~7m)7hl{Gh2|I1_5yW`nM z8suglnI*M=UvFM#f7RjJ8KO9v=&pPB{%7{*e&{ zE9IPl<`F>>dv&~txGsVC9w>B0Q@Vtc}he7LJhVa<(JJ7L2#0C0MY<@5A*RkFT81a+CLkbbRjqir>{$SWXe4AGbv? z7r(PCmcyE+^V?%Ic@uX{1>Dyad(^)xsiOe5H{Wc23?lnMOfLSoKR_cSI7btHZ!OX^H=@;HF;{5$bW-~3aSkUv@p?`F!HJ=c{w^{>3o=SE~3xu{9FTi@DT zxNto5og(?Qk-l6V-WCoOYvptbZv_N+ypOw_-+A69YY)CKqs>$FxQi-}dP9ppRH(<3 zh7%V0r_1FtuLm^aX(NyfadVsRb2oi#S!L#`$S(LPc__jH6|jyz8F(=`I;hB0ny3Qh zr`p-+8Z8_O&8AWkIqS+iAe`v1sA5(dpb-QWOKyzv=eK@n(k}gqjZufDNh0`4siUak zXgPLH{$xEe0G6WpD5xyz8MxDXvjBn$k zf`g?xAH)^U#VG<#b{2M8fRsBj`4a12Qdyu-CpQ4Sxa`14x1Xj)Q>MEYf4AAElRxfVDP`LsO% zhCtLxg_i_xzN{3lL;0|n6k;HCPdAmXMHA$){gb4Q@?Ac%g9$5Pq>Tbs{!aX z1wN;e%4`!xqv z`uVTd8a_~7ypcatF}0*GS(~=h0W3@j-+rd=0H1G=z$V(2R!C=5SU)jbKkU#X){^Nm zeezNs@uW;71kg%Sf(QRFM!!M933BpWijZO9s-RProSj*2-D#E}Z7`JxI)n9_mz}mY z+Wbs7dI&=WaPMM##giX&c`3zj6vD(o`Qt-ao<$~b;0mCF`dMa^&ck8k!$Oe3L@DYmZ4)U;4K#?CYanmKU?I(_8%KJNyqa>-{h~@s{F;*?$BP-}D5A|2Jh`!_WW!DgS>-&@+|Kpcrj;ly2oqswOGYR3V%oxBq}(3j^kDh2B2+J^>jZ=F3$H zFty>6Ba@DjJ)b;PznkqhyJ)3*EG`aE=E~CVZzAquKW#;yE{d62?3<9l^PesQktpBU zD&|V-s~TgqQQj0GfVl7|T$jAn>amlhkoSZ1kxot7V=4`W3+^Ub82G4g?-o5V2J6_&l`@|HkUHZsF;nxd z!z`$FXv~iF$zDJY9uRkXCH>-T%(lh2^b;-~$U%dZ)|E!jMw%7lj7%M_4qB}AisMT~ zLq)KuUy(Psw(Mo6&Y(#sVK>D8?d)>C~IAIUH?v5Z65o#6xlYpWr8G&3$eT%QK>k z&JPod)nuNW5O*Krw`1Y(AArC$aOR#~D;i4J%EQ0(U)AQbU=g=~`4{I|>FR;!UpUZ`@S&>z{v>*w=bam;_mb3c?D{!TevE7w4$4_kLFq4pX zIdbvjwS-}B)(*E_P2eTFbD|S4GTBWUZvp-D-2m%=Tk*x|0eD#0Z-Vjykfnw1!$r&A z3d1M0s2L>B9Qw7<0I%`{S@YvO0H!@+r)1)g*H)B~n0}534U}s~v%2L4<|;JOs}T`REWy``C|5 z25u6R!y~|i-dC$xIc@x9OB>8Z(4LWX5sQDqd^FWKi9SZ-9PbZ zFk^jK571bA@ZZ=4KUbig%n`+b@0qFL{f=r4LHm7+71)03%SqSvR__Dr%`n@gE`L^b z_W{)ZLm|>5O1`iF1H=GQ5nw7uy(0g+nmg?weEDy${|_-f2B|i($a^Wb{c;t`TNKEW z=PjRweJZXaaz;oK*ZX~&Ol`7&P?7p|LK`yZrTE~K6^m`*{$LcD0*;e#^ZCb`iX+_c zI^4Alt~Gup+H0)ur6P9YpO;}xnBJ%4Bi55@LNfBNLC|) zYhQN}Jf(CcF&GBP`3=EtN?{=;F$(3ghl1IZ zV_jD-)?&w$;Q#LZO#Llxl54;~-f(G^0rI(ne^}|$1<}-2A>qA@;g2wlk3E?v~#Xp0up{+eqB!S!q|arYc$R3?T&)>7>s>ZLC%(ss1LM zKFv)Wc(xg=ayTjsfpBQHQ7)CR&Xcn;-@N<9(ti38OW-B_2JNcDY+F$=e=_6_4Ope^ zkmD!ikl=oA|5-f-2ubzohWd{S5FE3wG?x#!> z1D*pRg7_4F4^;?SZ2jKdP%kOT`hveV6?mF{`h9S{lPg)sf#%VhjAY^G&aI(3f_9a81BB;3{@IpFz&G-lx8 z;}o*(p{ewgJpKY$X!Hyf(@|^t`kWcpd2cUrvp5(BT>a^Jm4pqb_6Mhi&>2&+(sGY1 z+d4qe`d9mfTIhngwhSir=^hhX+gh9-e@<>DpX#rU&1sa`9Z?s_|3E7YPWqy=^WCg5 zJN_D`|Mv_#-7ND;f-^@#*2S)kG#&*+n~zRvdncKBL0aVa5Ss;zWdFgAU95 z1=YX>%l2s99(AY71 zGTr?|Koe|)EFJHbv9+s(5`uTY~0q-_C#7ks?zr`GX)XO53yT>-N#p1 zF1y>KCedOs)JAXU$xDdvF30!Z+cs>%(PO*4e{oS!;4rM;HZF{Wx2}2m5x9nsE0#m- zzQXeC&_2g9F=I(`r|m`W>94L<4I3{{zhK7dU4+ca!%uwXN#Q^TpKkXf44G+6s|YMD zMg1|2TFA^NykQK`dGHrTlBAQ;Xupc(vg6nMS&bV+K^PpQDi+BM>cLV0U>z<}yEcyH z3ly56xLX-asmTLAouWo=`1+WI|2??gDOQRP$c`aA1t^&_@bH7}bFg$oo&rpP$`8O>c382UBIxgTtw{kJ$ zzYy&GX+X$UiI}K}|Lmz+m7J1bNf%6gEx6qfv$N{jw&F&`7_k*y3sIBacvPv=VX?;! zjpT8ambI+-y2kbz)qIAP&fN+RmVK=#YGR+(_VCumS)lt|*3G|4zt(>^y3qR%7YWtN z)jRZP0&Xsh`-th5D9Tp1vteHS>;8Mk4l{4kk#j>JEmhR?c)wyF;epQbQ6 z4~~i%!$q4}kAiU&_gQ5dy#cnxO6C{PUfo;Wmd2I|dqmL1p@QQOR z>9|~4#N0(~d9x{F=oP|@-=~FMIK`sVYRBOMeD`Ye#!8)df=}tlAe*D)=(Eba+0b@3 zvWu#sQgnS`wMDlbMrGm^oYR9P#*B~tV>_w8u?g6{%BE%#UM7Xuf0>Uf5jfG}KF@YS zG=n0KGR4YSI-?R^?;g`rdK&jZGz1N&Uh%j4-&P^jFIZ6uslq)p0^L~L`{ROamusGR z|M&o?abwOYa&X8?bbwmEqu;=Z;SHFeu+QZn>7i>)u!#a?>aEQu%%BZ$z6ZZbe-DMk}rT9G&zCJ>ZYkN7Qy+IFqcXswI zz>m;;*#x+@YJ8g|8uaPMLzDG6u$dLG&YDccPSqp$F;c4Q^uhXuWD@48CQ~HDw;1{Qa4jrU)Y|?OaN|V2_4onUW znR~C@nvEyo$wCt0*`&3~!51q!5o%cPWXjH@q*GC|uwTSnO#kzAKBj0%cC6k|k`NpL zYH_z`VZ{Xipp|JyzD1U0N3DSKU&+Ho_Zo%G&bqI@d)O@)L;ehO>y?95ndq;BwN09Z zp4|rpwVtVeea`HIpYb&ojvH*}<|Ipw04gtvrq2t%NJx3{K@EFv+WzJWRv5pq3)Z_p zMq}G(U;OPip5b8uqto|FMgM*`*!M{&{%%Zm*`4aW^|@Z43H#a@SK3waMl0#J&oRuX z@~1cM%V)Kvm{_v+uH?xDQ>A=-eC68NYAQI)DUW6HosA~Vx1PH5z>dRYM!Cp$#arHi z?>@S)gKAuQ6~Aj1BBO!;C|V}@Y~=dvSus1`X#_gPV2Xv`+(o09co#FM;-lXu9_xTK zSR6xs?7mId`6sVIe}1r069>2$)#<41FyMNNUXi6a)pm8W4~*f!jS zgmQ3MyqeyMbO?18hB~w7;*@wpZ89=0bAc1JFQk7FD;AgVC`$BU!>etyJTEBlmJ5E- z(!MK+Bcj6F!P` z)mqBvfqU2UW0*_e#H{ex-?`#R@fET(5Hb2JT7cDtELA_rxw}9&8X!n>(b(3kAfosl z6_vI_(WPYey%#0Lg(R(zSdM&Ydl-P0v&K&MH3z$9P`hQXtAD|F%z+tw(#$G-4_4^B zs02}o?5{<8*H5D;fJ)gGHAnkThES&3^Pwa-Rf>myoqpx^2&`O1q%TtQAj$m$(Rz|y z5)f&hwpBJjQev)2W@m1msU@Lywj9b6r-kQQDtn2tJpYEuLWfMjwMO(1$~Q`qd8nNRd2No3H>kl9*4DsM6LkK) z5W@U@BYod7ACHVmd=Nb9%=*kzDK^XF&pC;2mBdTbZT4|0;si<=5kSMy+B}|Di3B?t zOC;QUYY=>IfZ=?mWJW1by$j}Q&c^eG?u8Y6ZX9pP#trC@6QvnM6L=e3pj7VL$4Kk? zQ`|dlqUglfZ%3nJo2&EW_=GS!w3|r8Tly!tB;n+thtpAOn&zwt6R3RwbEMBRq8T6>#R zGB8~oY6xsF!~IDTy5atgJ3Unpu;SV9{L*#sW{M=@65^TM=;W8;=U~9GGgdCS&052E zS=ygH96Tb!LTmS>DK()hKSwAEwLZNaipJ+I*GC!2Mw;=YI`b1`uAJZNmi%w^mYXYk3c0+ky0sRcSEHIG3&p54 zWXhJKy1wDOkWv+;;o9=yLMg+GD9Qp8t8PkcXzHjaO|r@6USjfBG#qZKC)H)6bE6m! zi?C@4Gc}I=UpOPUc~HI6;GY3k6PxJ79w}407$50mj!KK!YbuL(EVj?VJ7Ad>wEDn- zfHhb?&_skp`_uXl$H#t4P_=NnDhjhr;Xd41q}Vyc=>WESXxU)qO-QWCn zukQk4@M6HU8%)Iw>%2Xr{wHHh5FBC*-foisghh>2;m72C8Ia!gB5$K;Bh%5xq^p)| zE?;zYhMQ`&iE{t*S}``a32=Z|HgV)@#N7&2^L(s&6Ti78`Sv)b+j<2jlEk#f{*K?eG60%dS^?=jrE45#`iwRq4c>1%M&C< zZmBSI*7`V>ZMk8)Br{+zl$pM9=dU)JNQ@vD2^N?Fbg~do8ckFiNmS{;!zD8ucqR5ockUS(muOYus3$zB|eRsVMZ8(%u=(Xvhao_6qg) zPP~RQE>tV*jsCnm(_F+AI{F5y*-)6fXbhoKd0CCDQ@?GVHV16Hs=l1oRUm~f^(w2% ztgvy$gGw^j0ZoC#FJXqVBM;i@4AN@yizHqsqSn6F6Jn&FtT=T%Hr8`^8@3jJQ;6mz zf-&%6co}S138x=$3DOu*{p7>u_;9DHlO^Vw74M(}pF2z5fV>Rtwu z0cu4!N!JDCMF)6|HtjtM{Y>@OLsXht>wLaJ);#?O7}OkJz2x*`Cn7p||D(*V@r&1h zmv(%Zk*xL1J(8E;>#A>|-z}(l_lxCN!^~QY_Qp)ob>Q#{SmmLHOK{J}=X`b+v8w^^J_*e<>f zxCyGa;YFTooy})4ua5{~iQbaK`fm`3B6}0gzVJSNzIQWrMRRjKW{{a{Ku^xALBUqo-v!88$(jSi(VZIU(l5z z6R-D&x6MYbaK|>o)vB*}Gaf;VX_UM|yrn(ac-9lYuNRIN0=8ctl16{{AhDTG$V2YI z_gF+$scU>=Pa(jm-PqBH+iT@rzu68iQ7KdSj;Ep6v7r7XqN`9gLnvtNA6j=OYXY7r zSSfpCe45G3y$sLPb|TW|1QMXuxt;S=)}R*l4TCU$T5ye4BIfKl^L_Fr!s%1lH&bRg zmLer+!%f7xv?8UJ#AS~E3D)>-f)f#o6|ERMen~JUz}ebq+2;ldKdG@p(`_9(_8cQNtD%2P|H7q*-nt5qJ{GCmj6vl>nQ4QTqps+J2(&BFev>r z1rB|ywYlc)(W&Ujx5Lnxx?pKa0okFcwCZ*SF`go|8OQ%nGa0#_s$otl?r^Z?q}UY2GH_T>zWvAE(2Kwa`b| z6liVLzl&#cS6LsMA%=$qT)D0oV^aBlk7QJ96N z=y`&|;UO#m&roTu9X&H@(;%&KYo3qGVR0r%DGVdLwX1Ta8M1?ardcaL%uSw6v7nQs z-Fpd;pzNIa)l&-zuGy|9U%tFlU4D!-3%VUmNAVldN+~452-5Me^WWP94v zRSchJcTC5_;&cDPWaq*O0fFGvbC!*1^9Pq;BLkx)gQ~k|qIh@vg-Z+*?U0S-4HoX@ z21_qF-C~+3bjCOUw?V@g#X_LjcJXFAs?ms4so7=$AGLIhdHrESS`~1D8C@-r?>*JX zs~wOFHNdvvs4d&Kj$*8ufJHKAU(@)@Dp7(4lv}6+Hg|pGLrJAB<)T<%x1dPTwwiU~ zld2J>(7pY)wzl~f5lC~f&D#Sc?cIe-&rLP(Rr@#E+pnRrReC=ShMnB~0dyGgiVJ*# z2UTnxJn@Bg;2+5Oc@ z2J;71;t=;&Yt|lnD<*kEt8{fTn!xE)s4N9F|2`Q|(})qK-^d;KYl5G1V?C68S(sQ| zwU%gf`7dMHU}7K2F-g?10XB}{v2-a{m8`)*$dsP(ntsK;at3M?cGZ!dfDqw0hJdu8 zX?nHc`-g9=gd5Q(&D82)-`|a1>Nq%jdo)W^r0jWP!?_t!`{+E|G^$bu>6l@4n$tLx zU~v|vERwCNY5&ut&&M7Fpv`_YQrIgW#pt)p1@3T7!^J47$BfG}a<~^2bawqvY3)R% z-9w0ZUl)92XIU|ClcYw8vhJaXH$tnyN0u6#X`;6h^XoHf4*Du$b9$$}!uJOWs*CDz z$%~>EFY_rkvle$AN|c~h%Z?M0GiQun6E+}E%-|B`)(+ZjI0D%@qY zwZfV_4i!H@6wJ(B^Cd6A%X|5MbiR9EmiH!vWl3W>8vrlg6@&#Z|0-5Frhtr~v9cGh{ghFP|J8Yye0NM>xcXZx0)aZ5 zQF@bYreAos0CQ9QTJg}y2AWc@oF7DJ?#6;25(r9VUIIep2D>6_+~ovt03Ktqy(Ntl zF@;fbDV`qY4!$l;+6`p{C?@+??MVk4(w&~Vy=z`D&$4DZfhc0yPq#~XrTDi)la;S^ zGd#!16y!Gw!+yQhX0mkfI6@SkXaHzaZGmGUOIoEJZJtFL3iu-+?iT_LcO!0TltQ$a zb?PHk4!PM(=9JI>cpFE%wGa`>U##!D*R4aCb?iKR%pt!Qlxftqx6&ELD95d%`6GIw zrb_KAVMfrCH({-uL|J(URwd?+P3>+iX3Ngl134$-^LB1)N%ovXs1Mmrb2z*dsB$X( zJ?Y=(cO5Io`29z&Sze`G zVJ-M^)*YaHqSG`_k>PtDjK;lq0CRwiI_dBU=V8%C9`a`Yqy6~S+1g=mWzIE2G9faE zKE$?|h2{u14Cd)#cX>_0ksnDoVx#h+BxOB=fwCy|U-8sj^d?FW;jZ^JS9=Rb5u~aK zA>mnm+TA-P(d3E@$Bm_k4l2h(KhZDj#bRjbp6T@Ep(G{>)A6YY6<`(dgP#wX_On&8 z!^8p|91bKlS@t{{FLBw5B%SYLtuz!pc2=HQIO6em8G;zo&gIZ0(T*DAN@ZT_={krZ zYktr~s0lG_7P#x}THm=0JL&NA*#fw5!af&qxp=eFqfwy}z7cVDHQV3#h9QMh%G=r8 zs<-oq4DA#m0SGSyI@>rYr)`#b4||bwa9&PMWllM_8yL1h&O$4MdtXeQ&U@nKdive- zQ;$g(#(s#D2E;8NTmr9`Hg|R?oHu)|TtP9$#?Sx@&yzXnLr`xQ9|u`Qra6J1C#g?S zk*-y?!N|&zG~$Q*N0}gEsMisP*u!AbL6UP%sXa#}0=^nEvWKICk6ID5dVj=l<0 zBI76XyseJMxA-%D(sL;JRxqpbxcdv-e$Z+~GHK0O3Ef0rPt=56bg!r!gO8#`T)#$TE;3Mxd z>$ScL`F7MoMtAyuVPVvWJ0%cK)WXP>MSxFmck-{o24vvM&elos0wxA-rmVLCXVC%b zpYP`pxC>bZcD~D+g{+75Z7l!z1EA4J?#=+%-GVXfMwyz@-}Fn!SZ+ST+X6I6gR4-l zncMm24FR+uo^Tps^F@4tFS&V!f z@SDv+k=gSskzz}F9XJ1@qQ#w9DXH!NQ%4wk<=pT_sEJ4lu~ID91PtbI%iQSttk&u( z+KIR2KOlE9L08g#lMcygtz7D15qVl_4$U?O}9j)Tj@)7r4Pl-%XFcoeumXFdbip+cSgLHN^#}{eq zW@q#!>m_A@XIpH@BMEaNUfj(5NgA$d^$r6{nRs5iXl(u0@{?2`&~}$C@q5o~1Z85a z!=Yox(6y+Gy(P;VSUUe}-F!a>&Nm&Zn}zBu?P3NV1i1nBk{e2P3%Yh>mbdtLak5Ko zmlZ{S8+iim*ULVgwn-!@w5fGgi2jn9i9YDOme=2)`xJxA-#D*(BrKY>&U%n#6zd#q zO}T138|lq0;C%%Tq6Jj6HrAXEANLncd)LzpJsf4_;2R;Ta}!-l0t^DS1qL$17?UIi zS8&I7$Z}6!>^ME*tp!d6T=pO#HBerR4${hQxnL2h)p^Ax0%c^3-p=dveMt9eUo1Hu!8JxGE$xZNWsBG5-52^6 zqTMIDYLYvUm5PjsUVMdZu$MkcKlM7bUJ9mW@5-+E3nm+kgS8Ds`OeECBQXVLewPml zUmxbKuB0o=SXd+22#TDoZhOL?!!E0KE%t$(O&;bx)%0B}!KyR~%<9*7rxRZGa$e9` zTsE5|>Zr}WPf7&99Y!_2@yzi67+UkmMQ#><`xX*jD zwCV{HE?A!S%*<{0Nghv}Youy^j{I03?e$9y$oakD>Ign%8<+5~R}-g^_eKPJwBe_% zrBjb#gui3M_rv+(n#t5c9^BL2$t6)ocx~v6LT6)* z=f=g&-%WSdt~q`$-OJWBud7??p{~spH?U6nmp?QKS-untO;^P{aJZb@yWeXKd&X_e znzSK&t}Jnm*Y4Mb>M62;u%zEO4kN8~qEayZs`>it?iFTD`IfW}e;i=C`&r+pJC3K$ z0@!fX@0$ayhnhOznZT_z57m4m!tm7LGJc-Clw+hol^{dt{{ARi=_uFL`y!TrfLUgu z)cs`;VTXrXsgoB)TlO3?mxmmUpvQNCB{01iLm!45L401EtxLE44u2q`}()`DwfFqy8kYIxTU4bz1YNm zk4mxBT+O1uX)^^2qqY{F4>4h#?!THI$2`lj_e^A?{uY-=AeN%YJXE4e+S;gB|X!|Ev9s+|A<00btB_ ziV9P?O326kKJb}gSzsrAMa12RBcwH5s~6=Jx3+t%G{WLzdU&3xCGOy8w_MAyfKoJM=UY=WK|fb6IWYr;=> zmpfMRZuw;5+?Y!~o8cQtomB9i$4R%OY3C!dQ*HQ^4jwxG3suDJ5*^eR88~TDm4Zwh z>_pnAFMWKP5wF*+ZjMGXJM;|tVtpRtdonQ^|9PkBsrZM>;Biw`UEuVVs!M(*YL(Gu z4cY@D!3m&vLjJpFs&M8uenp&GovvUO zJjQ9XdQ~~N-b-M0|81)WHzPw=riZPiOxWNX;dx9tx$m(xqeA%+uEBzij;JIZ-*cyN%ONoS*4X4`Imq)I{`n&iloZ|jMRVv{=e zv4+&?k$ylIe|c_R`b^C?E&U4R>#maV6&kupxi@Y(b^=9nx{mIt(dSs>(i)a`h|3I4 z4y&y{Z&YKOB7H8{C}P_@xp?pH9*9k?ZZa#18t}w2DJaFoAZL#|9U<29hSk&WNSF!w z)85!SND1bULr#@SN(5=8B-;K~rB&q{H$7W3WFfm}<3cs3gJ|cZxT^{F&*J#h$^Ct3 zv-k^r12Cj93A*9L7-HjadRWdn{zWu^MfiPaUN~rz>TSHn^uOjttu?9IGAy|Snf7Nu zW^4q#4*DVXnfeV~xP zFKqCGu2IzP=J);7ws5T$^>K0Z$2SKN{wJ7K(g*M3ZshC_^iq!_GP*88z#&>m zy%C+j&zzsb#ge37;$MPCb@A$^QCI;0$v^D2C>(`-&F6g;%SJOdhUna9W5y*GCFXQr zH)w$v;csM-YluM%%;3!skI(c#}cOW zGn@a4P9eQsf|h!N@$GgK=e(UI@8>#h72Gm_B&}uLknI?ckWuzhT6}V%WM<|8vhahf z1S%mh3E*(4)#cz0W@(L>{I@=|GG@*bWz6rGT@^JB zTY0$504M;*s@WPLM%Vp8(|1uARZa!ghdYiClwu7pRr%gQ8ZdT8lbQKMU8PK>=~#PqGk1VjiJUF}F`?Z@huC1AF|e_v7@TP4$G zT)AM`6D^#cC>18HtfM8E{wC)l7}|nF$ZD#x005(IW)kX5?55ZhxsJUoXD!SLMOdNj zvP2EJvfupaPG44}DPjSWjzMxWUthRLpiWk4`z|xFeey6Bp&E|}vS0joH@u@U5p$)8 zS0TsnF%paC^Jv8*n#@e;^#!lfC@ZNwhftoN&|6hg0{Q6D6&I*WG$om8$;0*e9Ghxq z6q;s<>!Nr1ZH}XpLsfT?YGVBMyA)J+`2R)LTZYBabm6*#g$X*i24>K~CAhl=4Fq?0 zcXyZI!8KTb;32rXySoK<3*pSW&)MIf)4%GPvhJ?#n(9^SxfkY#&1D_S`OIne({*`- zEwu$XA@U1;)^!hlN>Kou2!u=o*jJ#onRe`YR{g#V5g<_rwag?wFf!!xc|uzKct!?S zpwpZ&2>LvEU5uW9L(=*%>T2lC zI<{H+6W^#foC5$!#2HreVO3*t)tlV4Kd_1nBn(tcbtUfGHsT3{3oSc8tM>dINdB0V zA}{t=md`(o5wC4rFp(NiuKd18hWvYntLupVr(NaP(Kz@GeB^&QMciff!Nu^LQJ=w~ z^u$?L(Rvo;V!qJ;fM%#1aIijuroZUpd7HGgBnkz0X`#{Iv@jYjPM?Vq634%9lw>c7 zO9a6{aP-!=dOhKLxa}^;ZV$6nN|d6N)%0!x{d@E|f>&+KPyQ<3j(d&C`8>(l>@##+ zLP<*i0A3Vv-X9PEScPNDVb*?mu{?3qFcO03!1%er-jg349y5~sB|8IK^x8$$DQsdt zhlIiP8j1wCM42<@;X>@`gv9>qdZ#dR6!ZX!cP8EO9b_B(4Hu51y=B*|)lZ6_nn>X^ za_QMrL6EJjhdjJsJ&mI(j)VMy+>47Pi=PO$=|90Q0$3v(2nISjL#ZMttmhPumRDNj zRvpF1%_}!tRP1kSyF~&~L*E%QwK^579R(R~Rd0vt7yyF~e>FCWF|c}CvidZzP~gzH zzb#!q*yKpn5aMwH;qcAWRXHVtx~>#}Fqwc>N}2$)q0lSLCm@d1_^@amF#l)Xfbl&V{oD`NU4Q+Ua=b7#5lew#90f3ZkJC#Ubn4QG@pQdD+M8gJ6{oycZuHtfzfE^zl<3S zEEmyIh)-fRoiunwftzh;WZ@0A@a=7%Ii+2wuwiy0Xqdn|kfq=76wK{paas_x-R|9C ze!|1<_e+=>0j))Z{l~gfSyqjP216WuLBT9$4zb!S3OoQTs)j869V`Z<$hY2}`}Ai8 zZ?ws_w31{$950iQ2rWuffhOuPNY^YC0FY^1v(|+233>AkqXMC?QMSpaw(}2`ZL{>-h=la9bEmBvCK*H7`li z|CD&Q@BWDjVu`oG!f+l|qc`f48!zFL=@05d0Efa9l>rx>nWBYM&dn}pdB-t5c&#c9 z4>DAiY3?LR*)uavwmSFEa_>zQ;~oYh5a90{r+Z(wOMkcLE*Ey+j#D8%Bjfajh!Q~n zR0>ESFd$Niv3=fpwboDs6{zNu-tQztUFAERMltf@8rZJ z#3b3WavAiPq!Sthu~Lom8E6|V&HOAVwf}6n#v~<)NYdt4eXWZA>?IwU$H<{GVCMrC zu5-SxCb=YRrk~>!fQak7n}iHHJ9guwdPP^x@4WFopH*_8%fjFxNB7NeW$YBA-J2vcWE`&I3Vo~J`1#(W($hE7_`qXO6U^sk%&sMr$RdR^E&+D>_`BSY^oS*=nud}$JZ%e$wek)@Q|pn+o~Ny zD*6!08!A7;0c=?X*+DeBoGQ42l4Ao7%s5GLFAeOym=Hl?p`Za>5gax^2W)+PSpy0N ziiUdS65yU{F<;uP*2Njuw%m-lWWkGc9dn=+(oiQ)>GWqGezmW(Nz=&nvVZsy8DyjN zdt=`=M%iFWtYFF!ZR{d{Iuaixh7|E!N6IzG?oU%~`|k#w)z$$OK(=;mY25dEE~K6D zaFkG>3u#Sco5Sx=nd7m@U3CJ~8X>)o+=&l_ql$Ye+yiw2gN-?4SP>M#jNsU>RMAFp z+*xV+tSNgxzQ(%)L+pMil6KHe_t`2{JYXfnjeaNw>*kMw2@_mih;yI=avf1-)xJ`C2b zlYK=t38tWk1-Gp`df1I}p@c2me|!!HfE-uQL#*lgDN+iXTTQ8eZQn2FZUn_5*X>f} z>PJg_2kWBN%e=*SK1y6X3rJ}uOJD%R=tMJmljz~ad^g=mSIgXpTUk0AXd!Uk-|gKQ zIV_)r3LNYM)_oc1^3&`=RKTD>DnmrT416^FS*FdN{sde^_| zm;Z8z?pbZulFJmagObJ*8pJs2ta*JSxL7QR0{}BP5xKyo47fYpMSIR$>zBU|Fm41w zwb_y2BF0Jwj8&tubaE;%y9xpzDz@4O8fvroPR`gVD#)m6c4c69L2m7(X+@~|3%`E5 zS}Kuuv;}8J#Ss1uU9$TygpgDL6p#ws6*p3F)mwBL&pO-pSm^~UwdaP^LJ=>9WV+7P zV)joMxbqC#cVuhVK<(d5Ac!E*P&QTS+{}&(eviF95iV})NYy-6K(}qZrx?V?Q#6$v6sB*#?@)}cY5@G zt7xVuZ;MjTy5V&^y}iA2^*2~VM#k-1B+joIdAfW6JWN{%##LeUy|FjJx`ZoJ76IPT zot;0POlDb3zMPS9UKdk-_6qIz8iFN42p`)3vjzNKAPKnRnjC#+zgqLz5sHprG_=hf zpr|%AXZ81*y_{eT9@B&C=!n1(j96)>%6GBv!T)x$2nfw@-PKWNMIF5 zi#(L?cBGd^B#Y0QB-*Di3mar5P$!U*5-a34>sbebB_h)i6}!@GR=dvcNcB_t9Rqh0 zJwBoZT{Ln@04YKdgFfTs{?1h@w`ysZs+ya68*Tmq3hX=O&>L3bp#l8KTIp+63cIr^ zwF9WAn#pzpA!NuQqPh*FlMRw*aiifLp@}aJ2s=Fb`;p=h0PrRwop+p54$#|etdvmLiUie93QvaAy8QJFss{QjPNq$tBf^M2wE{5dW18V~qL zM5>!k-s*a0;pxgbj${$ zk_H1rWWQ47lf>I>bjVQ2W#fLiH|TDaS_|a5NqC6F<-C~m< zi@Wn$Qmoj@(W*PbJytDGx_X|XN2}<&(^752#|oN5#DGL124T`uoWlW0d+YccNA&&f zC+}(NJf(^h6f%Ck2ZI2Wbxln^_fl2jaEUX637DTSCGD%T!!vMLCnls!9bM+_+HmL#d>Y7T;GadxWKuS#<*O{d;aF8#UP-I82Iu# z796w`yEfIiYJJ7t24~(_7EJ*$r9r~C*WTmI-tX16^k<>5h~Sp{1E2NSL;LDJWg4f} zR9}`74g?UGIc6G9`jZ*|Aa}Jyb7sb`1!32(2y&~)U=?Jt1au0fGD3s^bd|S77VAGO zZaSQ!v<*S9;1PrRAY#7P7+HqS+a1MC7KE*>>Lyfezi01?yCo5Q z3miGex(5a`Baw;#tWW|&y**A@RH6^ z=pxt;R?6@IW6ukOD9Z(DqWTEr@!ly1Nr4|4ep{}0BvB7XFkQCEj9By^8s!o8{+FkI&p!nzN z8fU04(twhswkC#=_ovMcr?a((H1Su;5ajS3qC8ifa4jvLv40n?fUie3}XQo z(j*iSWmON1JCRMYP>)tNR7h7aqq9I^ctRqd<8!D}(NFFdIWx*k!W?4Wq@?qs_!93$ zDqXcNdw>W~VDNXON8>>^?}aL56xg5qq>HFRpyUn?eF?TW&Ot57{wT|Q+RnGA>9y`| znaCGvp!7pC`yX)UHas*GWUQhZ zeC*i?WJLtW>>2WW2=`!C4kx7KO_V{zA;yFQfRyN?I`X?(%~x3~Gd9AeE+s({FFle{Uq=C-%PJ#ib$g5C^tK zB7~33KY6~*B{>ic1jF|g-Ns{3tyHCOb3df%_|g#J7-Amj9op3mk4s~m=iX5wQY?$Q zV$1XIKkJ)$U{R1u4E*925V%LDc8JI(i7crMrXiPMiW0TQ5#>B+-#Nkbz!Va0vQg$I_2OS~c~1jL1{f z@fPtWOaQERs)YSCPt*ReZMQ*Bwm8*@4fBsXTZjQmA=Z6*c`n=mrtQ`6JRuhuKm-t6 zAHv4jJTX}bqTxA{(t9`zIAB+ff-DdMANgF3I<&4}RwnT-9Lhq!+HYP^=VvD?0mb$% z<-w)^LJMx&rSooc)j?v3gCJ$G2bLs)K9MpOoINlAEY!!KP4#`l=Ry|<7y$lCS!4W1 z2kuaM&@s8#NRNS(yzHZe0z`pOK(QWkI#-O%2chK1tDn-p^@0Ij=?yT)Qd4F|=9P8T zaz?Mp_9+>)s4~J|AVUlnX90Z0FbS_W5_UQW)&wGJnYiPP_V(EfrZNiHH{yx{Mr=&k zScyqFM@IK(a)*ckZyu`>f;ime&<#M?S4L;&&tFxYZ6*!n-a`;YB4KJyIg+gXeJ(}X zLQ;4#hgLh!dQ?O)M7sQ2eIIleIi7Ujr_daR%F0S=NvvNDpBRhUo!#8VF=XVR45EWm zP9M~^s}_L8|Elz)=#YdUxBwJTaAdlvLX>&(3$->?@-`xGhFD+(?9=^ysIwNRAP^z8;>tCj-8qQMMRQxA|S^$D3X}p zaMo9H1rbFxV^MJXE{JJnhpuYv%xwWx(5yzRCqi75GcX?sOG+6f-1tg_>*t%zmFbt` zQABu;F{W-pCy#c7HvA||B?!ot)7!j$qXI8lgU4>mGNtv9|2+&&c~1NGW!U$mF~mVl zj(f8)%j3_7h@7HwnIF~;=ljj{2da3ZMcQ1<+pYKQl5NE$g98busqMz?Q$Kz%{^oIg z4173osH_Bu ziacE4`xY&H2VnpC9S9R_i2yJC0{feZI9DeH6W7`jE_0#>xsx!lq*B_-MJ3?^FF#xp zKwRG#J%Jl*wTcgilGr;cBHR8(qQEdhacF2VM9s#%={_?*)|hriv_3TUj})(FotTLV zTNynTuOGk&vI$MG@i}Qt5liU>Q9`Y*G@&FLn+9~;6;$Cx*Z~?$-NW=X#k+nxxCB9=*Ey1NXRU)yn(xh2g90PrA`uu#RdAfX-E0bcBN3B< zN=9O0C}0$c_?0TNG>)V*7i>{dzIyD@$4*xjqJu@?AVP4so#mM5B0w(;I1y+`Huk4m z%v`t`_mbS2v@eV0gYuY|f8p_AT*z%`XyhT1EH2(L8BQh$+;Q^Ufe8o(c;=p9CA5_? zMNf}E9#q34n#6*Cy6JhqlS&eHnw{Rd%Z@W-7E+nC32s)ssiBlp15H;S{Us| zdD>(*x%cC1H{e~MYA`PuR(&=LZk89bi}9G|QYG%S92@-uWC*p*Vd=XWQG6E``Fm}d zRBU4kAH(Z^DNwK+Pz30td@;Z2+k83BjeaecAHdGRuG{(86DB{uVhz2Q;)$k~O)@Uj zqj$|zl}TIs(wgM}0~n=x`A+tAn32WU@ur=v^qq2@AcdrxiaPS$$=UQq`5h09X=Z$> zZgp90eD^kt82Ju9@WwY!6&{eE zYoWCt&Je+=zSG}~s|s`h!dNG~tOvysYMM44#N*2R&>Qy}wWB3t)wF)F(x>>U!kLQFOT5Q7~(18hbZ~)z*i3n?-fq2-qz#h!5tb~?3qtaM*$pk`U6fP z!xg?KVlETgyO?Z<@VppzXgKM)r1CIMA>ohgc*DHyuiS7%+t|R78Yu*YR|PjW?J~$7 z9lWZ3(-a^ZX=}6$JTfQWBdG$9U6Eo3X_XUtYvbzetP5#(6}1tcktf`mosb;rzfRb5 z=HW|huk&jJ<%gNoEX-EA&B{O~YVGnmo@7`;S>I*w<;0sHV z9C;|rGR*0Wxe47#3?_j0hZvebKC~TV*&1&b&s`MwN~NH7M`wSO4lPk!9%u zl=BmVz;)NFAB6aXTiJTufg zeq+8h7h6QXzMLd**Hkv-f@cXv##kZI5i}qgGN;&X_1L2Au$d#VV<6Nhv(g-|CIFUG zMBJ`h*M29N7RTJkTgYG4u4|uH+=aP^reG~{$WgDWs$r>Yy88hVsZK4(*+}Kl(Xtg? z|E^b_WbG%8A-gPb@iW{|-z@EIhm?n?tW@GooG~^)0Dzc6kg{X*!s)WC#x2@xnHy;j z9NQpuYvh%8J-7_S0 z)-xta*?6S{iD9@@n=C0#x_ik0lPHaXGQ5j6tojky8%Ijw<8c*I8@Z7)=N<$mdz&2Q zGS{6G24*U{+If*pB-KN|n>KJ)e#hUDDAjTxQBWF@K#Uh3&ZwKOW;>cIK7Hng%|I>B{+-{8ue6NRKM$i>d(3M;+`xsFQk!q~)O zMYWbm#nFsYQWQ)|MU- z;K^e{)fk){%{_UT87zetwvf;&9-@!SrAv;cBp691SthG|AO7A?T>U%x(98##4-KEU zbCdg>x$~;uGVRDVwf7TEPKgcJz5+4#(Y z&Bm*1z4ohV8kwCA2|n6WRE}Eh-+~W4y)$3>r!j&r+|(lLaOlot)Y}qb9M`RP;}v;4 z-nX~Es$5x^(ij#!c9)HC(aIZE=u=bOQW5FU_Kd%AXbdf;9q#kQNhAI7)CGeF8+;yu zkJrPE?s=FZv2Z=7`#s`tc0{1K-((zw+JDxLm@#S9oTcEejvNhVe1ATBSaMT3)o$q^ zfEgM8tn%CF@2IIMMthf|d2JC1wj)_BUhAS@^&}=>mV~wE{26H@j5tQTX!QkK;s5}9 zp48lTiH99Ri<&x16Ma(QtoR`6rg^)Ee22_`{&2bE9>!*dB4LtDSEWru9&dP)C)oEdGKbZS%5F-GVJlc z8jwmdZTm$fvV{Q2!ia2sS;y)L5*ey=vuV5&P?7*pMoDntTXJ!6b61ByBmcVpYh6!m z`cglAwB9K%P@@jr3sK3tz;7OnVe)$P{PeY*JEBON2ipdtaDJJ@=h~CiG-bg<8;R{T z>IWz#`P=%lexviTwn$cVc>d%tF*d@h*4g~ie#sQ8QwT)D4>R=HM3gx@cDOZlW(Rf= z=Gg22MAX8R*eJ2O07l(R7J?cU;PuZ!&-QA0Prz3T;;O%>HFGbD6QAxPW-sbaF>c!U z*wflvtA4d3;o_pKHZqKU;NbWci-gU7Rh0Rwtv!hVYua(tk{=}MIk?Az_SokbzB#Iq zM({`|Gw8Ls&p8;e_7BJQfz^VDx!~gI{Ytx{PBXe9x?wDmKA2D(2t}H!PW$770{HoP zeMN_M7};2rf=S1`D9>KEy<;#Te1<+Su}BQI7?7xs+PinJ{q=Gk?Mctzf}cn^RCvKI zL~j*EDZb%>&*UKzSt>S@Md?Ka*&&o_71v#Nhe~+3?>%!>O}6F$a6Ju0%c#MF2!#DD zvTZG92G760y#|9m=OYJV4w@3oHJq1Kpizuj!EM`xD^J{YtiZILeA02E z&8O@ux+eFQ|=!Y&y6 zr!_$hjMn$4jE!HJnrg<25ge^wNmMO;Za;rjNaaF*T3xL+qg7lky4-%~fo!s^_LJ_^ zw)1x(nW8L~1en&j+flp4;wA;>@ll4kF`H#COlz8CALg!jtzhTNh%fWr{Dwu%$~cx6 zt-!{EUl7HiBLrv!wlP}Xu;burE;h_=4zmo%NIuWzE$siiva#`H|JfRZp*TP#8Uz4F zlg59Du4c4L!^4Q8!)kS}RBbLqIG$=J`N*0PIsBB{k>$XFBf3_FOWdB>|8RzxXSS>^hpX8VKCvklMg>TE`dOOwT~w7c5tUzL&3QY z|0}s*^0K#?k9ac0wkNzY#!Vd}ol_hPB+pW_P@c0~6V#xldsl65n-EiI!%crzm5DkF z0N~0?7P`4O`Iy*?kYQ3xf7BK%J&`prVSE2qa=}Fu$TP;!%u@74yYe%`4KsBNC}tot zXUly%HSQ6Cmp4|R-L64_IA^T?VGwWK-pAoJLRf#E?C+5{PHoiXnSAe+r!vFhXr+!G zzc)Q3f)fn@qH?mN7|dbVyYZD!G^5_+UTswn%0;0rx^8FiYn?sD8|_GYkHkCaNY~d! zae@4^uTgKX{&%>^%UrFUICrbSftP+yLC24#hE>MB7@q=}t}&KWs4%X~fGObj!|Boq zXH3?rur{Xu9%Zk%k!(w)A5pyI{ExMN$NkkD{`B|@g^x_#KTOg+R-t9riI0)#NWOzy zGyvlAgKX8Bvdd5Z_xPI_{= zH&5rkF;bl0$ad=!&6acCwivVMIJ|r?@gHV5$9|}`%eJTO)UURKHW=&}@??_8jICSZ zH#J$Ls*&63YguVc@5#`UhI^=&&pnKr*K3RC=o?v8Hd$57ni#2g%D?$T(;~UBv%+FD z9_HT1Ih_B%jr*Q0kh)KWaT(=k*le6qk@f9c!jK#zoyL8(SO*ii00@g`np?-NaseqQ zUxXF*s7Z?8hRzvs)v9f5;Ikekykk4`rpk^i&mLKiH#PoNoVaPpyty=z?;1+mk$|Tj z9U0%)=vsxB&Bx1!^HH0D!JxCQLC{emPQEUdYDQD9-1MVzN(h|30(J0oOO?$@v>oy+ zMHgUNS)gjIa3JP?W%;I*43dF3E8BiQEMmlzTTdXgklRNjTQmE z;t#c;VTBK*FQ#JX8_ehZf!SGq=ZGFs!%`0ks)<5Bi(eHb2)U9kt^8O~pu79}UI8>0 zf^#+F>)^m-Ku9*O5UYrvUZdA}8)qX2WxK7N{De74TD&$;5=OGA^^>Wq{20cXkIg1( zU7Yydpuu3PYv5}&>P)xOF!bp9eCY@ZeEv{xh>d(MJm>9abU%Nmp{p2II-p4QqTES{ zANN2U58vF<__%Wrd`oxup#p?beBrLVGv)LR62tYA=#vCFP^S>Nw=&mx* z)qK2fuJMxjq?G4LwO^=%^vTinugFPwZSBK|ukqv5+$S$9_ooqZgDZhR*1hm>o+tv! z?YXOu$@7ccEJDqH+4};G;eb|XU|e>}-a*zn<{F`!-V?rVvEqxa+a=obBV5l2d}EGu z;u)Wl^y+_C(I;>K<$MQIs>deD+f@&l;)Jz;G7opF^ZEI7JHWiAx92sg6Q`3;)W^Y) zxuNZ#g_iw(au%l1?Y`PUa-rlbfdhvwk}Q@tPsvhM0d7xY>!YKe&kF;ITFajP9`VXl zQb{4w@&1;|kTX(4?mc19oiuqI_=I$D5XlkJE_l&%V9vo)*c6)m? zxI;uXn2?hRf3vEA&;0MoYY`5Fa@8AMraU>z-|sBWvDW?II46i-JQZY;kb#<>mY%2m zQ&3U`5YMT}4>PR2Ff2((CXX$x2X*O{K4W_$}h zDpQMdpE6;gH48iaj^{?R#SlQg$eRpf%Ke6`E)zzBQh~%Y0`fW_|o==W~HSza}+dz<`tLyF9`P%8|Q#z>}TvFpyS?K1` zup7VWN$UY-o`<^)AWY@?*JZg9YAw$fA-JedJ^{9`gPlg&h-I`-FP%SpuZk|pStW=B zTvfdtbE}k4f`$$5LmBOuk@3;qH_WvpmaNO$^h=3r1oil|o@NP~HKEM5% zora6w?KQv^etFoWA!TYae7${Hh(rGqqfD|dbp4Z+FZv$eA$@w-+0)$0c)sK!ytX1Wgv)jqemqm)mbOdo} z=c4lb1GmBB64_O@! z%HMu1YP_2X+1*m{c}Y8`R=k?ZF;U|}hqdXW~T0r^`~p7epdfuBEqo_=1tZ?RaID4*`Yu@DMi z1v`0|OEKZ8i_u$iPZezcY6vLC*_$`~8-OhGwNkqBNeZ{2M5LomYLLL5_nt%VI8BxVT>jfk`Qq7q; z+1x`3{@U1VJ`MbM@5!6}Etkm4aqFCf9y)XRHGsA^S%z zHokj;)8}+GCa33reY2<B zvul^~+%bDX+y!y?lQ(ctBO)G5flmJB`7p4b+Hzsgn*Rcfku!Jw z(=EgLq-cjfX_=D7QZwFYn@*vRavz5w>n-3`78t^ppy}X|2vZnIi zZ}){n`GgiJ!+WaoxDWZ=NoEyYPSd6!GiM0@>s;P+1W1C};}zd^t)319Uv0^52i0BD z8gRdD37-gIKKcth^UxwZ=1O@18&^$V!fDfnV$n+#Q7}atZ!X3z-ViEjyY^)Nb##94 zGzKy_e2YO=6S#s5pFD29QtrMzZqkwGR|CX9dsJ0#QKt~KI&AeUr!HR@90m`sU117) zntMJsw0fKQpFEK>5sE0@C1eXN3Hxav#Y)O1C2Dj$t}RaBD5_C>`!|eZl2B3`-IcXi zlrOS*2`E1Qm|pE0(EWhO#4q6bXX+>vkq2lKjqyRe3Mw*li9W@!KiUOIVnV@NZjwk;r1_L9!_6J|B#oWc!4V}4z>?GvR`pLvTcDd z;I&la!Wj>uAup~vN6=DS{D)7}YKjK}^4uhiWKrLDP?GX3bj<6g?X+^`!Pt9-%JR}B z{08K5zS0+JtL8Af1U#=k8to3&)Y(xkQlFYC4kX{ab;TVWOp}}`RwY$6d&-M1nqBt2 zUKHKiUCE&-F8<61*EtD4p-crGZgFjtL{)%vPJ+lYx9S3)loJm($gZ)KbNvRcuMHOs zsZdk}Ua?;7W2&ZdvbX>wcl}2*$#0v_Lov>*xStR`F`nDMwAwuTv*xOR!|j`w&oXhP zjOmUS>PS0R%N_i76BZkGcVE9Lqlq)hz#?;0I8t2O&DzejGL7Cq13~Yjv128Y*d^wU z-R{g+k2E_lzmmrGQ3nf@nqK-X2gXJ%TQ_@GQ-{6l`MLO~;dj$HHavJhGe)8)vsi5P zwBbIp>6qvH2IDE`BFfsZfzOeq8jy05D^99@kxMYW;|lkDseQQVZo?dvHd$NwfM>Dk zZbC|9j0QLEp(w;4|E`Ht#id`&2fu9V=dFS4$v8YF2 zs5M^*p)TI2^+wL7F-+a>~cUtoojKt z?_FbqMedYTC`G9)ApwH_vn-`l(-fO44&7@|hGKsSUOI+x9CM3WLjj73DW){IU5WpN zff+Y%HhU%ulSveZFyVdm1eDn{@q5>s5HT-LYHa_+pXS*(x6`oYC5tO_;QhDiLE7G| zRaEQBT6Wo->C!QM&cP=&NP*~7hc6>#D%nM-yu-ULRlne(kf0jLBZ?+b_#Q9jvAUvT z5!ScVAdQfOGc-vVbdfb5KJD^4M@9}ep$HBHiTN&a!pJ==LhC~c zq@+9_vEJu%k0Uk^H@eTd+K~eyJw>MquR??EH_$h~SK-xY(u5=A155_2zlM)F)oD zSJ_=2uvhY=fYzUssmbm%Br87wr%T`Rqv@F(B7fhMyoh=cN92g&>Sf>bIQs>7l~e5= z8)C;5wSi+%D^*edP11ig z{M0f2DVO=c$fHgZcR>04u|!+YlE>hap4#5=k#AyJdIfdsU$49j>H297;z3FKjQ!_v zsd8J?@+7M0T>nI{1c4X(pS&!&s?!C*q|)In+d}KA3Wrq9H0HwIYU>~BqlH5~maO^$ z?eFCGRf|;UU6LngLaYQ7QV!BIY<{GMz1jv2_a0jkV|>P9Y}Uc>VwaDYE|z&$WKCF1%xHgG{t?-0$q^;4Kt!N>I969B=Qm%P zazvG_^nKd1Af;gD>V&iNkB(ABD8(syeXMq4$qWHE(w*@N|I7Z{Kf~*V$<1{;y&6BS z&O67qZCdh;C%0pZH}jAbs_CBl(UR2P40I4l?C>kcB&txS0lNacZKMb0MnNecrzAGZ z_hd)XLnNafcLuypEjQS1tEflu2bgj#2`n)fA}Wlxc9Tw@-8VbIBhLxZbsVw9p;fHc zYC?!86Uf3Gd@UO)SDV#;JKcLrYjHmfl=BAk%W(1B@4 zvX$6d_flUgN}`5;mwwz&mBXv~6eE!7PGhi%&RlQGH|p7{r7#$RM47hkdUs?impR^* z+BBTR^CzM37wd>Jvt8$2GjXmT8(&2|6-vV7VOz@@eSlN6{_WI_)e<>Pt@^UP&j!Jb zW~M9GhjD^>$*&}0EspZ3=36PY6R{Lto^y1kU6}BP@|0}-6tM$Ej!EL9b*=}0_C1c6hFX7H3Wv=bc%6eCH)62fZ@fI;&-_iH&c`e^5E^mL@=OY%zIMd#m z_mz!l%Rt9e?Zo;8H(99VNgCZapKt1N)!4(8JBj&D(yV3vvSg4YI@H)zDAH`1p~Wl{ zt##L_0#&@l?4@KzwYMHWd1B6TRLh!&OXa59l2xfF8)dMnkr+Kopyl(o3D?6AF@x=K zntoD#mHWjKQ^Bq63nzMZCq(9c(=mZ7b^Z*<1= zwiVDml1OVlS(yDA$Pw>T#5xvhKEv|Tn6KtnMJ~AGM(k#QC z)7PuaFJDES1b<$zjXS(gmqxXrx>pR_U-GcRk-__VUFlSJO zBUfU!SUKEjum;KAFw4s!J1r|NXcDRf``mcGVaSPvji~0$Uar9;e(W0Gs+nn(F z4XP;i5@2$?jtv(vm&&$h8*3D!o^Q7)duB0B^Ita>{*wudD0<+2+L=22Xpr6hwq>po zs*PQVDNZ5&v@1SFFNeyQbDMWNu4kH^GoI1|tw7n+d=j;Kb8Wm#5qzA95I^_6&R(WSLFwlt>3+a3A(@81n~f>m^;__J3}yRWS#sWye` zX$QKi@&Wg>t9I$Dw}Xo#F*k!gZIJc_Qu3gjyb7}9(au87)DVFUorfavhl2l^g2u~$AP%uEeve|P11W8-0zxvqqCGV-&{)|bnR%7ANfgNJl^7M7P|%N60* zJA;iU4n|`N`MCYjMdr7sRrw7EEzS2ZMKLY_#)ObglvY>SlN_;CQvJuCH^ru1&NzHS ziz@C22{mC8SONkfi(tk6J2n~Gs{h~A|9%UE(Vza$@xR3XO8?))|8oA9_`f;-|5pB& z!xHa#uEP;ZXc8&93g2}jN(V`q*_=NlEJ9~{mowoqaD>zVa|#Ch71=3cqtW0SkN%;o zT_k`Qc!4kRemhpK`-41iq9Zphh098RtjP82K^PZe`^3%go0{XnO5M(C+8)~1|1Mr% zdH#wt0=I!pt9pk+L(V3o78dP;c{-9+j@P1tvc!{yn69cwQYe?@T8z$>Z*pETOTL=~ zZ?TcuM5Y*4{qnEi!aD^_KokDvuQuAX8V!y(Ne=&?em zSJtN7w3q#H5c|Jxm|1S><@LAlMxlOy&aKfYZ-|BTRtYVkTUBuOS8JiSdj2hkDhcp+Z?>WgEMZ2