├── .gitignore ├── .gitpod.yml ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── components ├── base_link.tsx ├── counters.module.css ├── counters.tsx ├── icons │ └── WeChat.tsx └── preamble.tsx ├── next-env.d.ts ├── next.config.js ├── package.json ├── pages ├── [dark_forest │ ├── _meta.json │ └── plant.mdx ├── _app.mdx ├── _meta.json ├── eth │ └── 23.8.9-mev-info.mdx ├── index.mdx ├── rust_vs_golang │ └── 1-sin-cos.mdx └── zk │ ├── 1-zk-SNARKs-intro.mdx │ ├── 2-zk-SNARKs-info.mdx │ ├── 3-zk-SNARKs-use-in-solidity.mdx │ └── _meta.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public ├── 2023-08-24-02-30-39.png ├── 2023-08-25-00-00-26.png └── 2023-08-31-18-10-30.png ├── sources ├── readme.md └── zk │ ├── .gitignore │ ├── README.md │ ├── contracts │ ├── master.sol │ └── verifier.sol │ ├── hardhat.config.ts │ ├── package.json │ ├── scripts │ └── deploy.ts │ ├── test │ └── verifier.test.ts │ ├── tsconfig.json │ ├── yarn.lock │ └── zok │ ├── abi.json │ ├── deposit.zok │ ├── out │ ├── out.r1cs │ ├── out.wtns │ ├── proof.json │ ├── proving.key │ ├── verification.key │ └── witness ├── style.css ├── tailwind.config.js ├── theme.config.tsx └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | .next -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | # This configuration file was automatically generated by Gitpod. 2 | # Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml) 3 | # and commit this file to your remote git repository to share the goodness with others. 4 | 5 | # Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart 6 | 7 | tasks: 8 | - init: pnpm install && pnpm run build 9 | command: pnpm run start 10 | 11 | 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "pasteImage.basePath": "${currentFileDir}", 3 | "pasteImage.path": "${projectRoot}/static", 4 | "mdx.experimentalLanguageServer": true 5 | } 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Shu Ding 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blog 2 | 3 | 盒子的博客 4 | 作者:[@BoxMrChen](https://twitter.com/home) 5 | 6 | 进入交流群:欢迎添加个人微信`Im3boxtech`,备注`进群`,我会拉你进入交流群。 7 | 8 | 如果你有什么想了解的可以在群内提出进行交流讨论。 9 | 10 | 欢迎参与共建计划,编写更多的文章,让更多的人了解区块链技术。 11 | 12 | ## 贡献者 13 | 14 | Box:@BoxMrChen 15 | -------------------------------------------------------------------------------- /components/base_link.tsx: -------------------------------------------------------------------------------- 1 | import { Link, useConfig } from "nextra-theme-docs"; 2 | 3 | export function BaseLink({ 4 | href, 5 | children, 6 | }: { 7 | href: string; 8 | children: React.ReactNode; 9 | }) { 10 | let { docsRepositoryBase } = useConfig(); 11 | if (!docsRepositoryBase.endsWith("/")) docsRepositoryBase += "/"; 12 | 13 | return {children}; 14 | } 15 | -------------------------------------------------------------------------------- /components/counters.module.css: -------------------------------------------------------------------------------- 1 | .counter { 2 | border: 1px solid #ccc; 3 | border-radius: 5px; 4 | padding: 2px 6px; 5 | margin: 12px 0 0; 6 | } 7 | -------------------------------------------------------------------------------- /components/counters.tsx: -------------------------------------------------------------------------------- 1 | // Example from https://beta.reactjs.org/learn 2 | 3 | import { useState } from 'react' 4 | import styles from './counters.module.css' 5 | 6 | function MyButton() { 7 | const [count, setCount] = useState(0) 8 | 9 | function handleClick() { 10 | setCount(count + 1) 11 | } 12 | 13 | return ( 14 |
15 | 18 |
19 | ) 20 | } 21 | 22 | export default function MyApp() { 23 | return 24 | } 25 | -------------------------------------------------------------------------------- /components/icons/WeChat.tsx: -------------------------------------------------------------------------------- 1 | export function WeChatIcon({ className }: { className?: string }) { 2 | return ( 3 | 10 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /components/preamble.tsx: -------------------------------------------------------------------------------- 1 | import { Callout, Link } from "nextra-theme-docs"; 2 | import { WeChatIcon } from "./icons/WeChat"; 3 | 4 | export function Preamble() { 5 | return ( 6 | 7 |
8 | 文章作者: @BoxMrChen 9 | ,欢迎转载,转载请注明出处。 10 |
11 |
12 | 文章 Github 仓库:{" "} 13 | 14 | https://github.com/nishuzumi/blog 15 | 16 | 欢迎Star。如果文章有误,欢迎提PR。 17 |
18 |
19 | 进入交流群:欢迎添加个人微信{" "} 20 | 21 | Im3boxtech 22 | 23 | ,备注`进群`,我会拉你进入交流群。 24 |
25 |
26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | const withNextra = require('nextra')({ 2 | theme: 'nextra-theme-docs', 3 | themeConfig: './theme.config.tsx', 4 | }) 5 | 6 | module.exports = withNextra() 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextra-docs-template", 3 | "version": "0.0.1", 4 | "description": "Nextra docs template", 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/shuding/nextra-docs-template.git" 13 | }, 14 | "author": "Shu Ding ", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/shuding/nextra-docs-template/issues" 18 | }, 19 | "homepage": "https://github.com/shuding/nextra-docs-template#readme", 20 | "dependencies": { 21 | "next": "^13.0.6", 22 | "nextra": "latest", 23 | "nextra-theme-docs": "latest", 24 | "react": "^18.2.0", 25 | "react-dom": "^18.2.0" 26 | }, 27 | "devDependencies": { 28 | "@types/node": "18.11.10", 29 | "autoprefixer": "^10.4.15", 30 | "postcss": "^8.4.29", 31 | "tailwindcss": "^3.3.3", 32 | "typescript": "^4.9.3" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pages/[dark_forest/_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "plant":{ 3 | "display":"hidden" 4 | } 5 | } -------------------------------------------------------------------------------- /pages/[dark_forest/plant.mdx: -------------------------------------------------------------------------------- 1 | # 星球 2 | 3 | ## 星球代码 4 | 5 | Path: eth/contracts/DFTypes.sol 6 | 7 | ```sol 8 | struct Planet { 9 | address owner; // 星球的当前所有者的以太坊地址 10 | uint256 range; // 从该星球可以发送舰队到达的最远距离 11 | uint256 speed; // 从该星球发送的舰队的移动速度 12 | uint256 defense; // 星球的防御力,可能影响战斗结果 13 | uint256 population; // 星球上的当前人口或能量 14 | uint256 populationCap; // 星球的人口或能量上限 15 | uint256 populationGrowth; // 星球人口或能量的增长率 16 | uint256 silverCap; // 星球上银币的上限 17 | uint256 silverGrowth; // 星球上银币的增长率 18 | uint256 silver; // 星球上的当前银币数量 19 | uint256 planetLevel; // 星球的等级,可能影响其其他属性 20 | PlanetType planetType; // 星球的类型,例如气态、岩石等 21 | bool isHomePlanet; // 标记该星球是否是玩家的主星 22 | bool isInitialized; // 标记该星球是否已被初始化或被玩家发现 23 | uint256 createdAt; // 星球创建的时间或区块 24 | uint256 lastUpdated; // 星球上次更新的时间或区块 25 | uint256 perlin; // 可能与星球的随机生成或地形有关的噪音值 26 | SpaceType spaceType; // 星球所在的空间类型 27 | uint256 upgradeState0; // 星球的第一个升级状态 28 | uint256 upgradeState1; // 星球的第二个升级状态 29 | uint256 upgradeState2; // 星球的第三个升级状态 30 | uint256 hatLevel; // 星球的“帽子”等级,可能是一种装饰或标志 31 | bool hasTriedFindingArtifact; // 标记玩家是否尝试在该星球上找到遗物 32 | uint256 prospectedBlockNumber; // 玩家上次在该星球上勘探的区块号 33 | bool destroyed; // 标记该星球是否已被摧毁 34 | uint256 spaceJunk; // 星球上的太空垃圾数量 35 | uint256 pausers; // 星球上的“暂停”数量或状态 36 | uint256 energyGroDoublers; // 与星球能量增长加倍器有关 37 | uint256 silverGroDoublers; // 与星球银币增长加倍器有关 38 | address invader; // 当前正在入侵星球的玩家地址 39 | uint256 invadeStartBlock; // 入侵开始的区块号 40 | address capturer; // 最后一次成功捕获星球的玩家地址 41 | uint256 locationId; // 星球的唯一位置ID 42 | } 43 | ``` 44 | -------------------------------------------------------------------------------- /pages/_app.mdx: -------------------------------------------------------------------------------- 1 | import "../style.css"; 2 | 3 | export default function App({ Component, pageProps }) { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /pages/_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "index":{ 3 | "title":"首页", 4 | "display": "hidden" 5 | }, 6 | "zk": "ZK 系列", 7 | "eth": "ETH 系列", 8 | "rust_vs_golang": "Rust VS Golang", 9 | "dark_forest":{ 10 | "title":"Dark Forest 游戏分析", 11 | "display": "hidden" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /pages/eth/23.8.9-mev-info.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: MEV 资料 3 | --- 4 | 5 | # MEV 资料 6 | 7 | 8 | 总结了一点 MEV 的资料,欢迎补充。 9 | 10 | ## 有用的链接 11 | 12 | ### Artemis:https://www.paradigm.xyz/2023/05/artemis 13 | 14 | Paradigm 出品的 MEV 框架,由 Rust 编写。 15 | 16 | 在 crates/strategies 文件目录下,有两个范例 17 | 18 | - Uniswap V2-V3 套利策略 19 | - Opensea - Sudo 套利策略 20 | 21 | ### cake_sniper:https://github.com/Supercycled/cake_sniper 22 | 23 | 一个抢跑 MEV 的机器人。由 Python 编写,代码比较老旧,可以用于学习思路。 24 | 25 | ### rusty-sando:https://github.com/mouseless-eth/rusty-sando 26 | 27 | 用 Huff 和 Artemis 编写的套利机器人,具有 Uniswap V2/V3 的三明治攻击机器人。 28 | 29 | ### awesome-MEV-resources:https://github.com/0xalpharush/awesome-MEV-resources 30 | 31 | 超多超全的 MEV 资料。 32 | -------------------------------------------------------------------------------- /pages/index.mdx: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | 欢迎来到 ByteMahou -(字节魔法)。这里是一个专门用于分享高质量 Web3 技术文章的地方。 4 | 5 | 如果你有任何想要分享的文章,欢迎随时到 Github 进行贡献。 6 | 7 | ## 主要贡献者 8 | 9 | BoxChen 10 | -------------------------------------------------------------------------------- /pages/rust_vs_golang/1-sin-cos.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Rust多线程浮点数运算比Golang慢一倍? 3 | --- 4 | 最近遇到一个有趣的问题,有人在测试Rust的性能的时候发现Rust比Golang慢竟然一倍。 5 | ```shell 6 | Project Execution Time (s) 7 | Rust 2.9696159 8 | Go 1.981306 9 | ``` 10 | 并且评论中大部分人都认为是多线程代码中的Mutex导致,但是根据我初步分析来看,和Mutex完全没用关系。 11 | 代码如下。 12 | https://github.com/nishuzumi/rust-vs-golang/blob/main/sin-cos/rust/src/main.rs 13 | ```rust 14 | use num_cpus; 15 | use std::{ 16 | sync::{Arc, Mutex}, 17 | thread, 18 | }; 19 | 20 | use std::time::Instant; 21 | fn main() { 22 | let num_cpus = num_cpus::get(); 23 | let start_time = Instant::now(); 24 | 25 | let mut handles = vec![]; 26 | let result = Arc::new(Mutex::new(vec![0.0; num_cpus])); 27 | 28 | for i in 0..num_cpus { 29 | let result = Arc::clone(&result); 30 | let handle = thread::spawn(move || { 31 | let mut local_result = 0.0; 32 | for j in 0..100_000_000 { 33 | local_result += (j as f64).sin() * (j as f64).cos(); 34 | } 35 | 36 | let mut result = result.lock().unwrap(); 37 | result[i] = local_result; 38 | println!("Thread {} result: {}", i, local_result); 39 | }); 40 | handles.push(handle); 41 | } 42 | 43 | for handle in handles { 44 | handle.join().unwrap(); 45 | } 46 | 47 | let final_result = result.lock().unwrap().iter().sum::(); 48 | 49 | println!("Elapsed time: {:?}", start_time.elapsed().as_secs_f64()); 50 | println!("Final result: {}", final_result); 51 | } 52 | ``` 53 | 而Golang部分的代码如下 54 | https://github.com/nishuzumi/rust-vs-golang/blob/main/sin-cos/golang/main.go 55 | ```golang 56 | package main 57 | 58 | import ( 59 | "fmt" 60 | "math" 61 | "runtime" 62 | "sync" 63 | "time" 64 | ) 65 | 66 | func main() { 67 | numCPU := runtime.NumCPU() 68 | fmt.Printf("Running with %d CPUs\n", numCPU) 69 | 70 | var wg sync.WaitGroup 71 | 72 | start := time.Now() 73 | 74 | for i := 0; i < numCPU; i++ { 75 | wg.Add(1) 76 | go func(id int) { 77 | defer wg.Done() 78 | result := 0.0 79 | for j := 0; j < 1e8; j++ { 80 | result += math.Sin(float64(j)) * math.Cos(float64(j)) 81 | } 82 | fmt.Printf("Goroutine %d result: %f\n", id, result) 83 | }(i) 84 | } 85 | 86 | wg.Wait() 87 | 88 | elapsed := time.Since(start) 89 | fmt.Printf("Elapsed time: %f\n", elapsed.Seconds()) 90 | } 91 | ``` 92 | 93 | 初步分析来看,rust虽然用了一个毫无必要的锁,但是这个锁并没有堵塞线程的迹象。而运行出来的结果是。 94 | ```shell 95 | Project Execution Time (s) 96 | Rust 2.9696159 97 | Go 1.981306 98 | ``` 99 | 很明显,Rust的速度反而没有Golang快,慢了一秒。这是为什么呢?可以思考一下 马上揭晓答案。 100 | 101 | ### 答案 102 | 原因在于Window上的一些小问题,以上代码在Linux和macos下运行的速度是正常的,golang比rust慢。 103 | 104 | 主要原因是,golang的math仓库是另外一套实现,而rust使用的是libm进行计算。在同样的环境下c++和rust的速度基本一致。而golang的math实现虽然快,但是损失了精度,详细可以见这里的解释。 105 | https://github.com/nishuzumi/rust-vs-golang/blob/main/sin-cos/readme.md 106 | 107 | ### 结尾 108 | 最近发现了很多这样的速度差异对比,我感觉很有意思,于是创建了一个仓库,用于记录这些差别。 109 | 110 | https://github.com/nishuzumi/rust-vs-golang 111 | 112 | 如果你也有一些速度差异的例子,欢迎到Github中进行补充。 -------------------------------------------------------------------------------- /pages/zk/1-zk-SNARKs-intro.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: zk-SNARKs 简介 3 | --- 4 | 5 | # zk-SNARKs 简介 6 | 7 | 8 | 9 | 在这篇文章中,我们的目标是从实用的角度对 zk-SNARKs 进行概述。我们将把实际的数学问题视为一个黑箱,并试图围绕我们如何使用它们来发展一些直觉。我们还将展示一项关于[ 10 | 在以太坊中集成 zk-SNARKs 的最近工作的简单应用 ](https://blog.ethereum.org/2017/01/19/update-integrating-zcash-ethereum/)。 11 | 12 | ## 零知识证明 13 | 14 | 零知识证明的目标是让验证者能够确信证明者掌握了一个满足某种关系的秘密参数,也就是所谓的见证人,而无需向验证者或任何其他人揭示这个见证人。 15 | 16 | 我们可以更具体地将其想象为一个程序,标记为 C ,接收两个输入: `C(x, w)`。输入 x 是公开输入,而 w 是秘密见证输入。程序的输出是布尔值,即 true 或 false 。然后,目标是给定特定的公开输入 x ,证明证明者知道一个秘密输入 w ,使得 `C(x,w) == true` 。 17 | 18 | 我们将专门讨论非交互式零知识证明。这意味着证明本身是一块可以在无需证明者任何交互的情况下进行验证的数据。 19 | 20 | ## 示例程序 21 | 22 | 假设 Bob 得到了某个值的哈希 H ,他希望有证据证明 Alice 知道哈希为 H 的值 s 。通常,Alice 会通过给 Bob s 来证明这一点,然后 Bob 会计算哈希并检查它是否等于 H 。 23 | 24 | 然而,假设 Alice 不想向 Bob 透露 s 的值,而只是想证明她知道这个值。她可以使用 `zk-SNARK` 来实现这一点。 25 | 26 | 我们可以使用以下程序来描述 Alice 的情况,这里以 Javascript 函数的形式编写: 27 | 28 | ``` 29 | function C(x, w) { return ( sha256(w) == x );} 30 | ``` 31 | 32 | > 这个程序不涉及任何 ZK 内容,他只是用于表示我们想要达到的效果是什么样。我们可以将其视为一个黑盒,我们将在下一节中讨论如何使用 zk-SNARKs 来构建这样的程序。 33 | 34 | 换句话说:该程序接收一个公共哈希 x 和一个秘密值 w ,如果 w 的 SHA-256 哈希等于 x ,则返回 true 。 35 | 36 | 将 Alice 的问题通过函数 `C(x,w)`进行翻译,我们可以看到 Alice 需要创建一个证明,证明她拥有 s ,使得 `C(H, s) == true` ,而无需揭示 s 。这就是 zk-SNARKs 解决的一般问题。 37 | 38 | ## zk-SNARK 的定义 39 | 40 | 一个 zk-SNARK 由三个算法 G, P, V 组成,定义如下: 41 | 42 | _密钥生成器 G_ 由一个秘密参数 `lambda` 和一个程序 C 组成 ,并生成两个公开可用的密钥,一个 _proving key_ pk(证明密钥) ,和一个 _verification key_ vk(验证密钥) 。这些密钥是公开参数,只需要使用程序 C 生成一次。 43 | 44 | _证明者 P_ 将证明密钥 pk 、公共输入 x 和见证 w 作为输入。该算法生成一个证明 `prf = P(pk, x, w)` ,证明者知道一个见证 w ,并且该见证满足程序的要求。 45 | 46 | _验证器 V_ 计算 `V(vk, x, prf)` ,如果证明是正确的,它将返回 true ,否则返回 false 。因此,如果证明者知道一个满足 C(x,w) == true 的见证 w ,这个函数就会返回真。 47 | 48 | 请注意在生成器中使用的秘密参数 lambda 。这个参数有时使得在现实世界的应用中使用 zk-SNARKs 变得棘手。原因在于,任何知道这个参数的人都可以生成假的证明。具体来说,给定任何程序 C 和公开输入 x ,知道 lambda 的人可以生成一个证明 fake_prf ,使得 `V(vk, x, fake_prf)` 评估为 true ,而无需知道秘密 w 。 49 | 50 | 因此,实际运行生成器需要一个非常安全的过程,以确保没有人了解并保存参数。这就是 Zcash 团队进行[极其复杂的仪式](https://electriccoin.co/blog/the-design-of-the-ceremony/)以生成证明密钥和验证密钥的原因,同时确保“有毒废料” lambda 在过程中被销毁。 51 | 52 | ## 针对示例程序的 zk-SNARK 53 | 54 | 在实际操作中, Alice 和 Bob 如何使用 zk-SNARK,以便 Alice 证明她知道上述示例中的秘密值? 55 | 首先,如上所述,我们将使用由以下函数定义的程序: 56 | 57 | ```javascript 58 | function C(x, w) { 59 | return sha256(w) == x; 60 | } 61 | ``` 62 | 63 | 首先,Bob 需要运行生成器 G,以创建证明密钥 pk 和验证密钥 vk。首先,随机生成 lambda,并将其作为输入: 64 | 65 | ``` 66 | (pk, vk) = G(C, lambda) 67 | ``` 68 | 69 | 请小心处理参数 lambda,因为如果 Alice 知道 lambda 的值,她将能够创建假的证明。Bob 将与 Alice 分享 pk 和 vk。 70 | 71 | Alice 现在将扮演证明者的角色。她需要证明她知道哈希值为已知哈希 H 的值 s。她运行证明算法 P,使用输入 pk、H 和 s 来生成证明 prf: 72 | 73 | ``` 74 | prf = P(pk, H, s) 75 | ``` 76 | 77 | 接下来,Alice 将证明 prf 呈现给 Bob ,Bob 运行验证函数 `V(vk, H, prf)`。在这种情况下,由于 Alice 正确地知道了秘密 s,所以会返回真值。Bob 可以确信 Alice 知道这个秘密,但 Alice 并不需要向 Bob 透露这个秘密。 78 | 79 | ## 可重用的证明和验证密钥 80 | 81 | 在我们上述的例子中,如果 Bob 想向 Alice 证明他知道一个秘密,那么他就不能使用 zk-SNARK,因为 Alice 无法知道 Bob 是否保存了 lambda 参数。Bob 完全有可能伪造证据。 82 | 83 | 如果一个程序对许多人有用(比如 Zcash 的例子),一个独立于 Alice 和 Bob 的可信赖的独立团队可以运行生成器,创建证明密钥 pk 和验证密钥 vk,而且这样做没有人会了解到 lambda。 84 | 85 | 任何相信该团队没有作弊的人,都可以在未来的互动中使用这些密钥。 86 | 87 | ## 以太坊中的 zk-SNARKs 88 | 89 | 开发者已经开始将 zk-SNARKs 集成到以太坊中。这看起来是什么样子呢?具体来说,你可以将验证算法的构建模块以预编译合约的形式添加到以太坊中。具体操作如下:在链下运行生成器,生成证明密钥和验证密钥。然后,任何证明者都可以使用证明密钥创建证明,这也是在链下完成的。然后,你可以在智能合约内部运行通用验证算法,使用证明、验证密钥和公开输入作为输入参数。然后,你可以使用验证算法的结果来触发其他链上活动。 90 | 91 | ## 示例:保密交易 92 | 93 | 以下是一个简单的例子,说明了 zk-SNARKs 如何帮助提高以太坊的隐私性。假设我们有一个简单的代币合约。通常,一个代币合约的核心是将地址映射到余额: 94 | 95 | ```javascript 96 | mapping (address => uint256) balances; 97 | ``` 98 | 99 | 我们将保留相同的基本核心,只是将余额替换为余额的哈希值: 100 | 101 | ```javascript 102 | mapping (address => bytes32) balanceHashes; 103 | ``` 104 | 105 | 我们不会隐藏交易的发送者或接收者。但我们会隐藏余额和发送的金额。这种属性有时被称为保密交易。 106 | 107 | 我们将使用两个 zk-SNARKs 来将代币从一个账户发送到另一个账户。发送者和接收者各创建一个证明。 108 | 109 | 通常在一个代币合约中,为了使大小值的交易有效,我们需要验证以下内容: 110 | 111 | ``` 112 | balances[fromAddress] >= value 113 | ``` 114 | 115 | 我们的 zk-SNARKs 需要证明这一点是成立的,以及更新后的哈希值与更新后的余额相匹配。 116 | 117 | 主要的思想是,发送者将使用他们的 _初始余额_ 和 _值_ 作为私有数据。使用 _初始余额_、_结束余额_ 和 _值的哈希_ 作为公开数据。同样,接收者将使用 _初始余额_ 和 _值_ 作为私有数据。使用 _初始余额_ 、 _结束余额_ 和 _值的哈希_ 作为公开数据。 118 | 119 | 以下是发送者的 zk-SNARK 程序,其中如前所述,x 代表公开数据,w 代表私有数据。 120 | 121 | ```javascript 122 | /** 123 | * @param x 公开数据 124 | * @param w 私有数据 125 | */ 126 | function senderFunction(x, w) { 127 | return ( 128 | w.senderBalanceBefore > w.value && // 确保发送者有足够的余额 129 | sha256(w.value) == x.hashValue && // 确保发送的值与公开的哈希值匹配 130 | sha256(w.senderBalanceBefore) == x.hashSenderBalanceBefore && // 确保发送者的初始余额与公开的哈希值匹配 131 | sha256(w.senderBalanceBefore - w.value) == x.hashSenderBalanceAfter // 确保发送者的结束余额与公开的哈希值匹配 132 | ); 133 | } 134 | ``` 135 | 136 | 接受者的 zk-SNARK 程序如下: 137 | 138 | ```javascript 139 | /** 140 | * @param x 公开数据 141 | * @param w 私有数据 142 | */ 143 | function receiverFunction(x, w) { 144 | return ( 145 | sha256(w.value) == x.hashValue && 146 | sha256(w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && 147 | sha256(w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter 148 | ); 149 | } 150 | ``` 151 | 152 | 这些程序会检查发送余额是否大于正在发送的值,并检查所有哈希是否匹配。一组受信任的人员将为我们的 zk-SNARKs 生成证明和验证密钥。我们称它们为 _confTxSenderPk_、_confTxSenderVk_、_confTxReceiverPk_ 和 _confTxReceiverVk_。 _confTxSenderPk_ 和 _confTxReceiverPk_ 将被用于生成证明,而 _confTxSenderVk_ 和 _confTxReceiverVk_ 将被用于验证证明。 153 | 154 | 在代币合约中使用 zk-SNARKs 可能会是这样的: 155 | 156 | ```solidity 157 | function transfer(address _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bytes zkProofSender, bytes zkProofReceiver) { 158 | bytes32 hashSenderBalanceBefore = balanceHashes[msg.sender]; 159 | bytes32 hashReceiverBalanceBefore = balanceHashes[_to]; 160 | 161 | bool senderProofIsCorrect = zksnarkverify(confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); 162 | 163 | bool receiverProofIsCorrect = zksnarkverify(confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); 164 | 165 | if(senderProofIsCorrect && receiverProofIsCorrect) { 166 | balanceHashes[msg.sender] = hashSenderBalanceAfter; 167 | balanceHashes[_to] = hashReceiverBalanceAfter; 168 | } 169 | } 170 | ``` 171 | 172 | 因此,区块链上唯一更新的只是余额的哈希值,而不是余额本身。然而,我们可以知道所有的余额都被正确地更新了,因为我们可以自己检查证明已经被验证过了。 173 | 174 | 通过上面的例子,我们也可以看到,在区块链上我们只进行了余额的 Hash 存储,而没有暴露真实的余额,这就对数据进行了保密,我们除了知道两者之间发生了交易,但是我们不知道具体交易金额,这就保证了交易的隐私性。 175 | 176 | ## 详细信息 177 | 178 | 上述的保密交易方案主要是为了给出一个实际的例子,说明我们如何在以太坊上使用 zk-SNARKs。要创建一个健全的保密交易方案,我们需要解决一些问题: 179 | 180 | - 用户需要在客户端跟踪他们的余额,如果你失去余额数据,那么你就失去了这个账户的控制权。余额或许可以用来自签名密钥的密钥加密并存储在链上。 181 | - 余额需要使用 32 字节的数据并熵编码,以防止反向解析哈希以计算余额。 182 | - 需要处理向未使用地址发送的边缘情况。 183 | - 发件人需要与收件人进行交互才能发送。我们可能会有一个系统,发件人可以使用他们的证明来启动交易。然后,收件人可以在区块链上看到他们有一个“待处理的入账交易”,并可以完成它。 184 | 185 | > 本文翻译自 [Consensys](https://consensys.net/blog/developers/introduction-to-zk-snarks/) 186 | > 翻译者:[@BoxMrChen](https://twitter.com/home) 187 | -------------------------------------------------------------------------------- /pages/zk/2-zk-SNARKs-info.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: zk-SNARKs 相关知识 3 | --- 4 | 5 | # zk-SNARKs 相关知识 6 | 7 | 8 | 9 | ## 曲线知识 10 | 11 | ### Pedersen 哈希 12 | 13 | 在 ZK 电路中,SHA256 是比较昂贵的计算电路,虽然他在 EVM 中具有内置计算方式,但是他的计算成本还是比较高的。所以,我们需要一个更加轻量级的哈希函数。 14 | 15 | 但是,Pedersen 哈希是一个特殊的哈希,他是通过 BabyJubJub 椭圆曲线来实现的。所以,我们在计算后得到的数据其实是椭圆函数上一个点的 Y 值附加一个 X 坐标符号,一般情况下,我们会使用`unpack`函数来将这个点的值转换,并且只取 X 坐标的值作为哈希值。 16 | 17 | ### BabyJubJub 椭圆曲线 18 | 19 | ETH 中确实具有一个椭圆曲线函数,但是加入 BabyJubJub 的理由主要是因这个曲线函数更加对 ZK 电路友好。并且能完成很多 ZK 电路功能。 20 | 21 | 不过可惜的是,目前 ETH 并不原生支持 BabyJubJub 曲线。详细可以查看这个链接:https://eips.ethereum.org/EIPS/eip-2494 22 | 23 | 目前来看,只有在链下使用 BabyJubJub 曲线,然后将结果提交到链上。 24 | 25 | 同时,一半情况下,我们建议开发者使用 ZK 电路中对电路友好的内置函数,比如说,我们可以使用 `pedersenHash` 来代替 `sha256`。这样做的目的主要是降低电路生成和验证成本,在同样的效果下达到最佳的性能。 26 | 27 | ## 证明模式 28 | 29 | ### 延展性攻击 30 | 31 | 所谓的延展性攻击,就是破坏了 ZK 对证明的确定性生成特性,比如说,我们可以通过一个证明来生成多个证明,这样就会导致我们的证明不再是确定性的,而是可以被重新生成的。 32 | 那么如果有程序使用了这个证明中 Proof 的某些值作为唯一校验,那么他就有被攻击的风险。比如,如果 Tornado Cash 使用了`proof.a.x`作为 nullifier,那么攻击者就可以使用一个输入来生成多个证明,然后使用这些证明来进行攻击。 33 | 34 | ## Groth16 和 GM17 35 | 36 | Groth16 和 GM17 是两种不同的的证明模式,他们之间有少许区别,主要区别在于证明方式和曲线支持程度不同。主要区别在于。 37 | 38 | ### 链下计算: 39 | 40 | 1. Groth16: 41 | 42 | - 通常更快的证明生成时间。 43 | - 参数设置(Trusted Setup)通常只需要进行一次,适用于多个证明。 44 | 45 | 2. GM17: 46 | - 相对于 Groth16,证明生成时间可能会稍长。 47 | - 每个不同的电路通常需要自己的参数设置(Trusted Setup)。 48 | 49 | ### 链上费用(Gas 成本): 50 | 51 | 1. Groth16: 52 | 53 | - 通常需要更少的链上数据,因为 Groth16 的证明通常较小。 54 | - 由于证明大小较小,因此链上验证的 gas 成本通常也较低。 55 | 56 | 2. GM17: 57 | 58 | - 相对于 Groth16,可能需要更多的链上数据。 59 | - 由于证明通常较大,因此链上验证的 gas 成本可能会稍高。 60 | 61 | ### 适用场景: 62 | 63 | - Groth16: 由于其高效性和较低的链上成本,Groth16 通常用于需要频繁生成和验证证明的应用。 64 | - GM17: 由于其更灵活的参数设置,GM17 适用于需要多个不同电路的应用。 65 | 66 | ### 安全性: 67 | 68 | - Groth16: 更容易受到延展性攻击的影响,因此可能需要额外的安全措施(如使用 nullifier)。 69 | - GM17: 设计用于抵抗延展性攻击,但可能需要为每个不同的电路进行独立的参数设置。 70 | -------------------------------------------------------------------------------- /pages/zk/3-zk-SNARKs-use-in-solidity.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: zk-SNARKs 在 Solidity 中的使用 3 | --- 4 | 5 | # zk-SNARKs 在 Solidity 中的使用 6 | 7 | 8 | 9 | 本文章主要讲述了如何在 Solidity 中使用 zk-SNARKs,以及如何使用 ZoKrates 编译器来生成证明和验证合约。 10 | 11 | 这文章不会过于深入 zk-SNARKs 的技术原理,这文章目的是为让读者能够理解 sk-SNARKs 的技术能在 EVM 中达到什么效果,如何使用,并且能在代码中运用。 12 | 13 | ## zk-SNARKs 简介 14 | 15 | 关于 zk-SNARKs 的简短描述为,我们需要在 zk 电路中编写一段代码,这段代码的输入是一些公开的数据,输出是一些私有的数据。zk-SNARKs 的验证算法可以验证这段代码的输出是否正确,但是验证算法不会泄露任何私有数据。而 Solidity 合约的主要目的是验证 zk-SNARKs 的验证算法的结果,如果验证算法的结果正确,那么合约会执行一些操作。 16 | 17 | 也就是说,在 EVM 上,只是进行了结果的验证,并没有进行一些复杂的计算,这些计算都是在 zk 电路中进行的。而这部分 zk 电路,则是在链下进行的,然后将结果提交到链上。 18 | 19 | ## 在 Solidity 中使用 zk-SNARKs 20 | 21 | 首先,我们需要知道 zk-SNARKs 可以完成什么功能,其实很简单,我们可以简单的认为,zk-SNARKs 可以完成对一个函数运算结果的校验,比如说,我们有一个函数,输入是三个数字,输出是一个数字,我们可以使用 zk-SNARKs 来校验这个函数的输出是否正确。但是我们并不需要知道输入的三个数字是什么,只需要知道这个函数的输出即可,也就是说,在一个函数完成计算时,我们可以知道确实是有这么三个数他能符合这个函数的输入,并且能输出正确结果,但是我们并不知道这三个数是什么。 22 | 23 | 在 Solidity 中,我们可以使用 zk-SNARKs 来完成对一个函数的校验,但是我们需要知道这个函数的输入和输出,然后我们可以使用 ZoKrates 编译器来生成 zk 电路,然后将 zk 电路的代码放到 Solidity 合约中,然后在合约中完成对 zk 电路的验证。 24 | 25 | ### 安装 ZoKrates 编译器 26 | 27 | 安装 [ZoKrates](https://github.com/Zokrates/ZoKrates) 28 | 29 | ```bash 30 | curl -LSfs get.zokrat.es | sh 31 | ``` 32 | 33 | 也可以选择其他安装方式,具体选择查看他们的 Github 页面。 34 | 35 | ![安装完成](/2023-08-24-02-30-39.png) 36 | 37 | ### 编写 zk 电路 38 | 39 | 从上一章节我们浅显的知道,一个 zk-SNARKs 电路需要的最基本的东西为: 40 | 41 | - 一个函数 - 我们需要有一个函数对数据进行运算,也就是程序 C 42 | - lambda - 所谓的“有毒废料”,其实就是一个 root key,我们需要通过它来生成 pk 和 vk 43 | 44 | 有了这两个基础条件,用户就可以通过 pk,目标值,输入值来生成证明 w。 45 | 随后,我们的验证程序通过 vk,目标值,证明 w 来验证证明的正确性。 46 | 47 | 我们先假设有这么一个第三方,他可以安全的生成 lambda,然后安全的将程序和 lambda 进行运算生成 vk 和 pk。 48 | 49 | 那么现在有两个新的角色,user 和 project。user 是用户,他确确实实拥有着一些数据,project 是项目合约,他需要验证用户的数据是否正确。 50 | 51 | ### 一个函数 52 | 53 | 我们首先需要一个函数,但是我并不打算举一些简单例子,因为我觉得这样做非常没有意义,因为 zk-SNARKs 的主要目的是为了验证一些复杂的函数,而不是一些简单的函数。 54 | 55 | 比如,我们现在需要生成一个存款凭证,有这个凭证,我们可以在任何地方取出这笔钱,但是我们并不知道这笔钱是谁的,我们只知道这笔钱是谁存的,存了多少,以及存款的时间。 56 | 57 | 首先我们需要一个存款函数,这个函数的输入为存款的金额,和一个随机数,然后输出为一个存款凭证。任何拥有这个凭证的人都可以取出这笔资金。所以,实际上,我们只需要编写验证知道这个凭证的验证函数即可。 58 | 59 | ```zok 60 | import "hashes/sha256/512bit" as sha256; 61 | import "utils/pack/u32/nonStrictUnpack256" as unpack256; 62 | 63 | // deposit_amount: 存款金额 64 | // secret: 随机数 65 | // returns: 用于取款的commitment 66 | def main(field deposit_amount, private field secret) -> u32[8] { 67 | return sha256(unpack256(deposit_amount), unpack256(secret)); 68 | } 69 | ``` 70 | 71 | 关于 Zok 的语法和用法这里不过多描述,具体可以参考官网,这里简单解释一下,这个函数的输入为两个数字,一个是存款金额,一个是随机数,然后输出为一个 u32[8],实际上就是 uint256.同时我们注意一下,参数中 deposit_amount 没有 private 关键词,说明这个参数是公开数据。 72 | 73 | ### 编译文件 74 | 75 | 这部分内容在 zokrates 中有讲述方式为 76 | 77 | ```zok 78 | # compile 79 | zokrates compile -i deposit.zok 80 | # perform the setup phase 81 | zokrates setup 82 | # execute the program 83 | zokrates compute-witness -a 337 113569 84 | # generate a proof of computation 85 | zokrates generate-proof 86 | # export a solidity verifier 87 | zokrates export-verifier 88 | # or verify natively 89 | zokrates verify 90 | ``` 91 | 92 | 运行完成后会生成一堆文件,我们需要的是 proof.json, proving.key, verification.key, verifier.sol, out。 93 | 94 | 大部分其实都是模版文件生成文件可能不一样的地方在于 Verifier 合约中 verifyingKey,当然,我们阅读这个文件其实意义也不大,因为这里面全是一大堆数字和运算。 95 | 实际上我们需要看的内容就是这些 ∑ 96 | 97 | ```solidity 98 | function verifyTx( 99 | Proof memory proof, uint[8] memory input 100 | ) public view returns (bool r) { 101 | uint[] memory inputValues = new uint[](8); 102 | 103 | for(uint i = 0; i < input.length; i++){ 104 | inputValues[i] = input[i]; 105 | } 106 | if (verify(inputValues, proof) == 0) { 107 | return true; 108 | } else { 109 | return false; 110 | } 111 | } 112 | ``` 113 | 114 | 可以看到,我们需要两个参数,proof 和 input。至于这两个参数是干嘛的,我们暂时不过多深究。不过我们需要注意的是,在 inputs 中,所有的共有参数都会被加入到这个数组中,在数字最开头部分被推入。 115 | 116 | 比如,自动生成的 proof.json 文件就是一个有效的数据。 117 | 118 | ```json 119 | { 120 | "scheme": "gm17", 121 | "curve": "bn128", 122 | "proof": { 123 | "a": [ 124 | "0x05a83e3c3b3ff9d59bdffdcf7aa655f42b941b0063f82cf26516846056d09aa6", 125 | "0x018039b7de92979ef6251c877971888ae049d09a6b48e5aa98c23ef91550ed36" 126 | ], 127 | "b": [ 128 | [ 129 | "0x1e88e783456a27e4f02dde8c742610339e395eb0bbf7f7efc1113815dcf0a16f", 130 | "0x1cc9de9e60c6519ea69c9b3a71c0809ac7ae3389a598d66fc27d378738d5de29" 131 | ], 132 | [ 133 | "0x0715544abbc18e741620ff7c76cb2a7d3558ee157d23f275ab65c43c25357d07", 134 | "0x0344257236ba33a3ce7ce34b8d518f7572984036db6f77fc2fc13f51c548a837" 135 | ] 136 | ], 137 | "c": [ 138 | "0x177113e528c76661a03a8f3f072f29e684244297a62926a0000d3a7135c1441f", 139 | "0x18cf275d0bc621473688848946584af771afca42e4f2bd0ef1e5d06e0adefd0f" 140 | ] 141 | }, 142 | "inputs": [ 143 | "0x0000000000000000000000000000000000000000000000000000000000000151", 144 | "0x00000000000000000000000000000000000000000000000000000000bb3eada7", 145 | "0x000000000000000000000000000000000000000000000000000000004b704815", 146 | "0x00000000000000000000000000000000000000000000000000000000cddda451", 147 | "0x00000000000000000000000000000000000000000000000000000000ca701d2a", 148 | "0x000000000000000000000000000000000000000000000000000000001f278e64", 149 | "0x00000000000000000000000000000000000000000000000000000000ef16f074", 150 | "0x0000000000000000000000000000000000000000000000000000000040e13298", 151 | "0x0000000000000000000000000000000000000000000000000000000026c5da72" 152 | ] 153 | } 154 | ``` 155 | 156 | 至此,我们可以写一个简单合约。 157 | 158 | ```solidity 159 | // SPDX-License-Identifier: MIT 160 | pragma solidity ^0.8.0; 161 | 162 | import {Verifier} from "./verifier.sol"; 163 | 164 | contract Master { 165 | event Despoit(uint256 commitment, uint amount); 166 | 167 | mapping(uint => uint) public proofs; 168 | 169 | Verifier v; 170 | 171 | constructor() { 172 | v = new Verifier(); 173 | } 174 | 175 | function deposit(uint commitment) public payable { 176 | proofs[commitment] = msg.value; 177 | emit Despoit(commitment, msg.value); 178 | } 179 | 180 | function withdraw( 181 | uint commitment, 182 | Verifier.Proof memory proof, 183 | uint[9] memory inputs 184 | ) public { 185 | uint amount = inputs[0]; 186 | require(v.verifyTx(proof, inputs)); 187 | require(proofs[commitment] == amount); 188 | 189 | payable(msg.sender).transfer(amount); 190 | } 191 | } 192 | ``` 193 | 194 | 要注意的是 Verifier 合约中会出现两个`pragma solidity`,记得删掉中间那一个,保留最上面的那个,否则编译无法通过。 195 | 196 | ## 测试 197 | 198 | 首先我们需要明白一下标准流程,我们需要先进行 compile,setup,然后再进行 compute-witness,然后再进行 generate-proof,最后再进行 export-verifier。 199 | 200 | 但是这套流程并不是每次都必须的,因为这个是一个完整流程。我们需要进行一下区分。 201 | 202 | ### 必要条件 203 | 204 | - compile - 编译 zk 电路 - 只需要执行一次 这个功能会生成 out 文件和 abi.json 文件,这两个是编译后的程序。 205 | - setup - 生成 zk 电路的 pk 和 vk - 只需要执行一次 这个功能会生成 proving.key 和 verification.key 文件,这两个文件是 zk 电路的公钥和私钥。实际上在进行 setup 的时候会产生 lambda,但是这些过程我们不需要太过于关心。 206 | 207 | ### 提交证明条件 208 | 209 | - compute-witness - 生成证明 - 这个功能会生成 witness 文件,这个文件是一个中间文件。 210 | - generate-proof - 生成证明的 Proof - 这个功能会生成 proof.json 文件,这个文件是证明需要提交的内容,一般来说里面的内容就是我们需要提交到链上的参数。 211 | 212 | ### 接受证明条件 213 | 214 | - export-verifier - 生成 verifier.sol - 这个功能会生成 verifier.sol 文件,这个文件是一个合约,我们需要将这个合约部署到链上,然后在我们的合约中调用这个合约来验证证明的正确性。 215 | - verify - 本地验证 - 这个功能会验证证明的正确性,但是这个功能并不会生成任何文件。 216 | 217 | ### 编写文件 218 | 219 | 根据上面内容,我们可以写出一些用于测试的单元测试逻辑。 220 | 221 | ```js 222 | import { expect } from "chai"; 223 | import { ethers } from "hardhat"; 224 | import { Verifier } from "../typechain-types/Verifier"; 225 | import { CompilationArtifacts, ZoKratesProvider } from "zokrates-js"; 226 | import { readFileSync } from "fs"; 227 | import { Master } from "../typechain-types"; 228 | import { resolve } from 'path' 229 | 230 | describe("Verifier", function () { 231 | let master: Master; 232 | let zokratesProvider: ZoKratesProvider 233 | 234 | const zokArtifacts: CompilationArtifacts = { 235 | program: readFileSync(resolve(__dirname, '../zok/out')), 236 | abi: JSON.parse(readFileSync(resolve(__dirname, '../zok/abi.json'), 'utf-8')) 237 | } 238 | 239 | const provingKey = readFileSync(resolve(__dirname, '../zok/proving.key')) 240 | 241 | beforeEach(async () => { 242 | const { initialize } = await import("zokrates-js"); 243 | zokratesProvider = (await initialize()).withOptions({ 244 | backend: 'ark', 245 | curve: 'bn128', 246 | scheme: 'gm17' 247 | }); 248 | 249 | const bn256 = await ethers.getContractFactory("BN256G2").then((f) => f.deploy()); 250 | 251 | master = await ethers.getContractFactory("Master", { 252 | libraries: { 253 | "contracts/verifier.sol:BN256G2": bn256.address, 254 | } 255 | }).then((f) => f.deploy()); 256 | }) 257 | 258 | it("should verify a proof", async () => { 259 | const { witness, output } = zokratesProvider.computeWitness( 260 | zokArtifacts, 261 | [`${ethers.constants.WeiPerEther}`, '23'], 262 | ) 263 | 264 | const commitment = hexListToUint256BigEndian(JSON.parse(output)).toString(); 265 | 266 | await master.deposit( 267 | commitment, 268 | { value: ethers.constants.WeiPerEther } 269 | ) 270 | 271 | const proof = zokratesProvider.generateProof( 272 | zokArtifacts.program, 273 | witness, 274 | provingKey); 275 | 276 | 277 | const sender = (await ethers.getSigners())[0]; 278 | expect(() => master.connect(sender). 279 | withdraw(commitment, proof.proof as Verifier.ProofStruct, proof.inputs) 280 | ).to.changeEtherBalance(sender, ethers.constants.WeiPerEther); 281 | }) 282 | }); 283 | 284 | 285 | function hexListToUint256BigEndian(hexList: string[]) { 286 | let uint256Data = "0x"; 287 | for (const hex of hexList) { 288 | const cleanedHex = hex.replace("0x", ""); 289 | uint256Data += cleanedHex; 290 | } 291 | const uint256BigNumber = ethers.BigNumber.from(uint256Data); 292 | return uint256BigNumber; 293 | } 294 | ``` 295 | 296 | ![运行成功](/2023-08-31-18-10-30.png) 297 | 298 | import { BaseLink } from "components/base_link"; 299 | 300 | 项目的基础文件都放在: Github 仓库[]()中,欢迎 Star。 301 | -------------------------------------------------------------------------------- /pages/zk/_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "1-zk-SNARKs-intro":{}, 3 | "2-zk-SNARKs-info" :{}, 4 | "3-zk-SNARKs-use-in-solidity":{} 5 | } -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | next: 12 | specifier: ^13.0.6 13 | version: 13.0.6(react-dom@18.2.0)(react@18.2.0) 14 | nextra: 15 | specifier: latest 16 | version: 2.12.3(next@13.0.6)(react-dom@18.2.0)(react@18.2.0) 17 | nextra-theme-docs: 18 | specifier: latest 19 | version: 2.12.3(next@13.0.6)(nextra@2.12.3)(react-dom@18.2.0)(react@18.2.0) 20 | react: 21 | specifier: ^18.2.0 22 | version: 18.2.0 23 | react-dom: 24 | specifier: ^18.2.0 25 | version: 18.2.0(react@18.2.0) 26 | devDependencies: 27 | '@types/node': 28 | specifier: 18.11.10 29 | version: 18.11.10 30 | autoprefixer: 31 | specifier: ^10.4.15 32 | version: 10.4.15(postcss@8.4.29) 33 | postcss: 34 | specifier: ^8.4.29 35 | version: 8.4.29 36 | tailwindcss: 37 | specifier: ^3.3.3 38 | version: 3.3.3 39 | typescript: 40 | specifier: ^4.9.3 41 | version: 4.9.3 42 | 43 | packages: 44 | 45 | '@alloc/quick-lru@5.2.0': 46 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 47 | engines: {node: '>=10'} 48 | 49 | '@babel/runtime@7.20.6': 50 | resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} 51 | engines: {node: '>=6.9.0'} 52 | 53 | '@braintree/sanitize-url@6.0.4': 54 | resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} 55 | 56 | '@headlessui/react@1.7.10': 57 | resolution: {integrity: sha512-1m66h/5eayTEZVT2PI13/2PG3EVC7a9XalmUtVSC8X76pcyKYMuyX1XAL2RUtCr8WhoMa/KrDEyoeU5v+kSQOw==} 58 | engines: {node: '>=10'} 59 | peerDependencies: 60 | react: ^16 || ^17 || ^18 61 | react-dom: ^16 || ^17 || ^18 62 | 63 | '@jridgewell/gen-mapping@0.3.3': 64 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 65 | engines: {node: '>=6.0.0'} 66 | 67 | '@jridgewell/resolve-uri@3.1.1': 68 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 69 | engines: {node: '>=6.0.0'} 70 | 71 | '@jridgewell/set-array@1.1.2': 72 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 73 | engines: {node: '>=6.0.0'} 74 | 75 | '@jridgewell/sourcemap-codec@1.4.15': 76 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 77 | 78 | '@jridgewell/trace-mapping@0.3.19': 79 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 80 | 81 | '@mdx-js/mdx@2.3.0': 82 | resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} 83 | 84 | '@mdx-js/react@2.3.0': 85 | resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} 86 | peerDependencies: 87 | react: '>=16' 88 | 89 | '@napi-rs/simple-git-android-arm-eabi@0.1.9': 90 | resolution: {integrity: sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==} 91 | engines: {node: '>= 10'} 92 | cpu: [arm] 93 | os: [android] 94 | 95 | '@napi-rs/simple-git-android-arm64@0.1.9': 96 | resolution: {integrity: sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==} 97 | engines: {node: '>= 10'} 98 | cpu: [arm64] 99 | os: [android] 100 | 101 | '@napi-rs/simple-git-darwin-arm64@0.1.9': 102 | resolution: {integrity: sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==} 103 | engines: {node: '>= 10'} 104 | cpu: [arm64] 105 | os: [darwin] 106 | 107 | '@napi-rs/simple-git-darwin-x64@0.1.9': 108 | resolution: {integrity: sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==} 109 | engines: {node: '>= 10'} 110 | cpu: [x64] 111 | os: [darwin] 112 | 113 | '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9': 114 | resolution: {integrity: sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==} 115 | engines: {node: '>= 10'} 116 | cpu: [arm] 117 | os: [linux] 118 | 119 | '@napi-rs/simple-git-linux-arm64-gnu@0.1.9': 120 | resolution: {integrity: sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==} 121 | engines: {node: '>= 10'} 122 | cpu: [arm64] 123 | os: [linux] 124 | 125 | '@napi-rs/simple-git-linux-arm64-musl@0.1.9': 126 | resolution: {integrity: sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==} 127 | engines: {node: '>= 10'} 128 | cpu: [arm64] 129 | os: [linux] 130 | 131 | '@napi-rs/simple-git-linux-x64-gnu@0.1.9': 132 | resolution: {integrity: sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==} 133 | engines: {node: '>= 10'} 134 | cpu: [x64] 135 | os: [linux] 136 | 137 | '@napi-rs/simple-git-linux-x64-musl@0.1.9': 138 | resolution: {integrity: sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==} 139 | engines: {node: '>= 10'} 140 | cpu: [x64] 141 | os: [linux] 142 | 143 | '@napi-rs/simple-git-win32-arm64-msvc@0.1.9': 144 | resolution: {integrity: sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==} 145 | engines: {node: '>= 10'} 146 | cpu: [arm64] 147 | os: [win32] 148 | 149 | '@napi-rs/simple-git-win32-x64-msvc@0.1.9': 150 | resolution: {integrity: sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==} 151 | engines: {node: '>= 10'} 152 | cpu: [x64] 153 | os: [win32] 154 | 155 | '@napi-rs/simple-git@0.1.9': 156 | resolution: {integrity: sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==} 157 | engines: {node: '>= 10'} 158 | 159 | '@next/env@13.0.6': 160 | resolution: {integrity: sha512-yceT6DCHKqPRS1cAm8DHvDvK74DLIkDQdm5iV+GnIts8h0QbdHvkUIkdOvQoOODgpr6018skbmSQp12z5OWIQQ==} 161 | 162 | '@next/swc-android-arm-eabi@13.0.6': 163 | resolution: {integrity: sha512-FGFSj3v2Bluw8fD/X+1eXIEB0PhoJE0zfutsAauRhmNpjjZshLDgoXMWm1jTRL/04K/o9gwwO2+A8+sPVCH1uw==} 164 | engines: {node: '>= 10'} 165 | cpu: [arm] 166 | os: [android] 167 | 168 | '@next/swc-android-arm64@13.0.6': 169 | resolution: {integrity: sha512-7MgbtU7kimxuovVsd7jSJWMkIHBDBUsNLmmlkrBRHTvgzx5nDBXogP0hzZm7EImdOPwVMPpUHRQMBP9mbsiJYQ==} 170 | engines: {node: '>= 10'} 171 | cpu: [arm64] 172 | os: [android] 173 | 174 | '@next/swc-darwin-arm64@13.0.6': 175 | resolution: {integrity: sha512-AUVEpVTxbP/fxdFsjVI9d5a0CFn6NVV7A/RXOb0Y+pXKIIZ1V5rFjPwpYfIfyOo2lrqgehMNQcyMRoTrhq04xg==} 176 | engines: {node: '>= 10'} 177 | cpu: [arm64] 178 | os: [darwin] 179 | 180 | '@next/swc-darwin-x64@13.0.6': 181 | resolution: {integrity: sha512-SasCDJlshglsPnbzhWaIF6VEGkQy2NECcAOxPwaPr0cwbbt4aUlZ7QmskNzgolr5eAjFS/xTr7CEeKJtZpAAtQ==} 182 | engines: {node: '>= 10'} 183 | cpu: [x64] 184 | os: [darwin] 185 | 186 | '@next/swc-freebsd-x64@13.0.6': 187 | resolution: {integrity: sha512-6Lbxd9gAdXneTkwHyYW/qtX1Tdw7ND9UbiGsGz/SP43ZInNWnW6q0au4hEVPZ9bOWWRKzcVoeTBdoMpQk9Hx9w==} 188 | engines: {node: '>= 10'} 189 | cpu: [x64] 190 | os: [freebsd] 191 | 192 | '@next/swc-linux-arm-gnueabihf@13.0.6': 193 | resolution: {integrity: sha512-wNdi5A519e1P+ozEuYOhWPzzE6m1y7mkO6NFwn6watUwO0X9nZs7fT9THmnekvmFQpaZ6U+xf2MQ9poQoCh6jQ==} 194 | engines: {node: '>= 10'} 195 | cpu: [arm] 196 | os: [linux] 197 | 198 | '@next/swc-linux-arm64-gnu@13.0.6': 199 | resolution: {integrity: sha512-e8KTRnleQY1KLk5PwGV5hrmvKksCc74QRpHl5ffWnEEAtL2FE0ave5aIkXqErsPdXkiKuA/owp3LjQrP+/AH7Q==} 200 | engines: {node: '>= 10'} 201 | cpu: [arm64] 202 | os: [linux] 203 | 204 | '@next/swc-linux-arm64-musl@13.0.6': 205 | resolution: {integrity: sha512-/7RF03C3mhjYpHN+pqOolgME3guiHU5T3TsejuyteqyEyzdEyLHod+jcYH6ft7UZ71a6TdOewvmbLOtzHW2O8A==} 206 | engines: {node: '>= 10'} 207 | cpu: [arm64] 208 | os: [linux] 209 | 210 | '@next/swc-linux-x64-gnu@13.0.6': 211 | resolution: {integrity: sha512-kxyEXnYHpOEkFnmrlwB1QlzJtjC6sAJytKcceIyFUHbCaD3W/Qb5tnclcnHKTaFccizZRePXvV25Ok/eUSpKTw==} 212 | engines: {node: '>= 10'} 213 | cpu: [x64] 214 | os: [linux] 215 | 216 | '@next/swc-linux-x64-musl@13.0.6': 217 | resolution: {integrity: sha512-N0c6gubS3WW1oYYgo02xzZnNatfVQP/CiJq2ax+DJ55ePV62IACbRCU99TZNXXg+Kos6vNW4k+/qgvkvpGDeyA==} 218 | engines: {node: '>= 10'} 219 | cpu: [x64] 220 | os: [linux] 221 | 222 | '@next/swc-win32-arm64-msvc@13.0.6': 223 | resolution: {integrity: sha512-QjeMB2EBqBFPb/ac0CYr7GytbhUkrG4EwFWbcE0vsRp4H8grt25kYpFQckL4Jak3SUrp7vKfDwZ/SwO7QdO8vw==} 224 | engines: {node: '>= 10'} 225 | cpu: [arm64] 226 | os: [win32] 227 | 228 | '@next/swc-win32-ia32-msvc@13.0.6': 229 | resolution: {integrity: sha512-EQzXtdqRTcmhT/tCq81rIwE36Y3fNHPInaCuJzM/kftdXfa0F+64y7FAoMO13npX8EG1+SamXgp/emSusKrCXg==} 230 | engines: {node: '>= 10'} 231 | cpu: [ia32] 232 | os: [win32] 233 | 234 | '@next/swc-win32-x64-msvc@13.0.6': 235 | resolution: {integrity: sha512-pSkqZ//UP/f2sS9T7IvHLfEWDPTX0vRyXJnAUNisKvO3eF3e1xdhDX7dix/X3Z3lnN4UjSwOzclAI87JFbOwmQ==} 236 | engines: {node: '>= 10'} 237 | cpu: [x64] 238 | os: [win32] 239 | 240 | '@nodelib/fs.scandir@2.1.5': 241 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 242 | engines: {node: '>= 8'} 243 | 244 | '@nodelib/fs.stat@2.0.5': 245 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 246 | engines: {node: '>= 8'} 247 | 248 | '@nodelib/fs.walk@1.2.8': 249 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 250 | engines: {node: '>= 8'} 251 | 252 | '@popperjs/core@2.11.6': 253 | resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} 254 | 255 | '@swc/helpers@0.4.14': 256 | resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} 257 | 258 | '@theguild/remark-mermaid@0.0.4': 259 | resolution: {integrity: sha512-C1gssw07eURtCwzXqZZdvyV/eawQ/cXfARaXIgBU9orffox+/YQ+exxmNu9v16NSGzAVsGF4qEVHvCOcCR/FpQ==} 260 | peerDependencies: 261 | react: ^18.2.0 262 | 263 | '@theguild/remark-npm2yarn@0.1.1': 264 | resolution: {integrity: sha512-ZKwd/bjQ9V+pESLnu8+q8jqn15alXzJOuVckraebsXwqVBTw53Gmupiw9zCdLNHU829KTYNycJYea6m9HRLuOg==} 265 | 266 | '@types/acorn@4.0.6': 267 | resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} 268 | 269 | '@types/d3-scale-chromatic@3.0.0': 270 | resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} 271 | 272 | '@types/d3-scale@4.0.4': 273 | resolution: {integrity: sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==} 274 | 275 | '@types/d3-time@3.0.0': 276 | resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} 277 | 278 | '@types/debug@4.1.7': 279 | resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} 280 | 281 | '@types/estree-jsx@1.0.0': 282 | resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} 283 | 284 | '@types/estree@1.0.0': 285 | resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} 286 | 287 | '@types/hast@2.3.4': 288 | resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} 289 | 290 | '@types/hast@3.0.0': 291 | resolution: {integrity: sha512-SoytUJRuf68HXYqcXicQIhCrLQjqeYU2anikr4G3p3Iz+OZO5QDQpDj++gv+RenHsnUBwNZ2dumBArF8VLSk2Q==} 292 | 293 | '@types/js-yaml@4.0.5': 294 | resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} 295 | 296 | '@types/katex@0.11.1': 297 | resolution: {integrity: sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==} 298 | 299 | '@types/katex@0.14.0': 300 | resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} 301 | 302 | '@types/mdast@3.0.10': 303 | resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} 304 | 305 | '@types/mdast@4.0.0': 306 | resolution: {integrity: sha512-YLeG8CujC9adtj/kuDzq1N4tCDYKoZ5l/bnjq8d74+t/3q/tHquJOJKUQXJrLCflOHpKjXgcI/a929gpmLOEng==} 307 | 308 | '@types/mdx@2.0.3': 309 | resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==} 310 | 311 | '@types/ms@0.7.31': 312 | resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} 313 | 314 | '@types/node@18.11.10': 315 | resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} 316 | 317 | '@types/prop-types@15.7.5': 318 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 319 | 320 | '@types/react@18.0.25': 321 | resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} 322 | 323 | '@types/scheduler@0.16.2': 324 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} 325 | 326 | '@types/unist@2.0.6': 327 | resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} 328 | 329 | '@types/unist@3.0.0': 330 | resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} 331 | 332 | '@ungap/structured-clone@1.2.0': 333 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 334 | 335 | acorn-jsx@5.3.2: 336 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 337 | peerDependencies: 338 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 339 | 340 | acorn@8.8.1: 341 | resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} 342 | engines: {node: '>=0.4.0'} 343 | hasBin: true 344 | 345 | ansi-sequence-parser@1.1.1: 346 | resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} 347 | 348 | ansi-styles@3.2.1: 349 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 350 | engines: {node: '>=4'} 351 | 352 | any-promise@1.3.0: 353 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 354 | 355 | anymatch@3.1.3: 356 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 357 | engines: {node: '>= 8'} 358 | 359 | arch@2.2.0: 360 | resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} 361 | 362 | arg@1.0.0: 363 | resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} 364 | 365 | arg@5.0.2: 366 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 367 | 368 | argparse@1.0.10: 369 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 370 | 371 | argparse@2.0.1: 372 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 373 | 374 | astring@1.8.3: 375 | resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==} 376 | hasBin: true 377 | 378 | autoprefixer@10.4.15: 379 | resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} 380 | engines: {node: ^10 || ^12 || >=14} 381 | hasBin: true 382 | peerDependencies: 383 | postcss: ^8.1.0 384 | 385 | bail@2.0.2: 386 | resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 387 | 388 | balanced-match@1.0.2: 389 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 390 | 391 | binary-extensions@2.2.0: 392 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 393 | engines: {node: '>=8'} 394 | 395 | brace-expansion@1.1.11: 396 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 397 | 398 | braces@3.0.2: 399 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 400 | engines: {node: '>=8'} 401 | 402 | browserslist@4.21.10: 403 | resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} 404 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 405 | hasBin: true 406 | 407 | camelcase-css@2.0.1: 408 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 409 | engines: {node: '>= 6'} 410 | 411 | caniuse-lite@1.0.30001435: 412 | resolution: {integrity: sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA==} 413 | 414 | caniuse-lite@1.0.30001527: 415 | resolution: {integrity: sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==} 416 | 417 | ccount@2.0.1: 418 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 419 | 420 | chalk@2.3.0: 421 | resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} 422 | engines: {node: '>=4'} 423 | 424 | character-entities-html4@2.1.0: 425 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 426 | 427 | character-entities-legacy@3.0.0: 428 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 429 | 430 | character-entities@2.0.2: 431 | resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 432 | 433 | character-reference-invalid@2.0.1: 434 | resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} 435 | 436 | chokidar@3.5.3: 437 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 438 | engines: {node: '>= 8.10.0'} 439 | 440 | client-only@0.0.1: 441 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 442 | 443 | clipboardy@1.2.2: 444 | resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} 445 | engines: {node: '>=4'} 446 | 447 | clsx@2.0.0: 448 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 449 | engines: {node: '>=6'} 450 | 451 | color-convert@1.9.3: 452 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 453 | 454 | color-name@1.1.3: 455 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 456 | 457 | comma-separated-tokens@2.0.3: 458 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 459 | 460 | commander@4.1.1: 461 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 462 | engines: {node: '>= 6'} 463 | 464 | commander@7.2.0: 465 | resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 466 | engines: {node: '>= 10'} 467 | 468 | commander@8.3.0: 469 | resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} 470 | engines: {node: '>= 12'} 471 | 472 | compute-scroll-into-view@2.0.4: 473 | resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} 474 | 475 | concat-map@0.0.1: 476 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 477 | 478 | cose-base@1.0.3: 479 | resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} 480 | 481 | cose-base@2.2.0: 482 | resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} 483 | 484 | cross-spawn@5.1.0: 485 | resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} 486 | 487 | cssesc@3.0.0: 488 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 489 | engines: {node: '>=4'} 490 | hasBin: true 491 | 492 | csstype@3.1.1: 493 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 494 | 495 | cytoscape-cose-bilkent@4.1.0: 496 | resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} 497 | peerDependencies: 498 | cytoscape: ^3.2.0 499 | 500 | cytoscape-fcose@2.2.0: 501 | resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} 502 | peerDependencies: 503 | cytoscape: ^3.2.0 504 | 505 | cytoscape@3.26.0: 506 | resolution: {integrity: sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==} 507 | engines: {node: '>=0.10'} 508 | 509 | d3-array@2.12.1: 510 | resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} 511 | 512 | d3-array@3.2.4: 513 | resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} 514 | engines: {node: '>=12'} 515 | 516 | d3-axis@3.0.0: 517 | resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} 518 | engines: {node: '>=12'} 519 | 520 | d3-brush@3.0.0: 521 | resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} 522 | engines: {node: '>=12'} 523 | 524 | d3-chord@3.0.1: 525 | resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} 526 | engines: {node: '>=12'} 527 | 528 | d3-color@3.1.0: 529 | resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} 530 | engines: {node: '>=12'} 531 | 532 | d3-contour@4.0.2: 533 | resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} 534 | engines: {node: '>=12'} 535 | 536 | d3-delaunay@6.0.4: 537 | resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} 538 | engines: {node: '>=12'} 539 | 540 | d3-dispatch@3.0.1: 541 | resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} 542 | engines: {node: '>=12'} 543 | 544 | d3-drag@3.0.0: 545 | resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} 546 | engines: {node: '>=12'} 547 | 548 | d3-dsv@3.0.1: 549 | resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} 550 | engines: {node: '>=12'} 551 | hasBin: true 552 | 553 | d3-ease@3.0.1: 554 | resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} 555 | engines: {node: '>=12'} 556 | 557 | d3-fetch@3.0.1: 558 | resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} 559 | engines: {node: '>=12'} 560 | 561 | d3-force@3.0.0: 562 | resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} 563 | engines: {node: '>=12'} 564 | 565 | d3-format@3.1.0: 566 | resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} 567 | engines: {node: '>=12'} 568 | 569 | d3-geo@3.1.0: 570 | resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} 571 | engines: {node: '>=12'} 572 | 573 | d3-hierarchy@3.1.2: 574 | resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} 575 | engines: {node: '>=12'} 576 | 577 | d3-interpolate@3.0.1: 578 | resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} 579 | engines: {node: '>=12'} 580 | 581 | d3-path@1.0.9: 582 | resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} 583 | 584 | d3-path@3.1.0: 585 | resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} 586 | engines: {node: '>=12'} 587 | 588 | d3-polygon@3.0.1: 589 | resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} 590 | engines: {node: '>=12'} 591 | 592 | d3-quadtree@3.0.1: 593 | resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} 594 | engines: {node: '>=12'} 595 | 596 | d3-random@3.0.1: 597 | resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} 598 | engines: {node: '>=12'} 599 | 600 | d3-sankey@0.12.3: 601 | resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} 602 | 603 | d3-scale-chromatic@3.0.0: 604 | resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} 605 | engines: {node: '>=12'} 606 | 607 | d3-scale@4.0.2: 608 | resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} 609 | engines: {node: '>=12'} 610 | 611 | d3-selection@3.0.0: 612 | resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} 613 | engines: {node: '>=12'} 614 | 615 | d3-shape@1.3.7: 616 | resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} 617 | 618 | d3-shape@3.2.0: 619 | resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} 620 | engines: {node: '>=12'} 621 | 622 | d3-time-format@4.1.0: 623 | resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} 624 | engines: {node: '>=12'} 625 | 626 | d3-time@3.1.0: 627 | resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} 628 | engines: {node: '>=12'} 629 | 630 | d3-timer@3.0.1: 631 | resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} 632 | engines: {node: '>=12'} 633 | 634 | d3-transition@3.0.1: 635 | resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} 636 | engines: {node: '>=12'} 637 | peerDependencies: 638 | d3-selection: 2 - 3 639 | 640 | d3-zoom@3.0.0: 641 | resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} 642 | engines: {node: '>=12'} 643 | 644 | d3@7.8.5: 645 | resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} 646 | engines: {node: '>=12'} 647 | 648 | dagre-d3-es@7.0.10: 649 | resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} 650 | 651 | dayjs@1.11.9: 652 | resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} 653 | 654 | debug@4.3.4: 655 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 656 | engines: {node: '>=6.0'} 657 | peerDependencies: 658 | supports-color: '*' 659 | peerDependenciesMeta: 660 | supports-color: 661 | optional: true 662 | 663 | decode-named-character-reference@1.0.2: 664 | resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} 665 | 666 | delaunator@5.0.0: 667 | resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} 668 | 669 | dequal@2.0.3: 670 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 671 | engines: {node: '>=6'} 672 | 673 | devlop@1.1.0: 674 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 675 | 676 | didyoumean@1.2.2: 677 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 678 | 679 | diff@5.1.0: 680 | resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} 681 | engines: {node: '>=0.3.1'} 682 | 683 | dlv@1.1.3: 684 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 685 | 686 | dompurify@3.0.5: 687 | resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} 688 | 689 | electron-to-chromium@1.4.508: 690 | resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==} 691 | 692 | elkjs@0.8.2: 693 | resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} 694 | 695 | entities@4.5.0: 696 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 697 | engines: {node: '>=0.12'} 698 | 699 | escalade@3.1.1: 700 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 701 | engines: {node: '>=6'} 702 | 703 | escape-string-regexp@1.0.5: 704 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 705 | engines: {node: '>=0.8.0'} 706 | 707 | escape-string-regexp@5.0.0: 708 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 709 | engines: {node: '>=12'} 710 | 711 | esprima@4.0.1: 712 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 713 | engines: {node: '>=4'} 714 | hasBin: true 715 | 716 | estree-util-attach-comments@2.1.0: 717 | resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==} 718 | 719 | estree-util-build-jsx@2.2.0: 720 | resolution: {integrity: sha512-apsfRxF9uLrqosApvHVtYZjISPvTJ+lBiIydpC+9wE6cF6ssbhnjyQLqaIjgzGxvC2Hbmec1M7g91PoBayYoQQ==} 721 | 722 | estree-util-is-identifier-name@2.0.1: 723 | resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==} 724 | 725 | estree-util-to-js@1.1.0: 726 | resolution: {integrity: sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A==} 727 | 728 | estree-util-value-to-estree@1.3.0: 729 | resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} 730 | engines: {node: '>=12.0.0'} 731 | 732 | estree-util-visit@1.2.0: 733 | resolution: {integrity: sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==} 734 | 735 | estree-walker@3.0.1: 736 | resolution: {integrity: sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==} 737 | 738 | execa@0.8.0: 739 | resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} 740 | engines: {node: '>=4'} 741 | 742 | extend-shallow@2.0.1: 743 | resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} 744 | engines: {node: '>=0.10.0'} 745 | 746 | extend@3.0.2: 747 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 748 | 749 | fast-glob@3.3.1: 750 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 751 | engines: {node: '>=8.6.0'} 752 | 753 | fastq@1.15.0: 754 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 755 | 756 | fill-range@7.0.1: 757 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 758 | engines: {node: '>=8'} 759 | 760 | flexsearch@0.7.31: 761 | resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} 762 | 763 | focus-visible@5.2.0: 764 | resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} 765 | 766 | fraction.js@4.3.6: 767 | resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} 768 | 769 | fs.realpath@1.0.0: 770 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 771 | 772 | fsevents@2.3.3: 773 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 774 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 775 | os: [darwin] 776 | 777 | function-bind@1.1.1: 778 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 779 | 780 | get-stream@3.0.0: 781 | resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} 782 | engines: {node: '>=4'} 783 | 784 | git-up@7.0.0: 785 | resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} 786 | 787 | git-url-parse@13.1.0: 788 | resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} 789 | 790 | github-slugger@2.0.0: 791 | resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 792 | 793 | glob-parent@5.1.2: 794 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 795 | engines: {node: '>= 6'} 796 | 797 | glob-parent@6.0.2: 798 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 799 | engines: {node: '>=10.13.0'} 800 | 801 | glob@7.1.6: 802 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 803 | 804 | graceful-fs@4.2.11: 805 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 806 | 807 | gray-matter@4.0.3: 808 | resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} 809 | engines: {node: '>=6.0'} 810 | 811 | has-flag@2.0.0: 812 | resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} 813 | engines: {node: '>=0.10.0'} 814 | 815 | has@1.0.3: 816 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 817 | engines: {node: '>= 0.4.0'} 818 | 819 | hash-obj@4.0.0: 820 | resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} 821 | engines: {node: '>=12'} 822 | 823 | hast-util-from-dom@4.2.0: 824 | resolution: {integrity: sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==} 825 | 826 | hast-util-from-html-isomorphic@1.0.0: 827 | resolution: {integrity: sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==} 828 | 829 | hast-util-from-html@1.0.2: 830 | resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} 831 | 832 | hast-util-from-parse5@7.1.1: 833 | resolution: {integrity: sha512-R6PoNcUs89ZxLJmMWsVbwSWuz95/9OriyQZ3e2ybwqGsRXzhA6gv49rgGmQvLbZuSNDv9fCg7vV7gXUsvtUFaA==} 834 | 835 | hast-util-from-parse5@8.0.1: 836 | resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} 837 | 838 | hast-util-is-element@2.1.3: 839 | resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} 840 | 841 | hast-util-parse-selector@3.1.1: 842 | resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} 843 | 844 | hast-util-parse-selector@4.0.0: 845 | resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 846 | 847 | hast-util-raw@9.0.1: 848 | resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} 849 | 850 | hast-util-to-estree@2.1.0: 851 | resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} 852 | 853 | hast-util-to-parse5@8.0.0: 854 | resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 855 | 856 | hast-util-to-text@3.1.2: 857 | resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} 858 | 859 | hast-util-whitespace@2.0.0: 860 | resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} 861 | 862 | hastscript@7.2.0: 863 | resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} 864 | 865 | hastscript@8.0.0: 866 | resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} 867 | 868 | heap@0.2.7: 869 | resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} 870 | 871 | html-void-elements@3.0.0: 872 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 873 | 874 | iconv-lite@0.6.3: 875 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 876 | engines: {node: '>=0.10.0'} 877 | 878 | inflight@1.0.6: 879 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 880 | 881 | inherits@2.0.4: 882 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 883 | 884 | inline-style-parser@0.1.1: 885 | resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} 886 | 887 | internmap@1.0.1: 888 | resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} 889 | 890 | internmap@2.0.3: 891 | resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} 892 | engines: {node: '>=12'} 893 | 894 | intersection-observer@0.12.2: 895 | resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} 896 | 897 | is-alphabetical@2.0.1: 898 | resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} 899 | 900 | is-alphanumerical@2.0.1: 901 | resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} 902 | 903 | is-binary-path@2.1.0: 904 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 905 | engines: {node: '>=8'} 906 | 907 | is-buffer@2.0.5: 908 | resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} 909 | engines: {node: '>=4'} 910 | 911 | is-core-module@2.13.0: 912 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 913 | 914 | is-decimal@2.0.1: 915 | resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} 916 | 917 | is-extendable@0.1.1: 918 | resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} 919 | engines: {node: '>=0.10.0'} 920 | 921 | is-extglob@2.1.1: 922 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 923 | engines: {node: '>=0.10.0'} 924 | 925 | is-glob@4.0.3: 926 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 927 | engines: {node: '>=0.10.0'} 928 | 929 | is-hexadecimal@2.0.1: 930 | resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} 931 | 932 | is-number@7.0.0: 933 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 934 | engines: {node: '>=0.12.0'} 935 | 936 | is-obj@3.0.0: 937 | resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} 938 | engines: {node: '>=12'} 939 | 940 | is-plain-obj@3.0.0: 941 | resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} 942 | engines: {node: '>=10'} 943 | 944 | is-plain-obj@4.1.0: 945 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 946 | engines: {node: '>=12'} 947 | 948 | is-reference@3.0.0: 949 | resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==} 950 | 951 | is-ssh@1.4.0: 952 | resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} 953 | 954 | is-stream@1.1.0: 955 | resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} 956 | engines: {node: '>=0.10.0'} 957 | 958 | isexe@2.0.0: 959 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 960 | 961 | jiti@1.19.3: 962 | resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} 963 | hasBin: true 964 | 965 | js-tokens@4.0.0: 966 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 967 | 968 | js-yaml@3.14.1: 969 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 970 | hasBin: true 971 | 972 | js-yaml@4.1.0: 973 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 974 | hasBin: true 975 | 976 | jsonc-parser@3.2.0: 977 | resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 978 | 979 | katex@0.13.24: 980 | resolution: {integrity: sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==} 981 | hasBin: true 982 | 983 | katex@0.16.8: 984 | resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==} 985 | hasBin: true 986 | 987 | khroma@2.0.0: 988 | resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} 989 | 990 | kind-of@6.0.3: 991 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 992 | engines: {node: '>=0.10.0'} 993 | 994 | kleur@4.1.5: 995 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 996 | engines: {node: '>=6'} 997 | 998 | layout-base@1.0.2: 999 | resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} 1000 | 1001 | layout-base@2.0.1: 1002 | resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} 1003 | 1004 | lilconfig@2.1.0: 1005 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1006 | engines: {node: '>=10'} 1007 | 1008 | lines-and-columns@1.2.4: 1009 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1010 | 1011 | lodash-es@4.17.21: 1012 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 1013 | 1014 | lodash.get@4.4.2: 1015 | resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} 1016 | 1017 | lodash@4.17.21: 1018 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1019 | 1020 | longest-streak@3.1.0: 1021 | resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1022 | 1023 | loose-envify@1.4.0: 1024 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1025 | hasBin: true 1026 | 1027 | lru-cache@4.1.5: 1028 | resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} 1029 | 1030 | markdown-extensions@1.1.1: 1031 | resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} 1032 | engines: {node: '>=0.10.0'} 1033 | 1034 | markdown-table@3.0.3: 1035 | resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} 1036 | 1037 | match-sorter@6.3.1: 1038 | resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} 1039 | 1040 | mdast-util-definitions@5.1.1: 1041 | resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==} 1042 | 1043 | mdast-util-find-and-replace@2.2.1: 1044 | resolution: {integrity: sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==} 1045 | 1046 | mdast-util-from-markdown@1.3.1: 1047 | resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} 1048 | 1049 | mdast-util-gfm-autolink-literal@1.0.2: 1050 | resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} 1051 | 1052 | mdast-util-gfm-footnote@1.0.1: 1053 | resolution: {integrity: sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==} 1054 | 1055 | mdast-util-gfm-strikethrough@1.0.2: 1056 | resolution: {integrity: sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==} 1057 | 1058 | mdast-util-gfm-table@1.0.6: 1059 | resolution: {integrity: sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==} 1060 | 1061 | mdast-util-gfm-task-list-item@1.0.1: 1062 | resolution: {integrity: sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==} 1063 | 1064 | mdast-util-gfm@2.0.1: 1065 | resolution: {integrity: sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==} 1066 | 1067 | mdast-util-math@2.0.2: 1068 | resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} 1069 | 1070 | mdast-util-mdx-expression@1.3.1: 1071 | resolution: {integrity: sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==} 1072 | 1073 | mdast-util-mdx-jsx@2.1.0: 1074 | resolution: {integrity: sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==} 1075 | 1076 | mdast-util-mdx@2.0.0: 1077 | resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==} 1078 | 1079 | mdast-util-mdxjs-esm@1.3.0: 1080 | resolution: {integrity: sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==} 1081 | 1082 | mdast-util-to-hast@12.2.4: 1083 | resolution: {integrity: sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==} 1084 | 1085 | mdast-util-to-hast@13.0.2: 1086 | resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} 1087 | 1088 | mdast-util-to-markdown@1.3.0: 1089 | resolution: {integrity: sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==} 1090 | 1091 | mdast-util-to-string@3.1.0: 1092 | resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} 1093 | 1094 | merge2@1.4.1: 1095 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1096 | engines: {node: '>= 8'} 1097 | 1098 | mermaid@10.4.0: 1099 | resolution: {integrity: sha512-4QCQLp79lvz7UZxow5HUX7uWTPJOaQBVExduo91tliXC7v78i6kssZOPHxLL+Xs30KU72cpPn3g3imw/xm/gaw==} 1100 | 1101 | micromark-core-commonmark@1.0.6: 1102 | resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} 1103 | 1104 | micromark-extension-gfm-autolink-literal@1.0.3: 1105 | resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} 1106 | 1107 | micromark-extension-gfm-footnote@1.0.4: 1108 | resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} 1109 | 1110 | micromark-extension-gfm-strikethrough@1.0.4: 1111 | resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} 1112 | 1113 | micromark-extension-gfm-table@1.0.5: 1114 | resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} 1115 | 1116 | micromark-extension-gfm-tagfilter@1.0.1: 1117 | resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} 1118 | 1119 | micromark-extension-gfm-task-list-item@1.0.3: 1120 | resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} 1121 | 1122 | micromark-extension-gfm@2.0.1: 1123 | resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} 1124 | 1125 | micromark-extension-math@2.0.2: 1126 | resolution: {integrity: sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==} 1127 | 1128 | micromark-extension-mdx-expression@1.0.3: 1129 | resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==} 1130 | 1131 | micromark-extension-mdx-jsx@1.0.3: 1132 | resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} 1133 | 1134 | micromark-extension-mdx-md@1.0.0: 1135 | resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} 1136 | 1137 | micromark-extension-mdxjs-esm@1.0.3: 1138 | resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} 1139 | 1140 | micromark-extension-mdxjs@1.0.0: 1141 | resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} 1142 | 1143 | micromark-factory-destination@1.0.0: 1144 | resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} 1145 | 1146 | micromark-factory-label@1.0.2: 1147 | resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} 1148 | 1149 | micromark-factory-mdx-expression@1.0.6: 1150 | resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} 1151 | 1152 | micromark-factory-space@1.0.0: 1153 | resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} 1154 | 1155 | micromark-factory-title@1.0.2: 1156 | resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} 1157 | 1158 | micromark-factory-whitespace@1.0.0: 1159 | resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} 1160 | 1161 | micromark-util-character@1.1.0: 1162 | resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} 1163 | 1164 | micromark-util-character@2.0.1: 1165 | resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} 1166 | 1167 | micromark-util-chunked@1.0.0: 1168 | resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} 1169 | 1170 | micromark-util-classify-character@1.0.0: 1171 | resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} 1172 | 1173 | micromark-util-combine-extensions@1.0.0: 1174 | resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} 1175 | 1176 | micromark-util-decode-numeric-character-reference@1.0.0: 1177 | resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} 1178 | 1179 | micromark-util-decode-string@1.0.2: 1180 | resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} 1181 | 1182 | micromark-util-encode@1.0.1: 1183 | resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} 1184 | 1185 | micromark-util-encode@2.0.0: 1186 | resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} 1187 | 1188 | micromark-util-events-to-acorn@1.2.0: 1189 | resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==} 1190 | 1191 | micromark-util-html-tag-name@1.1.0: 1192 | resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} 1193 | 1194 | micromark-util-normalize-identifier@1.0.0: 1195 | resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} 1196 | 1197 | micromark-util-resolve-all@1.0.0: 1198 | resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} 1199 | 1200 | micromark-util-sanitize-uri@1.1.0: 1201 | resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} 1202 | 1203 | micromark-util-sanitize-uri@2.0.0: 1204 | resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} 1205 | 1206 | micromark-util-subtokenize@1.0.2: 1207 | resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} 1208 | 1209 | micromark-util-symbol@1.0.1: 1210 | resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} 1211 | 1212 | micromark-util-symbol@2.0.0: 1213 | resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} 1214 | 1215 | micromark-util-types@1.0.2: 1216 | resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} 1217 | 1218 | micromark-util-types@2.0.0: 1219 | resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} 1220 | 1221 | micromark@3.1.0: 1222 | resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} 1223 | 1224 | micromatch@4.0.5: 1225 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1226 | engines: {node: '>=8.6'} 1227 | 1228 | minimatch@3.1.2: 1229 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1230 | 1231 | mri@1.2.0: 1232 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1233 | engines: {node: '>=4'} 1234 | 1235 | ms@2.1.2: 1236 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1237 | 1238 | mz@2.7.0: 1239 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1240 | 1241 | nanoid@3.3.6: 1242 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1243 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1244 | hasBin: true 1245 | 1246 | next-mdx-remote@4.3.0: 1247 | resolution: {integrity: sha512-fbxkY03pM2Wx5bDNTVKpYD5Hx3QVZGH+6xDtVIxlxXz4HTifP1yI2DrkDvxXbTz0SYGIbluRMIW81IOOa8pigA==} 1248 | engines: {node: '>=14', npm: '>=7'} 1249 | peerDependencies: 1250 | react: '>=16.x <=18.x' 1251 | react-dom: '>=16.x <=18.x' 1252 | 1253 | next-seo@6.1.0: 1254 | resolution: {integrity: sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==} 1255 | peerDependencies: 1256 | next: ^8.1.1-canary.54 || >=9.0.0 1257 | react: '>=16.0.0' 1258 | react-dom: '>=16.0.0' 1259 | 1260 | next-themes@0.2.1: 1261 | resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} 1262 | peerDependencies: 1263 | next: '*' 1264 | react: '*' 1265 | react-dom: '*' 1266 | 1267 | next@13.0.6: 1268 | resolution: {integrity: sha512-COvigvms2LRt1rrzfBQcMQ2GZd86Mvk1z+LOLY5pniFtL4VrTmhZ9salrbKfSiXbhsD01TrDdD68ec3ABDyscA==} 1269 | engines: {node: '>=14.6.0'} 1270 | hasBin: true 1271 | peerDependencies: 1272 | fibers: '>= 3.1.0' 1273 | node-sass: ^6.0.0 || ^7.0.0 1274 | react: ^18.2.0 1275 | react-dom: ^18.2.0 1276 | sass: ^1.3.0 1277 | peerDependenciesMeta: 1278 | fibers: 1279 | optional: true 1280 | node-sass: 1281 | optional: true 1282 | sass: 1283 | optional: true 1284 | 1285 | nextra-theme-docs@2.12.3: 1286 | resolution: {integrity: sha512-aZywZwokk/h5HrUTh/bsU981Sd2prZks7ci+HNG9wuMnm+drp3PBmRKIuQxBCiJurePVBJ2Qk2/wTV3VECGKnA==} 1287 | peerDependencies: 1288 | next: '>=9.5.3' 1289 | nextra: 2.12.3 1290 | react: '>=16.13.1' 1291 | react-dom: '>=16.13.1' 1292 | 1293 | nextra@2.12.3: 1294 | resolution: {integrity: sha512-0d8wXpGAccFpMFZuxnlnN56MIZj+AWGYXW3Xk6ByXyr0Mb+B/C/0aGZV5YrBex0V1wEqMGQl4LLAJI+AfCbSXg==} 1295 | engines: {node: '>=16'} 1296 | peerDependencies: 1297 | next: '>=9.5.3' 1298 | react: '>=16.13.1' 1299 | react-dom: '>=16.13.1' 1300 | 1301 | node-releases@2.0.13: 1302 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 1303 | 1304 | non-layered-tidy-tree-layout@2.0.2: 1305 | resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} 1306 | 1307 | normalize-path@3.0.0: 1308 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1309 | engines: {node: '>=0.10.0'} 1310 | 1311 | normalize-range@0.1.2: 1312 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1313 | engines: {node: '>=0.10.0'} 1314 | 1315 | npm-run-path@2.0.2: 1316 | resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} 1317 | engines: {node: '>=4'} 1318 | 1319 | npm-to-yarn@2.0.0: 1320 | resolution: {integrity: sha512-/IbjiJ7vqbxfxJxAZ+QI9CCRjnIbvGxn5KQcSY9xHh0lMKc/Sgqmm7yp7KPmd6TiTZX5/KiSBKlkGHo59ucZbg==} 1321 | engines: {node: '>=6.0.0'} 1322 | 1323 | object-assign@4.1.1: 1324 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1325 | engines: {node: '>=0.10.0'} 1326 | 1327 | object-hash@3.0.0: 1328 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1329 | engines: {node: '>= 6'} 1330 | 1331 | once@1.4.0: 1332 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1333 | 1334 | p-finally@1.0.0: 1335 | resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} 1336 | engines: {node: '>=4'} 1337 | 1338 | p-limit@3.1.0: 1339 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1340 | engines: {node: '>=10'} 1341 | 1342 | parse-entities@4.0.0: 1343 | resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==} 1344 | 1345 | parse-numeric-range@1.3.0: 1346 | resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} 1347 | 1348 | parse-path@7.0.0: 1349 | resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} 1350 | 1351 | parse-url@8.1.0: 1352 | resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} 1353 | 1354 | parse5@7.1.2: 1355 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 1356 | 1357 | path-is-absolute@1.0.1: 1358 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1359 | engines: {node: '>=0.10.0'} 1360 | 1361 | path-key@2.0.1: 1362 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1363 | engines: {node: '>=4'} 1364 | 1365 | path-parse@1.0.7: 1366 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1367 | 1368 | periscopic@3.0.4: 1369 | resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} 1370 | 1371 | picocolors@1.0.0: 1372 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1373 | 1374 | picomatch@2.3.1: 1375 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1376 | engines: {node: '>=8.6'} 1377 | 1378 | pify@2.3.0: 1379 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1380 | engines: {node: '>=0.10.0'} 1381 | 1382 | pirates@4.0.6: 1383 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1384 | engines: {node: '>= 6'} 1385 | 1386 | postcss-import@15.1.0: 1387 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1388 | engines: {node: '>=14.0.0'} 1389 | peerDependencies: 1390 | postcss: ^8.0.0 1391 | 1392 | postcss-js@4.0.1: 1393 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1394 | engines: {node: ^12 || ^14 || >= 16} 1395 | peerDependencies: 1396 | postcss: ^8.4.21 1397 | 1398 | postcss-load-config@4.0.1: 1399 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} 1400 | engines: {node: '>= 14'} 1401 | peerDependencies: 1402 | postcss: '>=8.0.9' 1403 | ts-node: '>=9.0.0' 1404 | peerDependenciesMeta: 1405 | postcss: 1406 | optional: true 1407 | ts-node: 1408 | optional: true 1409 | 1410 | postcss-nested@6.0.1: 1411 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1412 | engines: {node: '>=12.0'} 1413 | peerDependencies: 1414 | postcss: ^8.2.14 1415 | 1416 | postcss-selector-parser@6.0.13: 1417 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} 1418 | engines: {node: '>=4'} 1419 | 1420 | postcss-value-parser@4.2.0: 1421 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1422 | 1423 | postcss@8.4.14: 1424 | resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} 1425 | engines: {node: ^10 || ^12 || >=14} 1426 | 1427 | postcss@8.4.29: 1428 | resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} 1429 | engines: {node: ^10 || ^12 || >=14} 1430 | 1431 | property-information@6.2.0: 1432 | resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} 1433 | 1434 | protocols@2.0.1: 1435 | resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} 1436 | 1437 | pseudomap@1.0.2: 1438 | resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 1439 | 1440 | queue-microtask@1.2.3: 1441 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1442 | 1443 | react-dom@18.2.0: 1444 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1445 | peerDependencies: 1446 | react: ^18.2.0 1447 | 1448 | react@18.2.0: 1449 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1450 | engines: {node: '>=0.10.0'} 1451 | 1452 | read-cache@1.0.0: 1453 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1454 | 1455 | readdirp@3.6.0: 1456 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1457 | engines: {node: '>=8.10.0'} 1458 | 1459 | reading-time@1.5.0: 1460 | resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} 1461 | 1462 | regenerator-runtime@0.13.11: 1463 | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} 1464 | 1465 | rehype-katex@6.0.3: 1466 | resolution: {integrity: sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==} 1467 | 1468 | rehype-pretty-code@0.9.11: 1469 | resolution: {integrity: sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA==} 1470 | engines: {node: '>=16'} 1471 | peerDependencies: 1472 | shiki: '*' 1473 | 1474 | rehype-raw@7.0.0: 1475 | resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 1476 | 1477 | remark-gfm@3.0.1: 1478 | resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} 1479 | 1480 | remark-math@5.1.1: 1481 | resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} 1482 | 1483 | remark-mdx@2.1.5: 1484 | resolution: {integrity: sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==} 1485 | 1486 | remark-parse@10.0.1: 1487 | resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} 1488 | 1489 | remark-reading-time@2.0.1: 1490 | resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} 1491 | 1492 | remark-rehype@10.1.0: 1493 | resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} 1494 | 1495 | remove-accents@0.4.2: 1496 | resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} 1497 | 1498 | resolve@1.22.4: 1499 | resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} 1500 | hasBin: true 1501 | 1502 | reusify@1.0.4: 1503 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1504 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1505 | 1506 | robust-predicates@3.0.2: 1507 | resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} 1508 | 1509 | run-parallel@1.2.0: 1510 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1511 | 1512 | rw@1.3.3: 1513 | resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} 1514 | 1515 | sade@1.8.1: 1516 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1517 | engines: {node: '>=6'} 1518 | 1519 | safer-buffer@2.1.2: 1520 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1521 | 1522 | scheduler@0.23.0: 1523 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1524 | 1525 | scroll-into-view-if-needed@3.0.4: 1526 | resolution: {integrity: sha512-s+/F50jwTOUt+u5oEIAzum9MN2lUQNvWBe/zfEsVQcbaERjGkKLq1s+2wCHkahMLC8nMLbzMVKivx9JhunXaZg==} 1527 | 1528 | section-matter@1.0.0: 1529 | resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} 1530 | engines: {node: '>=4'} 1531 | 1532 | shebang-command@1.2.0: 1533 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1534 | engines: {node: '>=0.10.0'} 1535 | 1536 | shebang-regex@1.0.0: 1537 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1538 | engines: {node: '>=0.10.0'} 1539 | 1540 | shiki@0.14.4: 1541 | resolution: {integrity: sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==} 1542 | 1543 | signal-exit@3.0.7: 1544 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1545 | 1546 | slash@3.0.0: 1547 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1548 | engines: {node: '>=8'} 1549 | 1550 | sort-keys@5.0.0: 1551 | resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} 1552 | engines: {node: '>=12'} 1553 | 1554 | source-map-js@1.0.2: 1555 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1556 | engines: {node: '>=0.10.0'} 1557 | 1558 | source-map@0.7.4: 1559 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 1560 | engines: {node: '>= 8'} 1561 | 1562 | space-separated-tokens@2.0.2: 1563 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1564 | 1565 | sprintf-js@1.0.3: 1566 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1567 | 1568 | stringify-entities@4.0.3: 1569 | resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} 1570 | 1571 | strip-bom-string@1.0.0: 1572 | resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} 1573 | engines: {node: '>=0.10.0'} 1574 | 1575 | strip-eof@1.0.0: 1576 | resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} 1577 | engines: {node: '>=0.10.0'} 1578 | 1579 | style-to-object@0.3.0: 1580 | resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} 1581 | 1582 | styled-jsx@5.1.0: 1583 | resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} 1584 | engines: {node: '>= 12.0.0'} 1585 | peerDependencies: 1586 | '@babel/core': '*' 1587 | babel-plugin-macros: '*' 1588 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 1589 | peerDependenciesMeta: 1590 | '@babel/core': 1591 | optional: true 1592 | babel-plugin-macros: 1593 | optional: true 1594 | 1595 | stylis@4.3.0: 1596 | resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} 1597 | 1598 | sucrase@3.34.0: 1599 | resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} 1600 | engines: {node: '>=8'} 1601 | hasBin: true 1602 | 1603 | supports-color@4.5.0: 1604 | resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} 1605 | engines: {node: '>=4'} 1606 | 1607 | supports-preserve-symlinks-flag@1.0.0: 1608 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1609 | engines: {node: '>= 0.4'} 1610 | 1611 | tailwindcss@3.3.3: 1612 | resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} 1613 | engines: {node: '>=14.0.0'} 1614 | hasBin: true 1615 | 1616 | thenify-all@1.6.0: 1617 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1618 | engines: {node: '>=0.8'} 1619 | 1620 | thenify@3.3.1: 1621 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1622 | 1623 | title@3.5.3: 1624 | resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} 1625 | hasBin: true 1626 | 1627 | titleize@1.0.0: 1628 | resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} 1629 | engines: {node: '>=0.10.0'} 1630 | 1631 | to-regex-range@5.0.1: 1632 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1633 | engines: {node: '>=8.0'} 1634 | 1635 | trim-lines@3.0.1: 1636 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1637 | 1638 | trough@2.1.0: 1639 | resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} 1640 | 1641 | ts-dedent@2.2.0: 1642 | resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} 1643 | engines: {node: '>=6.10'} 1644 | 1645 | ts-interface-checker@0.1.13: 1646 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1647 | 1648 | tslib@2.4.1: 1649 | resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} 1650 | 1651 | type-fest@1.4.0: 1652 | resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} 1653 | engines: {node: '>=10'} 1654 | 1655 | typescript@4.9.3: 1656 | resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} 1657 | engines: {node: '>=4.2.0'} 1658 | hasBin: true 1659 | 1660 | unified@10.1.2: 1661 | resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} 1662 | 1663 | unist-builder@3.0.0: 1664 | resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==} 1665 | 1666 | unist-util-find-after@4.0.1: 1667 | resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} 1668 | 1669 | unist-util-generated@2.0.0: 1670 | resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} 1671 | 1672 | unist-util-is@5.1.1: 1673 | resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} 1674 | 1675 | unist-util-is@6.0.0: 1676 | resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 1677 | 1678 | unist-util-position-from-estree@1.1.1: 1679 | resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} 1680 | 1681 | unist-util-position@4.0.3: 1682 | resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==} 1683 | 1684 | unist-util-position@5.0.0: 1685 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1686 | 1687 | unist-util-remove-position@4.0.1: 1688 | resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} 1689 | 1690 | unist-util-remove@4.0.0: 1691 | resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} 1692 | 1693 | unist-util-stringify-position@3.0.2: 1694 | resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} 1695 | 1696 | unist-util-stringify-position@4.0.0: 1697 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1698 | 1699 | unist-util-visit-parents@4.1.1: 1700 | resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} 1701 | 1702 | unist-util-visit-parents@5.1.1: 1703 | resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} 1704 | 1705 | unist-util-visit-parents@6.0.1: 1706 | resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 1707 | 1708 | unist-util-visit@3.1.0: 1709 | resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} 1710 | 1711 | unist-util-visit@4.1.1: 1712 | resolution: {integrity: sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==} 1713 | 1714 | unist-util-visit@5.0.0: 1715 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1716 | 1717 | update-browserslist-db@1.0.11: 1718 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 1719 | hasBin: true 1720 | peerDependencies: 1721 | browserslist: '>= 4.21.0' 1722 | 1723 | util-deprecate@1.0.2: 1724 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1725 | 1726 | uuid@9.0.0: 1727 | resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} 1728 | hasBin: true 1729 | 1730 | uvu@0.5.6: 1731 | resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} 1732 | engines: {node: '>=8'} 1733 | hasBin: true 1734 | 1735 | vfile-location@4.0.1: 1736 | resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} 1737 | 1738 | vfile-location@5.0.2: 1739 | resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} 1740 | 1741 | vfile-matter@3.0.1: 1742 | resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} 1743 | 1744 | vfile-message@3.1.3: 1745 | resolution: {integrity: sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==} 1746 | 1747 | vfile-message@4.0.2: 1748 | resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 1749 | 1750 | vfile@5.3.6: 1751 | resolution: {integrity: sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==} 1752 | 1753 | vfile@6.0.1: 1754 | resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} 1755 | 1756 | vscode-oniguruma@1.7.0: 1757 | resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} 1758 | 1759 | vscode-textmate@8.0.0: 1760 | resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} 1761 | 1762 | web-namespaces@2.0.1: 1763 | resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 1764 | 1765 | web-worker@1.2.0: 1766 | resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} 1767 | 1768 | which@1.3.1: 1769 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1770 | hasBin: true 1771 | 1772 | wrappy@1.0.2: 1773 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1774 | 1775 | yallist@2.1.2: 1776 | resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 1777 | 1778 | yaml@2.3.2: 1779 | resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} 1780 | engines: {node: '>= 14'} 1781 | 1782 | yocto-queue@0.1.0: 1783 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1784 | engines: {node: '>=10'} 1785 | 1786 | zod@3.22.2: 1787 | resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} 1788 | 1789 | zwitch@2.0.4: 1790 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 1791 | 1792 | snapshots: 1793 | 1794 | '@alloc/quick-lru@5.2.0': {} 1795 | 1796 | '@babel/runtime@7.20.6': 1797 | dependencies: 1798 | regenerator-runtime: 0.13.11 1799 | 1800 | '@braintree/sanitize-url@6.0.4': {} 1801 | 1802 | '@headlessui/react@1.7.10(react-dom@18.2.0)(react@18.2.0)': 1803 | dependencies: 1804 | client-only: 0.0.1 1805 | react: 18.2.0 1806 | react-dom: 18.2.0(react@18.2.0) 1807 | 1808 | '@jridgewell/gen-mapping@0.3.3': 1809 | dependencies: 1810 | '@jridgewell/set-array': 1.1.2 1811 | '@jridgewell/sourcemap-codec': 1.4.15 1812 | '@jridgewell/trace-mapping': 0.3.19 1813 | 1814 | '@jridgewell/resolve-uri@3.1.1': {} 1815 | 1816 | '@jridgewell/set-array@1.1.2': {} 1817 | 1818 | '@jridgewell/sourcemap-codec@1.4.15': {} 1819 | 1820 | '@jridgewell/trace-mapping@0.3.19': 1821 | dependencies: 1822 | '@jridgewell/resolve-uri': 3.1.1 1823 | '@jridgewell/sourcemap-codec': 1.4.15 1824 | 1825 | '@mdx-js/mdx@2.3.0': 1826 | dependencies: 1827 | '@types/estree-jsx': 1.0.0 1828 | '@types/mdx': 2.0.3 1829 | estree-util-build-jsx: 2.2.0 1830 | estree-util-is-identifier-name: 2.0.1 1831 | estree-util-to-js: 1.1.0 1832 | estree-walker: 3.0.1 1833 | hast-util-to-estree: 2.1.0 1834 | markdown-extensions: 1.1.1 1835 | periscopic: 3.0.4 1836 | remark-mdx: 2.1.5 1837 | remark-parse: 10.0.1 1838 | remark-rehype: 10.1.0 1839 | unified: 10.1.2 1840 | unist-util-position-from-estree: 1.1.1 1841 | unist-util-stringify-position: 3.0.2 1842 | unist-util-visit: 4.1.1 1843 | vfile: 5.3.6 1844 | transitivePeerDependencies: 1845 | - supports-color 1846 | 1847 | '@mdx-js/react@2.3.0(react@18.2.0)': 1848 | dependencies: 1849 | '@types/mdx': 2.0.3 1850 | '@types/react': 18.0.25 1851 | react: 18.2.0 1852 | 1853 | '@napi-rs/simple-git-android-arm-eabi@0.1.9': 1854 | optional: true 1855 | 1856 | '@napi-rs/simple-git-android-arm64@0.1.9': 1857 | optional: true 1858 | 1859 | '@napi-rs/simple-git-darwin-arm64@0.1.9': 1860 | optional: true 1861 | 1862 | '@napi-rs/simple-git-darwin-x64@0.1.9': 1863 | optional: true 1864 | 1865 | '@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9': 1866 | optional: true 1867 | 1868 | '@napi-rs/simple-git-linux-arm64-gnu@0.1.9': 1869 | optional: true 1870 | 1871 | '@napi-rs/simple-git-linux-arm64-musl@0.1.9': 1872 | optional: true 1873 | 1874 | '@napi-rs/simple-git-linux-x64-gnu@0.1.9': 1875 | optional: true 1876 | 1877 | '@napi-rs/simple-git-linux-x64-musl@0.1.9': 1878 | optional: true 1879 | 1880 | '@napi-rs/simple-git-win32-arm64-msvc@0.1.9': 1881 | optional: true 1882 | 1883 | '@napi-rs/simple-git-win32-x64-msvc@0.1.9': 1884 | optional: true 1885 | 1886 | '@napi-rs/simple-git@0.1.9': 1887 | optionalDependencies: 1888 | '@napi-rs/simple-git-android-arm-eabi': 0.1.9 1889 | '@napi-rs/simple-git-android-arm64': 0.1.9 1890 | '@napi-rs/simple-git-darwin-arm64': 0.1.9 1891 | '@napi-rs/simple-git-darwin-x64': 0.1.9 1892 | '@napi-rs/simple-git-linux-arm-gnueabihf': 0.1.9 1893 | '@napi-rs/simple-git-linux-arm64-gnu': 0.1.9 1894 | '@napi-rs/simple-git-linux-arm64-musl': 0.1.9 1895 | '@napi-rs/simple-git-linux-x64-gnu': 0.1.9 1896 | '@napi-rs/simple-git-linux-x64-musl': 0.1.9 1897 | '@napi-rs/simple-git-win32-arm64-msvc': 0.1.9 1898 | '@napi-rs/simple-git-win32-x64-msvc': 0.1.9 1899 | 1900 | '@next/env@13.0.6': {} 1901 | 1902 | '@next/swc-android-arm-eabi@13.0.6': 1903 | optional: true 1904 | 1905 | '@next/swc-android-arm64@13.0.6': 1906 | optional: true 1907 | 1908 | '@next/swc-darwin-arm64@13.0.6': 1909 | optional: true 1910 | 1911 | '@next/swc-darwin-x64@13.0.6': 1912 | optional: true 1913 | 1914 | '@next/swc-freebsd-x64@13.0.6': 1915 | optional: true 1916 | 1917 | '@next/swc-linux-arm-gnueabihf@13.0.6': 1918 | optional: true 1919 | 1920 | '@next/swc-linux-arm64-gnu@13.0.6': 1921 | optional: true 1922 | 1923 | '@next/swc-linux-arm64-musl@13.0.6': 1924 | optional: true 1925 | 1926 | '@next/swc-linux-x64-gnu@13.0.6': 1927 | optional: true 1928 | 1929 | '@next/swc-linux-x64-musl@13.0.6': 1930 | optional: true 1931 | 1932 | '@next/swc-win32-arm64-msvc@13.0.6': 1933 | optional: true 1934 | 1935 | '@next/swc-win32-ia32-msvc@13.0.6': 1936 | optional: true 1937 | 1938 | '@next/swc-win32-x64-msvc@13.0.6': 1939 | optional: true 1940 | 1941 | '@nodelib/fs.scandir@2.1.5': 1942 | dependencies: 1943 | '@nodelib/fs.stat': 2.0.5 1944 | run-parallel: 1.2.0 1945 | 1946 | '@nodelib/fs.stat@2.0.5': {} 1947 | 1948 | '@nodelib/fs.walk@1.2.8': 1949 | dependencies: 1950 | '@nodelib/fs.scandir': 2.1.5 1951 | fastq: 1.15.0 1952 | 1953 | '@popperjs/core@2.11.6': {} 1954 | 1955 | '@swc/helpers@0.4.14': 1956 | dependencies: 1957 | tslib: 2.4.1 1958 | 1959 | '@theguild/remark-mermaid@0.0.4(react@18.2.0)': 1960 | dependencies: 1961 | mermaid: 10.4.0 1962 | react: 18.2.0 1963 | unist-util-visit: 5.0.0 1964 | transitivePeerDependencies: 1965 | - supports-color 1966 | 1967 | '@theguild/remark-npm2yarn@0.1.1': 1968 | dependencies: 1969 | npm-to-yarn: 2.0.0 1970 | unist-util-visit: 5.0.0 1971 | 1972 | '@types/acorn@4.0.6': 1973 | dependencies: 1974 | '@types/estree': 1.0.0 1975 | 1976 | '@types/d3-scale-chromatic@3.0.0': {} 1977 | 1978 | '@types/d3-scale@4.0.4': 1979 | dependencies: 1980 | '@types/d3-time': 3.0.0 1981 | 1982 | '@types/d3-time@3.0.0': {} 1983 | 1984 | '@types/debug@4.1.7': 1985 | dependencies: 1986 | '@types/ms': 0.7.31 1987 | 1988 | '@types/estree-jsx@1.0.0': 1989 | dependencies: 1990 | '@types/estree': 1.0.0 1991 | 1992 | '@types/estree@1.0.0': {} 1993 | 1994 | '@types/hast@2.3.4': 1995 | dependencies: 1996 | '@types/unist': 3.0.0 1997 | 1998 | '@types/hast@3.0.0': 1999 | dependencies: 2000 | '@types/unist': 3.0.0 2001 | 2002 | '@types/js-yaml@4.0.5': {} 2003 | 2004 | '@types/katex@0.11.1': {} 2005 | 2006 | '@types/katex@0.14.0': {} 2007 | 2008 | '@types/mdast@3.0.10': 2009 | dependencies: 2010 | '@types/unist': 3.0.0 2011 | 2012 | '@types/mdast@4.0.0': 2013 | dependencies: 2014 | '@types/unist': 3.0.0 2015 | 2016 | '@types/mdx@2.0.3': {} 2017 | 2018 | '@types/ms@0.7.31': {} 2019 | 2020 | '@types/node@18.11.10': {} 2021 | 2022 | '@types/prop-types@15.7.5': {} 2023 | 2024 | '@types/react@18.0.25': 2025 | dependencies: 2026 | '@types/prop-types': 15.7.5 2027 | '@types/scheduler': 0.16.2 2028 | csstype: 3.1.1 2029 | 2030 | '@types/scheduler@0.16.2': {} 2031 | 2032 | '@types/unist@2.0.6': {} 2033 | 2034 | '@types/unist@3.0.0': {} 2035 | 2036 | '@ungap/structured-clone@1.2.0': {} 2037 | 2038 | acorn-jsx@5.3.2(acorn@8.8.1): 2039 | dependencies: 2040 | acorn: 8.8.1 2041 | 2042 | acorn@8.8.1: {} 2043 | 2044 | ansi-sequence-parser@1.1.1: {} 2045 | 2046 | ansi-styles@3.2.1: 2047 | dependencies: 2048 | color-convert: 1.9.3 2049 | 2050 | any-promise@1.3.0: {} 2051 | 2052 | anymatch@3.1.3: 2053 | dependencies: 2054 | normalize-path: 3.0.0 2055 | picomatch: 2.3.1 2056 | 2057 | arch@2.2.0: {} 2058 | 2059 | arg@1.0.0: {} 2060 | 2061 | arg@5.0.2: {} 2062 | 2063 | argparse@1.0.10: 2064 | dependencies: 2065 | sprintf-js: 1.0.3 2066 | 2067 | argparse@2.0.1: {} 2068 | 2069 | astring@1.8.3: {} 2070 | 2071 | autoprefixer@10.4.15(postcss@8.4.29): 2072 | dependencies: 2073 | browserslist: 4.21.10 2074 | caniuse-lite: 1.0.30001527 2075 | fraction.js: 4.3.6 2076 | normalize-range: 0.1.2 2077 | picocolors: 1.0.0 2078 | postcss: 8.4.29 2079 | postcss-value-parser: 4.2.0 2080 | 2081 | bail@2.0.2: {} 2082 | 2083 | balanced-match@1.0.2: {} 2084 | 2085 | binary-extensions@2.2.0: {} 2086 | 2087 | brace-expansion@1.1.11: 2088 | dependencies: 2089 | balanced-match: 1.0.2 2090 | concat-map: 0.0.1 2091 | 2092 | braces@3.0.2: 2093 | dependencies: 2094 | fill-range: 7.0.1 2095 | 2096 | browserslist@4.21.10: 2097 | dependencies: 2098 | caniuse-lite: 1.0.30001527 2099 | electron-to-chromium: 1.4.508 2100 | node-releases: 2.0.13 2101 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 2102 | 2103 | camelcase-css@2.0.1: {} 2104 | 2105 | caniuse-lite@1.0.30001435: {} 2106 | 2107 | caniuse-lite@1.0.30001527: {} 2108 | 2109 | ccount@2.0.1: {} 2110 | 2111 | chalk@2.3.0: 2112 | dependencies: 2113 | ansi-styles: 3.2.1 2114 | escape-string-regexp: 1.0.5 2115 | supports-color: 4.5.0 2116 | 2117 | character-entities-html4@2.1.0: {} 2118 | 2119 | character-entities-legacy@3.0.0: {} 2120 | 2121 | character-entities@2.0.2: {} 2122 | 2123 | character-reference-invalid@2.0.1: {} 2124 | 2125 | chokidar@3.5.3: 2126 | dependencies: 2127 | anymatch: 3.1.3 2128 | braces: 3.0.2 2129 | glob-parent: 5.1.2 2130 | is-binary-path: 2.1.0 2131 | is-glob: 4.0.3 2132 | normalize-path: 3.0.0 2133 | readdirp: 3.6.0 2134 | optionalDependencies: 2135 | fsevents: 2.3.3 2136 | 2137 | client-only@0.0.1: {} 2138 | 2139 | clipboardy@1.2.2: 2140 | dependencies: 2141 | arch: 2.2.0 2142 | execa: 0.8.0 2143 | 2144 | clsx@2.0.0: {} 2145 | 2146 | color-convert@1.9.3: 2147 | dependencies: 2148 | color-name: 1.1.3 2149 | 2150 | color-name@1.1.3: {} 2151 | 2152 | comma-separated-tokens@2.0.3: {} 2153 | 2154 | commander@4.1.1: {} 2155 | 2156 | commander@7.2.0: {} 2157 | 2158 | commander@8.3.0: {} 2159 | 2160 | compute-scroll-into-view@2.0.4: {} 2161 | 2162 | concat-map@0.0.1: {} 2163 | 2164 | cose-base@1.0.3: 2165 | dependencies: 2166 | layout-base: 1.0.2 2167 | 2168 | cose-base@2.2.0: 2169 | dependencies: 2170 | layout-base: 2.0.1 2171 | 2172 | cross-spawn@5.1.0: 2173 | dependencies: 2174 | lru-cache: 4.1.5 2175 | shebang-command: 1.2.0 2176 | which: 1.3.1 2177 | 2178 | cssesc@3.0.0: {} 2179 | 2180 | csstype@3.1.1: {} 2181 | 2182 | cytoscape-cose-bilkent@4.1.0(cytoscape@3.26.0): 2183 | dependencies: 2184 | cose-base: 1.0.3 2185 | cytoscape: 3.26.0 2186 | 2187 | cytoscape-fcose@2.2.0(cytoscape@3.26.0): 2188 | dependencies: 2189 | cose-base: 2.2.0 2190 | cytoscape: 3.26.0 2191 | 2192 | cytoscape@3.26.0: 2193 | dependencies: 2194 | heap: 0.2.7 2195 | lodash: 4.17.21 2196 | 2197 | d3-array@2.12.1: 2198 | dependencies: 2199 | internmap: 1.0.1 2200 | 2201 | d3-array@3.2.4: 2202 | dependencies: 2203 | internmap: 2.0.3 2204 | 2205 | d3-axis@3.0.0: {} 2206 | 2207 | d3-brush@3.0.0: 2208 | dependencies: 2209 | d3-dispatch: 3.0.1 2210 | d3-drag: 3.0.0 2211 | d3-interpolate: 3.0.1 2212 | d3-selection: 3.0.0 2213 | d3-transition: 3.0.1(d3-selection@3.0.0) 2214 | 2215 | d3-chord@3.0.1: 2216 | dependencies: 2217 | d3-path: 3.1.0 2218 | 2219 | d3-color@3.1.0: {} 2220 | 2221 | d3-contour@4.0.2: 2222 | dependencies: 2223 | d3-array: 3.2.4 2224 | 2225 | d3-delaunay@6.0.4: 2226 | dependencies: 2227 | delaunator: 5.0.0 2228 | 2229 | d3-dispatch@3.0.1: {} 2230 | 2231 | d3-drag@3.0.0: 2232 | dependencies: 2233 | d3-dispatch: 3.0.1 2234 | d3-selection: 3.0.0 2235 | 2236 | d3-dsv@3.0.1: 2237 | dependencies: 2238 | commander: 7.2.0 2239 | iconv-lite: 0.6.3 2240 | rw: 1.3.3 2241 | 2242 | d3-ease@3.0.1: {} 2243 | 2244 | d3-fetch@3.0.1: 2245 | dependencies: 2246 | d3-dsv: 3.0.1 2247 | 2248 | d3-force@3.0.0: 2249 | dependencies: 2250 | d3-dispatch: 3.0.1 2251 | d3-quadtree: 3.0.1 2252 | d3-timer: 3.0.1 2253 | 2254 | d3-format@3.1.0: {} 2255 | 2256 | d3-geo@3.1.0: 2257 | dependencies: 2258 | d3-array: 3.2.4 2259 | 2260 | d3-hierarchy@3.1.2: {} 2261 | 2262 | d3-interpolate@3.0.1: 2263 | dependencies: 2264 | d3-color: 3.1.0 2265 | 2266 | d3-path@1.0.9: {} 2267 | 2268 | d3-path@3.1.0: {} 2269 | 2270 | d3-polygon@3.0.1: {} 2271 | 2272 | d3-quadtree@3.0.1: {} 2273 | 2274 | d3-random@3.0.1: {} 2275 | 2276 | d3-sankey@0.12.3: 2277 | dependencies: 2278 | d3-array: 2.12.1 2279 | d3-shape: 1.3.7 2280 | 2281 | d3-scale-chromatic@3.0.0: 2282 | dependencies: 2283 | d3-color: 3.1.0 2284 | d3-interpolate: 3.0.1 2285 | 2286 | d3-scale@4.0.2: 2287 | dependencies: 2288 | d3-array: 3.2.4 2289 | d3-format: 3.1.0 2290 | d3-interpolate: 3.0.1 2291 | d3-time: 3.1.0 2292 | d3-time-format: 4.1.0 2293 | 2294 | d3-selection@3.0.0: {} 2295 | 2296 | d3-shape@1.3.7: 2297 | dependencies: 2298 | d3-path: 1.0.9 2299 | 2300 | d3-shape@3.2.0: 2301 | dependencies: 2302 | d3-path: 3.1.0 2303 | 2304 | d3-time-format@4.1.0: 2305 | dependencies: 2306 | d3-time: 3.1.0 2307 | 2308 | d3-time@3.1.0: 2309 | dependencies: 2310 | d3-array: 3.2.4 2311 | 2312 | d3-timer@3.0.1: {} 2313 | 2314 | d3-transition@3.0.1(d3-selection@3.0.0): 2315 | dependencies: 2316 | d3-color: 3.1.0 2317 | d3-dispatch: 3.0.1 2318 | d3-ease: 3.0.1 2319 | d3-interpolate: 3.0.1 2320 | d3-selection: 3.0.0 2321 | d3-timer: 3.0.1 2322 | 2323 | d3-zoom@3.0.0: 2324 | dependencies: 2325 | d3-dispatch: 3.0.1 2326 | d3-drag: 3.0.0 2327 | d3-interpolate: 3.0.1 2328 | d3-selection: 3.0.0 2329 | d3-transition: 3.0.1(d3-selection@3.0.0) 2330 | 2331 | d3@7.8.5: 2332 | dependencies: 2333 | d3-array: 3.2.4 2334 | d3-axis: 3.0.0 2335 | d3-brush: 3.0.0 2336 | d3-chord: 3.0.1 2337 | d3-color: 3.1.0 2338 | d3-contour: 4.0.2 2339 | d3-delaunay: 6.0.4 2340 | d3-dispatch: 3.0.1 2341 | d3-drag: 3.0.0 2342 | d3-dsv: 3.0.1 2343 | d3-ease: 3.0.1 2344 | d3-fetch: 3.0.1 2345 | d3-force: 3.0.0 2346 | d3-format: 3.1.0 2347 | d3-geo: 3.1.0 2348 | d3-hierarchy: 3.1.2 2349 | d3-interpolate: 3.0.1 2350 | d3-path: 3.1.0 2351 | d3-polygon: 3.0.1 2352 | d3-quadtree: 3.0.1 2353 | d3-random: 3.0.1 2354 | d3-scale: 4.0.2 2355 | d3-scale-chromatic: 3.0.0 2356 | d3-selection: 3.0.0 2357 | d3-shape: 3.2.0 2358 | d3-time: 3.1.0 2359 | d3-time-format: 4.1.0 2360 | d3-timer: 3.0.1 2361 | d3-transition: 3.0.1(d3-selection@3.0.0) 2362 | d3-zoom: 3.0.0 2363 | 2364 | dagre-d3-es@7.0.10: 2365 | dependencies: 2366 | d3: 7.8.5 2367 | lodash-es: 4.17.21 2368 | 2369 | dayjs@1.11.9: {} 2370 | 2371 | debug@4.3.4: 2372 | dependencies: 2373 | ms: 2.1.2 2374 | 2375 | decode-named-character-reference@1.0.2: 2376 | dependencies: 2377 | character-entities: 2.0.2 2378 | 2379 | delaunator@5.0.0: 2380 | dependencies: 2381 | robust-predicates: 3.0.2 2382 | 2383 | dequal@2.0.3: {} 2384 | 2385 | devlop@1.1.0: 2386 | dependencies: 2387 | dequal: 2.0.3 2388 | 2389 | didyoumean@1.2.2: {} 2390 | 2391 | diff@5.1.0: {} 2392 | 2393 | dlv@1.1.3: {} 2394 | 2395 | dompurify@3.0.5: {} 2396 | 2397 | electron-to-chromium@1.4.508: {} 2398 | 2399 | elkjs@0.8.2: {} 2400 | 2401 | entities@4.5.0: {} 2402 | 2403 | escalade@3.1.1: {} 2404 | 2405 | escape-string-regexp@1.0.5: {} 2406 | 2407 | escape-string-regexp@5.0.0: {} 2408 | 2409 | esprima@4.0.1: {} 2410 | 2411 | estree-util-attach-comments@2.1.0: 2412 | dependencies: 2413 | '@types/estree': 1.0.0 2414 | 2415 | estree-util-build-jsx@2.2.0: 2416 | dependencies: 2417 | '@types/estree-jsx': 1.0.0 2418 | estree-util-is-identifier-name: 2.0.1 2419 | estree-walker: 3.0.1 2420 | 2421 | estree-util-is-identifier-name@2.0.1: {} 2422 | 2423 | estree-util-to-js@1.1.0: 2424 | dependencies: 2425 | '@types/estree-jsx': 1.0.0 2426 | astring: 1.8.3 2427 | source-map: 0.7.4 2428 | 2429 | estree-util-value-to-estree@1.3.0: 2430 | dependencies: 2431 | is-plain-obj: 3.0.0 2432 | 2433 | estree-util-visit@1.2.0: 2434 | dependencies: 2435 | '@types/estree-jsx': 1.0.0 2436 | '@types/unist': 2.0.6 2437 | 2438 | estree-walker@3.0.1: {} 2439 | 2440 | execa@0.8.0: 2441 | dependencies: 2442 | cross-spawn: 5.1.0 2443 | get-stream: 3.0.0 2444 | is-stream: 1.1.0 2445 | npm-run-path: 2.0.2 2446 | p-finally: 1.0.0 2447 | signal-exit: 3.0.7 2448 | strip-eof: 1.0.0 2449 | 2450 | extend-shallow@2.0.1: 2451 | dependencies: 2452 | is-extendable: 0.1.1 2453 | 2454 | extend@3.0.2: {} 2455 | 2456 | fast-glob@3.3.1: 2457 | dependencies: 2458 | '@nodelib/fs.stat': 2.0.5 2459 | '@nodelib/fs.walk': 1.2.8 2460 | glob-parent: 5.1.2 2461 | merge2: 1.4.1 2462 | micromatch: 4.0.5 2463 | 2464 | fastq@1.15.0: 2465 | dependencies: 2466 | reusify: 1.0.4 2467 | 2468 | fill-range@7.0.1: 2469 | dependencies: 2470 | to-regex-range: 5.0.1 2471 | 2472 | flexsearch@0.7.31: {} 2473 | 2474 | focus-visible@5.2.0: {} 2475 | 2476 | fraction.js@4.3.6: {} 2477 | 2478 | fs.realpath@1.0.0: {} 2479 | 2480 | fsevents@2.3.3: 2481 | optional: true 2482 | 2483 | function-bind@1.1.1: {} 2484 | 2485 | get-stream@3.0.0: {} 2486 | 2487 | git-up@7.0.0: 2488 | dependencies: 2489 | is-ssh: 1.4.0 2490 | parse-url: 8.1.0 2491 | 2492 | git-url-parse@13.1.0: 2493 | dependencies: 2494 | git-up: 7.0.0 2495 | 2496 | github-slugger@2.0.0: {} 2497 | 2498 | glob-parent@5.1.2: 2499 | dependencies: 2500 | is-glob: 4.0.3 2501 | 2502 | glob-parent@6.0.2: 2503 | dependencies: 2504 | is-glob: 4.0.3 2505 | 2506 | glob@7.1.6: 2507 | dependencies: 2508 | fs.realpath: 1.0.0 2509 | inflight: 1.0.6 2510 | inherits: 2.0.4 2511 | minimatch: 3.1.2 2512 | once: 1.4.0 2513 | path-is-absolute: 1.0.1 2514 | 2515 | graceful-fs@4.2.11: {} 2516 | 2517 | gray-matter@4.0.3: 2518 | dependencies: 2519 | js-yaml: 3.14.1 2520 | kind-of: 6.0.3 2521 | section-matter: 1.0.0 2522 | strip-bom-string: 1.0.0 2523 | 2524 | has-flag@2.0.0: {} 2525 | 2526 | has@1.0.3: 2527 | dependencies: 2528 | function-bind: 1.1.1 2529 | 2530 | hash-obj@4.0.0: 2531 | dependencies: 2532 | is-obj: 3.0.0 2533 | sort-keys: 5.0.0 2534 | type-fest: 1.4.0 2535 | 2536 | hast-util-from-dom@4.2.0: 2537 | dependencies: 2538 | hastscript: 7.2.0 2539 | web-namespaces: 2.0.1 2540 | 2541 | hast-util-from-html-isomorphic@1.0.0: 2542 | dependencies: 2543 | '@types/hast': 2.3.4 2544 | hast-util-from-dom: 4.2.0 2545 | hast-util-from-html: 1.0.2 2546 | unist-util-remove-position: 4.0.1 2547 | 2548 | hast-util-from-html@1.0.2: 2549 | dependencies: 2550 | '@types/hast': 2.3.4 2551 | hast-util-from-parse5: 7.1.1 2552 | parse5: 7.1.2 2553 | vfile: 5.3.6 2554 | vfile-message: 3.1.3 2555 | 2556 | hast-util-from-parse5@7.1.1: 2557 | dependencies: 2558 | '@types/hast': 2.3.4 2559 | '@types/unist': 2.0.6 2560 | hastscript: 7.2.0 2561 | property-information: 6.2.0 2562 | vfile: 5.3.6 2563 | vfile-location: 4.0.1 2564 | web-namespaces: 2.0.1 2565 | 2566 | hast-util-from-parse5@8.0.1: 2567 | dependencies: 2568 | '@types/hast': 3.0.0 2569 | '@types/unist': 3.0.0 2570 | devlop: 1.1.0 2571 | hastscript: 8.0.0 2572 | property-information: 6.2.0 2573 | vfile: 6.0.1 2574 | vfile-location: 5.0.2 2575 | web-namespaces: 2.0.1 2576 | 2577 | hast-util-is-element@2.1.3: 2578 | dependencies: 2579 | '@types/hast': 2.3.4 2580 | '@types/unist': 2.0.6 2581 | 2582 | hast-util-parse-selector@3.1.1: 2583 | dependencies: 2584 | '@types/hast': 2.3.4 2585 | 2586 | hast-util-parse-selector@4.0.0: 2587 | dependencies: 2588 | '@types/hast': 3.0.0 2589 | 2590 | hast-util-raw@9.0.1: 2591 | dependencies: 2592 | '@types/hast': 3.0.0 2593 | '@types/unist': 3.0.0 2594 | '@ungap/structured-clone': 1.2.0 2595 | hast-util-from-parse5: 8.0.1 2596 | hast-util-to-parse5: 8.0.0 2597 | html-void-elements: 3.0.0 2598 | mdast-util-to-hast: 13.0.2 2599 | parse5: 7.1.2 2600 | unist-util-position: 5.0.0 2601 | unist-util-visit: 5.0.0 2602 | vfile: 6.0.1 2603 | web-namespaces: 2.0.1 2604 | zwitch: 2.0.4 2605 | 2606 | hast-util-to-estree@2.1.0: 2607 | dependencies: 2608 | '@types/estree': 1.0.0 2609 | '@types/estree-jsx': 1.0.0 2610 | '@types/hast': 2.3.4 2611 | '@types/unist': 2.0.6 2612 | comma-separated-tokens: 2.0.3 2613 | estree-util-attach-comments: 2.1.0 2614 | estree-util-is-identifier-name: 2.0.1 2615 | hast-util-whitespace: 2.0.0 2616 | mdast-util-mdx-expression: 1.3.1 2617 | mdast-util-mdxjs-esm: 1.3.0 2618 | property-information: 6.2.0 2619 | space-separated-tokens: 2.0.2 2620 | style-to-object: 0.3.0 2621 | unist-util-position: 4.0.3 2622 | zwitch: 2.0.4 2623 | transitivePeerDependencies: 2624 | - supports-color 2625 | 2626 | hast-util-to-parse5@8.0.0: 2627 | dependencies: 2628 | '@types/hast': 3.0.0 2629 | comma-separated-tokens: 2.0.3 2630 | devlop: 1.1.0 2631 | property-information: 6.2.0 2632 | space-separated-tokens: 2.0.2 2633 | web-namespaces: 2.0.1 2634 | zwitch: 2.0.4 2635 | 2636 | hast-util-to-text@3.1.2: 2637 | dependencies: 2638 | '@types/hast': 2.3.4 2639 | '@types/unist': 2.0.6 2640 | hast-util-is-element: 2.1.3 2641 | unist-util-find-after: 4.0.1 2642 | 2643 | hast-util-whitespace@2.0.0: {} 2644 | 2645 | hastscript@7.2.0: 2646 | dependencies: 2647 | '@types/hast': 2.3.4 2648 | comma-separated-tokens: 2.0.3 2649 | hast-util-parse-selector: 3.1.1 2650 | property-information: 6.2.0 2651 | space-separated-tokens: 2.0.2 2652 | 2653 | hastscript@8.0.0: 2654 | dependencies: 2655 | '@types/hast': 3.0.0 2656 | comma-separated-tokens: 2.0.3 2657 | hast-util-parse-selector: 4.0.0 2658 | property-information: 6.2.0 2659 | space-separated-tokens: 2.0.2 2660 | 2661 | heap@0.2.7: {} 2662 | 2663 | html-void-elements@3.0.0: {} 2664 | 2665 | iconv-lite@0.6.3: 2666 | dependencies: 2667 | safer-buffer: 2.1.2 2668 | 2669 | inflight@1.0.6: 2670 | dependencies: 2671 | once: 1.4.0 2672 | wrappy: 1.0.2 2673 | 2674 | inherits@2.0.4: {} 2675 | 2676 | inline-style-parser@0.1.1: {} 2677 | 2678 | internmap@1.0.1: {} 2679 | 2680 | internmap@2.0.3: {} 2681 | 2682 | intersection-observer@0.12.2: {} 2683 | 2684 | is-alphabetical@2.0.1: {} 2685 | 2686 | is-alphanumerical@2.0.1: 2687 | dependencies: 2688 | is-alphabetical: 2.0.1 2689 | is-decimal: 2.0.1 2690 | 2691 | is-binary-path@2.1.0: 2692 | dependencies: 2693 | binary-extensions: 2.2.0 2694 | 2695 | is-buffer@2.0.5: {} 2696 | 2697 | is-core-module@2.13.0: 2698 | dependencies: 2699 | has: 1.0.3 2700 | 2701 | is-decimal@2.0.1: {} 2702 | 2703 | is-extendable@0.1.1: {} 2704 | 2705 | is-extglob@2.1.1: {} 2706 | 2707 | is-glob@4.0.3: 2708 | dependencies: 2709 | is-extglob: 2.1.1 2710 | 2711 | is-hexadecimal@2.0.1: {} 2712 | 2713 | is-number@7.0.0: {} 2714 | 2715 | is-obj@3.0.0: {} 2716 | 2717 | is-plain-obj@3.0.0: {} 2718 | 2719 | is-plain-obj@4.1.0: {} 2720 | 2721 | is-reference@3.0.0: 2722 | dependencies: 2723 | '@types/estree': 1.0.0 2724 | 2725 | is-ssh@1.4.0: 2726 | dependencies: 2727 | protocols: 2.0.1 2728 | 2729 | is-stream@1.1.0: {} 2730 | 2731 | isexe@2.0.0: {} 2732 | 2733 | jiti@1.19.3: {} 2734 | 2735 | js-tokens@4.0.0: {} 2736 | 2737 | js-yaml@3.14.1: 2738 | dependencies: 2739 | argparse: 1.0.10 2740 | esprima: 4.0.1 2741 | 2742 | js-yaml@4.1.0: 2743 | dependencies: 2744 | argparse: 2.0.1 2745 | 2746 | jsonc-parser@3.2.0: {} 2747 | 2748 | katex@0.13.24: 2749 | dependencies: 2750 | commander: 8.3.0 2751 | 2752 | katex@0.16.8: 2753 | dependencies: 2754 | commander: 8.3.0 2755 | 2756 | khroma@2.0.0: {} 2757 | 2758 | kind-of@6.0.3: {} 2759 | 2760 | kleur@4.1.5: {} 2761 | 2762 | layout-base@1.0.2: {} 2763 | 2764 | layout-base@2.0.1: {} 2765 | 2766 | lilconfig@2.1.0: {} 2767 | 2768 | lines-and-columns@1.2.4: {} 2769 | 2770 | lodash-es@4.17.21: {} 2771 | 2772 | lodash.get@4.4.2: {} 2773 | 2774 | lodash@4.17.21: {} 2775 | 2776 | longest-streak@3.1.0: {} 2777 | 2778 | loose-envify@1.4.0: 2779 | dependencies: 2780 | js-tokens: 4.0.0 2781 | 2782 | lru-cache@4.1.5: 2783 | dependencies: 2784 | pseudomap: 1.0.2 2785 | yallist: 2.1.2 2786 | 2787 | markdown-extensions@1.1.1: {} 2788 | 2789 | markdown-table@3.0.3: {} 2790 | 2791 | match-sorter@6.3.1: 2792 | dependencies: 2793 | '@babel/runtime': 7.20.6 2794 | remove-accents: 0.4.2 2795 | 2796 | mdast-util-definitions@5.1.1: 2797 | dependencies: 2798 | '@types/mdast': 3.0.10 2799 | '@types/unist': 2.0.6 2800 | unist-util-visit: 4.1.1 2801 | 2802 | mdast-util-find-and-replace@2.2.1: 2803 | dependencies: 2804 | escape-string-regexp: 5.0.0 2805 | unist-util-is: 5.1.1 2806 | unist-util-visit-parents: 5.1.1 2807 | 2808 | mdast-util-from-markdown@1.3.1: 2809 | dependencies: 2810 | '@types/mdast': 3.0.10 2811 | '@types/unist': 2.0.6 2812 | decode-named-character-reference: 1.0.2 2813 | mdast-util-to-string: 3.1.0 2814 | micromark: 3.1.0 2815 | micromark-util-decode-numeric-character-reference: 1.0.0 2816 | micromark-util-decode-string: 1.0.2 2817 | micromark-util-normalize-identifier: 1.0.0 2818 | micromark-util-symbol: 1.0.1 2819 | micromark-util-types: 1.0.2 2820 | unist-util-stringify-position: 3.0.2 2821 | uvu: 0.5.6 2822 | transitivePeerDependencies: 2823 | - supports-color 2824 | 2825 | mdast-util-gfm-autolink-literal@1.0.2: 2826 | dependencies: 2827 | '@types/mdast': 3.0.10 2828 | ccount: 2.0.1 2829 | mdast-util-find-and-replace: 2.2.1 2830 | micromark-util-character: 1.1.0 2831 | 2832 | mdast-util-gfm-footnote@1.0.1: 2833 | dependencies: 2834 | '@types/mdast': 3.0.10 2835 | mdast-util-to-markdown: 1.3.0 2836 | micromark-util-normalize-identifier: 1.0.0 2837 | 2838 | mdast-util-gfm-strikethrough@1.0.2: 2839 | dependencies: 2840 | '@types/mdast': 3.0.10 2841 | mdast-util-to-markdown: 1.3.0 2842 | 2843 | mdast-util-gfm-table@1.0.6: 2844 | dependencies: 2845 | '@types/mdast': 3.0.10 2846 | markdown-table: 3.0.3 2847 | mdast-util-from-markdown: 1.3.1 2848 | mdast-util-to-markdown: 1.3.0 2849 | transitivePeerDependencies: 2850 | - supports-color 2851 | 2852 | mdast-util-gfm-task-list-item@1.0.1: 2853 | dependencies: 2854 | '@types/mdast': 3.0.10 2855 | mdast-util-to-markdown: 1.3.0 2856 | 2857 | mdast-util-gfm@2.0.1: 2858 | dependencies: 2859 | mdast-util-from-markdown: 1.3.1 2860 | mdast-util-gfm-autolink-literal: 1.0.2 2861 | mdast-util-gfm-footnote: 1.0.1 2862 | mdast-util-gfm-strikethrough: 1.0.2 2863 | mdast-util-gfm-table: 1.0.6 2864 | mdast-util-gfm-task-list-item: 1.0.1 2865 | mdast-util-to-markdown: 1.3.0 2866 | transitivePeerDependencies: 2867 | - supports-color 2868 | 2869 | mdast-util-math@2.0.2: 2870 | dependencies: 2871 | '@types/mdast': 3.0.10 2872 | longest-streak: 3.1.0 2873 | mdast-util-to-markdown: 1.3.0 2874 | 2875 | mdast-util-mdx-expression@1.3.1: 2876 | dependencies: 2877 | '@types/estree-jsx': 1.0.0 2878 | '@types/hast': 2.3.4 2879 | '@types/mdast': 3.0.10 2880 | mdast-util-from-markdown: 1.3.1 2881 | mdast-util-to-markdown: 1.3.0 2882 | transitivePeerDependencies: 2883 | - supports-color 2884 | 2885 | mdast-util-mdx-jsx@2.1.0: 2886 | dependencies: 2887 | '@types/estree-jsx': 1.0.0 2888 | '@types/hast': 2.3.4 2889 | '@types/mdast': 3.0.10 2890 | ccount: 2.0.1 2891 | mdast-util-to-markdown: 1.3.0 2892 | parse-entities: 4.0.0 2893 | stringify-entities: 4.0.3 2894 | unist-util-remove-position: 4.0.1 2895 | unist-util-stringify-position: 3.0.2 2896 | vfile-message: 3.1.3 2897 | 2898 | mdast-util-mdx@2.0.0: 2899 | dependencies: 2900 | mdast-util-mdx-expression: 1.3.1 2901 | mdast-util-mdx-jsx: 2.1.0 2902 | mdast-util-mdxjs-esm: 1.3.0 2903 | transitivePeerDependencies: 2904 | - supports-color 2905 | 2906 | mdast-util-mdxjs-esm@1.3.0: 2907 | dependencies: 2908 | '@types/estree-jsx': 1.0.0 2909 | '@types/hast': 2.3.4 2910 | '@types/mdast': 3.0.10 2911 | mdast-util-from-markdown: 1.3.1 2912 | mdast-util-to-markdown: 1.3.0 2913 | transitivePeerDependencies: 2914 | - supports-color 2915 | 2916 | mdast-util-to-hast@12.2.4: 2917 | dependencies: 2918 | '@types/hast': 2.3.4 2919 | '@types/mdast': 3.0.10 2920 | mdast-util-definitions: 5.1.1 2921 | micromark-util-sanitize-uri: 1.1.0 2922 | trim-lines: 3.0.1 2923 | unist-builder: 3.0.0 2924 | unist-util-generated: 2.0.0 2925 | unist-util-position: 4.0.3 2926 | unist-util-visit: 4.1.1 2927 | 2928 | mdast-util-to-hast@13.0.2: 2929 | dependencies: 2930 | '@types/hast': 3.0.0 2931 | '@types/mdast': 4.0.0 2932 | '@ungap/structured-clone': 1.2.0 2933 | devlop: 1.1.0 2934 | micromark-util-sanitize-uri: 2.0.0 2935 | trim-lines: 3.0.1 2936 | unist-util-position: 5.0.0 2937 | unist-util-visit: 5.0.0 2938 | 2939 | mdast-util-to-markdown@1.3.0: 2940 | dependencies: 2941 | '@types/mdast': 3.0.10 2942 | '@types/unist': 2.0.6 2943 | longest-streak: 3.1.0 2944 | mdast-util-to-string: 3.1.0 2945 | micromark-util-decode-string: 1.0.2 2946 | unist-util-visit: 4.1.1 2947 | zwitch: 2.0.4 2948 | 2949 | mdast-util-to-string@3.1.0: {} 2950 | 2951 | merge2@1.4.1: {} 2952 | 2953 | mermaid@10.4.0: 2954 | dependencies: 2955 | '@braintree/sanitize-url': 6.0.4 2956 | '@types/d3-scale': 4.0.4 2957 | '@types/d3-scale-chromatic': 3.0.0 2958 | cytoscape: 3.26.0 2959 | cytoscape-cose-bilkent: 4.1.0(cytoscape@3.26.0) 2960 | cytoscape-fcose: 2.2.0(cytoscape@3.26.0) 2961 | d3: 7.8.5 2962 | d3-sankey: 0.12.3 2963 | dagre-d3-es: 7.0.10 2964 | dayjs: 1.11.9 2965 | dompurify: 3.0.5 2966 | elkjs: 0.8.2 2967 | khroma: 2.0.0 2968 | lodash-es: 4.17.21 2969 | mdast-util-from-markdown: 1.3.1 2970 | non-layered-tidy-tree-layout: 2.0.2 2971 | stylis: 4.3.0 2972 | ts-dedent: 2.2.0 2973 | uuid: 9.0.0 2974 | web-worker: 1.2.0 2975 | transitivePeerDependencies: 2976 | - supports-color 2977 | 2978 | micromark-core-commonmark@1.0.6: 2979 | dependencies: 2980 | decode-named-character-reference: 1.0.2 2981 | micromark-factory-destination: 1.0.0 2982 | micromark-factory-label: 1.0.2 2983 | micromark-factory-space: 1.0.0 2984 | micromark-factory-title: 1.0.2 2985 | micromark-factory-whitespace: 1.0.0 2986 | micromark-util-character: 1.1.0 2987 | micromark-util-chunked: 1.0.0 2988 | micromark-util-classify-character: 1.0.0 2989 | micromark-util-html-tag-name: 1.1.0 2990 | micromark-util-normalize-identifier: 1.0.0 2991 | micromark-util-resolve-all: 1.0.0 2992 | micromark-util-subtokenize: 1.0.2 2993 | micromark-util-symbol: 1.0.1 2994 | micromark-util-types: 1.0.2 2995 | uvu: 0.5.6 2996 | 2997 | micromark-extension-gfm-autolink-literal@1.0.3: 2998 | dependencies: 2999 | micromark-util-character: 1.1.0 3000 | micromark-util-sanitize-uri: 1.1.0 3001 | micromark-util-symbol: 1.0.1 3002 | micromark-util-types: 1.0.2 3003 | uvu: 0.5.6 3004 | 3005 | micromark-extension-gfm-footnote@1.0.4: 3006 | dependencies: 3007 | micromark-core-commonmark: 1.0.6 3008 | micromark-factory-space: 1.0.0 3009 | micromark-util-character: 1.1.0 3010 | micromark-util-normalize-identifier: 1.0.0 3011 | micromark-util-sanitize-uri: 1.1.0 3012 | micromark-util-symbol: 1.0.1 3013 | micromark-util-types: 1.0.2 3014 | uvu: 0.5.6 3015 | 3016 | micromark-extension-gfm-strikethrough@1.0.4: 3017 | dependencies: 3018 | micromark-util-chunked: 1.0.0 3019 | micromark-util-classify-character: 1.0.0 3020 | micromark-util-resolve-all: 1.0.0 3021 | micromark-util-symbol: 1.0.1 3022 | micromark-util-types: 1.0.2 3023 | uvu: 0.5.6 3024 | 3025 | micromark-extension-gfm-table@1.0.5: 3026 | dependencies: 3027 | micromark-factory-space: 1.0.0 3028 | micromark-util-character: 1.1.0 3029 | micromark-util-symbol: 1.0.1 3030 | micromark-util-types: 1.0.2 3031 | uvu: 0.5.6 3032 | 3033 | micromark-extension-gfm-tagfilter@1.0.1: 3034 | dependencies: 3035 | micromark-util-types: 1.0.2 3036 | 3037 | micromark-extension-gfm-task-list-item@1.0.3: 3038 | dependencies: 3039 | micromark-factory-space: 1.0.0 3040 | micromark-util-character: 1.1.0 3041 | micromark-util-symbol: 1.0.1 3042 | micromark-util-types: 1.0.2 3043 | uvu: 0.5.6 3044 | 3045 | micromark-extension-gfm@2.0.1: 3046 | dependencies: 3047 | micromark-extension-gfm-autolink-literal: 1.0.3 3048 | micromark-extension-gfm-footnote: 1.0.4 3049 | micromark-extension-gfm-strikethrough: 1.0.4 3050 | micromark-extension-gfm-table: 1.0.5 3051 | micromark-extension-gfm-tagfilter: 1.0.1 3052 | micromark-extension-gfm-task-list-item: 1.0.3 3053 | micromark-util-combine-extensions: 1.0.0 3054 | micromark-util-types: 1.0.2 3055 | 3056 | micromark-extension-math@2.0.2: 3057 | dependencies: 3058 | '@types/katex': 0.11.1 3059 | katex: 0.13.24 3060 | micromark-factory-space: 1.0.0 3061 | micromark-util-character: 1.1.0 3062 | micromark-util-symbol: 1.0.1 3063 | micromark-util-types: 1.0.2 3064 | uvu: 0.5.6 3065 | 3066 | micromark-extension-mdx-expression@1.0.3: 3067 | dependencies: 3068 | micromark-factory-mdx-expression: 1.0.6 3069 | micromark-factory-space: 1.0.0 3070 | micromark-util-character: 1.1.0 3071 | micromark-util-events-to-acorn: 1.2.0 3072 | micromark-util-symbol: 1.0.1 3073 | micromark-util-types: 1.0.2 3074 | uvu: 0.5.6 3075 | 3076 | micromark-extension-mdx-jsx@1.0.3: 3077 | dependencies: 3078 | '@types/acorn': 4.0.6 3079 | estree-util-is-identifier-name: 2.0.1 3080 | micromark-factory-mdx-expression: 1.0.6 3081 | micromark-factory-space: 1.0.0 3082 | micromark-util-character: 1.1.0 3083 | micromark-util-symbol: 1.0.1 3084 | micromark-util-types: 1.0.2 3085 | uvu: 0.5.6 3086 | vfile-message: 3.1.3 3087 | 3088 | micromark-extension-mdx-md@1.0.0: 3089 | dependencies: 3090 | micromark-util-types: 1.0.2 3091 | 3092 | micromark-extension-mdxjs-esm@1.0.3: 3093 | dependencies: 3094 | micromark-core-commonmark: 1.0.6 3095 | micromark-util-character: 1.1.0 3096 | micromark-util-events-to-acorn: 1.2.0 3097 | micromark-util-symbol: 1.0.1 3098 | micromark-util-types: 1.0.2 3099 | unist-util-position-from-estree: 1.1.1 3100 | uvu: 0.5.6 3101 | vfile-message: 3.1.3 3102 | 3103 | micromark-extension-mdxjs@1.0.0: 3104 | dependencies: 3105 | acorn: 8.8.1 3106 | acorn-jsx: 5.3.2(acorn@8.8.1) 3107 | micromark-extension-mdx-expression: 1.0.3 3108 | micromark-extension-mdx-jsx: 1.0.3 3109 | micromark-extension-mdx-md: 1.0.0 3110 | micromark-extension-mdxjs-esm: 1.0.3 3111 | micromark-util-combine-extensions: 1.0.0 3112 | micromark-util-types: 1.0.2 3113 | 3114 | micromark-factory-destination@1.0.0: 3115 | dependencies: 3116 | micromark-util-character: 1.1.0 3117 | micromark-util-symbol: 1.0.1 3118 | micromark-util-types: 1.0.2 3119 | 3120 | micromark-factory-label@1.0.2: 3121 | dependencies: 3122 | micromark-util-character: 1.1.0 3123 | micromark-util-symbol: 1.0.1 3124 | micromark-util-types: 1.0.2 3125 | uvu: 0.5.6 3126 | 3127 | micromark-factory-mdx-expression@1.0.6: 3128 | dependencies: 3129 | micromark-factory-space: 1.0.0 3130 | micromark-util-character: 1.1.0 3131 | micromark-util-events-to-acorn: 1.2.0 3132 | micromark-util-symbol: 1.0.1 3133 | micromark-util-types: 1.0.2 3134 | unist-util-position-from-estree: 1.1.1 3135 | uvu: 0.5.6 3136 | vfile-message: 3.1.3 3137 | 3138 | micromark-factory-space@1.0.0: 3139 | dependencies: 3140 | micromark-util-character: 1.1.0 3141 | micromark-util-types: 1.0.2 3142 | 3143 | micromark-factory-title@1.0.2: 3144 | dependencies: 3145 | micromark-factory-space: 1.0.0 3146 | micromark-util-character: 1.1.0 3147 | micromark-util-symbol: 1.0.1 3148 | micromark-util-types: 1.0.2 3149 | uvu: 0.5.6 3150 | 3151 | micromark-factory-whitespace@1.0.0: 3152 | dependencies: 3153 | micromark-factory-space: 1.0.0 3154 | micromark-util-character: 1.1.0 3155 | micromark-util-symbol: 1.0.1 3156 | micromark-util-types: 1.0.2 3157 | 3158 | micromark-util-character@1.1.0: 3159 | dependencies: 3160 | micromark-util-symbol: 1.0.1 3161 | micromark-util-types: 1.0.2 3162 | 3163 | micromark-util-character@2.0.1: 3164 | dependencies: 3165 | micromark-util-symbol: 2.0.0 3166 | micromark-util-types: 2.0.0 3167 | 3168 | micromark-util-chunked@1.0.0: 3169 | dependencies: 3170 | micromark-util-symbol: 1.0.1 3171 | 3172 | micromark-util-classify-character@1.0.0: 3173 | dependencies: 3174 | micromark-util-character: 1.1.0 3175 | micromark-util-symbol: 1.0.1 3176 | micromark-util-types: 1.0.2 3177 | 3178 | micromark-util-combine-extensions@1.0.0: 3179 | dependencies: 3180 | micromark-util-chunked: 1.0.0 3181 | micromark-util-types: 1.0.2 3182 | 3183 | micromark-util-decode-numeric-character-reference@1.0.0: 3184 | dependencies: 3185 | micromark-util-symbol: 1.0.1 3186 | 3187 | micromark-util-decode-string@1.0.2: 3188 | dependencies: 3189 | decode-named-character-reference: 1.0.2 3190 | micromark-util-character: 1.1.0 3191 | micromark-util-decode-numeric-character-reference: 1.0.0 3192 | micromark-util-symbol: 1.0.1 3193 | 3194 | micromark-util-encode@1.0.1: {} 3195 | 3196 | micromark-util-encode@2.0.0: {} 3197 | 3198 | micromark-util-events-to-acorn@1.2.0: 3199 | dependencies: 3200 | '@types/acorn': 4.0.6 3201 | '@types/estree': 1.0.0 3202 | estree-util-visit: 1.2.0 3203 | micromark-util-types: 1.0.2 3204 | uvu: 0.5.6 3205 | vfile-location: 4.0.1 3206 | vfile-message: 3.1.3 3207 | 3208 | micromark-util-html-tag-name@1.1.0: {} 3209 | 3210 | micromark-util-normalize-identifier@1.0.0: 3211 | dependencies: 3212 | micromark-util-symbol: 1.0.1 3213 | 3214 | micromark-util-resolve-all@1.0.0: 3215 | dependencies: 3216 | micromark-util-types: 1.0.2 3217 | 3218 | micromark-util-sanitize-uri@1.1.0: 3219 | dependencies: 3220 | micromark-util-character: 1.1.0 3221 | micromark-util-encode: 1.0.1 3222 | micromark-util-symbol: 1.0.1 3223 | 3224 | micromark-util-sanitize-uri@2.0.0: 3225 | dependencies: 3226 | micromark-util-character: 2.0.1 3227 | micromark-util-encode: 2.0.0 3228 | micromark-util-symbol: 2.0.0 3229 | 3230 | micromark-util-subtokenize@1.0.2: 3231 | dependencies: 3232 | micromark-util-chunked: 1.0.0 3233 | micromark-util-symbol: 1.0.1 3234 | micromark-util-types: 1.0.2 3235 | uvu: 0.5.6 3236 | 3237 | micromark-util-symbol@1.0.1: {} 3238 | 3239 | micromark-util-symbol@2.0.0: {} 3240 | 3241 | micromark-util-types@1.0.2: {} 3242 | 3243 | micromark-util-types@2.0.0: {} 3244 | 3245 | micromark@3.1.0: 3246 | dependencies: 3247 | '@types/debug': 4.1.7 3248 | debug: 4.3.4 3249 | decode-named-character-reference: 1.0.2 3250 | micromark-core-commonmark: 1.0.6 3251 | micromark-factory-space: 1.0.0 3252 | micromark-util-character: 1.1.0 3253 | micromark-util-chunked: 1.0.0 3254 | micromark-util-combine-extensions: 1.0.0 3255 | micromark-util-decode-numeric-character-reference: 1.0.0 3256 | micromark-util-encode: 1.0.1 3257 | micromark-util-normalize-identifier: 1.0.0 3258 | micromark-util-resolve-all: 1.0.0 3259 | micromark-util-sanitize-uri: 1.1.0 3260 | micromark-util-subtokenize: 1.0.2 3261 | micromark-util-symbol: 1.0.1 3262 | micromark-util-types: 1.0.2 3263 | uvu: 0.5.6 3264 | transitivePeerDependencies: 3265 | - supports-color 3266 | 3267 | micromatch@4.0.5: 3268 | dependencies: 3269 | braces: 3.0.2 3270 | picomatch: 2.3.1 3271 | 3272 | minimatch@3.1.2: 3273 | dependencies: 3274 | brace-expansion: 1.1.11 3275 | 3276 | mri@1.2.0: {} 3277 | 3278 | ms@2.1.2: {} 3279 | 3280 | mz@2.7.0: 3281 | dependencies: 3282 | any-promise: 1.3.0 3283 | object-assign: 4.1.1 3284 | thenify-all: 1.6.0 3285 | 3286 | nanoid@3.3.6: {} 3287 | 3288 | next-mdx-remote@4.3.0(react-dom@18.2.0)(react@18.2.0): 3289 | dependencies: 3290 | '@mdx-js/mdx': 2.3.0 3291 | '@mdx-js/react': 2.3.0(react@18.2.0) 3292 | react: 18.2.0 3293 | react-dom: 18.2.0(react@18.2.0) 3294 | vfile: 5.3.6 3295 | vfile-matter: 3.0.1 3296 | transitivePeerDependencies: 3297 | - supports-color 3298 | 3299 | next-seo@6.1.0(next@13.0.6)(react-dom@18.2.0)(react@18.2.0): 3300 | dependencies: 3301 | next: 13.0.6(react-dom@18.2.0)(react@18.2.0) 3302 | react: 18.2.0 3303 | react-dom: 18.2.0(react@18.2.0) 3304 | 3305 | next-themes@0.2.1(next@13.0.6)(react-dom@18.2.0)(react@18.2.0): 3306 | dependencies: 3307 | next: 13.0.6(react-dom@18.2.0)(react@18.2.0) 3308 | react: 18.2.0 3309 | react-dom: 18.2.0(react@18.2.0) 3310 | 3311 | next@13.0.6(react-dom@18.2.0)(react@18.2.0): 3312 | dependencies: 3313 | '@next/env': 13.0.6 3314 | '@swc/helpers': 0.4.14 3315 | caniuse-lite: 1.0.30001435 3316 | postcss: 8.4.14 3317 | react: 18.2.0 3318 | react-dom: 18.2.0(react@18.2.0) 3319 | styled-jsx: 5.1.0(react@18.2.0) 3320 | optionalDependencies: 3321 | '@next/swc-android-arm-eabi': 13.0.6 3322 | '@next/swc-android-arm64': 13.0.6 3323 | '@next/swc-darwin-arm64': 13.0.6 3324 | '@next/swc-darwin-x64': 13.0.6 3325 | '@next/swc-freebsd-x64': 13.0.6 3326 | '@next/swc-linux-arm-gnueabihf': 13.0.6 3327 | '@next/swc-linux-arm64-gnu': 13.0.6 3328 | '@next/swc-linux-arm64-musl': 13.0.6 3329 | '@next/swc-linux-x64-gnu': 13.0.6 3330 | '@next/swc-linux-x64-musl': 13.0.6 3331 | '@next/swc-win32-arm64-msvc': 13.0.6 3332 | '@next/swc-win32-ia32-msvc': 13.0.6 3333 | '@next/swc-win32-x64-msvc': 13.0.6 3334 | transitivePeerDependencies: 3335 | - '@babel/core' 3336 | - babel-plugin-macros 3337 | 3338 | nextra-theme-docs@2.12.3(next@13.0.6)(nextra@2.12.3)(react-dom@18.2.0)(react@18.2.0): 3339 | dependencies: 3340 | '@headlessui/react': 1.7.10(react-dom@18.2.0)(react@18.2.0) 3341 | '@popperjs/core': 2.11.6 3342 | clsx: 2.0.0 3343 | escape-string-regexp: 5.0.0 3344 | flexsearch: 0.7.31 3345 | focus-visible: 5.2.0 3346 | git-url-parse: 13.1.0 3347 | intersection-observer: 0.12.2 3348 | match-sorter: 6.3.1 3349 | next: 13.0.6(react-dom@18.2.0)(react@18.2.0) 3350 | next-seo: 6.1.0(next@13.0.6)(react-dom@18.2.0)(react@18.2.0) 3351 | next-themes: 0.2.1(next@13.0.6)(react-dom@18.2.0)(react@18.2.0) 3352 | nextra: 2.12.3(next@13.0.6)(react-dom@18.2.0)(react@18.2.0) 3353 | react: 18.2.0 3354 | react-dom: 18.2.0(react@18.2.0) 3355 | scroll-into-view-if-needed: 3.0.4 3356 | zod: 3.22.2 3357 | 3358 | nextra@2.12.3(next@13.0.6)(react-dom@18.2.0)(react@18.2.0): 3359 | dependencies: 3360 | '@headlessui/react': 1.7.10(react-dom@18.2.0)(react@18.2.0) 3361 | '@mdx-js/mdx': 2.3.0 3362 | '@mdx-js/react': 2.3.0(react@18.2.0) 3363 | '@napi-rs/simple-git': 0.1.9 3364 | '@theguild/remark-mermaid': 0.0.4(react@18.2.0) 3365 | '@theguild/remark-npm2yarn': 0.1.1 3366 | clsx: 2.0.0 3367 | github-slugger: 2.0.0 3368 | graceful-fs: 4.2.11 3369 | gray-matter: 4.0.3 3370 | katex: 0.16.8 3371 | lodash.get: 4.4.2 3372 | next: 13.0.6(react-dom@18.2.0)(react@18.2.0) 3373 | next-mdx-remote: 4.3.0(react-dom@18.2.0)(react@18.2.0) 3374 | p-limit: 3.1.0 3375 | react: 18.2.0 3376 | react-dom: 18.2.0(react@18.2.0) 3377 | rehype-katex: 6.0.3 3378 | rehype-pretty-code: 0.9.11(shiki@0.14.4) 3379 | rehype-raw: 7.0.0 3380 | remark-gfm: 3.0.1 3381 | remark-math: 5.1.1 3382 | remark-reading-time: 2.0.1 3383 | shiki: 0.14.4 3384 | slash: 3.0.0 3385 | title: 3.5.3 3386 | unist-util-remove: 4.0.0 3387 | unist-util-visit: 5.0.0 3388 | zod: 3.22.2 3389 | transitivePeerDependencies: 3390 | - supports-color 3391 | 3392 | node-releases@2.0.13: {} 3393 | 3394 | non-layered-tidy-tree-layout@2.0.2: {} 3395 | 3396 | normalize-path@3.0.0: {} 3397 | 3398 | normalize-range@0.1.2: {} 3399 | 3400 | npm-run-path@2.0.2: 3401 | dependencies: 3402 | path-key: 2.0.1 3403 | 3404 | npm-to-yarn@2.0.0: {} 3405 | 3406 | object-assign@4.1.1: {} 3407 | 3408 | object-hash@3.0.0: {} 3409 | 3410 | once@1.4.0: 3411 | dependencies: 3412 | wrappy: 1.0.2 3413 | 3414 | p-finally@1.0.0: {} 3415 | 3416 | p-limit@3.1.0: 3417 | dependencies: 3418 | yocto-queue: 0.1.0 3419 | 3420 | parse-entities@4.0.0: 3421 | dependencies: 3422 | '@types/unist': 2.0.6 3423 | character-entities: 2.0.2 3424 | character-entities-legacy: 3.0.0 3425 | character-reference-invalid: 2.0.1 3426 | decode-named-character-reference: 1.0.2 3427 | is-alphanumerical: 2.0.1 3428 | is-decimal: 2.0.1 3429 | is-hexadecimal: 2.0.1 3430 | 3431 | parse-numeric-range@1.3.0: {} 3432 | 3433 | parse-path@7.0.0: 3434 | dependencies: 3435 | protocols: 2.0.1 3436 | 3437 | parse-url@8.1.0: 3438 | dependencies: 3439 | parse-path: 7.0.0 3440 | 3441 | parse5@7.1.2: 3442 | dependencies: 3443 | entities: 4.5.0 3444 | 3445 | path-is-absolute@1.0.1: {} 3446 | 3447 | path-key@2.0.1: {} 3448 | 3449 | path-parse@1.0.7: {} 3450 | 3451 | periscopic@3.0.4: 3452 | dependencies: 3453 | estree-walker: 3.0.1 3454 | is-reference: 3.0.0 3455 | 3456 | picocolors@1.0.0: {} 3457 | 3458 | picomatch@2.3.1: {} 3459 | 3460 | pify@2.3.0: {} 3461 | 3462 | pirates@4.0.6: {} 3463 | 3464 | postcss-import@15.1.0(postcss@8.4.29): 3465 | dependencies: 3466 | postcss: 8.4.29 3467 | postcss-value-parser: 4.2.0 3468 | read-cache: 1.0.0 3469 | resolve: 1.22.4 3470 | 3471 | postcss-js@4.0.1(postcss@8.4.29): 3472 | dependencies: 3473 | camelcase-css: 2.0.1 3474 | postcss: 8.4.29 3475 | 3476 | postcss-load-config@4.0.1(postcss@8.4.29): 3477 | dependencies: 3478 | lilconfig: 2.1.0 3479 | postcss: 8.4.29 3480 | yaml: 2.3.2 3481 | 3482 | postcss-nested@6.0.1(postcss@8.4.29): 3483 | dependencies: 3484 | postcss: 8.4.29 3485 | postcss-selector-parser: 6.0.13 3486 | 3487 | postcss-selector-parser@6.0.13: 3488 | dependencies: 3489 | cssesc: 3.0.0 3490 | util-deprecate: 1.0.2 3491 | 3492 | postcss-value-parser@4.2.0: {} 3493 | 3494 | postcss@8.4.14: 3495 | dependencies: 3496 | nanoid: 3.3.6 3497 | picocolors: 1.0.0 3498 | source-map-js: 1.0.2 3499 | 3500 | postcss@8.4.29: 3501 | dependencies: 3502 | nanoid: 3.3.6 3503 | picocolors: 1.0.0 3504 | source-map-js: 1.0.2 3505 | 3506 | property-information@6.2.0: {} 3507 | 3508 | protocols@2.0.1: {} 3509 | 3510 | pseudomap@1.0.2: {} 3511 | 3512 | queue-microtask@1.2.3: {} 3513 | 3514 | react-dom@18.2.0(react@18.2.0): 3515 | dependencies: 3516 | loose-envify: 1.4.0 3517 | react: 18.2.0 3518 | scheduler: 0.23.0 3519 | 3520 | react@18.2.0: 3521 | dependencies: 3522 | loose-envify: 1.4.0 3523 | 3524 | read-cache@1.0.0: 3525 | dependencies: 3526 | pify: 2.3.0 3527 | 3528 | readdirp@3.6.0: 3529 | dependencies: 3530 | picomatch: 2.3.1 3531 | 3532 | reading-time@1.5.0: {} 3533 | 3534 | regenerator-runtime@0.13.11: {} 3535 | 3536 | rehype-katex@6.0.3: 3537 | dependencies: 3538 | '@types/hast': 2.3.4 3539 | '@types/katex': 0.14.0 3540 | hast-util-from-html-isomorphic: 1.0.0 3541 | hast-util-to-text: 3.1.2 3542 | katex: 0.16.8 3543 | unist-util-visit: 4.1.1 3544 | 3545 | rehype-pretty-code@0.9.11(shiki@0.14.4): 3546 | dependencies: 3547 | '@types/hast': 2.3.4 3548 | hash-obj: 4.0.0 3549 | parse-numeric-range: 1.3.0 3550 | shiki: 0.14.4 3551 | 3552 | rehype-raw@7.0.0: 3553 | dependencies: 3554 | '@types/hast': 3.0.0 3555 | hast-util-raw: 9.0.1 3556 | vfile: 6.0.1 3557 | 3558 | remark-gfm@3.0.1: 3559 | dependencies: 3560 | '@types/mdast': 3.0.10 3561 | mdast-util-gfm: 2.0.1 3562 | micromark-extension-gfm: 2.0.1 3563 | unified: 10.1.2 3564 | transitivePeerDependencies: 3565 | - supports-color 3566 | 3567 | remark-math@5.1.1: 3568 | dependencies: 3569 | '@types/mdast': 3.0.10 3570 | mdast-util-math: 2.0.2 3571 | micromark-extension-math: 2.0.2 3572 | unified: 10.1.2 3573 | 3574 | remark-mdx@2.1.5: 3575 | dependencies: 3576 | mdast-util-mdx: 2.0.0 3577 | micromark-extension-mdxjs: 1.0.0 3578 | transitivePeerDependencies: 3579 | - supports-color 3580 | 3581 | remark-parse@10.0.1: 3582 | dependencies: 3583 | '@types/mdast': 3.0.10 3584 | mdast-util-from-markdown: 1.3.1 3585 | unified: 10.1.2 3586 | transitivePeerDependencies: 3587 | - supports-color 3588 | 3589 | remark-reading-time@2.0.1: 3590 | dependencies: 3591 | estree-util-is-identifier-name: 2.0.1 3592 | estree-util-value-to-estree: 1.3.0 3593 | reading-time: 1.5.0 3594 | unist-util-visit: 3.1.0 3595 | 3596 | remark-rehype@10.1.0: 3597 | dependencies: 3598 | '@types/hast': 2.3.4 3599 | '@types/mdast': 3.0.10 3600 | mdast-util-to-hast: 12.2.4 3601 | unified: 10.1.2 3602 | 3603 | remove-accents@0.4.2: {} 3604 | 3605 | resolve@1.22.4: 3606 | dependencies: 3607 | is-core-module: 2.13.0 3608 | path-parse: 1.0.7 3609 | supports-preserve-symlinks-flag: 1.0.0 3610 | 3611 | reusify@1.0.4: {} 3612 | 3613 | robust-predicates@3.0.2: {} 3614 | 3615 | run-parallel@1.2.0: 3616 | dependencies: 3617 | queue-microtask: 1.2.3 3618 | 3619 | rw@1.3.3: {} 3620 | 3621 | sade@1.8.1: 3622 | dependencies: 3623 | mri: 1.2.0 3624 | 3625 | safer-buffer@2.1.2: {} 3626 | 3627 | scheduler@0.23.0: 3628 | dependencies: 3629 | loose-envify: 1.4.0 3630 | 3631 | scroll-into-view-if-needed@3.0.4: 3632 | dependencies: 3633 | compute-scroll-into-view: 2.0.4 3634 | 3635 | section-matter@1.0.0: 3636 | dependencies: 3637 | extend-shallow: 2.0.1 3638 | kind-of: 6.0.3 3639 | 3640 | shebang-command@1.2.0: 3641 | dependencies: 3642 | shebang-regex: 1.0.0 3643 | 3644 | shebang-regex@1.0.0: {} 3645 | 3646 | shiki@0.14.4: 3647 | dependencies: 3648 | ansi-sequence-parser: 1.1.1 3649 | jsonc-parser: 3.2.0 3650 | vscode-oniguruma: 1.7.0 3651 | vscode-textmate: 8.0.0 3652 | 3653 | signal-exit@3.0.7: {} 3654 | 3655 | slash@3.0.0: {} 3656 | 3657 | sort-keys@5.0.0: 3658 | dependencies: 3659 | is-plain-obj: 4.1.0 3660 | 3661 | source-map-js@1.0.2: {} 3662 | 3663 | source-map@0.7.4: {} 3664 | 3665 | space-separated-tokens@2.0.2: {} 3666 | 3667 | sprintf-js@1.0.3: {} 3668 | 3669 | stringify-entities@4.0.3: 3670 | dependencies: 3671 | character-entities-html4: 2.1.0 3672 | character-entities-legacy: 3.0.0 3673 | 3674 | strip-bom-string@1.0.0: {} 3675 | 3676 | strip-eof@1.0.0: {} 3677 | 3678 | style-to-object@0.3.0: 3679 | dependencies: 3680 | inline-style-parser: 0.1.1 3681 | 3682 | styled-jsx@5.1.0(react@18.2.0): 3683 | dependencies: 3684 | client-only: 0.0.1 3685 | react: 18.2.0 3686 | 3687 | stylis@4.3.0: {} 3688 | 3689 | sucrase@3.34.0: 3690 | dependencies: 3691 | '@jridgewell/gen-mapping': 0.3.3 3692 | commander: 4.1.1 3693 | glob: 7.1.6 3694 | lines-and-columns: 1.2.4 3695 | mz: 2.7.0 3696 | pirates: 4.0.6 3697 | ts-interface-checker: 0.1.13 3698 | 3699 | supports-color@4.5.0: 3700 | dependencies: 3701 | has-flag: 2.0.0 3702 | 3703 | supports-preserve-symlinks-flag@1.0.0: {} 3704 | 3705 | tailwindcss@3.3.3: 3706 | dependencies: 3707 | '@alloc/quick-lru': 5.2.0 3708 | arg: 5.0.2 3709 | chokidar: 3.5.3 3710 | didyoumean: 1.2.2 3711 | dlv: 1.1.3 3712 | fast-glob: 3.3.1 3713 | glob-parent: 6.0.2 3714 | is-glob: 4.0.3 3715 | jiti: 1.19.3 3716 | lilconfig: 2.1.0 3717 | micromatch: 4.0.5 3718 | normalize-path: 3.0.0 3719 | object-hash: 3.0.0 3720 | picocolors: 1.0.0 3721 | postcss: 8.4.29 3722 | postcss-import: 15.1.0(postcss@8.4.29) 3723 | postcss-js: 4.0.1(postcss@8.4.29) 3724 | postcss-load-config: 4.0.1(postcss@8.4.29) 3725 | postcss-nested: 6.0.1(postcss@8.4.29) 3726 | postcss-selector-parser: 6.0.13 3727 | resolve: 1.22.4 3728 | sucrase: 3.34.0 3729 | transitivePeerDependencies: 3730 | - ts-node 3731 | 3732 | thenify-all@1.6.0: 3733 | dependencies: 3734 | thenify: 3.3.1 3735 | 3736 | thenify@3.3.1: 3737 | dependencies: 3738 | any-promise: 1.3.0 3739 | 3740 | title@3.5.3: 3741 | dependencies: 3742 | arg: 1.0.0 3743 | chalk: 2.3.0 3744 | clipboardy: 1.2.2 3745 | titleize: 1.0.0 3746 | 3747 | titleize@1.0.0: {} 3748 | 3749 | to-regex-range@5.0.1: 3750 | dependencies: 3751 | is-number: 7.0.0 3752 | 3753 | trim-lines@3.0.1: {} 3754 | 3755 | trough@2.1.0: {} 3756 | 3757 | ts-dedent@2.2.0: {} 3758 | 3759 | ts-interface-checker@0.1.13: {} 3760 | 3761 | tslib@2.4.1: {} 3762 | 3763 | type-fest@1.4.0: {} 3764 | 3765 | typescript@4.9.3: {} 3766 | 3767 | unified@10.1.2: 3768 | dependencies: 3769 | '@types/unist': 2.0.6 3770 | bail: 2.0.2 3771 | extend: 3.0.2 3772 | is-buffer: 2.0.5 3773 | is-plain-obj: 4.1.0 3774 | trough: 2.1.0 3775 | vfile: 5.3.6 3776 | 3777 | unist-builder@3.0.0: 3778 | dependencies: 3779 | '@types/unist': 2.0.6 3780 | 3781 | unist-util-find-after@4.0.1: 3782 | dependencies: 3783 | '@types/unist': 2.0.6 3784 | unist-util-is: 5.1.1 3785 | 3786 | unist-util-generated@2.0.0: {} 3787 | 3788 | unist-util-is@5.1.1: {} 3789 | 3790 | unist-util-is@6.0.0: 3791 | dependencies: 3792 | '@types/unist': 3.0.0 3793 | 3794 | unist-util-position-from-estree@1.1.1: 3795 | dependencies: 3796 | '@types/unist': 2.0.6 3797 | 3798 | unist-util-position@4.0.3: 3799 | dependencies: 3800 | '@types/unist': 2.0.6 3801 | 3802 | unist-util-position@5.0.0: 3803 | dependencies: 3804 | '@types/unist': 3.0.0 3805 | 3806 | unist-util-remove-position@4.0.1: 3807 | dependencies: 3808 | '@types/unist': 2.0.6 3809 | unist-util-visit: 4.1.1 3810 | 3811 | unist-util-remove@4.0.0: 3812 | dependencies: 3813 | '@types/unist': 3.0.0 3814 | unist-util-is: 6.0.0 3815 | unist-util-visit-parents: 6.0.1 3816 | 3817 | unist-util-stringify-position@3.0.2: 3818 | dependencies: 3819 | '@types/unist': 2.0.6 3820 | 3821 | unist-util-stringify-position@4.0.0: 3822 | dependencies: 3823 | '@types/unist': 3.0.0 3824 | 3825 | unist-util-visit-parents@4.1.1: 3826 | dependencies: 3827 | '@types/unist': 2.0.6 3828 | unist-util-is: 5.1.1 3829 | 3830 | unist-util-visit-parents@5.1.1: 3831 | dependencies: 3832 | '@types/unist': 2.0.6 3833 | unist-util-is: 5.1.1 3834 | 3835 | unist-util-visit-parents@6.0.1: 3836 | dependencies: 3837 | '@types/unist': 3.0.0 3838 | unist-util-is: 6.0.0 3839 | 3840 | unist-util-visit@3.1.0: 3841 | dependencies: 3842 | '@types/unist': 2.0.6 3843 | unist-util-is: 5.1.1 3844 | unist-util-visit-parents: 4.1.1 3845 | 3846 | unist-util-visit@4.1.1: 3847 | dependencies: 3848 | '@types/unist': 2.0.6 3849 | unist-util-is: 5.1.1 3850 | unist-util-visit-parents: 5.1.1 3851 | 3852 | unist-util-visit@5.0.0: 3853 | dependencies: 3854 | '@types/unist': 3.0.0 3855 | unist-util-is: 6.0.0 3856 | unist-util-visit-parents: 6.0.1 3857 | 3858 | update-browserslist-db@1.0.11(browserslist@4.21.10): 3859 | dependencies: 3860 | browserslist: 4.21.10 3861 | escalade: 3.1.1 3862 | picocolors: 1.0.0 3863 | 3864 | util-deprecate@1.0.2: {} 3865 | 3866 | uuid@9.0.0: {} 3867 | 3868 | uvu@0.5.6: 3869 | dependencies: 3870 | dequal: 2.0.3 3871 | diff: 5.1.0 3872 | kleur: 4.1.5 3873 | sade: 1.8.1 3874 | 3875 | vfile-location@4.0.1: 3876 | dependencies: 3877 | '@types/unist': 2.0.6 3878 | vfile: 5.3.6 3879 | 3880 | vfile-location@5.0.2: 3881 | dependencies: 3882 | '@types/unist': 3.0.0 3883 | vfile: 6.0.1 3884 | 3885 | vfile-matter@3.0.1: 3886 | dependencies: 3887 | '@types/js-yaml': 4.0.5 3888 | is-buffer: 2.0.5 3889 | js-yaml: 4.1.0 3890 | 3891 | vfile-message@3.1.3: 3892 | dependencies: 3893 | '@types/unist': 2.0.6 3894 | unist-util-stringify-position: 3.0.2 3895 | 3896 | vfile-message@4.0.2: 3897 | dependencies: 3898 | '@types/unist': 3.0.0 3899 | unist-util-stringify-position: 4.0.0 3900 | 3901 | vfile@5.3.6: 3902 | dependencies: 3903 | '@types/unist': 2.0.6 3904 | is-buffer: 2.0.5 3905 | unist-util-stringify-position: 3.0.2 3906 | vfile-message: 3.1.3 3907 | 3908 | vfile@6.0.1: 3909 | dependencies: 3910 | '@types/unist': 3.0.0 3911 | unist-util-stringify-position: 4.0.0 3912 | vfile-message: 4.0.2 3913 | 3914 | vscode-oniguruma@1.7.0: {} 3915 | 3916 | vscode-textmate@8.0.0: {} 3917 | 3918 | web-namespaces@2.0.1: {} 3919 | 3920 | web-worker@1.2.0: {} 3921 | 3922 | which@1.3.1: 3923 | dependencies: 3924 | isexe: 2.0.0 3925 | 3926 | wrappy@1.0.2: {} 3927 | 3928 | yallist@2.1.2: {} 3929 | 3930 | yaml@2.3.2: {} 3931 | 3932 | yocto-queue@0.1.0: {} 3933 | 3934 | zod@3.22.2: {} 3935 | 3936 | zwitch@2.0.4: {} 3937 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/2023-08-24-02-30-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/public/2023-08-24-02-30-39.png -------------------------------------------------------------------------------- /public/2023-08-25-00-00-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/public/2023-08-25-00-00-26.png -------------------------------------------------------------------------------- /public/2023-08-31-18-10-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/public/2023-08-31-18-10-30.png -------------------------------------------------------------------------------- /sources/readme.md: -------------------------------------------------------------------------------- 1 | 用于存放 contracts 等仓库代码 2 | 3 | zk —— zk 教程用代码 4 | -------------------------------------------------------------------------------- /sources/zk/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | coverage 4 | coverage.json 5 | typechain 6 | typechain-types 7 | 8 | #Hardhat files 9 | cache 10 | artifacts 11 | 12 | -------------------------------------------------------------------------------- /sources/zk/README.md: -------------------------------------------------------------------------------- 1 | # Sample Hardhat Project 2 | 3 | This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a script that deploys that contract. 4 | 5 | Try running some of the following tasks: 6 | 7 | ```shell 8 | npx hardhat help 9 | npx hardhat test 10 | REPORT_GAS=true npx hardhat test 11 | npx hardhat node 12 | npx hardhat run scripts/deploy.ts 13 | ``` 14 | -------------------------------------------------------------------------------- /sources/zk/contracts/master.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.0; 3 | 4 | import {Verifier} from "./verifier.sol"; 5 | 6 | contract Master { 7 | event Despoit(uint256 commitment, uint amount); 8 | 9 | mapping(uint => uint) public proofs; 10 | 11 | Verifier v; 12 | 13 | constructor() { 14 | v = new Verifier(); 15 | } 16 | 17 | function deposit(uint commitment) public payable { 18 | proofs[commitment] = msg.value; 19 | emit Despoit(commitment, msg.value); 20 | } 21 | 22 | function withdraw( 23 | uint commitment, 24 | Verifier.Proof memory proof, 25 | uint[9] memory inputs 26 | ) public { 27 | uint amount = inputs[0]; 28 | require(v.verifyTx(proof, inputs)); 29 | require(proofs[commitment] == amount); 30 | 31 | payable(msg.sender).transfer(amount); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /sources/zk/contracts/verifier.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: LGPL-3.0-only 2 | pragma solidity ^0.8.0; 3 | 4 | /** 5 | * @title Elliptic curve operations on twist points for alt_bn128 6 | * @author Mustafa Al-Bassam (mus@musalbas.com) 7 | * @dev Homepage: https://github.com/musalbas/solidity-BN256G2 8 | */ 9 | 10 | library BN256G2 { 11 | uint256 internal constant FIELD_MODULUS = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47; 12 | uint256 internal constant TWISTBX = 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5; 13 | uint256 internal constant TWISTBY = 0x9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2; 14 | uint internal constant PTXX = 0; 15 | uint internal constant PTXY = 1; 16 | uint internal constant PTYX = 2; 17 | uint internal constant PTYY = 3; 18 | uint internal constant PTZX = 4; 19 | uint internal constant PTZY = 5; 20 | 21 | /** 22 | * @notice Add two twist points 23 | * @param pt1xx Coefficient 1 of x on point 1 24 | * @param pt1xy Coefficient 2 of x on point 1 25 | * @param pt1yx Coefficient 1 of y on point 1 26 | * @param pt1yy Coefficient 2 of y on point 1 27 | * @param pt2xx Coefficient 1 of x on point 2 28 | * @param pt2xy Coefficient 2 of x on point 2 29 | * @param pt2yx Coefficient 1 of y on point 2 30 | * @param pt2yy Coefficient 2 of y on point 2 31 | * @return (pt3xx, pt3xy, pt3yx, pt3yy) 32 | */ 33 | function ECTwistAdd( 34 | uint256 pt1xx, uint256 pt1xy, 35 | uint256 pt1yx, uint256 pt1yy, 36 | uint256 pt2xx, uint256 pt2xy, 37 | uint256 pt2yx, uint256 pt2yy 38 | ) public view returns ( 39 | uint256, uint256, 40 | uint256, uint256 41 | ) { 42 | if ( 43 | pt1xx == 0 && pt1xy == 0 && 44 | pt1yx == 0 && pt1yy == 0 45 | ) { 46 | if (!( 47 | pt2xx == 0 && pt2xy == 0 && 48 | pt2yx == 0 && pt2yy == 0 49 | )) { 50 | assert(_isOnCurve( 51 | pt2xx, pt2xy, 52 | pt2yx, pt2yy 53 | )); 54 | } 55 | return ( 56 | pt2xx, pt2xy, 57 | pt2yx, pt2yy 58 | ); 59 | } else if ( 60 | pt2xx == 0 && pt2xy == 0 && 61 | pt2yx == 0 && pt2yy == 0 62 | ) { 63 | assert(_isOnCurve( 64 | pt1xx, pt1xy, 65 | pt1yx, pt1yy 66 | )); 67 | return ( 68 | pt1xx, pt1xy, 69 | pt1yx, pt1yy 70 | ); 71 | } 72 | 73 | assert(_isOnCurve( 74 | pt1xx, pt1xy, 75 | pt1yx, pt1yy 76 | )); 77 | assert(_isOnCurve( 78 | pt2xx, pt2xy, 79 | pt2yx, pt2yy 80 | )); 81 | 82 | uint256[6] memory pt3 = _ECTwistAddJacobian( 83 | pt1xx, pt1xy, 84 | pt1yx, pt1yy, 85 | 1, 0, 86 | pt2xx, pt2xy, 87 | pt2yx, pt2yy, 88 | 1, 0 89 | ); 90 | 91 | return _fromJacobian( 92 | pt3[PTXX], pt3[PTXY], 93 | pt3[PTYX], pt3[PTYY], 94 | pt3[PTZX], pt3[PTZY] 95 | ); 96 | } 97 | 98 | /** 99 | * @notice Multiply a twist point by a scalar 100 | * @param s Scalar to multiply by 101 | * @param pt1xx Coefficient 1 of x 102 | * @param pt1xy Coefficient 2 of x 103 | * @param pt1yx Coefficient 1 of y 104 | * @param pt1yy Coefficient 2 of y 105 | * @return (pt2xx, pt2xy, pt2yx, pt2yy) 106 | */ 107 | function ECTwistMul( 108 | uint256 s, 109 | uint256 pt1xx, uint256 pt1xy, 110 | uint256 pt1yx, uint256 pt1yy 111 | ) public view returns ( 112 | uint256, uint256, 113 | uint256, uint256 114 | ) { 115 | uint256 pt1zx = 1; 116 | if ( 117 | pt1xx == 0 && pt1xy == 0 && 118 | pt1yx == 0 && pt1yy == 0 119 | ) { 120 | pt1xx = 1; 121 | pt1yx = 1; 122 | pt1zx = 0; 123 | } else { 124 | assert(_isOnCurve( 125 | pt1xx, pt1xy, 126 | pt1yx, pt1yy 127 | )); 128 | } 129 | 130 | uint256[6] memory pt2 = _ECTwistMulJacobian( 131 | s, 132 | pt1xx, pt1xy, 133 | pt1yx, pt1yy, 134 | pt1zx, 0 135 | ); 136 | 137 | return _fromJacobian( 138 | pt2[PTXX], pt2[PTXY], 139 | pt2[PTYX], pt2[PTYY], 140 | pt2[PTZX], pt2[PTZY] 141 | ); 142 | } 143 | 144 | /** 145 | * @notice Get the field modulus 146 | * @return The field modulus 147 | */ 148 | function GetFieldModulus() public pure returns (uint256) { 149 | return FIELD_MODULUS; 150 | } 151 | 152 | function submod(uint256 a, uint256 b, uint256 n) internal pure returns (uint256) { 153 | return addmod(a, n - b, n); 154 | } 155 | 156 | function _FQ2Mul( 157 | uint256 xx, uint256 xy, 158 | uint256 yx, uint256 yy 159 | ) internal pure returns (uint256, uint256) { 160 | return ( 161 | submod(mulmod(xx, yx, FIELD_MODULUS), mulmod(xy, yy, FIELD_MODULUS), FIELD_MODULUS), 162 | addmod(mulmod(xx, yy, FIELD_MODULUS), mulmod(xy, yx, FIELD_MODULUS), FIELD_MODULUS) 163 | ); 164 | } 165 | 166 | function _FQ2Muc( 167 | uint256 xx, uint256 xy, 168 | uint256 c 169 | ) internal pure returns (uint256, uint256) { 170 | return ( 171 | mulmod(xx, c, FIELD_MODULUS), 172 | mulmod(xy, c, FIELD_MODULUS) 173 | ); 174 | } 175 | 176 | function _FQ2Add( 177 | uint256 xx, uint256 xy, 178 | uint256 yx, uint256 yy 179 | ) internal pure returns (uint256, uint256) { 180 | return ( 181 | addmod(xx, yx, FIELD_MODULUS), 182 | addmod(xy, yy, FIELD_MODULUS) 183 | ); 184 | } 185 | 186 | function _FQ2Sub( 187 | uint256 xx, uint256 xy, 188 | uint256 yx, uint256 yy 189 | ) internal pure returns (uint256 rx, uint256 ry) { 190 | return ( 191 | submod(xx, yx, FIELD_MODULUS), 192 | submod(xy, yy, FIELD_MODULUS) 193 | ); 194 | } 195 | 196 | function _FQ2Div( 197 | uint256 xx, uint256 xy, 198 | uint256 yx, uint256 yy 199 | ) internal view returns (uint256, uint256) { 200 | (yx, yy) = _FQ2Inv(yx, yy); 201 | return _FQ2Mul(xx, xy, yx, yy); 202 | } 203 | 204 | function _FQ2Inv(uint256 x, uint256 y) internal view returns (uint256, uint256) { 205 | uint256 inv = _modInv(addmod(mulmod(y, y, FIELD_MODULUS), mulmod(x, x, FIELD_MODULUS), FIELD_MODULUS), FIELD_MODULUS); 206 | return ( 207 | mulmod(x, inv, FIELD_MODULUS), 208 | FIELD_MODULUS - mulmod(y, inv, FIELD_MODULUS) 209 | ); 210 | } 211 | 212 | function _isOnCurve( 213 | uint256 xx, uint256 xy, 214 | uint256 yx, uint256 yy 215 | ) internal pure returns (bool) { 216 | uint256 yyx; 217 | uint256 yyy; 218 | uint256 xxxx; 219 | uint256 xxxy; 220 | (yyx, yyy) = _FQ2Mul(yx, yy, yx, yy); 221 | (xxxx, xxxy) = _FQ2Mul(xx, xy, xx, xy); 222 | (xxxx, xxxy) = _FQ2Mul(xxxx, xxxy, xx, xy); 223 | (yyx, yyy) = _FQ2Sub(yyx, yyy, xxxx, xxxy); 224 | (yyx, yyy) = _FQ2Sub(yyx, yyy, TWISTBX, TWISTBY); 225 | return yyx == 0 && yyy == 0; 226 | } 227 | 228 | function _modInv(uint256 a, uint256 n) internal view returns (uint256 result) { 229 | bool success; 230 | assembly { 231 | let freemem := mload(0x40) 232 | mstore(freemem, 0x20) 233 | mstore(add(freemem,0x20), 0x20) 234 | mstore(add(freemem,0x40), 0x20) 235 | mstore(add(freemem,0x60), a) 236 | mstore(add(freemem,0x80), sub(n, 2)) 237 | mstore(add(freemem,0xA0), n) 238 | success := staticcall(sub(gas(), 2000), 5, freemem, 0xC0, freemem, 0x20) 239 | result := mload(freemem) 240 | } 241 | require(success); 242 | } 243 | 244 | function _fromJacobian( 245 | uint256 pt1xx, uint256 pt1xy, 246 | uint256 pt1yx, uint256 pt1yy, 247 | uint256 pt1zx, uint256 pt1zy 248 | ) internal view returns ( 249 | uint256 pt2xx, uint256 pt2xy, 250 | uint256 pt2yx, uint256 pt2yy 251 | ) { 252 | uint256 invzx; 253 | uint256 invzy; 254 | (invzx, invzy) = _FQ2Inv(pt1zx, pt1zy); 255 | (pt2xx, pt2xy) = _FQ2Mul(pt1xx, pt1xy, invzx, invzy); 256 | (pt2yx, pt2yy) = _FQ2Mul(pt1yx, pt1yy, invzx, invzy); 257 | } 258 | 259 | function _ECTwistAddJacobian( 260 | uint256 pt1xx, uint256 pt1xy, 261 | uint256 pt1yx, uint256 pt1yy, 262 | uint256 pt1zx, uint256 pt1zy, 263 | uint256 pt2xx, uint256 pt2xy, 264 | uint256 pt2yx, uint256 pt2yy, 265 | uint256 pt2zx, uint256 pt2zy) internal pure returns (uint256[6] memory pt3) { 266 | if (pt1zx == 0 && pt1zy == 0) { 267 | ( 268 | pt3[PTXX], pt3[PTXY], 269 | pt3[PTYX], pt3[PTYY], 270 | pt3[PTZX], pt3[PTZY] 271 | ) = ( 272 | pt2xx, pt2xy, 273 | pt2yx, pt2yy, 274 | pt2zx, pt2zy 275 | ); 276 | return pt3; 277 | } else if (pt2zx == 0 && pt2zy == 0) { 278 | ( 279 | pt3[PTXX], pt3[PTXY], 280 | pt3[PTYX], pt3[PTYY], 281 | pt3[PTZX], pt3[PTZY] 282 | ) = ( 283 | pt1xx, pt1xy, 284 | pt1yx, pt1yy, 285 | pt1zx, pt1zy 286 | ); 287 | return pt3; 288 | } 289 | 290 | (pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, pt1zx, pt1zy); // U1 = y2 * z1 291 | (pt3[PTYX], pt3[PTYY]) = _FQ2Mul(pt1yx, pt1yy, pt2zx, pt2zy); // U2 = y1 * z2 292 | (pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1zx, pt1zy); // V1 = x2 * z1 293 | (pt3[PTZX], pt3[PTZY]) = _FQ2Mul(pt1xx, pt1xy, pt2zx, pt2zy); // V2 = x1 * z2 294 | 295 | if (pt2xx == pt3[PTZX] && pt2xy == pt3[PTZY]) { 296 | if (pt2yx == pt3[PTYX] && pt2yy == pt3[PTYY]) { 297 | ( 298 | pt3[PTXX], pt3[PTXY], 299 | pt3[PTYX], pt3[PTYY], 300 | pt3[PTZX], pt3[PTZY] 301 | ) = _ECTwistDoubleJacobian(pt1xx, pt1xy, pt1yx, pt1yy, pt1zx, pt1zy); 302 | return pt3; 303 | } 304 | ( 305 | pt3[PTXX], pt3[PTXY], 306 | pt3[PTYX], pt3[PTYY], 307 | pt3[PTZX], pt3[PTZY] 308 | ) = ( 309 | 1, 0, 310 | 1, 0, 311 | 0, 0 312 | ); 313 | return pt3; 314 | } 315 | 316 | (pt2zx, pt2zy) = _FQ2Mul(pt1zx, pt1zy, pt2zx, pt2zy); // W = z1 * z2 317 | (pt1xx, pt1xy) = _FQ2Sub(pt2yx, pt2yy, pt3[PTYX], pt3[PTYY]); // U = U1 - U2 318 | (pt1yx, pt1yy) = _FQ2Sub(pt2xx, pt2xy, pt3[PTZX], pt3[PTZY]); // V = V1 - V2 319 | (pt1zx, pt1zy) = _FQ2Mul(pt1yx, pt1yy, pt1yx, pt1yy); // V_squared = V * V 320 | (pt2yx, pt2yy) = _FQ2Mul(pt1zx, pt1zy, pt3[PTZX], pt3[PTZY]); // V_squared_times_V2 = V_squared * V2 321 | (pt1zx, pt1zy) = _FQ2Mul(pt1zx, pt1zy, pt1yx, pt1yy); // V_cubed = V * V_squared 322 | (pt3[PTZX], pt3[PTZY]) = _FQ2Mul(pt1zx, pt1zy, pt2zx, pt2zy); // newz = V_cubed * W 323 | (pt2xx, pt2xy) = _FQ2Mul(pt1xx, pt1xy, pt1xx, pt1xy); // U * U 324 | (pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt2zx, pt2zy); // U * U * W 325 | (pt2xx, pt2xy) = _FQ2Sub(pt2xx, pt2xy, pt1zx, pt1zy); // U * U * W - V_cubed 326 | (pt2zx, pt2zy) = _FQ2Muc(pt2yx, pt2yy, 2); // 2 * V_squared_times_V2 327 | (pt2xx, pt2xy) = _FQ2Sub(pt2xx, pt2xy, pt2zx, pt2zy); // A = U * U * W - V_cubed - 2 * V_squared_times_V2 328 | (pt3[PTXX], pt3[PTXY]) = _FQ2Mul(pt1yx, pt1yy, pt2xx, pt2xy); // newx = V * A 329 | (pt1yx, pt1yy) = _FQ2Sub(pt2yx, pt2yy, pt2xx, pt2xy); // V_squared_times_V2 - A 330 | (pt1yx, pt1yy) = _FQ2Mul(pt1xx, pt1xy, pt1yx, pt1yy); // U * (V_squared_times_V2 - A) 331 | (pt1xx, pt1xy) = _FQ2Mul(pt1zx, pt1zy, pt3[PTYX], pt3[PTYY]); // V_cubed * U2 332 | (pt3[PTYX], pt3[PTYY]) = _FQ2Sub(pt1yx, pt1yy, pt1xx, pt1xy); // newy = U * (V_squared_times_V2 - A) - V_cubed * U2 333 | } 334 | 335 | function _ECTwistDoubleJacobian( 336 | uint256 pt1xx, uint256 pt1xy, 337 | uint256 pt1yx, uint256 pt1yy, 338 | uint256 pt1zx, uint256 pt1zy 339 | ) internal pure returns ( 340 | uint256 pt2xx, uint256 pt2xy, 341 | uint256 pt2yx, uint256 pt2yy, 342 | uint256 pt2zx, uint256 pt2zy 343 | ) { 344 | (pt2xx, pt2xy) = _FQ2Muc(pt1xx, pt1xy, 3); // 3 * x 345 | (pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1xx, pt1xy); // W = 3 * x * x 346 | (pt1zx, pt1zy) = _FQ2Mul(pt1yx, pt1yy, pt1zx, pt1zy); // S = y * z 347 | (pt2yx, pt2yy) = _FQ2Mul(pt1xx, pt1xy, pt1yx, pt1yy); // x * y 348 | (pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, pt1zx, pt1zy); // B = x * y * S 349 | (pt1xx, pt1xy) = _FQ2Mul(pt2xx, pt2xy, pt2xx, pt2xy); // W * W 350 | (pt2zx, pt2zy) = _FQ2Muc(pt2yx, pt2yy, 8); // 8 * B 351 | (pt1xx, pt1xy) = _FQ2Sub(pt1xx, pt1xy, pt2zx, pt2zy); // H = W * W - 8 * B 352 | (pt2zx, pt2zy) = _FQ2Mul(pt1zx, pt1zy, pt1zx, pt1zy); // S_squared = S * S 353 | (pt2yx, pt2yy) = _FQ2Muc(pt2yx, pt2yy, 4); // 4 * B 354 | (pt2yx, pt2yy) = _FQ2Sub(pt2yx, pt2yy, pt1xx, pt1xy); // 4 * B - H 355 | (pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, pt2xx, pt2xy); // W * (4 * B - H) 356 | (pt2xx, pt2xy) = _FQ2Muc(pt1yx, pt1yy, 8); // 8 * y 357 | (pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1yx, pt1yy); // 8 * y * y 358 | (pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt2zx, pt2zy); // 8 * y * y * S_squared 359 | (pt2yx, pt2yy) = _FQ2Sub(pt2yx, pt2yy, pt2xx, pt2xy); // newy = W * (4 * B - H) - 8 * y * y * S_squared 360 | (pt2xx, pt2xy) = _FQ2Muc(pt1xx, pt1xy, 2); // 2 * H 361 | (pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1zx, pt1zy); // newx = 2 * H * S 362 | (pt2zx, pt2zy) = _FQ2Mul(pt1zx, pt1zy, pt2zx, pt2zy); // S * S_squared 363 | (pt2zx, pt2zy) = _FQ2Muc(pt2zx, pt2zy, 8); // newz = 8 * S * S_squared 364 | } 365 | 366 | function _ECTwistMulJacobian( 367 | uint256 d, 368 | uint256 pt1xx, uint256 pt1xy, 369 | uint256 pt1yx, uint256 pt1yy, 370 | uint256 pt1zx, uint256 pt1zy 371 | ) internal pure returns (uint256[6] memory pt2) { 372 | while (d != 0) { 373 | if ((d & 1) != 0) { 374 | pt2 = _ECTwistAddJacobian( 375 | pt2[PTXX], pt2[PTXY], 376 | pt2[PTYX], pt2[PTYY], 377 | pt2[PTZX], pt2[PTZY], 378 | pt1xx, pt1xy, 379 | pt1yx, pt1yy, 380 | pt1zx, pt1zy); 381 | } 382 | ( 383 | pt1xx, pt1xy, 384 | pt1yx, pt1yy, 385 | pt1zx, pt1zy 386 | ) = _ECTwistDoubleJacobian( 387 | pt1xx, pt1xy, 388 | pt1yx, pt1yy, 389 | pt1zx, pt1zy 390 | ); 391 | 392 | d = d / 2; 393 | } 394 | } 395 | } 396 | // This file is MIT Licensed. 397 | // 398 | // Copyright 2017 Christian Reitwiessner 399 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 400 | // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 401 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 402 | 403 | library Pairing { 404 | struct G1Point { 405 | uint X; 406 | uint Y; 407 | } 408 | // Encoding of field elements is: X[0] * z + X[1] 409 | struct G2Point { 410 | uint[2] X; 411 | uint[2] Y; 412 | } 413 | /// @return the generator of G1 414 | function P1() pure internal returns (G1Point memory) { 415 | return G1Point(1, 2); 416 | } 417 | /// @return the generator of G2 418 | function P2() pure internal returns (G2Point memory) { 419 | return G2Point( 420 | [10857046999023057135944570762232829481370756359578518086990519993285655852781, 421 | 11559732032986387107991004021392285783925812861821192530917403151452391805634], 422 | [8495653923123431417604973247489272438418190587263600148770280649306958101930, 423 | 4082367875863433681332203403145435568316851327593401208105741076214120093531] 424 | ); 425 | } 426 | /// @return the negation of p, i.e. p.addition(p.negate()) should be zero. 427 | function negate(G1Point memory p) pure internal returns (G1Point memory) { 428 | // The prime q in the base field F_q for G1 429 | uint q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; 430 | if (p.X == 0 && p.Y == 0) 431 | return G1Point(0, 0); 432 | return G1Point(p.X, q - (p.Y % q)); 433 | } 434 | /// @return r the sum of two points of G1 435 | function addition(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) { 436 | uint[4] memory input; 437 | input[0] = p1.X; 438 | input[1] = p1.Y; 439 | input[2] = p2.X; 440 | input[3] = p2.Y; 441 | bool success; 442 | assembly { 443 | success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60) 444 | // Use "invalid" to make gas estimation work 445 | switch success case 0 { invalid() } 446 | } 447 | require(success); 448 | } 449 | 450 | 451 | /// @return r the sum of two points of G2 452 | function addition(G2Point memory p1, G2Point memory p2) internal view returns (G2Point memory r) { 453 | (r.X[0], r.X[1], r.Y[0], r.Y[1]) = BN256G2.ECTwistAdd(p1.X[0],p1.X[1],p1.Y[0],p1.Y[1],p2.X[0],p2.X[1],p2.Y[0],p2.Y[1]); 454 | } 455 | 456 | 457 | /// @return r the product of a point on G1 and a scalar, i.e. 458 | /// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p. 459 | function scalar_mul(G1Point memory p, uint s) internal view returns (G1Point memory r) { 460 | uint[3] memory input; 461 | input[0] = p.X; 462 | input[1] = p.Y; 463 | input[2] = s; 464 | bool success; 465 | assembly { 466 | success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60) 467 | // Use "invalid" to make gas estimation work 468 | switch success case 0 { invalid() } 469 | } 470 | require (success); 471 | } 472 | /// @return the result of computing the pairing check 473 | /// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1 474 | /// For example pairing([P1(), P1().negate()], [P2(), P2()]) should 475 | /// return true. 476 | function pairing(G1Point[] memory p1, G2Point[] memory p2) internal view returns (bool) { 477 | require(p1.length == p2.length); 478 | uint elements = p1.length; 479 | uint inputSize = elements * 6; 480 | uint[] memory input = new uint[](inputSize); 481 | for (uint i = 0; i < elements; i++) 482 | { 483 | input[i * 6 + 0] = p1[i].X; 484 | input[i * 6 + 1] = p1[i].Y; 485 | input[i * 6 + 2] = p2[i].X[1]; 486 | input[i * 6 + 3] = p2[i].X[0]; 487 | input[i * 6 + 4] = p2[i].Y[1]; 488 | input[i * 6 + 5] = p2[i].Y[0]; 489 | } 490 | uint[1] memory out; 491 | bool success; 492 | assembly { 493 | success := staticcall(sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20) 494 | // Use "invalid" to make gas estimation work 495 | switch success case 0 { invalid() } 496 | } 497 | require(success); 498 | return out[0] != 0; 499 | } 500 | /// Convenience method for a pairing check for two pairs. 501 | function pairingProd2(G1Point memory a1, G2Point memory a2, G1Point memory b1, G2Point memory b2) internal view returns (bool) { 502 | G1Point[] memory p1 = new G1Point[](2); 503 | G2Point[] memory p2 = new G2Point[](2); 504 | p1[0] = a1; 505 | p1[1] = b1; 506 | p2[0] = a2; 507 | p2[1] = b2; 508 | return pairing(p1, p2); 509 | } 510 | /// Convenience method for a pairing check for three pairs. 511 | function pairingProd3( 512 | G1Point memory a1, G2Point memory a2, 513 | G1Point memory b1, G2Point memory b2, 514 | G1Point memory c1, G2Point memory c2 515 | ) internal view returns (bool) { 516 | G1Point[] memory p1 = new G1Point[](3); 517 | G2Point[] memory p2 = new G2Point[](3); 518 | p1[0] = a1; 519 | p1[1] = b1; 520 | p1[2] = c1; 521 | p2[0] = a2; 522 | p2[1] = b2; 523 | p2[2] = c2; 524 | return pairing(p1, p2); 525 | } 526 | /// Convenience method for a pairing check for four pairs. 527 | function pairingProd4( 528 | G1Point memory a1, G2Point memory a2, 529 | G1Point memory b1, G2Point memory b2, 530 | G1Point memory c1, G2Point memory c2, 531 | G1Point memory d1, G2Point memory d2 532 | ) internal view returns (bool) { 533 | G1Point[] memory p1 = new G1Point[](4); 534 | G2Point[] memory p2 = new G2Point[](4); 535 | p1[0] = a1; 536 | p1[1] = b1; 537 | p1[2] = c1; 538 | p1[3] = d1; 539 | p2[0] = a2; 540 | p2[1] = b2; 541 | p2[2] = c2; 542 | p2[3] = d2; 543 | return pairing(p1, p2); 544 | } 545 | } 546 | 547 | contract Verifier { 548 | using Pairing for *; 549 | struct VerifyingKey { 550 | Pairing.G2Point h; 551 | Pairing.G1Point g_alpha; 552 | Pairing.G2Point h_beta; 553 | Pairing.G1Point g_gamma; 554 | Pairing.G2Point h_gamma; 555 | Pairing.G1Point[] query; 556 | } 557 | struct Proof { 558 | Pairing.G1Point a; 559 | Pairing.G2Point b; 560 | Pairing.G1Point c; 561 | } 562 | function verifyingKey() pure internal returns (VerifyingKey memory vk) { 563 | vk.h= Pairing.G2Point([uint256(0x052f6d551c292af5839a17b48560ccc26a13c8afe06d052d018659e5af208b7c), uint256(0x199b9e1b80889d9e0f34c19d4583cea80c5ab4443e44c0eb2c20aa476b8242a9)], [uint256(0x0710d972dfb67510e174bc9e8dc8ee92c32d116886989403fcb436d7744f7e93), uint256(0x2d316a218f66e3c109bebe0977c7dce799f32c96ba466e5ed3d6a5595d7a1cee)]); 564 | vk.g_alpha = Pairing.G1Point(uint256(0x007d622529cae0ede1b6d47220be1aa7e3eaa6a411876e10474670530f0ead5e), uint256(0x20759f0b508aaa59367290123502d6b1f4ac9b79c30390e01c27cb5888b4f654)); 565 | vk.h_beta = Pairing.G2Point([uint256(0x2ae3cddf0644841615ea88c37c842c0453726b097e8199abdb422ba37b3da76f), uint256(0x19a13e4fd10eb3fcc40cdecf4c252eac62f530a41d3d5258107029c4284b32fb)], [uint256(0x2c18b03f3facfff359059d7768a7e05cdd935e138398f3f46db977de502dfb62), uint256(0x293949d189148c142d2fbd8500cbd117091e79e554876d75fcda6b83bc1abf0a)]); 566 | vk.g_gamma = Pairing.G1Point(uint256(0x1b25a7980e7464aafc15c4cdea1d1681f9e7f6f09c7858b1b9f74c260328832b), uint256(0x1f179761cb7db872d21bb79bb2861ac6376cab386f5f29410d7329d50066a936)); 567 | vk.h_gamma = Pairing.G2Point([uint256(0x052f6d551c292af5839a17b48560ccc26a13c8afe06d052d018659e5af208b7c), uint256(0x199b9e1b80889d9e0f34c19d4583cea80c5ab4443e44c0eb2c20aa476b8242a9)], [uint256(0x0710d972dfb67510e174bc9e8dc8ee92c32d116886989403fcb436d7744f7e93), uint256(0x2d316a218f66e3c109bebe0977c7dce799f32c96ba466e5ed3d6a5595d7a1cee)]); 568 | vk.query = new Pairing.G1Point[](10); 569 | vk.query[0] = Pairing.G1Point(uint256(0x26f33e6bdb65847214bddf2125032fd01a2b0d3e6b54ed44ce6c10575aa239bd), uint256(0x205f6940fb76063144d3f2bba040a64be6f88e694ae52f190e58363370b59119)); 570 | vk.query[1] = Pairing.G1Point(uint256(0x1f0555d3d1a746b8ed44ff828ca6efea721edd25aae37b31d975b939c0ebfd3e), uint256(0x29ae78fe19a8360540643626488a2c18f6af48cec366ceb32882c363fae20950)); 571 | vk.query[2] = Pairing.G1Point(uint256(0x2ac91afbbcb0f05c90c7e48a2097247cb9e408b7d02a30950f9282e141e9ff9e), uint256(0x2a37ccd4413e5cffda7f73b19fe303575df1b2a9e7869395a8498ae284fc2e19)); 572 | vk.query[3] = Pairing.G1Point(uint256(0x03fce0c74a2e351905e49ec649546dba62d2f598885b88dccdf7743523bed875), uint256(0x08566668adaefc7d7157ec6fa201ab9e05954e22b248292d51f6d97f147e4158)); 573 | vk.query[4] = Pairing.G1Point(uint256(0x06a37dc1f6eceff90bfc47d7d1a84e7cc757cb211249e0a486d44c2a6a51c3de), uint256(0x0b3e008cccc17e3bfa06284b6f1cbf1f67f46538ebfa6264ed260edeeb69f354)); 574 | vk.query[5] = Pairing.G1Point(uint256(0x07c76bcc8101df58bd32ea34432892c0d75d4ba7d4a40836d40b897fbdb4a714), uint256(0x284f5cd8279eb6bb963f98d74a4eea4c87414023c3d69e9d6701cc0c2e8cf0bf)); 575 | vk.query[6] = Pairing.G1Point(uint256(0x06ba14ce5053eb68fcb0d05411f653fa9fe0fd99b7e2a52b06f1332f4917f260), uint256(0x15dbe842fc42006c2b43ed405995143b2ec68693326a2177e977bbc420c04e9f)); 576 | vk.query[7] = Pairing.G1Point(uint256(0x13b9efc46d5ca316206f7e50f82148235a0179c8c22b13fc28d0ae780ed7d58a), uint256(0x01d71a7aa55424f791982e6dfa886bb632d93d7728e6189771eea6e799f477b7)); 577 | vk.query[8] = Pairing.G1Point(uint256(0x2169a2d87f0aee29058d470ff6643fe76a042b6dac01b3ec6ea4a082aa6d68ed), uint256(0x25cce33ca9728bd84e48b09876e26e80945b02920965c8d9a2a790724e98989a)); 578 | vk.query[9] = Pairing.G1Point(uint256(0x0f110f8d946356e8db0882527b5bf6b3eaea881de1cbacffdaec40e0488eb67b), uint256(0x1f24b10abdcac6c6b2c980968264a33c3d334f2e0ae0a8b8c88ecd462676a4ed)); 579 | } 580 | function verify(uint[] memory input, Proof memory proof) internal view returns (uint) { 581 | uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617; 582 | VerifyingKey memory vk = verifyingKey(); 583 | require(input.length + 1 == vk.query.length); 584 | // Compute the linear combination vk_x 585 | Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0); 586 | for (uint i = 0; i < input.length; i++) { 587 | require(input[i] < snark_scalar_field); 588 | vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.query[i + 1], input[i])); 589 | } 590 | vk_x = Pairing.addition(vk_x, vk.query[0]); 591 | /** 592 | * e(A*G^{alpha}, B*H^{beta}) = e(G^{alpha}, H^{beta}) * e(G^{psi}, H^{gamma}) 593 | * * e(C, H) 594 | * where psi = \sum_{i=0}^l input_i pvk.query[i] 595 | */ 596 | if (!Pairing.pairingProd4(vk.g_alpha, vk.h_beta, vk_x, vk.h_gamma, proof.c, vk.h, Pairing.negate(Pairing.addition(proof.a, vk.g_alpha)), Pairing.addition(proof.b, vk.h_beta))) return 1; 597 | /** 598 | * e(A, H^{gamma}) = e(G^{gamma}, B) 599 | */ 600 | if (!Pairing.pairingProd2(proof.a, vk.h_gamma, Pairing.negate(vk.g_gamma), proof.b)) return 2; 601 | return 0; 602 | } 603 | function verifyTx( 604 | Proof memory proof, uint[9] memory input 605 | ) public view returns (bool r) { 606 | uint[] memory inputValues = new uint[](9); 607 | 608 | for(uint i = 0; i < input.length; i++){ 609 | inputValues[i] = input[i]; 610 | } 611 | if (verify(inputValues, proof) == 0) { 612 | return true; 613 | } else { 614 | return false; 615 | } 616 | } 617 | } 618 | -------------------------------------------------------------------------------- /sources/zk/hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import { HardhatUserConfig } from "hardhat/config"; 2 | import "@nomicfoundation/hardhat-toolbox"; 3 | import "hardhat-tracer"; 4 | 5 | const config: HardhatUserConfig = { 6 | solidity: "0.8.14", 7 | }; 8 | 9 | export default config; 10 | -------------------------------------------------------------------------------- /sources/zk/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hardhat-project", 3 | "devDependencies": { 4 | "@nomicfoundation/hardhat-toolbox": "^2.0.0", 5 | "hardhat": "^2.11.2" 6 | }, 7 | "dependencies": { 8 | "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", 9 | "@nomicfoundation/hardhat-network-helpers": "^1.0.0", 10 | "@nomiclabs/hardhat-ethers": "^2.0.0", 11 | "@nomiclabs/hardhat-etherscan": "^3.0.0", 12 | "@typechain/ethers-v5": "^10.1.0", 13 | "@typechain/hardhat": "^6.1.2", 14 | "@types/chai": "^4.2.0", 15 | "@types/mocha": ">=9.1.0", 16 | "chai": "^4.2.0", 17 | "hardhat-gas-reporter": "^1.0.8", 18 | "hardhat-tracer": "^2.6.0", 19 | "solidity-coverage": "^0.8.1", 20 | "ts-node": "^10.9.1", 21 | "typechain": "^8.1.0", 22 | "typescript": "^5.2.2", 23 | "zokrates-js": "^1.1.8" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sources/zk/scripts/deploy.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | 3 | async function main() { 4 | const currentTimestampInSeconds = Math.round(Date.now() / 1000); 5 | const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; 6 | const unlockTime = currentTimestampInSeconds + ONE_YEAR_IN_SECS; 7 | 8 | const lockedAmount = ethers.utils.parseEther("1"); 9 | 10 | const Lock = await ethers.getContractFactory("Lock"); 11 | const lock = await Lock.deploy(unlockTime, { value: lockedAmount }); 12 | 13 | await lock.deployed(); 14 | 15 | console.log(`Lock with 1 ETH and unlock timestamp ${unlockTime} deployed to ${lock.address}`); 16 | } 17 | 18 | // We recommend this pattern to be able to use async/await everywhere 19 | // and properly handle errors. 20 | main().catch((error) => { 21 | console.error(error); 22 | process.exitCode = 1; 23 | }); 24 | -------------------------------------------------------------------------------- /sources/zk/test/verifier.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import { ethers } from "hardhat"; 3 | import { Verifier } from "../typechain-types/Verifier"; 4 | import { CompilationArtifacts, ZoKratesProvider } from "zokrates-js"; 5 | import { readFileSync } from "fs"; 6 | import { Master } from "../typechain-types"; 7 | import { resolve } from 'path' 8 | 9 | describe("Verifier", function () { 10 | let master: Master; 11 | let zokratesProvider: ZoKratesProvider 12 | 13 | const zokArtifacts: CompilationArtifacts = { 14 | program: readFileSync(resolve(__dirname, '../zok/out')), 15 | abi: JSON.parse(readFileSync(resolve(__dirname, '../zok/abi.json'), 'utf-8')) 16 | } 17 | 18 | const provingKey = readFileSync(resolve(__dirname, '../zok/proving.key')) 19 | 20 | beforeEach(async () => { 21 | const { initialize } = await import("zokrates-js"); 22 | zokratesProvider = (await initialize()).withOptions({ 23 | backend: 'ark', 24 | curve: 'bn128', 25 | scheme: 'gm17' 26 | }); 27 | 28 | const bn256 = await ethers.getContractFactory("BN256G2").then((f) => f.deploy()); 29 | 30 | master = await ethers.getContractFactory("Master", { 31 | libraries: { 32 | "contracts/verifier.sol:BN256G2": bn256.address, 33 | } 34 | }).then((f) => f.deploy()); 35 | }) 36 | 37 | it("should verify a proof", async () => { 38 | const { witness, output } = zokratesProvider.computeWitness( 39 | zokArtifacts, 40 | [`${ethers.constants.WeiPerEther}`, '23'], 41 | ) 42 | 43 | const commitment = hexListToUint256BigEndian(JSON.parse(output)).toString(); 44 | 45 | await master.deposit( 46 | commitment, 47 | { value: ethers.constants.WeiPerEther } 48 | ) 49 | 50 | const proof = zokratesProvider.generateProof( 51 | zokArtifacts.program, 52 | witness, 53 | provingKey); 54 | 55 | 56 | const sender = (await ethers.getSigners())[0]; 57 | expect(() => master.connect(sender). 58 | withdraw(commitment, proof.proof as Verifier.ProofStruct, proof.inputs) 59 | ).to.changeEtherBalance(sender, ethers.constants.WeiPerEther); 60 | }) 61 | }); 62 | 63 | 64 | function hexListToUint256BigEndian(hexList: string[]) { 65 | let uint256Data = "0x"; 66 | for (const hex of hexList) { 67 | const cleanedHex = hex.replace("0x", ""); 68 | uint256Data += cleanedHex; 69 | } 70 | const uint256BigNumber = ethers.BigNumber.from(uint256Data); 71 | return uint256BigNumber; 72 | } -------------------------------------------------------------------------------- /sources/zk/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "node16", 5 | "esModuleInterop": true, 6 | "allowJs": true, 7 | "allowSyntheticDefaultImports": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "strict": true, 10 | "skipLibCheck": true 11 | }, 12 | "include": ["**/*.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /sources/zk/zok/abi.json: -------------------------------------------------------------------------------- 1 | { 2 | "inputs": [ 3 | { 4 | "name": "deposit_amount", 5 | "public": true, 6 | "type": "field" 7 | }, 8 | { 9 | "name": "secret", 10 | "public": false, 11 | "type": "field" 12 | } 13 | ], 14 | "output": { 15 | "type": "array", 16 | "components": { 17 | "size": 8, 18 | "type": "u32" 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /sources/zk/zok/deposit.zok: -------------------------------------------------------------------------------- 1 | import "hashes/sha256/512bit" as sha256; 2 | import "utils/pack/u32/nonStrictUnpack256" as unpack256; 3 | 4 | // deposit_amount: 存款金额 5 | // secret: 随机数 6 | // returns: 用于取款的commitment 7 | def main(field deposit_amount, private field secret) -> u32[8] { 8 | return sha256(unpack256(deposit_amount), unpack256(secret)); 9 | } -------------------------------------------------------------------------------- /sources/zk/zok/out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/sources/zk/zok/out -------------------------------------------------------------------------------- /sources/zk/zok/out.r1cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/sources/zk/zok/out.r1cs -------------------------------------------------------------------------------- /sources/zk/zok/out.wtns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/sources/zk/zok/out.wtns -------------------------------------------------------------------------------- /sources/zk/zok/proof.json: -------------------------------------------------------------------------------- 1 | { 2 | "scheme": "gm17", 3 | "curve": "bn128", 4 | "proof": { 5 | "a": [ 6 | "0x05a83e3c3b3ff9d59bdffdcf7aa655f42b941b0063f82cf26516846056d09aa6", 7 | "0x018039b7de92979ef6251c877971888ae049d09a6b48e5aa98c23ef91550ed36" 8 | ], 9 | "b": [ 10 | [ 11 | "0x1e88e783456a27e4f02dde8c742610339e395eb0bbf7f7efc1113815dcf0a16f", 12 | "0x1cc9de9e60c6519ea69c9b3a71c0809ac7ae3389a598d66fc27d378738d5de29" 13 | ], 14 | [ 15 | "0x0715544abbc18e741620ff7c76cb2a7d3558ee157d23f275ab65c43c25357d07", 16 | "0x0344257236ba33a3ce7ce34b8d518f7572984036db6f77fc2fc13f51c548a837" 17 | ] 18 | ], 19 | "c": [ 20 | "0x177113e528c76661a03a8f3f072f29e684244297a62926a0000d3a7135c1441f", 21 | "0x18cf275d0bc621473688848946584af771afca42e4f2bd0ef1e5d06e0adefd0f" 22 | ] 23 | }, 24 | "inputs": [ 25 | "0x0000000000000000000000000000000000000000000000000000000000000151", 26 | "0x00000000000000000000000000000000000000000000000000000000bb3eada7", 27 | "0x000000000000000000000000000000000000000000000000000000004b704815", 28 | "0x00000000000000000000000000000000000000000000000000000000cddda451", 29 | "0x00000000000000000000000000000000000000000000000000000000ca701d2a", 30 | "0x000000000000000000000000000000000000000000000000000000001f278e64", 31 | "0x00000000000000000000000000000000000000000000000000000000ef16f074", 32 | "0x0000000000000000000000000000000000000000000000000000000040e13298", 33 | "0x0000000000000000000000000000000000000000000000000000000026c5da72" 34 | ] 35 | } -------------------------------------------------------------------------------- /sources/zk/zok/proving.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/sources/zk/zok/proving.key -------------------------------------------------------------------------------- /sources/zk/zok/verification.key: -------------------------------------------------------------------------------- 1 | { 2 | "scheme": "gm17", 3 | "curve": "bn128", 4 | "h": [ 5 | [ 6 | "0x052f6d551c292af5839a17b48560ccc26a13c8afe06d052d018659e5af208b7c", 7 | "0x199b9e1b80889d9e0f34c19d4583cea80c5ab4443e44c0eb2c20aa476b8242a9" 8 | ], 9 | [ 10 | "0x0710d972dfb67510e174bc9e8dc8ee92c32d116886989403fcb436d7744f7e93", 11 | "0x2d316a218f66e3c109bebe0977c7dce799f32c96ba466e5ed3d6a5595d7a1cee" 12 | ] 13 | ], 14 | "g_alpha": [ 15 | "0x007d622529cae0ede1b6d47220be1aa7e3eaa6a411876e10474670530f0ead5e", 16 | "0x20759f0b508aaa59367290123502d6b1f4ac9b79c30390e01c27cb5888b4f654" 17 | ], 18 | "h_beta": [ 19 | [ 20 | "0x2ae3cddf0644841615ea88c37c842c0453726b097e8199abdb422ba37b3da76f", 21 | "0x19a13e4fd10eb3fcc40cdecf4c252eac62f530a41d3d5258107029c4284b32fb" 22 | ], 23 | [ 24 | "0x2c18b03f3facfff359059d7768a7e05cdd935e138398f3f46db977de502dfb62", 25 | "0x293949d189148c142d2fbd8500cbd117091e79e554876d75fcda6b83bc1abf0a" 26 | ] 27 | ], 28 | "g_gamma": [ 29 | "0x1b25a7980e7464aafc15c4cdea1d1681f9e7f6f09c7858b1b9f74c260328832b", 30 | "0x1f179761cb7db872d21bb79bb2861ac6376cab386f5f29410d7329d50066a936" 31 | ], 32 | "h_gamma": [ 33 | [ 34 | "0x052f6d551c292af5839a17b48560ccc26a13c8afe06d052d018659e5af208b7c", 35 | "0x199b9e1b80889d9e0f34c19d4583cea80c5ab4443e44c0eb2c20aa476b8242a9" 36 | ], 37 | [ 38 | "0x0710d972dfb67510e174bc9e8dc8ee92c32d116886989403fcb436d7744f7e93", 39 | "0x2d316a218f66e3c109bebe0977c7dce799f32c96ba466e5ed3d6a5595d7a1cee" 40 | ] 41 | ], 42 | "query": [ 43 | [ 44 | "0x26f33e6bdb65847214bddf2125032fd01a2b0d3e6b54ed44ce6c10575aa239bd", 45 | "0x205f6940fb76063144d3f2bba040a64be6f88e694ae52f190e58363370b59119" 46 | ], 47 | [ 48 | "0x1f0555d3d1a746b8ed44ff828ca6efea721edd25aae37b31d975b939c0ebfd3e", 49 | "0x29ae78fe19a8360540643626488a2c18f6af48cec366ceb32882c363fae20950" 50 | ], 51 | [ 52 | "0x2ac91afbbcb0f05c90c7e48a2097247cb9e408b7d02a30950f9282e141e9ff9e", 53 | "0x2a37ccd4413e5cffda7f73b19fe303575df1b2a9e7869395a8498ae284fc2e19" 54 | ], 55 | [ 56 | "0x03fce0c74a2e351905e49ec649546dba62d2f598885b88dccdf7743523bed875", 57 | "0x08566668adaefc7d7157ec6fa201ab9e05954e22b248292d51f6d97f147e4158" 58 | ], 59 | [ 60 | "0x06a37dc1f6eceff90bfc47d7d1a84e7cc757cb211249e0a486d44c2a6a51c3de", 61 | "0x0b3e008cccc17e3bfa06284b6f1cbf1f67f46538ebfa6264ed260edeeb69f354" 62 | ], 63 | [ 64 | "0x07c76bcc8101df58bd32ea34432892c0d75d4ba7d4a40836d40b897fbdb4a714", 65 | "0x284f5cd8279eb6bb963f98d74a4eea4c87414023c3d69e9d6701cc0c2e8cf0bf" 66 | ], 67 | [ 68 | "0x06ba14ce5053eb68fcb0d05411f653fa9fe0fd99b7e2a52b06f1332f4917f260", 69 | "0x15dbe842fc42006c2b43ed405995143b2ec68693326a2177e977bbc420c04e9f" 70 | ], 71 | [ 72 | "0x13b9efc46d5ca316206f7e50f82148235a0179c8c22b13fc28d0ae780ed7d58a", 73 | "0x01d71a7aa55424f791982e6dfa886bb632d93d7728e6189771eea6e799f477b7" 74 | ], 75 | [ 76 | "0x2169a2d87f0aee29058d470ff6643fe76a042b6dac01b3ec6ea4a082aa6d68ed", 77 | "0x25cce33ca9728bd84e48b09876e26e80945b02920965c8d9a2a790724e98989a" 78 | ], 79 | [ 80 | "0x0f110f8d946356e8db0882527b5bf6b3eaea881de1cbacffdaec40e0488eb67b", 81 | "0x1f24b10abdcac6c6b2c980968264a33c3d334f2e0ae0a8b8c88ecd462676a4ed" 82 | ] 83 | ] 84 | } -------------------------------------------------------------------------------- /sources/zk/zok/witness: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nishuzumi/blog/HEAD/sources/zk/zok/witness -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | font-feature-settings: "rlig" 1, "calt" 1; 7 | } 8 | 9 | .home-content p { 10 | margin-top: 1.5em; 11 | line-height: 1.75em; 12 | } 13 | 14 | .home-content a { 15 | --tw-ring-color: hsl(var(--nextra-primary-hue) 100% 50%/0.3); 16 | --tw-text-opacity: 1; 17 | text-underline-position: under; 18 | text-decoration-line: underline; 19 | text-decoration-thickness: from-font; 20 | color: hsl(var(--nextra-primary-hue) 100% 50% / var(--tw-text-opacity)); 21 | } 22 | 23 | figcaption { 24 | font-size: 0.85rem; 25 | line-height: 1.5rem; 26 | display: block; 27 | text-align: center; 28 | margin-top: 0.5rem; 29 | } 30 | 31 | code.text-\[\.9em\] { 32 | font-size: 14px; 33 | } 34 | 35 | @media screen and (max-width: 1200px) { 36 | .home-content .hide-medium { 37 | display: none; 38 | } 39 | } 40 | 41 | @media screen and (max-width: 720px) { 42 | .home-content p { 43 | font-size: 0.9rem; 44 | } 45 | .home-content .hide-small { 46 | display: none; 47 | } 48 | } 49 | 50 | /* Mermaid */ 51 | svg[aria-roledescription="sequence"] { 52 | @apply rounded-lg p-4; 53 | background: linear-gradient(135deg, rgb(102, 126, 234), rgb(118, 75, 162)); 54 | } 55 | 56 | svg[aria-roledescription="sequence"] line { 57 | stroke: black !important; 58 | } 59 | 60 | text.actor { 61 | @apply text-base; 62 | } 63 | 64 | text.actor > tspan { 65 | fill: #ececff !important; 66 | } 67 | 68 | .actor { 69 | fill: #22272e !important; 70 | stroke: none !important; 71 | } 72 | 73 | .messageText { 74 | fill: white !important; 75 | stroke: none; 76 | } 77 | 78 | .messageLine0 { 79 | stroke: white !important; 80 | } 81 | 82 | .actor-line { 83 | stroke: grey; 84 | } 85 | 86 | /* End Mermaid */ 87 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./pages/**/*.{js,jsx,ts,tsx,md,mdx}", 5 | "./components/**/*.{js,jsx,ts,tsx,md,mdx}", 6 | "./theme.config.tsx", 7 | ], 8 | theme: { 9 | extend: {}, 10 | }, 11 | plugins: [], 12 | }; 13 | -------------------------------------------------------------------------------- /theme.config.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { DocsThemeConfig, Link } from "nextra-theme-docs"; 3 | import { Preamble } from "components/preamble"; 4 | 5 | const config: DocsThemeConfig = { 6 | logo: ByteMahou, 7 | project: { 8 | link: "https://github.com/nishuzumi/blog", 9 | }, 10 | chat: { 11 | link: "https://t.me/BoxMrChen", 12 | }, 13 | docsRepositoryBase: "https://github.com/nishuzumi/blog/tree/main", 14 | footer: { 15 | text: ( 16 |
17 |
18 | 简约的字节魔法 19 |
20 |
21 | 22 | Made by Box With 23 | ❤️ 24 | 25 |
26 |
27 | ), 28 | }, 29 | useNextSeoProps() { 30 | return { 31 | titleTemplate: "%s - ByteMahou", 32 | }; 33 | }, 34 | editLink: { 35 | text: "修正此文章", 36 | }, 37 | feedback: { 38 | content: "有疑问?请在此提出你的问题。", 39 | }, 40 | components: { 41 | Preamble, 42 | }, 43 | toc: { 44 | title: "目录", 45 | }, 46 | head: ( 47 | <> 48 | 49 | 50 | 51 | 52 | ), 53 | }; 54 | 55 | export default config; 56 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2021", 4 | "baseUrl": ".", 5 | "lib": ["dom", "dom.iterable", "esnext"], 6 | "allowJs": true, 7 | "skipLibCheck": true, 8 | "strict": false, 9 | "forceConsistentCasingInFileNames": true, 10 | "noEmit": true, 11 | "incremental": true, 12 | "esModuleInterop": true, 13 | "module": "esnext", 14 | "moduleResolution": "node", 15 | "resolveJsonModule": true, 16 | "isolatedModules": true, 17 | "jsx": "preserve" 18 | }, 19 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 20 | "exclude": ["node_modules", "sources"] 21 | } 22 | --------------------------------------------------------------------------------