docs: Make easier images more readable by AI tools (#47132)

## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What is this PR?

This PR makes some images easier to understand by AI tools.

Some are removed as they served minimal purposes. Some are replaced with
mermaid versions instead, which are more understandable by AI tools.
Next steps after this PR are to continue migrating harder images as well
as improving the text around images in general.

## Testing

```
pnpm install
pnpm dev --filter=docs        # or: cd apps/docs && pnpm dev
```

Then visit each converted page and verify:

Diagrams render as Mermaid (not a broken image / raw code fence) in both
light and dark mode:

- /docs/guides/auth/auth-mfa/phone, /totp
- /docs/guides/database/connecting-to-postgres
- /docs/guides/platform/read-replicas (inside the accordion)
- /docs/guides/storage/schema/design
- /docs/guides/local-development/seeding-your-database
- /docs/guides/auth/signing-keys (image gone, prose + table intact)
This commit is contained in:
Chris Chinchilla authored and GitHub committed 2026-06-24 11:50:26 +02:00
1 parent 3cf5cc634b
commit f3c4ead337
19 files changed
+121 -167

No files matched your search

@@ -12,16 +12,25 @@ The phone messaging configuration for MFA is shared with [phone auth login](/doc
Below is a flow chart illustrating how the Enrollment and Verify APIs work in the context of MFA (Phone).
<Image
alt="Diagram showing the flow of Multi-Factor authentication"
src={{
light: '/docs/img/guides/auth-mfa/auth-mfa-phone-flow.svg',
dark: '/docs/img/guides/auth-mfa/auth-mfa-phone-flow.svg',
}}
containerClassName="max-w-[700px]"
width={93}
height={150}
/>
```mermaid
flowchart TD
InitS((Setup flow)) --> SAAL1[/Session is AAL1/]
SAAL1 --> Enroll[Enroll API]
Enroll --> ChallengeAPI[Challenge API]
ChallengeAPI --> Scan[/Code sent to User/]
Scan --> Enter[User: Enter code]
Enter --> Verify[Verify API]
Verify --> Check{{Is code correct?}}
Check -->|Yes| AAL2[/Upgrade to AAL2/]
AAL2 --> Done((Done))
Check -->|No| Enter
InitA((Login flow)) --> SignIn([User: Sign-in])
SignIn --> AAL1[/Upgrade to AAL1/]
AAL1 --> ListFactors[List Factors API]
ListFactors -->|1 or more factors| OpenAuth([User: Select phone factor])
OpenAuth --> Enter
ListFactors -->|0 factors| Setup[[Setup flow]]
```
### Add enrollment flow
+19 -10
View File
@@ -12,16 +12,25 @@ The use of a QR code was [initially introduced by Google Authenticator](https://
Below is a flow chart illustrating how the Enrollment, Challenge, and Verify APIs work in the context of MFA (TOTP).
<Image
alt="Diagram showing the flow of Multi-Factor authentication"
src={{
light: '/docs/img/guides/auth-mfa/auth-mfa-flow.svg',
dark: '/docs/img/guides/auth-mfa/auth-mfa-flow.svg',
}}
containerClassName="max-w-[700px]"
width={111}
height={150}
/>
```mermaid
flowchart TD
InitS((Setup flow)) --> SAAL1[/Session is AAL1/]
SAAL1 --> Enroll[Enroll API]
Enroll --> ShowQR[Show QR code]
ShowQR --> Scan([User: Scan QR code in authenticator])
Scan --> Enter([User: Enter code])
Enter --> Verify[Challenge + Verify API]
Verify --> Check{{Is code correct?}}
Check -->|Yes| AAL2[/Upgrade to AAL2/]
AAL2 --> Done((Done))
Check -->|No| Enter
InitA((Login flow)) --> SignIn([User: Sign-in])
SignIn --> AAL1[/Upgrade to AAL1/]
AAL1 --> ListFactors[List Factors API]
ListFactors -->|1 or more factors| OpenAuth([User: Open authenticator])
OpenAuth --> Enter
ListFactors -->|0 factors| Setup[[Setup flow]]
```
[TOTP MFA API](/docs/reference/javascript/auth-mfa-api) is free to use and is enabled on all Supabase projects by default.
@@ -74,31 +74,12 @@ Key rotation and revocation are one of the most important processes for maintain
### Lifetime of a signing key
<div className="flex flex-row gap-6 items-center w-full">
<Image
alt="Diagram showing the state transitions of a signing key"
src={{
light: '/docs/img/guides/auth-signing-keys/states.svg',
dark: '/docs/img/guides/auth-signing-keys/states.svg',
}}
containerClassName="max-w-[300px] min-w-[180px]"
width={336}
height={766}
/>
<div>
A newly created key starts off as standby, before being rotated into in use (becoming the current key) while the existing current key becomes previously used.
At any point you can move a key from the previously used or revoked states back to being a standby key, and rotate to it. This gives you the confidence to revert back to an older key if you identify problems with the rotation, such as forgetting to update a component of your application that is relying on a specific key (for example, the legacy JWT secret).
Each action on a key is reversible (except permanent deletion).
</div>
</div>
| Action | Accepted JWT signatures | Description |
| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="whitespace-nowrap!">Create a new key</span> | Current key only, new key has not created any JWTs yet. | When you initially create a key, after choosing the signing algorithm or importing a private key you already have, it starts out in the standby state. If using an asymmetric key (RSA, Elliptic Curve) its public key will be available in the discovery endpoint. Supabase Auth does not use this key to create new JWTs. |
@@ -315,14 +315,16 @@ Because the dedicated pooler is hosted on the same machine as your database, it
See the [connection method matrix](#how-to-connect-to-your-postgres-databases) at the top of this page for a quick reference, or follow the decision flow in the diagram below to choose the right option for your environment.
<Image
alt="Decision tree diagram showing when to connect directly to Postgres or use a connection pooler."
src={{
dark: '/docs/img/guides/database/connecting-to-postgres/connection-decision-tree.svg',
light: '/docs/img/guides/database/connecting-to-postgres/connection-decision-tree-light.svg',
}}
caption="Choosing between direct Postgres connections and connection pooling"
width={291}
height={150}
/>
```mermaid
flowchart TD
A[Where are you connecting from?] --> B[Persistent Backend]
A --> C[Serverless / Edge]
B --> D{IPv6 Supported?<br/>IPv4 Add-on?}
B --> E{IPv4 Needed?}
C --> H{IPv6 Supported?<br/>IPv4 Add-on?}
C --> I{IPv4 Needed?}
D --> F[Use Direct Connection]
E --> G[Use Supavisor Session Mode]
H --> J[Use Dedicated Pooler PgBouncer Pro]
I --> K[Use Supavisor Transaction Mode]
```
@@ -98,7 +98,29 @@ export default defineConfig({
Suppose you have a database with the following schema:
![An example schema](/docs/img/guides/cli/snaplet-example-schema.png)
```mermaid
erDiagram
User ||--o{ Post : createdBy
User ||--o{ Comment : userId
Post ||--o{ Comment : postId
User {
bigint id PK
text email
text name
}
Post {
bigint id PK
text title
text content
bigint createdBy FK
}
Comment {
bigint id PK
text text
bigint userId FK
bigint postId FK
}
```
You can use the seed script example generated by Snaplet `seed.ts` to define the values you want to generate. For example:
@@ -107,8 +129,8 @@ You can use the seed script example generated by Snaplet `seed.ts` to define the
- Three `Post.comments` from three different users.
```ts seed.ts
import { createSeedClient } from '@snaplet/seed'
import { copycat } from '@snaplet/copycat'
import { createSeedClient } from '@snaplet/seed'
async function main() {
const seed = await createSeedClient({ dryRun: true })
@@ -45,10 +45,21 @@ You can only read data from a Read Replica. This is in contrast to a Primary dat
When your database starts slowing down, you face a choice: make your existing database bigger (scale vertically), or spread the load across multiple databases (scale horizontally). Both approaches work. Neither is universally correct. The right answer depends on your workload, your budget, and where the bottleneck actually is.
<Image
src="/docs/img/guides/platform/read-replicas/read-replicas-flow.svg"
alt="Read Replicas decision flowchart"
/>
```mermaid
flowchart TD
A[Database slowing down] --> B{CPU above 70% sustained?}
B -->|No| C[Monitor, do not scale yet]
B -->|Yes| D{Queries optimized? Indexes in place?}
D -->|No| E[Run EXPLAIN ANALYZE<br/>Add missing indexes<br/>Optimize first]
E --> D
D -->|Yes| F{Workload 80%+ reads?}
F -->|No| G[Upgrade compute<br/>Replicas will not help writes]
F -->|Yes| H{Already at 16XL?}
H -->|Yes| I[Read Replicas<br/>Only horizontal option left]
H -->|No| J{Need workload isolation<br/>or geo-distribution?}
J -->|Yes| K[Read Replicas]
J -->|No| L[Either works<br/>Compute is simpler<br/>Replicas scale further]
```
</AccordionItem>
@@ -18,7 +18,37 @@ This is important because the storage schema only stores the metadata and the ac
Here is the schema that represents the Storage service:
<img alt="Storage schema design" src="/docs/img/storage/schema-design.png" />
```mermaid
erDiagram
buckets ||--o{ objects : "buckets_id:id"
buckets {
text id PK
text name
timestamptz created_at
timestamptz updated_at
boolean public
bigint file_size_limit
text[] allowed_mime_types
text owner_id
}
objects {
uuid id PK
text bucket_id FK
text name
timestamptz created_at
timestamptz updated_at
jsonb metadata
text[] path_tokens
text version
text owner_id
}
migrations {
integer id PK
varchar(100) name
varchar(40) hash
timestamp executed_at
}
```
You have the option to query this table directly to retrieve information about your files in Storage without the need to go through our API.
@@ -1 +0,0 @@
<svg aria-roledescription="flowchart-v2" role="graphics-document document" viewBox="-8 -8 715.6328125 968.234375" style="max-width: 100%;" xmlns="http://www.w3.org/2000/svg" width="100%" id="graph-div" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink"><style>#graph-div{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#graph-div .error-icon{fill:#552222;}#graph-div .error-text{fill:#552222;stroke:#552222;}#graph-div .edge-thickness-normal{stroke-width:2px;}#graph-div .edge-thickness-thick{stroke-width:3.5px;}#graph-div .edge-pattern-solid{stroke-dasharray:0;}#graph-div .edge-pattern-dashed{stroke-dasharray:3;}#graph-div .edge-pattern-dotted{stroke-dasharray:2;}#graph-div .marker{fill:#333333;stroke:#333333;}#graph-div .marker.cross{stroke:#333333;}#graph-div svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#graph-div .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#graph-div .cluster-label text{fill:#333;}#graph-div .cluster-label span,#graph-div p{color:#333;}#graph-div .label text,#graph-div span,#graph-div p{fill:#333;color:#333;}#graph-div .node rect,#graph-div .node circle,#graph-div .node ellipse,#graph-div .node polygon,#graph-div .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#graph-div .flowchart-label text{text-anchor:middle;}#graph-div .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#graph-div .node .label{text-align:center;}#graph-div .node.clickable{cursor:pointer;}#graph-div .arrowheadPath{fill:#333333;}#graph-div .edgePath .path{stroke:#333333;stroke-width:2.0px;}#graph-div .flowchart-link{stroke:#333333;fill:none;}#graph-div .edgeLabel{background-color:#e8e8e8;text-align:center;}#graph-div .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#graph-div .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#graph-div .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#graph-div .cluster text{fill:#333;}#graph-div .cluster span,#graph-div p{color:#333;}#graph-div div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#graph-div .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#graph-div :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="6" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-pointEnd"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="4.5" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-pointStart"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-circleEnd"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-circleStart"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart" id="graph-div_flowchart-crossEnd"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart" id="graph-div_flowchart-crossStart"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#graph-div_flowchart-pointEnd)" style="fill:none;" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-InitS LE-SAAL1" id="L-InitS-SAAL1-0" d="M142.477,91.367L142.477,95.534C142.477,99.701,142.477,108.034,142.543,115.567C142.609,123.101,142.741,129.835,142.807,133.201L142.873,136.568"></path><path marker-end="url(#graph-div_flowchart-pointEnd)" style="fill:none;" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-SAAL1 LE-Enroll" id="L-SAAL1-Enroll-0" d="M142.977,180.867L142.893,184.951C142.81,189.034,142.643,197.201,142.56,204.567C142.477,211.934,142.477Line truncated

Before

Width:  |  Height:  |  Size: 23 KiB

@@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" type="text/css"?>
<svg aria-roledescription="flowchart-v2" role="graphics-document document" viewBox="-8 -8 599.78125 968.25" style="max-width: 100%;" xmlns="http://www.w3.org/2000/svg" width="100%" id="graph-div" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink"><style>#graph-div{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#graph-div .error-icon{fill:#552222;}#graph-div .error-text{fill:#552222;stroke:#552222;}#graph-div .edge-thickness-normal{stroke-width:2px;}#graph-div .edge-thickness-thick{stroke-width:3.5px;}#graph-div .edge-pattern-solid{stroke-dasharray:0;}#graph-div .edge-pattern-dashed{stroke-dasharray:3;}#graph-div .edge-pattern-dotted{stroke-dasharray:2;}#graph-div .marker{fill:#333333;stroke:#333333;}#graph-div .marker.cross{stroke:#333333;}#graph-div svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#graph-div .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#graph-div .cluster-label text{fill:#333;}#graph-div .cluster-label span,#graph-div p{color:#333;}#graph-div .label text,#graph-div span,#graph-div p{fill:#333;color:#333;}#graph-div .node rect,#graph-div .node circle,#graph-div .node ellipse,#graph-div .node polygon,#graph-div .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#graph-div .flowchart-label text{text-anchor:middle;}#graph-div .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#graph-div .node .label{text-align:center;}#graph-div .node.clickable{cursor:pointer;}#graph-div .arrowheadPath{fill:#333333;}#graph-div .edgePath .path{stroke:#333333;stroke-width:2.0px;}#graph-div .flowchart-link{stroke:#333333;fill:none;}#graph-div .edgeLabel{background-color:#e8e8e8;text-align:center;}#graph-div .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#graph-div .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#graph-div .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#graph-div .cluster text{fill:#333;}#graph-div .cluster span,#graph-div p{color:#333;}#graph-div div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#graph-div .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#graph-div :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="6" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-pointEnd"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="4.5" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-pointStart"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-circleEnd"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart" id="graph-div_flowchart-circleStart"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart" id="graph-div_flowchart-crossEnd"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart" id="graph-div_flowchart-crossStart"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#graph-div_flowchart-pointEnd)" style="fill:none;" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-InitS LE-SAAL1" id="L-InitS-SAAL1-0" d="M84.141,91.375L84.141,95.542C84.141,99.708,84.141,108.042,84.207,115.575C84.273,123.109,84.405,129.842,84.471,133.209L84.537,136.576"></path><path marker-end="url(#graph-div_flowchart-pointEnd)" style="fill:none;" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-SAAL1 LE-Enroll" id="L-SAAL1-Enroll-0" d="M84.641,180.875L84.557,184.958C84.474,189.042,84.307,197.208,84.224,204.575C84.141,211.942,84.141,218.508,84.141,221.Line truncated

Before

Width:  |  Height:  |  Size: 23 KiB

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg aria-roledescription="stateDiagram" role="graphics-document document" viewBox="0 0 336 766" height="766" class="statediagram" xmlns="http://www.w3.org/2000/svg" width="336" id="container"><style>#container{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#container .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#container .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#container .error-icon{fill:#552222;}#container .error-text{fill:#552222;stroke:#552222;}#container .edge-thickness-normal{stroke-width:1px;}#container .edge-thickness-thick{stroke-width:3.5px;}#container .edge-pattern-solid{stroke-dasharray:0;}#container .edge-thickness-invisible{stroke-width:0;fill:none;}#container .edge-pattern-dashed{stroke-dasharray:3;}#container .edge-pattern-dotted{stroke-dasharray:2;}#container .marker{fill:#333333;stroke:#333333;}#container .marker.cross{stroke:#333333;}#container svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#container p{margin:0;}#container defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#container g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#container g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#container g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#container g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#container g.stateGroup line{stroke:#333333;stroke-width:1;}#container .transition{stroke:#333333;stroke-width:1;fill:none;}#container .stateGroup .composit{fill:white;border-bottom:1px;}#container .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#container .state-note{stroke:#aaaa33;fill:#fff5ad;}#container .state-note text{fill:black;stroke:none;font-size:10px;}#container .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#container .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#container .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#container .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#container .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#container .edgeLabel .label text{fill:#333;}#container .label div .edgeLabel{color:#333;}#container .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#container .node circle.state-start{fill:#333333;stroke:#333333;}#container .node .fork-join{fill:#333333;stroke:#333333;}#container .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#container .end-state-inner{fill:white;stroke-width:1.5;}#container .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#container .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#container #statediagram-barbEnd{fill:#333333;}#container .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#container .cluster-label,#container .nodeLabel{color:#131300;}#container .statediagram-cluster rect.outer{rx:5px;ry:5px;}#container .statediagram-state .divider{stroke:#9370DB;}#container .statediagram-state .title-state{rx:5px;ry:5px;}#container .statediagram-cluster.statediagram-cluster .inner{fill:white;}#container .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#container .statediagram-cluster .inner{rx:0;ry:0;}#container .statediagram-state rect.basic{rx:5px;ry:5px;}#container .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#container .note-edge{stroke-dasharray:5;}#container .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#container .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#container .statediagram-note text{fill:black;}#container .statediagram-note .nodeLabel{color:black;}#container .statediagram .edgeLabel{color:red;}#container #dependencyStart,#container #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#container .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#container :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><defs><marker orient="auto" markerUnits="userSpaceOnUse" markerHeight="14" markerWidth="20" refY="7" refX="19" id="container_stateDiagram-barbEnd"><path d="M 19,7 L9,13 L14,7 L9,1 Z"></path></marker></defs><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#container_stateDiagram-barbEnd)" style="fill:none;" class="edge-thickness-normal edge-pattern-solid transition" id="edge0" d="M228,22L228,30.167C228,38.333,228,54.667,228,71C228,87.333,228,103.667,228,111.833L228,120"></path><path marker-end="url(#container_stateDiagram-barbEnd)" style="fill:none;" class="edge-thickness-normal edge-pattern-solid transition" id="edge1" d="M202.194,160L186.495,172.167C170.796,184.333Line truncated

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

@@ -1 +0,0 @@
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1069.36669921875px;" viewBox="0 0 1069.36669921875 551.9166870117188" role="graphics-document document" aria-roledescription="flowchart-v2"><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-size:16px;fill:#262626;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:#000000;stroke:#000000;}#export-svg .edge-thickness-normal{stroke-width:1px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#3ECF8E;stroke:#3ECF8E;}#export-svg .marker.cross{stroke:#3ECF8E;}#export-svg svg{font-size:16px;}#export-svg p{margin:0;}#export-svg .label{color:#333;}#export-svg .cluster-label text{fill:#000000;}#export-svg .cluster-label span{color:#000000;}#export-svg .cluster-label span p{background-color:transparent;}#export-svg .label text,#export-svg span{fill:#333;color:#333;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#3ECF8E;stroke:#262626;stroke-width:1px;}#export-svg .rough-node .label text,#export-svg .node .label text,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-anchor:middle;}#export-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#export-svg .rough-node .label,#export-svg .node .label,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-align:center;}#export-svg .node.clickable{cursor:pointer;}#export-svg .root .anchor path{fill:#3ECF8E!important;stroke-width:0;stroke:#3ECF8E;}#export-svg .arrowheadPath{fill:#0b0b0b;}#export-svg .edgePath .path{stroke:#3ECF8E;stroke-width:1px;}#export-svg .flowchart-link{stroke:#3ECF8E;fill:none;}#export-svg .edgeLabel{background-color:#262626;text-align:center;}#export-svg .edgeLabel p{background-color:#262626;}#export-svg .edgeLabel rect{opacity:0.5;background-color:#262626;fill:#262626;}#export-svg .labelBkg{background-color:rgba(38, 38, 38, 0.5);}#export-svg .cluster rect{fill:#FFFFF8;stroke:hsl(0, 0%, 90%);stroke-width:1px;}#export-svg .cluster text{fill:#000000;}#export-svg .cluster span{color:#000000;}#export-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#export-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#262626;}#export-svg rect.text{fill:none;stroke-width:0;}#export-svg .icon-shape,#export-svg .image-shape{background-color:#262626;text-align:center;}#export-svg .icon-shape p,#export-svg .image-shape p{background-color:#262626;padding:2px;}#export-svg .icon-shape rect,#export-svg .image-shape rect{opacity:0.5;background-color:#262626;fill:#262626;}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#262626;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:url(#export-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#export-svg [data-look="neo"].node path{stroke:url(#export-svg-gradient);stroke-width:1;}#export-svg [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#export-svg [data-look="neo"].node .neo-line path{stroke:#262626;filter:none;}#export-svg [data-look="neo"].node circle{stroke:url(#export-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#export-svg [data-look="neo"].node circle .state-start{fill:#000000;}#export-svg [data-look="neo"].statediagram-cluster rect{fill:#3ECF8E;stroke:url(#export-svg-gradient);stroke-width:1;}#export-svg [data-look="neo"].icon-shape .icon{fill:url(#export-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#export-svg [data-look="neo"].icon-shape .icon-neo path{stroke:url(#export-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#export-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#export-svg .question&gt;*{fill:#3ECF8E!important;stroke:#262626!important;stroke-width:2px!imporLine truncated

Before

Width:  |  Height:  |  Size: 31 KiB

@@ -1,102 +0,0 @@
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1181.37px; background: rgb(23, 23, 25);" viewBox="0 0 1181.36669921875 569.9166870117188" role="graphics-document document" aria-roledescription="flowchart-v2"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION &amp; CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
*/
@font-face {
font-family: 'Recursive Variable';
font-style: normal;
font-display: swap;
font-weight: 300 1000;
src: url("data:font/woff2;base64,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 truncated
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-size:16px;fill:#262626;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);stroke:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#3ECF8E;stroke:#3ECF8E;}#export-svg .marker.cross{stroke:#3ECF8E;}#export-svg svg{font-size:16px;}#export-svg p{margin:0;}#export-svg .label{color:#e0dfdf;}#export-svg .cluster-label text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .cluster-label span{color:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .cluster-label span p{background-color:transparent;}#export-svg .label text,#export-svg span{fill:#e0dfdf;color:#e0dfdf;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#111113;stroke:#262626;stroke-width:2px;}#export-svg .rough-node .label text,#export-svg .node .label text,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-anchor:middle;}#export-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#export-svg .rough-node .label,#export-svg .node .label,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-align:center;}#export-svg .node.clickable{cursor:pointer;}#export-svg .root .anchor path{fill:#3ECF8E!important;stroke-width:0;stroke:#3ECF8E;}#export-svg .arrowheadPath{fill:#cccccc;}#export-svg .edgePath .path{stroke:#3ECF8E;stroke-width:2px;}#export-svg .flowchart-link{stroke:#3ECF8E;fill:none;}#export-svg .edgeLabel{background-color:#262626;text-align:center;}#export-svg .edgeLabel p{background-color:#262626;}#export-svg .edgeLabel rect{opacity:0.5;background-color:#262626;fill:#262626;}#export-svg .labelBkg{background-color:rgba(38, 38, 38, 0.5);}#export-svg .cluster rect{fill:#1E1A2E;stroke:#BDBCCC;stroke-width:2px;}#export-svg .cluster text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .cluster span{color:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-size:12px;background:#ffffff;border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#export-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#262626;}#export-svg rect.text{fill:none;stroke-width:0;}#export-svg .icon-shape,#export-svg .image-shape{background-color:#262626;text-align:center;}#export-svg .icon-shape p,#export-svg .image-shape p{background-color:#262626;padding:2px;}#export-svg .icon-shape rect,#export-svg .image-shape rect{opacity:0.5;background-color:#262626;fill:#262626;}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#262626;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#262626;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#262626;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#262626;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#262626;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node circle .state-start{fill:#000000;}#export-svg [data-look="neo"].statediagram-cluster rect{fill:#16141F;stroke:#262626;stroke-width:2;}#export-svg [data-look="neo"].icon-shape .icon{fill:#262626;filter:url(#drop-shadow);}#export-svg [data-look="neo"].icon-shape .icon-neo path{stroke:#262626;filter:url(#drop-shadow);}#export-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#export-svg .question&gt;*{fill:#3bb37c!important;stroke:#262626!important;stroke-width:2px!important;color:#fff!important;}#export-svg .question span{fill:#3bb37c!important;stroke:#262626!important;stroke-width:2px!important;color:#fff!important;}#export-svg .question tspan{fill:#fff!important;}#export-sLine truncated

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

@@ -1 +0,0 @@
<svg id="mermaid-ql8o97suu" width="1005.05859375" xmlns="http://www.w3.org/2000/svg" class="flowchart" height="1679.515625" viewBox="0 0 1005.05859375 1679.515625" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#mermaid-ql8o97suu{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:14px;fill:#ededed;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-ql8o97suu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-ql8o97suu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-ql8o97suu .error-icon{fill:#262626;}#mermaid-ql8o97suu .error-text{fill:#ededed;stroke:#ededed;}#mermaid-ql8o97suu .edge-thickness-normal{stroke-width:1px;}#mermaid-ql8o97suu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-ql8o97suu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-ql8o97suu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-ql8o97suu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-ql8o97suu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-ql8o97suu .marker{fill:#525252;stroke:#525252;}#mermaid-ql8o97suu .marker.cross{stroke:#525252;}#mermaid-ql8o97suu svg{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:14px;}#mermaid-ql8o97suu p{margin:0;}#mermaid-ql8o97suu .label{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:#ededed;}#mermaid-ql8o97suu .cluster-label text{fill:#ededed;}#mermaid-ql8o97suu .cluster-label span{color:#ededed;}#mermaid-ql8o97suu .cluster-label span p{background-color:transparent;}#mermaid-ql8o97suu .label text,#mermaid-ql8o97suu span{fill:#ededed;color:#ededed;}#mermaid-ql8o97suu .node rect,#mermaid-ql8o97suu .node circle,#mermaid-ql8o97suu .node ellipse,#mermaid-ql8o97suu .node polygon,#mermaid-ql8o97suu .node path{fill:#171717;stroke:#404040;stroke-width:1px;}#mermaid-ql8o97suu .rough-node .label text,#mermaid-ql8o97suu .node .label text,#mermaid-ql8o97suu .image-shape .label,#mermaid-ql8o97suu .icon-shape .label{text-anchor:middle;}#mermaid-ql8o97suu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-ql8o97suu .rough-node .label,#mermaid-ql8o97suu .node .label,#mermaid-ql8o97suu .image-shape .label,#mermaid-ql8o97suu .icon-shape .label{text-align:center;}#mermaid-ql8o97suu .node.clickable{cursor:pointer;}#mermaid-ql8o97suu .root .anchor path{fill:#525252!important;stroke-width:0;stroke:#525252;}#mermaid-ql8o97suu .arrowheadPath{fill:rgba(255, 255, 255, 0);}#mermaid-ql8o97suu .edgePath .path{stroke:#525252;stroke-width:2.0px;}#mermaid-ql8o97suu .flowchart-link{stroke:#525252;fill:none;}#mermaid-ql8o97suu .edgeLabel{background-color:#171717;text-align:center;}#mermaid-ql8o97suu .edgeLabel p{background-color:#171717;}#mermaid-ql8o97suu .edgeLabel rect{opacity:0.5;background-color:#171717;fill:#171717;}#mermaid-ql8o97suu .labelBkg{background-color:rgba(23, 23, 23, 0.5);}#mermaid-ql8o97suu .cluster rect{fill:#1a1a1a;stroke:#404040;stroke-width:1px;}#mermaid-ql8o97suu .cluster text{fill:#ededed;}#mermaid-ql8o97suu .cluster span{color:#ededed;}#mermaid-ql8o97suu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px;background:#262626;border:1px solid #525252;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-ql8o97suu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ededed;}#mermaid-ql8o97suu rect.text{fill:none;stroke-width:0;}#mermaid-ql8o97suu .icon-shape,#mermaid-ql8o97suu .image-shape{background-color:#171717;text-align:center;}#mermaid-ql8o97suu .icon-shape p,#mermaid-ql8o97suu .image-shape p{background-color:#171717;padding:2px;}#mermaid-ql8o97suu .icon-shape rect,#mermaid-ql8o97suu .image-shape rect{opacity:0.5;background-color:#171717;fill:#171717;}#mermaid-ql8o97suu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-ql8o97suu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-ql8o97suu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="mermaid-ql8o97suu_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker><marker id="mermaid-ql8o97suu_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker><marker id="mermaid-qLine truncated

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 933 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB