@facilitator/server 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,121 +1,216 @@
1
1
  # @facilitator/server
2
2
 
3
- x402 payment facilitator server implementing gasless ERC-20 and native ETH transfers via [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) delegated transactions.
3
+ Self-hosted x402 payment facilitator server. Verifies and settles **any ERC-20 token** (including USDT) and native ETH payments using EIP-7702 delegated transactions.
4
4
 
5
- A **relayer** pays the gas on behalf of users. Users sign an EIP-712 payment intent and an EIP-7702 authorization that delegates their EOA to the [`Delegate`](../contracts/src/Delegate.sol) contract. The facilitator verifies both signatures off-chain, then submits a single Type 4 transaction to settle the payment on-chain.
5
+ A **relayer** account pays gas on behalf of users. Users sign two things:
6
6
 
7
- ## Prerequisites
7
+ 1. **EIP-712 PaymentIntent** — what to pay (token, amount, recipient)
8
+ 2. **EIP-7702 Authorization** — delegate their EOA to the `Delegate` contract
8
9
 
9
- - [Bun](https://bun.sh/) v1.1+
10
- - Access to an EVM RPC endpoint (Anvil for local development)
11
- - A deployed `Delegate` contract (see `packages/contracts`)
10
+ The facilitator verifies both signatures off-chain, then submits a single Type 4 transaction to settle on-chain.
11
+
12
+ ```
13
+ Verification & Settlement Flow
14
+
15
+ Client Facilitator Blockchain
16
+ │ │ │
17
+ │── POST /verify ──────────>│ │
18
+ │ {paymentPayload, │── recover signer │
19
+ │ paymentRequirements} │── verify EIP-712 sig │
20
+ │ │── check deadline │
21
+ │ │── check nonce │
22
+ │ │── check balance ────────>│
23
+ │<── {isValid, payer} ──────│ │
24
+ │ │ │
25
+ │── POST /settle ──────────>│ │
26
+ │ │── verify (same checks) │
27
+ │ │── encode Delegate call │
28
+ │ │── send Type 4 tx ───────>│
29
+ │ │ (EIP-7702 + call data) │
30
+ │ │<── receipt ──────────────│
31
+ │<── {success, tx hash} ────│ │
32
+ ```
12
33
 
13
34
  ## Quick Start
14
35
 
15
36
  ```sh
16
- # Install dependencies
17
37
  bun install
18
38
 
19
- # Set environment variables (or create a .env file — Bun loads it automatically)
39
+ # Using environment variables
20
40
  export RELAYER_PRIVATE_KEY="0x..."
21
41
  export DELEGATE_ADDRESS="0x..."
22
42
  export RPC_URL_31337="http://127.0.0.1:8545"
23
-
24
- # Start the server
25
43
  bun run start
26
44
 
27
- # Or with file-watching for development
45
+ # Or pass everything via CLI flags
46
+ bunx @facilitator/server \
47
+ --relayer-private-key 0x... \
48
+ --delegate-address 0x... \
49
+ --rpc-url 31337=http://127.0.0.1:8545
50
+
51
+ # Mix and match — CLI flags override env vars
52
+ export RELAYER_PRIVATE_KEY="0x..."
53
+ bunx @facilitator/server --port 8080 --delegate-address 0x...
54
+
55
+ # Hot-reload for development
28
56
  bun run dev
29
57
  ```
30
58
 
31
- The server starts on port `3000` by default. Override with the `PORT` environment variable.
59
+ The server starts on `0.0.0.0:3000` by default. Override with CLI flags or environment variables.
60
+
61
+ ## CLI Options
62
+
63
+ ```
64
+ Usage: facilitator-server [options]
65
+
66
+ Options:
67
+ -p, --port <port> Server port (default: 3000, env: PORT)
68
+ -H, --host <host> Server hostname (default: "0.0.0.0", env: HOST)
69
+ --relayer-private-key <key> Relayer private key (env: RELAYER_PRIVATE_KEY)
70
+ --delegate-address <addr> Delegate contract address (env: DELEGATE_ADDRESS)
71
+ --rpc-url <chainId=url> RPC endpoint, repeatable (env: RPC_URL_<chainId>)
72
+ -h, --help Show this help message
73
+ ```
74
+
75
+ CLI flags take precedence over environment variables. The `--rpc-url` flag can be repeated for multiple chains:
76
+
77
+ ```sh
78
+ bunx @facilitator/server \
79
+ --rpc-url 1=https://eth.rpc.io \
80
+ --rpc-url 8453=https://base.rpc.io
81
+ ```
32
82
 
33
83
  ## Environment Variables
34
84
 
35
85
  | Variable | Required | Description |
36
86
  | --------------------- | -------- | --------------------------------------------------------- |
37
- | `RELAYER_PRIVATE_KEY` | Yes | Private key of the relayer account that pays gas |
38
- | `DELEGATE_ADDRESS` | Yes | Deployed `Delegate` contract address |
87
+ | `RELAYER_PRIVATE_KEY` | Yes | Private key of the account that pays gas for settlements |
88
+ | `DELEGATE_ADDRESS` | Yes | Address of the deployed `Delegate` contract |
39
89
  | `RPC_URL_<chainId>` | Yes | RPC endpoint per chain (e.g. `RPC_URL_1`, `RPC_URL_8453`) |
40
90
  | `PORT` | No | Server port (default: `3000`) |
91
+ | `HOST` | No | Server hostname (default: `"0.0.0.0"`) |
41
92
 
42
93
  ## API
43
94
 
44
95
  ### `GET /healthcheck`
45
96
 
46
- Returns server uptime and status.
97
+ Returns server status and uptime.
98
+
99
+ **Response:**
100
+
101
+ ```json
102
+ { "status": "ok", "uptime": 123.45, "timestamp": 1706745600000 }
103
+ ```
47
104
 
48
105
  ### `GET /supported`
49
106
 
50
107
  Returns supported payment schemes, networks, and the relayer signer address.
51
108
 
109
+ **Response:**
110
+
111
+ ```json
112
+ {
113
+ "kinds": [{ "x402Version": 2, "scheme": "eip7702", "network": "eip155:*" }],
114
+ "extensions": ["bazaar"],
115
+ "signers": { "eip155:*": ["0xRelayer..."] },
116
+ "delegateContract": "0xDelegate..."
117
+ }
118
+ ```
119
+
52
120
  ### `GET /discovery/resources?limit=100&offset=0`
53
121
 
54
122
  Lists resources that have been settled through this facilitator (the "bazaar").
55
123
 
56
124
  ### `POST /verify`
57
125
 
58
- Off-chain verification of a payment intent. Checks:
126
+ Read-only off-chain verification of a payment payload. Does not consume the nonce or submit any transaction. Checks:
59
127
 
60
- 1. EIP-7702 authorization signature recovery
61
- 2. Delegate contract address trust
62
- 3. EIP-712 intent signature validity
63
- 4. Deadline expiration
64
- 5. Nonce uniqueness
65
- 6. Payer balance (ERC-20 `balanceOf` or native ETH `getBalance`)
128
+ | Step | Check | Failure Reason |
129
+ | ---- | ------------------------------------------ | ----------------------------- |
130
+ | 1 | Recover signer from EIP-7702 authorization | `Untrusted Delegate Contract` |
131
+ | 2 | Verify EIP-712 intent signature | `Invalid Intent Signature` |
132
+ | 3 | Check deadline has not passed | `Deadline Expired` |
133
+ | 4 | Check nonce has not been used | `Nonce Used` |
134
+ | 5 | Check payer has sufficient balance | `Insufficient Balance` |
66
135
 
67
- **Request body:**
136
+ **Request:**
68
137
 
69
138
  ```json
70
139
  {
71
- "paymentPayload": { "..." },
72
- "paymentRequirements": { "..." }
140
+ "paymentPayload": { "x402Version": 2, "resource": {...}, "accepted": {...}, "payload": {...} },
141
+ "paymentRequirements": { "scheme": "eip7702", "network": "eip155:31337", "asset": "0x...", "amount": "1000000000000000000", "payTo": "0x..." }
73
142
  }
74
143
  ```
75
144
 
145
+ **Response:**
146
+
147
+ ```json
148
+ { "isValid": true, "payer": "0xBuyer..." }
149
+ ```
150
+
76
151
  ### `POST /settle`
77
152
 
78
- Verifies and then submits the payment transaction on-chain. Sends a Type 4 (EIP-7702) transaction through the relayer. If the payer's EOA already has delegated code, the authorization list is omitted.
153
+ Re-verifies (consuming the nonce this time) and submits the payment on-chain. Sends a Type 4 (EIP-7702) transaction through the relayer. If the payer already has delegated code, the authorization list is omitted for gas efficiency. Always call `/verify` first to check validity without side effects.
79
154
 
80
- **Request body:** Same as `/verify`.
155
+ **Request:** Same as `/verify`.
156
+
157
+ **Response:**
158
+
159
+ ```json
160
+ {
161
+ "success": true,
162
+ "transaction": "0xTxHash...",
163
+ "network": "eip155:31337",
164
+ "payer": "0xBuyer..."
165
+ }
166
+ ```
167
+
168
+ ### `GET /balance`
169
+
170
+ Returns the relayer's ETH balance (debug endpoint).
81
171
 
82
172
  ## Asset Types
83
173
 
84
- - **ERC-20 tokens:** Set `asset` to the token contract address. Uses `Delegate.transfer()`.
85
- - **Native ETH:** Set `asset` to `0x0000000000000000000000000000000000000000`. Uses `Delegate.transferEth()`.
174
+ | Asset | `asset` field | Contract call |
175
+ | ---------------- | -------------------------------------------- | ------------------------ |
176
+ | Any ERC-20 token | Token contract address | `Delegate.transfer()` |
177
+ | Native ETH | `0x0000000000000000000000000000000000000000` | `Delegate.transferEth()` |
86
178
 
87
- ## Architecture
179
+ ## Source Structure
88
180
 
89
181
  ```
90
182
  src/
91
- index.ts HTTP server (Bun.serve) and route handlers
92
- config.ts Environment config, relayer account, RPC client factory
93
- mechanism.ts EIP-7702 verification and settlement logic
94
- storage.ts In-memory nonce tracker and discovery catalog
95
- types.ts x402 protocol and EIP-7702 type definitions
96
- abi.ts Solidity ABI fragments for Delegate and ERC-20
183
+ ├── index.ts HTTP server (Bun.serve) route handlers
184
+ ├── config.ts Environment config, relayer account, RPC client factory
185
+ ├── mechanism.ts EIP-7702 verification and settlement logic
186
+ ├── storage.ts In-memory nonce tracker and bazaar catalog
187
+ ├── types.ts x402 protocol and EIP-7702 type definitions
188
+ └── abi.ts Solidity ABI fragments for Delegate and ERC-20
189
+
97
190
  test/
98
- integration.test.ts End-to-end test against Anvil
191
+ ├── integration.test.ts End-to-end tests against Anvil
192
+ ├── Delegate.json Compiled contract artifact
193
+ └── MockERC20.json Compiled token artifact
99
194
  ```
100
195
 
101
196
  ## Testing
102
197
 
103
- Tests require [Foundry](https://getfoundry.sh/) (for Anvil) and compiled contract artifacts.
198
+ Tests require [Foundry](https://getfoundry.sh/) (for Anvil) and compiled contract artifacts in `test/`.
104
199
 
105
200
  ```sh
106
- # Build contracts first (from the monorepo root)
107
- cd packages/contracts && forge build
201
+ # Build contracts first (from monorepo root)
202
+ bun run build:contracts
108
203
 
109
204
  # Run integration tests
110
- cd packages/server && bun test
205
+ bun test
111
206
  ```
112
207
 
113
- The integration test suite:
208
+ The test suite automatically:
114
209
 
115
210
  1. Starts a local Anvil instance
116
211
  2. Deploys `Delegate` and `MockERC20` contracts
117
212
  3. Starts the facilitator server
118
- 4. Executes full verify + settle flows for both ERC-20 and native ETH transfers
213
+ 4. Executes verify + settle flows for both ERC-20 and native ETH
119
214
  5. Asserts on-chain balances after settlement
120
215
 
121
216
  ## License
package/package.json CHANGED
@@ -1,9 +1,36 @@
1
1
  {
2
2
  "name": "@facilitator/server",
3
- "version": "0.0.1",
4
- "description": "x402 payment facilitator server using EIP-7702 delegated transactions",
3
+ "version": "0.1.0",
4
+ "description": "Self-hosted x402 payment facilitator server verifies and settles any ERC-20 token via EIP-7702",
5
5
  "module": "src/index.ts",
6
+ "bin": {
7
+ "facilitator-server": "src/index.ts"
8
+ },
6
9
  "type": "module",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/melonask/facilitator",
13
+ "directory": "packages/server"
14
+ },
15
+ "homepage": "https://github.com/melonask/facilitator/tree/main/packages/server#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/melonask/facilitator/issues"
18
+ },
19
+ "license": "MIT",
20
+ "author": "melonask",
21
+ "keywords": [
22
+ "x402",
23
+ "eip-7702",
24
+ "eip-712",
25
+ "facilitator",
26
+ "payment",
27
+ "erc20",
28
+ "usdt",
29
+ "gasless",
30
+ "relayer",
31
+ "blockchain",
32
+ "ethereum"
33
+ ],
7
34
  "scripts": {
8
35
  "start": "bun run src/index.ts",
9
36
  "dev": "bun --hot src/index.ts",
@@ -14,5 +41,15 @@
14
41
  "@x402/core": "^2.2.0",
15
42
  "viem": "^2.45.1"
16
43
  },
17
- "license": "MIT"
44
+ "peerDependencies": {
45
+ "bun": ">=1.1.0"
46
+ },
47
+ "files": [
48
+ "src",
49
+ "README.md",
50
+ "LICENSE"
51
+ ],
52
+ "engines": {
53
+ "bun": ">=1.1.0"
54
+ }
18
55
  }
package/src/index.ts CHANGED
@@ -1,7 +1,4 @@
1
- import { DELEGATE_CONTRACT_ADDRESS, relayerAccount, getClients } from "./config";
2
- import { formatEther } from "viem";
3
- import { mechanism } from "./mechanism";
4
- import { bazaarManager } from "./storage";
1
+ import { parseArgs } from "util";
5
2
  import type {
6
3
  DiscoveryResponse,
7
4
  SettleRequest,
@@ -11,7 +8,59 @@ import type {
11
8
  VerifyResponse,
12
9
  } from "./types";
13
10
 
14
- const PORT = Number(process.env.PORT) || 3000;
11
+ const { values: args } = parseArgs({
12
+ args: Bun.argv.slice(2),
13
+ options: {
14
+ port: { type: "string", short: "p" },
15
+ host: { type: "string", short: "H" },
16
+ "relayer-private-key": { type: "string" },
17
+ "delegate-address": { type: "string" },
18
+ "rpc-url": { type: "string", multiple: true },
19
+ help: { type: "boolean", short: "h" },
20
+ },
21
+ strict: false,
22
+ });
23
+
24
+ if (args.help) {
25
+ console.log(`Usage: facilitator-server [options]
26
+
27
+ Options:
28
+ -p, --port <port> Server port (default: 3000, env: PORT)
29
+ -H, --host <host> Server hostname (default: "0.0.0.0", env: HOST)
30
+ --relayer-private-key <key> Relayer private key (env: RELAYER_PRIVATE_KEY)
31
+ --delegate-address <addr> Delegate contract address (env: DELEGATE_ADDRESS)
32
+ --rpc-url <chainId=url> RPC endpoint, repeatable (env: RPC_URL_<chainId>)
33
+ -h, --help Show this help message
34
+
35
+ Examples:
36
+ facilitator-server --port 8080
37
+ facilitator-server --relayer-private-key 0x... --delegate-address 0x... --rpc-url 1=https://eth.rpc.io
38
+ facilitator-server --rpc-url 1=https://eth.rpc.io --rpc-url 8453=https://base.rpc.io`);
39
+ process.exit(0);
40
+ }
41
+
42
+ // Apply CLI args to process.env before config module reads them
43
+ if (args["relayer-private-key"]) process.env.RELAYER_PRIVATE_KEY = args["relayer-private-key"] as string;
44
+ if (args["delegate-address"]) process.env.DELEGATE_ADDRESS = args["delegate-address"] as string;
45
+ if (args["rpc-url"]) {
46
+ for (const entry of args["rpc-url"] as string[]) {
47
+ const eq = entry.indexOf("=");
48
+ if (eq === -1) {
49
+ console.error(`Invalid --rpc-url format: "${entry}" (expected chainId=url)`);
50
+ process.exit(1);
51
+ }
52
+ process.env[`RPC_URL_${entry.slice(0, eq)}`] = entry.slice(eq + 1);
53
+ }
54
+ }
55
+
56
+ const PORT = Number(args.port ?? process.env.PORT) || 3000;
57
+ const HOST = (args.host as string) ?? process.env.HOST ?? "0.0.0.0";
58
+
59
+ // Import after env is populated from CLI args
60
+ const { DELEGATE_CONTRACT_ADDRESS, relayerAccount, getClients } = await import("./config");
61
+ const { formatEther } = await import("viem");
62
+ const { mechanism } = await import("./mechanism");
63
+ const { bazaarManager } = await import("./storage");
15
64
 
16
65
  const CORS_HEADERS = {
17
66
  "Access-Control-Allow-Origin": "*",
@@ -115,6 +164,7 @@ async function handleBalance() {
115
164
 
116
165
  Bun.serve({
117
166
  port: PORT,
167
+ hostname: HOST,
118
168
  async fetch(req) {
119
169
  if (req.method === "OPTIONS") {
120
170
  return new Response(null, { headers: CORS_HEADERS });
@@ -144,4 +194,4 @@ Bun.serve({
144
194
  },
145
195
  });
146
196
 
147
- console.log(`x402 EIP-7702 Facilitator running on port ${PORT}`);
197
+ console.log(`x402 EIP-7702 Facilitator running on ${HOST}:${PORT}`);
package/src/mechanism.ts CHANGED
@@ -140,9 +140,15 @@ export class Eip7702Mechanism {
140
140
  });
141
141
  }
142
142
 
143
- async verify(
143
+ /**
144
+ * Shared verification logic.
145
+ * @param consumeNonce - if true, marks the nonce as used (for settlement).
146
+ * if false, only checks whether it has been used (read-only verify).
147
+ */
148
+ private async _verify(
144
149
  payload: PaymentPayload,
145
150
  reqs: PaymentRequirements,
151
+ consumeNonce: boolean,
146
152
  ): Promise<VerifyResponse> {
147
153
  try {
148
154
  const chainId = parseChainId(reqs.network);
@@ -174,8 +180,14 @@ export class Eip7702Mechanism {
174
180
  }
175
181
 
176
182
  // 4. Check nonce
177
- if (!nonceManager.checkAndMark(intent.nonce.toString())) {
178
- return { isValid: false, invalidReason: "Nonce Used" };
183
+ if (consumeNonce) {
184
+ if (!nonceManager.checkAndMark(intent.nonce.toString())) {
185
+ return { isValid: false, invalidReason: "Nonce Used" };
186
+ }
187
+ } else {
188
+ if (nonceManager.has(intent.nonce.toString())) {
189
+ return { isValid: false, invalidReason: "Nonce Used" };
190
+ }
179
191
  }
180
192
 
181
193
  // 5. Check balance
@@ -203,12 +215,22 @@ export class Eip7702Mechanism {
203
215
  }
204
216
  }
205
217
 
218
+ /**
219
+ * Read-only verification. Does not consume the nonce.
220
+ */
221
+ async verify(
222
+ payload: PaymentPayload,
223
+ reqs: PaymentRequirements,
224
+ ): Promise<VerifyResponse> {
225
+ return this._verify(payload, reqs, false);
226
+ }
227
+
206
228
  async settle(
207
229
  payload: PaymentPayload,
208
230
  reqs: PaymentRequirements,
209
231
  ): Promise<SettleResponse> {
210
232
  try {
211
- const verification = await this.verify(payload, reqs);
233
+ const verification = await this._verify(payload, reqs, true);
212
234
  if (!verification.isValid) throw new Error(verification.invalidReason);
213
235
 
214
236
  const chainId = parseChainId(reqs.network);
@@ -1 +0,0 @@
1
- {"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"invalidateNonce","inputs":[{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transfer","inputs":[{"name":"intent","type":"tuple","internalType":"struct Delegate.PaymentIntent","components":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"to","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferEth","inputs":[{"name":"intent","type":"tuple","internalType":"struct Delegate.EthPaymentIntent","components":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"to","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidShortString","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"StringTooLong","inputs":[{"name":"str","type":"string","internalType":"string"}]}],"bytecode":{"object":"0x610160604052348015610010575f5ffd5b506040518060400160405280600881526020017f44656c65676174650000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f312e3000000000000000000000000000000000000000000000000000000000008152506100905f8361012b60201b90919060201c565b61012081815250506100ac60018261012b60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506100e961017860201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050505061071c565b5f60208351101561014c57610145836101d260201b60201c565b9050610172565b8261015c8361023760201b60201c565b5f01908161016a919061047d565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016101b79594939291906105b2565b60405160208183030381529060405280519060200120905090565b5f5f829050601f8151111561021e57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016102159190610669565b60405180910390fd5b80518161022a906106b6565b5f1c175f1b915050919050565b5f819050919050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806102bb57607f821691505b6020821081036102ce576102cd610277565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102f5565b61033a86836102f5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61037e61037961037484610352565b61035b565b610352565b9050919050565b5f819050919050565b61039783610364565b6103ab6103a382610385565b848454610301565b825550505050565b5f5f905090565b6103c26103b3565b6103cd81848461038e565b505050565b5b818110156103f0576103e55f826103ba565b6001810190506103d3565b5050565b601f82111561043557610406816102d4565b61040f846102e6565b8101602085101561041e578190505b61043261042a856102e6565b8301826103d2565b50505b505050565b5f82821c905092915050565b5f6104555f198460080261043a565b1980831691505092915050565b5f61046d8383610446565b9150826002028217905092915050565b61048682610240565b67ffffffffffffffff81111561049f5761049e61024a565b5b6104a982546102a4565b6104b48282856103f4565b5f60209050601f8311600181146104e5575f84156104d3578287015190505b6104dd8582610462565b865550610544565b601f1984166104f3866102d4565b5f5b8281101561051a578489015182556001820191506020850194506020810190506104f5565b868310156105375784890151610533601f891682610446565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b61055e8161054c565b82525050565b61056d81610352565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61059c82610573565b9050919050565b6105ac81610592565b82525050565b5f60a0820190506105c55f830188610555565b6105d26020830187610555565b6105df6040830186610555565b6105ec6060830185610564565b6105f960808301846105a3565b9695505050505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61063b82610240565b6106458185610603565b9350610655818560208601610613565b61065e81610621565b840191505092915050565b5f6020820190508181035f8301526106818184610631565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f6106ad825161054c565b80915050919050565b5f6106c082610689565b826106ca84610693565b90506106d5816106a2565b92506020821015610715576107107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026102f5565b831692505b5050919050565b60805160a05160c05160e05161010051610120516101405161169e61076d5f395f6107e501525f6107aa01525f610c1801525f610bf701525f61081a01525f61087001525f610899015261169e5ff3fe608060405260043610610042575f3560e01c806305b6eb9f1461004d5780633b8218601461007557806384b0196e1461009d578063b70e36f0146100cd57610049565b3661004957005b5f5ffd5b348015610058575f5ffd5b50610073600480360381019061006e9190610e9a565b6100f5565b005b348015610080575f5ffd5b5061009b60048036038101906100969190610f15565b610355565b005b3480156100a8575f5ffd5b506100b1610566565b6040516100c49796959493929190611142565b60405180910390f35b3480156100d8575f5ffd5b506100f360048036038101906100ee91906111ee565b61060b565b005b6101028360400135610685565b5f5f7fa24447fab62723450095d3ad42f06d3f815a023f2e0b97c41a5f768c52177ff490505f855f013590505f8660200160208101906101429190611243565b90505f876040013590505f8860600135905060405185815284602082015283604082015282606082015281608082015260a081209650505f6101838761070c565b90505f6101d3828b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610725565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023a906112b8565b60405180910390fd5b8a6060013542111561028a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028190611320565b60405180910390fd5b5f8b602001602081019061029e9190611243565b73ffffffffffffffffffffffffffffffffffffffff168c5f01356040516102c49061136b565b5f6040518083038185875af1925050503d805f81146102fe576040519150601f19603f3d011682016040523d82523d5f602084013e610303565b606091505b5050905080610347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033e906113c9565b60405180910390fd5b505050505050505050505050565b6103628360600135610685565b5f5f7f935bf9a4261e15f8449634fd7c0e31227afce52a2f0829d3b5a103c6c9ba7c6790505f855f01602081019061039a9190611243565b90505f866020013590505f8760400160208101906103b89190611243565b90505f886060013590505f896080013590506040518681528560208201528460408201528360608201528260808201528160a082015260c081209750505f6103ff8861070c565b90505f61044f828c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610725565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b6906112b8565b60405180910390fd5b8b60800135421115610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fd90611320565b60405180910390fd5b6105588c604001602081019061051c9190611243565b8d602001358e5f0160208101906105339190611243565b73ffffffffffffffffffffffffffffffffffffffff1661074f9092919063ffffffff16565b505050505050505050505050565b5f6060805f5f5f60606105776107a2565b61057f6107dc565b46305f5f1b5f67ffffffffffffffff81111561059e5761059d6113e7565b5b6040519080825280602002602001820160405280156105cc5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610679576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106709061145e565b60405180910390fd5b61068281610685565b50565b5f7f27f372a79847a7b78b0d20e519aa47d449ec715dc685ecfb25a9fe69e28ff9535f1b90505f825f528160205260405f2080549150816106c557600181555b508015610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe906114c6565b60405180910390fd5b505050565b5f61071e610718610817565b836108cd565b9050919050565b5f5f5f5f610733868661090d565b9250925092506107438282610962565b82935050505092915050565b61075c8383836001610ac4565b61079d57826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161079491906114e4565b60405180910390fd5b505050565b60606107d75f7f0000000000000000000000000000000000000000000000000000000000000000610b2690919063ffffffff16565b905090565b606061081260017f0000000000000000000000000000000000000000000000000000000000000000610b2690919063ffffffff16565b905090565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561089257507f000000000000000000000000000000000000000000000000000000000000000046145b156108bf577f000000000000000000000000000000000000000000000000000000000000000090506108ca565b6108c7610bd3565b90505b90565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f5f604184510361094d575f5f5f602087015192506040870151915060608701515f1a905061093f88828585610c68565b95509550955050505061095b565b5f600285515f1b9250925092505b9250925092565b5f6003811115610975576109746114fd565b5b826003811115610988576109876114fd565b5b0315610ac057600160038111156109a2576109a16114fd565b5b8260038111156109b5576109b46114fd565b5b036109ec576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115610a00576109ff6114fd565b5b826003811115610a1357610a126114fd565b5b03610a5757805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401610a4e919061152a565b60405180910390fd5b600380811115610a6a57610a696114fd565b5b826003811115610a7d57610a7c6114fd565b5b03610abf57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401610ab69190611543565b60405180910390fd5b5b5050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f51148316610b18578383151615610b0c573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b606060ff5f1b8314610b4257610b3b83610d4f565b9050610bcd565b818054610b4e90611589565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7a90611589565b8015610bc55780601f10610b9c57610100808354040283529160200191610bc5565b820191905f5260205f20905b815481529060010190602001808311610ba857829003601f168201915b505050505090505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001610c4d9594939291906115b9565b60405160208183030381529060405280519060200120905090565b5f5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115610ca4575f600385925092509250610d45565b5f6001888888886040515f8152602001604052604051610cc79493929190611625565b6020604051602081039080840390855afa158015610ce7573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d38575f60015f5f1b93509350935050610d45565b805f5f5f1b935093509350505b9450945094915050565b60605f610d5b83610dc1565b90505f602067ffffffffffffffff811115610d7957610d786113e7565b5b6040519080825280601f01601f191660200182016040528015610dab5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f5f60ff835f1c169050601f811115610e06576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f60808284031215610e3057610e2f610e17565b5b81905092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112610e5a57610e59610e39565b5b8235905067ffffffffffffffff811115610e7757610e76610e3d565b5b602083019150836001820283011115610e9357610e92610e41565b5b9250929050565b5f5f5f60a08486031215610eb157610eb0610e0f565b5b5f610ebe86828701610e1b565b935050608084013567ffffffffffffffff811115610edf57610ede610e13565b5b610eeb86828701610e45565b92509250509250925092565b5f60a08284031215610f0c57610f0b610e17565b5b81905092915050565b5f5f5f60c08486031215610f2c57610f2b610e0f565b5b5f610f3986828701610ef7565b93505060a084013567ffffffffffffffff811115610f5a57610f59610e13565b5b610f6686828701610e45565b92509250509250925092565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b610fa681610f72565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610fee82610fac565b610ff88185610fb6565b9350611008818560208601610fc6565b61101181610fd4565b840191505092915050565b5f819050919050565b61102e8161101c565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61105d82611034565b9050919050565b61106d81611053565b82525050565b5f819050919050565b61108581611073565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6110bd8161101c565b82525050565b5f6110ce83836110b4565b60208301905092915050565b5f602082019050919050565b5f6110f08261108b565b6110fa8185611095565b9350611105836110a5565b805f5b8381101561113557815161111c88826110c3565b9750611127836110da565b925050600181019050611108565b5085935050505092915050565b5f60e0820190506111555f83018a610f9d565b81810360208301526111678189610fe4565b9050818103604083015261117b8188610fe4565b905061118a6060830187611025565b6111976080830186611064565b6111a460a083018561107c565b81810360c08301526111b681846110e6565b905098975050505050505050565b6111cd8161101c565b81146111d7575f5ffd5b50565b5f813590506111e8816111c4565b92915050565b5f6020828403121561120357611202610e0f565b5b5f611210848285016111da565b91505092915050565b61122281611053565b811461122c575f5ffd5b50565b5f8135905061123d81611219565b92915050565b5f6020828403121561125857611257610e0f565b5b5f6112658482850161122f565b91505092915050565b7f496e76616c696420496e74656e74205369676e617475726500000000000000005f82015250565b5f6112a2601883610fb6565b91506112ad8261126e565b602082019050919050565b5f6020820190508181035f8301526112cf81611296565b9050919050565b7f45787069726564000000000000000000000000000000000000000000000000005f82015250565b5f61130a600783610fb6565b9150611315826112d6565b602082019050919050565b5f6020820190508181035f830152611337816112fe565b9050919050565b5f81905092915050565b50565b5f6113565f8361133e565b915061136182611348565b5f82019050919050565b5f6113758261134b565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f6113b3601383610fb6565b91506113be8261137f565b602082019050919050565b5f6020820190508181035f8301526113e0816113a7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4f6e6c79206f776e6572000000000000000000000000000000000000000000005f82015250565b5f611448600a83610fb6565b915061145382611414565b602082019050919050565b5f6020820190508181035f8301526114758161143c565b9050919050565b7f4e6f6e636520616c7265616479207573656400000000000000000000000000005f82015250565b5f6114b0601283610fb6565b91506114bb8261147c565b602082019050919050565b5f6020820190508181035f8301526114dd816114a4565b9050919050565b5f6020820190506114f75f830184611064565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208201905061153d5f830184611025565b92915050565b5f6020820190506115565f83018461107c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806115a057607f821691505b6020821081036115b3576115b261155c565b5b50919050565b5f60a0820190506115cc5f83018861107c565b6115d9602083018761107c565b6115e6604083018661107c565b6115f36060830185611025565b6116006080830184611064565b9695505050505050565b5f60ff82169050919050565b61161f8161160a565b82525050565b5f6080820190506116385f83018761107c565b6116456020830186611616565b611652604083018561107c565b61165f606083018461107c565b9594505050505056fea264697066735822122069c63f93f17ba8ddf5850f25622946e2aba6a478174e7e50bfaa0bbf9d28afca64736f6c634300081d0033","sourceMap":"373:3889:37:-:0;;;1441:42;;;;;;;;;;3428:431:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3501:45;3532:13;3501:4;:30;;;;:45;;;;:::i;:::-;3493:53;;;;;;3567:51;3601:16;3567:7;:33;;;;:51;;;;:::i;:::-;3556:62;;;;;;3658:4;3642:22;;;;;;3628:36;;;;;;3707:7;3691:25;;;;;;3674:42;;;;;;3744:13;3727:30;;;;;;3792:23;:21;;;:23;;:::i;:::-;3767:48;;;;;;3847:4;3825:27;;;;;;;;;;3428:431;;373:3889:37;;2893:342:27;2989:11;3038:4;3022:5;3016:19;:26;3012:217;;;3065:20;3079:5;3065:13;;;:20;;:::i;:::-;3058:27;;;;3012:217;3157:5;3116:32;3142:5;3116:25;;;:32;;:::i;:::-;:38;;:46;;;;;;:::i;:::-;;1390:66;3200:17;;3176:42;;2893:342;;;;;:::o;4213:179:31:-;4268:7;2079:95;4326:11;;4339:14;;4355:13;4378:4;4304:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4294:91;;;;;;4287:98;;4213:179;:::o;1708:288:27:-;1773:11;1796:17;1822:3;1796:30;;1854:4;1840;:11;:18;1836:74;;;1895:3;1881:18;;;;;;;;;;;:::i;:::-;;;;;;;;1836:74;1976:4;:11;1967:4;1959:13;;;:::i;:::-;1951:22;;:36;1943:45;;1919:70;;;1708:288;;;:::o;3468:175:28:-;3536:20;3617:10;3607:20;;3468:175;;;:::o;7:99:39:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:180::-;160:77;157:1;150:88;257:4;254:1;247:15;281:4;278:1;271:15;298:180;346:77;343:1;336:88;443:4;440:1;433:15;467:4;464:1;457:15;484:320;528:6;565:1;559:4;555:12;545:22;;612:1;606:4;602:12;633:18;623:81;;689:4;681:6;677:17;667:27;;623:81;751:2;743:6;740:14;720:18;717:38;714:84;;770:18;;:::i;:::-;714:84;535:269;484:320;;;:::o;810:141::-;859:4;882:3;874:11;;905:3;902:1;895:14;939:4;936:1;926:18;918:26;;810:141;;;:::o;957:93::-;994:6;1041:2;1036;1029:5;1025:14;1021:23;1011:33;;957:93;;;:::o;1056:107::-;1100:8;1150:5;1144:4;1140:16;1119:37;;1056:107;;;;:::o;1169:393::-;1238:6;1288:1;1276:10;1272:18;1311:97;1341:66;1330:9;1311:97;:::i;:::-;1429:39;1459:8;1448:9;1429:39;:::i;:::-;1417:51;;1501:4;1497:9;1490:5;1486:21;1477:30;;1550:4;1540:8;1536:19;1529:5;1526:30;1516:40;;1245:317;;1169:393;;;;;:::o;1568:77::-;1605:7;1634:5;1623:16;;1568:77;;;:::o;1651:60::-;1679:3;1700:5;1693:12;;1651:60;;;:::o;1717:142::-;1767:9;1800:53;1818:34;1827:24;1845:5;1827:24;:::i;:::-;1818:34;:::i;:::-;1800:53;:::i;:::-;1787:66;;1717:142;;;:::o;1865:75::-;1908:3;1929:5;1922:12;;1865:75;;;:::o;1946:269::-;2056:39;2087:7;2056:39;:::i;:::-;2117:91;2166:41;2190:16;2166:41;:::i;:::-;2158:6;2151:4;2145:11;2117:91;:::i;:::-;2111:4;2104:105;2022:193;1946:269;;;:::o;2221:73::-;2266:3;2287:1;2280:8;;2221:73;:::o;2300:189::-;2377:32;;:::i;:::-;2418:65;2476:6;2468;2462:4;2418:65;:::i;:::-;2353:136;2300:189;;:::o;2495:186::-;2555:120;2572:3;2565:5;2562:14;2555:120;;;2626:39;2663:1;2656:5;2626:39;:::i;:::-;2599:1;2592:5;2588:13;2579:22;;2555:120;;;2495:186;;:::o;2687:543::-;2788:2;2783:3;2780:11;2777:446;;;2822:38;2854:5;2822:38;:::i;:::-;2906:29;2924:10;2906:29;:::i;:::-;2896:8;2892:44;3089:2;3077:10;3074:18;3071:49;;;3110:8;3095:23;;3071:49;3133:80;3189:22;3207:3;3189:22;:::i;:::-;3179:8;3175:37;3162:11;3133:80;:::i;:::-;2792:431;;2777:446;2687:543;;;:::o;3236:117::-;3290:8;3340:5;3334:4;3330:16;3309:37;;3236:117;;;;:::o;3359:169::-;3403:6;3436:51;3484:1;3480:6;3472:5;3469:1;3465:13;3436:51;:::i;:::-;3432:56;3517:4;3511;3507:15;3497:25;;3410:118;3359:169;;;;:::o;3533:295::-;3609:4;3755:29;3780:3;3774:4;3755:29;:::i;:::-;3747:37;;3817:3;3814:1;3810:11;3804:4;3801:21;3793:29;;3533:295;;;;:::o;3833:1395::-;3950:37;3983:3;3950:37;:::i;:::-;4052:18;4044:6;4041:30;4038:56;;;4074:18;;:::i;:::-;4038:56;4118:38;4150:4;4144:11;4118:38;:::i;:::-;4203:67;4263:6;4255;4249:4;4203:67;:::i;:::-;4297:1;4321:4;4308:17;;4353:2;4345:6;4342:14;4370:1;4365:618;;;;5027:1;5044:6;5041:77;;;5093:9;5088:3;5084:19;5078:26;5069:35;;5041:77;5144:67;5204:6;5197:5;5144:67;:::i;:::-;5138:4;5131:81;5000:222;4335:887;;4365:618;4417:4;4413:9;4405:6;4401:22;4451:37;4483:4;4451:37;:::i;:::-;4510:1;4524:208;4538:7;4535:1;4532:14;4524:208;;;4617:9;4612:3;4608:19;4602:26;4594:6;4587:42;4668:1;4660:6;4656:14;4646:24;;4715:2;4704:9;4700:18;4687:31;;4561:4;4558:1;4554:12;4549:17;;4524:208;;;4760:6;4751:7;4748:19;4745:179;;;4818:9;4813:3;4809:19;4803:26;4861:48;4903:4;4895:6;4891:17;4880:9;4861:48;:::i;:::-;4853:6;4846:64;4768:156;4745:179;4970:1;4966;4958:6;4954:14;4950:22;4944:4;4937:36;4372:611;;;4335:887;;3925:1303;;;3833:1395;;:::o;5234:77::-;5271:7;5300:5;5289:16;;5234:77;;;:::o;5317:118::-;5404:24;5422:5;5404:24;:::i;:::-;5399:3;5392:37;5317:118;;:::o;5441:::-;5528:24;5546:5;5528:24;:::i;:::-;5523:3;5516:37;5441:118;;:::o;5565:126::-;5602:7;5642:42;5635:5;5631:54;5620:65;;5565:126;;;:::o;5697:96::-;5734:7;5763:24;5781:5;5763:24;:::i;:::-;5752:35;;5697:96;;;:::o;5799:118::-;5886:24;5904:5;5886:24;:::i;:::-;5881:3;5874:37;5799:118;;:::o;5923:664::-;6128:4;6166:3;6155:9;6151:19;6143:27;;6180:71;6248:1;6237:9;6233:17;6224:6;6180:71;:::i;:::-;6261:72;6329:2;6318:9;6314:18;6305:6;6261:72;:::i;:::-;6343;6411:2;6400:9;6396:18;6387:6;6343:72;:::i;:::-;6425;6493:2;6482:9;6478:18;6469:6;6425:72;:::i;:::-;6507:73;6575:3;6564:9;6560:19;6551:6;6507:73;:::i;:::-;5923:664;;;;;;;;:::o;6593:169::-;6677:11;6711:6;6706:3;6699:19;6751:4;6746:3;6742:14;6727:29;;6593:169;;;;:::o;6768:139::-;6857:6;6852:3;6847;6841:23;6898:1;6889:6;6884:3;6880:16;6873:27;6768:139;;;:::o;6913:102::-;6954:6;7005:2;7001:7;6996:2;6989:5;6985:14;6981:28;6971:38;;6913:102;;;:::o;7021:377::-;7109:3;7137:39;7170:5;7137:39;:::i;:::-;7192:71;7256:6;7251:3;7192:71;:::i;:::-;7185:78;;7272:65;7330:6;7325:3;7318:4;7311:5;7307:16;7272:65;:::i;:::-;7362:29;7384:6;7362:29;:::i;:::-;7357:3;7353:39;7346:46;;7113:285;7021:377;;;;:::o;7404:313::-;7517:4;7555:2;7544:9;7540:18;7532:26;;7604:9;7598:4;7594:20;7590:1;7579:9;7575:17;7568:47;7632:78;7705:4;7696:6;7632:78;:::i;:::-;7624:86;;7404:313;;;;:::o;7723:98::-;7774:6;7808:5;7802:12;7792:22;;7723:98;;;:::o;7827:116::-;7878:4;7901:3;7893:11;;7931:4;7926:3;7922:14;7914:22;;7827:116;;;:::o;7949:154::-;7992:11;8028:29;8052:3;8046:10;8028:29;:::i;:::-;8091:5;8067:29;;8004:99;7949:154;;;:::o;8109:594::-;8193:5;8224:38;8256:5;8224:38;:::i;:::-;8287:5;8314:40;8348:5;8314:40;:::i;:::-;8302:52;;8373:35;8399:8;8373:35;:::i;:::-;8364:44;;8432:2;8424:6;8421:14;8418:278;;;8503:169;8588:66;8558:6;8554:2;8550:15;8547:1;8543:23;8503:169;:::i;:::-;8480:5;8459:227;8450:236;;8418:278;8199:504;;8109:594;;;:::o;373:3889:37:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610042575f3560e01c806305b6eb9f1461004d5780633b8218601461007557806384b0196e1461009d578063b70e36f0146100cd57610049565b3661004957005b5f5ffd5b348015610058575f5ffd5b50610073600480360381019061006e9190610e9a565b6100f5565b005b348015610080575f5ffd5b5061009b60048036038101906100969190610f15565b610355565b005b3480156100a8575f5ffd5b506100b1610566565b6040516100c49796959493929190611142565b60405180910390f35b3480156100d8575f5ffd5b506100f360048036038101906100ee91906111ee565b61060b565b005b6101028360400135610685565b5f5f7fa24447fab62723450095d3ad42f06d3f815a023f2e0b97c41a5f768c52177ff490505f855f013590505f8660200160208101906101429190611243565b90505f876040013590505f8860600135905060405185815284602082015283604082015282606082015281608082015260a081209650505f6101838761070c565b90505f6101d3828b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610725565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023a906112b8565b60405180910390fd5b8a6060013542111561028a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028190611320565b60405180910390fd5b5f8b602001602081019061029e9190611243565b73ffffffffffffffffffffffffffffffffffffffff168c5f01356040516102c49061136b565b5f6040518083038185875af1925050503d805f81146102fe576040519150601f19603f3d011682016040523d82523d5f602084013e610303565b606091505b5050905080610347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033e906113c9565b60405180910390fd5b505050505050505050505050565b6103628360600135610685565b5f5f7f935bf9a4261e15f8449634fd7c0e31227afce52a2f0829d3b5a103c6c9ba7c6790505f855f01602081019061039a9190611243565b90505f866020013590505f8760400160208101906103b89190611243565b90505f886060013590505f896080013590506040518681528560208201528460408201528360608201528260808201528160a082015260c081209750505f6103ff8861070c565b90505f61044f828c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610725565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b6906112b8565b60405180910390fd5b8b60800135421115610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fd90611320565b60405180910390fd5b6105588c604001602081019061051c9190611243565b8d602001358e5f0160208101906105339190611243565b73ffffffffffffffffffffffffffffffffffffffff1661074f9092919063ffffffff16565b505050505050505050505050565b5f6060805f5f5f60606105776107a2565b61057f6107dc565b46305f5f1b5f67ffffffffffffffff81111561059e5761059d6113e7565b5b6040519080825280602002602001820160405280156105cc5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610679576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106709061145e565b60405180910390fd5b61068281610685565b50565b5f7f27f372a79847a7b78b0d20e519aa47d449ec715dc685ecfb25a9fe69e28ff9535f1b90505f825f528160205260405f2080549150816106c557600181555b508015610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe906114c6565b60405180910390fd5b505050565b5f61071e610718610817565b836108cd565b9050919050565b5f5f5f5f610733868661090d565b9250925092506107438282610962565b82935050505092915050565b61075c8383836001610ac4565b61079d57826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161079491906114e4565b60405180910390fd5b505050565b60606107d75f7f0000000000000000000000000000000000000000000000000000000000000000610b2690919063ffffffff16565b905090565b606061081260017f0000000000000000000000000000000000000000000000000000000000000000610b2690919063ffffffff16565b905090565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561089257507f000000000000000000000000000000000000000000000000000000000000000046145b156108bf577f000000000000000000000000000000000000000000000000000000000000000090506108ca565b6108c7610bd3565b90505b90565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f5f604184510361094d575f5f5f602087015192506040870151915060608701515f1a905061093f88828585610c68565b95509550955050505061095b565b5f600285515f1b9250925092505b9250925092565b5f6003811115610975576109746114fd565b5b826003811115610988576109876114fd565b5b0315610ac057600160038111156109a2576109a16114fd565b5b8260038111156109b5576109b46114fd565b5b036109ec576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115610a00576109ff6114fd565b5b826003811115610a1357610a126114fd565b5b03610a5757805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401610a4e919061152a565b60405180910390fd5b600380811115610a6a57610a696114fd565b5b826003811115610a7d57610a7c6114fd565b5b03610abf57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401610ab69190611543565b60405180910390fd5b5b5050565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f51148316610b18578383151615610b0c573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b606060ff5f1b8314610b4257610b3b83610d4f565b9050610bcd565b818054610b4e90611589565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7a90611589565b8015610bc55780601f10610b9c57610100808354040283529160200191610bc5565b820191905f5260205f20905b815481529060010190602001808311610ba857829003601f168201915b505050505090505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001610c4d9594939291906115b9565b60405160208183030381529060405280519060200120905090565b5f5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115610ca4575f600385925092509250610d45565b5f6001888888886040515f8152602001604052604051610cc79493929190611625565b6020604051602081039080840390855afa158015610ce7573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d38575f60015f5f1b93509350935050610d45565b805f5f5f1b935093509350505b9450945094915050565b60605f610d5b83610dc1565b90505f602067ffffffffffffffff811115610d7957610d786113e7565b5b6040519080825280601f01601f191660200182016040528015610dab5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f5f60ff835f1c169050601f811115610e06576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f60808284031215610e3057610e2f610e17565b5b81905092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112610e5a57610e59610e39565b5b8235905067ffffffffffffffff811115610e7757610e76610e3d565b5b602083019150836001820283011115610e9357610e92610e41565b5b9250929050565b5f5f5f60a08486031215610eb157610eb0610e0f565b5b5f610ebe86828701610e1b565b935050608084013567ffffffffffffffff811115610edf57610ede610e13565b5b610eeb86828701610e45565b92509250509250925092565b5f60a08284031215610f0c57610f0b610e17565b5b81905092915050565b5f5f5f60c08486031215610f2c57610f2b610e0f565b5b5f610f3986828701610ef7565b93505060a084013567ffffffffffffffff811115610f5a57610f59610e13565b5b610f6686828701610e45565b92509250509250925092565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b610fa681610f72565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610fee82610fac565b610ff88185610fb6565b9350611008818560208601610fc6565b61101181610fd4565b840191505092915050565b5f819050919050565b61102e8161101c565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61105d82611034565b9050919050565b61106d81611053565b82525050565b5f819050919050565b61108581611073565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6110bd8161101c565b82525050565b5f6110ce83836110b4565b60208301905092915050565b5f602082019050919050565b5f6110f08261108b565b6110fa8185611095565b9350611105836110a5565b805f5b8381101561113557815161111c88826110c3565b9750611127836110da565b925050600181019050611108565b5085935050505092915050565b5f60e0820190506111555f83018a610f9d565b81810360208301526111678189610fe4565b9050818103604083015261117b8188610fe4565b905061118a6060830187611025565b6111976080830186611064565b6111a460a083018561107c565b81810360c08301526111b681846110e6565b905098975050505050505050565b6111cd8161101c565b81146111d7575f5ffd5b50565b5f813590506111e8816111c4565b92915050565b5f6020828403121561120357611202610e0f565b5b5f611210848285016111da565b91505092915050565b61122281611053565b811461122c575f5ffd5b50565b5f8135905061123d81611219565b92915050565b5f6020828403121561125857611257610e0f565b5b5f6112658482850161122f565b91505092915050565b7f496e76616c696420496e74656e74205369676e617475726500000000000000005f82015250565b5f6112a2601883610fb6565b91506112ad8261126e565b602082019050919050565b5f6020820190508181035f8301526112cf81611296565b9050919050565b7f45787069726564000000000000000000000000000000000000000000000000005f82015250565b5f61130a600783610fb6565b9150611315826112d6565b602082019050919050565b5f6020820190508181035f830152611337816112fe565b9050919050565b5f81905092915050565b50565b5f6113565f8361133e565b915061136182611348565b5f82019050919050565b5f6113758261134b565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f6113b3601383610fb6565b91506113be8261137f565b602082019050919050565b5f6020820190508181035f8301526113e0816113a7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4f6e6c79206f776e6572000000000000000000000000000000000000000000005f82015250565b5f611448600a83610fb6565b915061145382611414565b602082019050919050565b5f6020820190508181035f8301526114758161143c565b9050919050565b7f4e6f6e636520616c7265616479207573656400000000000000000000000000005f82015250565b5f6114b0601283610fb6565b91506114bb8261147c565b602082019050919050565b5f6020820190508181035f8301526114dd816114a4565b9050919050565b5f6020820190506114f75f830184611064565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208201905061153d5f830184611025565b92915050565b5f6020820190506115565f83018461107c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806115a057607f821691505b6020821081036115b3576115b261155c565b5b50919050565b5f60a0820190506115cc5f83018861107c565b6115d9602083018761107c565b6115e6604083018661107c565b6115f36060830185611025565b6116006080830184611064565b9695505050505050565b5f60ff82169050919050565b61161f8161160a565b82525050565b5f6080820190506116385f83018761107c565b6116456020830186611616565b611652604083018561107c565b61165f606083018461107c565b9594505050505056fea264697066735822122069c63f93f17ba8ddf5850f25622946e2aba6a478174e7e50bfaa0bbf9d28afca64736f6c634300081d0033","sourceMap":"373:3889:37:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:1068;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1524:1089;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5228:557:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;3693:142:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2619:1068;2741:23;2751:6;:12;;;2741:9;:23::i;:::-;2775:18;2803:16;1142:109;2803:39;;2852:14;2869:6;:13;;;2852:30;;2892:10;2905:6;:9;;;;;;;;;;:::i;:::-;2892:22;;2924:13;2940:6;:12;;;2924:28;;2962:16;2981:6;:15;;;2962:34;;3047:4;3041:11;3077:8;3072:3;3065:21;3122:6;3115:4;3110:3;3106:14;3099:30;3165:2;3158:4;3153:3;3149:14;3142:26;3204:5;3197:4;3192:3;3188:14;3181:29;3246:8;3239:4;3234:3;3230:14;3223:32;3297:4;3292:3;3282:20;3268:34;;3016:296;3322:14;3339:28;3356:10;3339:16;:28::i;:::-;3322:45;;3377:14;3394:32;3408:6;3416:9;;3394:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:32::i;:::-;3377:49;;3463:4;3445:23;;:6;:23;;;3437:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3534:6;:15;;;3515;:34;;3507:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;3573:12;3591:6;:9;;;;;;;;;;:::i;:::-;:14;;3613:6;:13;;;3591:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3572:59;;;3649:7;3641:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;2731:956;;;;;;;;;2619:1068;;;:::o;1524:1089::-;1640:23;1650:6;:12;;;1640:9;:23::i;:::-;1674:18;1702:16;871:120;1702:35;;1747:13;1763:6;:12;;;;;;;;;;:::i;:::-;1747:28;;1785:14;1802:6;:13;;;1785:30;;1825:10;1838:6;:9;;;;;;;;;;:::i;:::-;1825:22;;1857:13;1873:6;:12;;;1857:28;;1895:16;1914:6;:15;;;1895:34;;1980:4;1974:11;2010:8;2005:3;1998:21;2055:5;2048:4;2043:3;2039:14;2032:29;2097:6;2090:4;2085:3;2081:14;2074:30;2140:2;2133:4;2128:3;2124:14;2117:26;2179:5;2172:4;2167:3;2163:14;2156:29;2221:8;2214:4;2209:3;2205:14;2198:32;2272:4;2267:3;2257:20;2243:34;;1949:338;2297:14;2314:28;2331:10;2314:16;:28::i;:::-;2297:45;;2352:14;2369:32;2383:6;2391:9;;2369:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:32::i;:::-;2352:49;;2438:4;2420:23;;:6;:23;;;2412:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;2509:6;:15;;;2490;:34;;2482:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2547:59;2581:6;:9;;;;;;;;;;:::i;:::-;2592:6;:13;;;2554:6;:12;;;;;;;;;;:::i;:::-;2547:33;;;;:59;;;;;:::i;:::-;1630:983;;;;;;;;;1524:1089;;;:::o;5228:557:31:-;5326:13;5353:18;5385:21;5420:15;5449:25;5488:12;5514:27;5617:13;:11;:13::i;:::-;5644:16;:14;:16::i;:::-;5674:13;5709:4;5736:1;5728:10;;5766:1;5752:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5566:212;;;;;;;;;;;;;;;;;;;;;5228:557;;;;;;;:::o;3693:142:37:-;3782:4;3760:27;;:10;:27;;;3752:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3812:16;3822:5;3812:9;:16::i;:::-;3693:142;:::o;3841:419::-;3894:12;1368:66;3909:18;;3894:33;;3937:11;3992:5;3989:1;3982:16;4022:4;4018:2;4011:16;4070:2;4067:1;4057:16;4102:9;4096:16;4086:26;;4135:6;4125:70;;4179:1;4168:9;4161:20;4125:70;3968:237;4224:6;4223:7;4215:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3884:376;;3841:419;:::o;5017:176:31:-;5094:7;5120:66;5153:20;:18;:20::i;:::-;5175:10;5120:32;:66::i;:::-;5113:73;;5017:176;;;:::o;5290:255:30:-;5368:7;5388:17;5407:18;5427:16;5447:27;5458:4;5464:9;5447:10;:27::i;:::-;5387:87;;;;;;5484:28;5496:5;5503:8;5484:11;:28::i;:::-;5529:9;5522:16;;;;;5290:255;;;;:::o;1219:204:24:-;1306:37;1320:5;1327:2;1331:5;1338:4;1306:13;:37::i;:::-;1301:116;;1399:5;1366:40;;;;;;;;;;;:::i;:::-;;;;;;;;1301:116;1219:204;;;:::o;6105:126:31:-;6151:13;6183:41;6210:13;6183:5;:26;;:41;;;;:::i;:::-;6176:48;;6105:126;:::o;6557:135::-;6606:13;6638:47;6668:16;6638:8;:29;;:47;;;;:::i;:::-;6631:54;;6557:135;:::o;3945:262::-;3998:7;4038:11;4021:28;;4029:4;4021:28;;;:63;;;;;4070:14;4053:13;:31;4021:63;4017:184;;;4107:22;4100:29;;;;4017:184;4167:23;:21;:23::i;:::-;4160:30;;3945:262;;:::o;3874:374:32:-;3967:14;4049:4;4043:11;4079:10;4074:3;4067:23;4126:15;4119:4;4114:3;4110:14;4103:39;4178:10;4171:4;4166:3;4162:14;4155:34;4227:4;4222:3;4212:20;4202:30;;4018:224;3874:374;;;;:::o;2433:778:30:-;2536:17;2555:16;2573:14;2623:2;2603:9;:16;:22;2599:606;;2641:9;2664;2687:7;2908:4;2897:9;2893:20;2887:27;2882:32;;2957:4;2946:9;2942:20;2936:27;2931:32;;3014:4;3003:9;2999:20;2993:27;2990:1;2985:36;2980:41;;3055:25;3066:4;3072:1;3075;3078;3055:10;:25::i;:::-;3048:32;;;;;;;;;;;2599:606;3127:1;3131:35;3176:9;:16;3168:25;;3111:83;;;;;;2433:778;;;;;;:::o;11630:532::-;11725:20;11716:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;11712:444;11761:7;11712:444;11821:29;11812:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;11808:348;;11873:23;;;;;;;;;;;;;;11808:348;11926:35;11917:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;11913:243;;12020:8;12012:17;;11984:46;;;;;;;;;;;:::i;:::-;;;;;;;;11913:243;12060:30;12051:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;12047:109;;12136:8;12113:32;;;;;;;;;;;:::i;:::-;;;;;;;;12047:109;11630:532;;;:::o;8373:1244:24:-;8467:12;8491:15;8509:24;;;8491:42;;8600:4;8594:11;8631:8;8625:4;8618:22;8686:1;8682:6;8678:2;8674:15;8670:2;8666:24;8660:4;8653:38;8717:5;8711:4;8704:19;8787:4;8781;8775;8769;8766:1;8759:5;8752;8747:45;8736:56;;9004:1;8997:4;8991:11;8988:18;8979:7;8975:32;8965:606;;9136:6;9126:7;9119:15;9115:28;9112:165;;;9192:16;9186:4;9181:3;9166:43;9242:16;9237:3;9230:29;9112:165;9553:1;9545:5;9533:18;9530:25;9511:16;9504:24;9500:56;9491:7;9487:70;9476:81;;8965:606;9597:3;9591:4;9584:17;8569:1042;;8373:1244;;;;;;:::o;3376:267:27:-;3470:13;1390:66;3528:17;;3518:5;3499:46;3495:142;;3568:15;3577:5;3568:8;:15::i;:::-;3561:22;;;;3495:142;3621:5;3614:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3376:267;;;;;:::o;4213:179:31:-;4268:7;2079:95;4326:11;4339:14;4355:13;4378:4;4304:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4294:91;;;;;;4287:98;;4213:179;:::o;7142:1551:30:-;7268:17;7287:16;7305:14;8222:66;8217:1;8209:10;;:79;8205:164;;;8320:1;8324:30;8356:1;8304:54;;;;;;;;8205:164;8463:14;8480:24;8490:4;8496:1;8499;8502;8480:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8463:41;;8536:1;8518:20;;:6;:20;;;8514:113;;8570:1;8574:29;8613:1;8605:10;;8554:62;;;;;;;;;8514:113;8645:6;8653:20;8683:1;8675:10;;8637:49;;;;;;;7142:1551;;;;;;;;;:::o;2080:380:27:-;2139:13;2164:11;2178:16;2189:4;2178:10;:16::i;:::-;2164:30;;2282:17;2313:4;2302:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2282:36;;2379:3;2374;2367:16;2419:4;2412;2407:3;2403:14;2396:28;2450:3;2443:10;;;;2080:380;;;:::o;2532:247::-;2593:7;2612:14;2665:4;2656;2629:33;;:40;2612:57;;2692:4;2683:6;:13;2679:71;;;2719:20;;;;;;;;;;;;;;2679:71;2766:6;2759:13;;;2532:247;;;:::o;88:117:39:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;497:242;580:5;621:3;612:6;607:3;603:16;599:26;596:113;;;628:79;;:::i;:::-;596:113;727:6;718:15;;497:242;;;;:::o;745:117::-;854:1;851;844:12;868:117;977:1;974;967:12;991:117;1100:1;1097;1090:12;1127:552;1184:8;1194:6;1244:3;1237:4;1229:6;1225:17;1221:27;1211:122;;1252:79;;:::i;:::-;1211:122;1365:6;1352:20;1342:30;;1395:18;1387:6;1384:30;1381:117;;;1417:79;;:::i;:::-;1381:117;1531:4;1523:6;1519:17;1507:29;;1585:3;1577:4;1569:6;1565:17;1555:8;1551:32;1548:41;1545:128;;;1592:79;;:::i;:::-;1545:128;1127:552;;;;;:::o;1685:748::-;1801:6;1809;1817;1866:3;1854:9;1845:7;1841:23;1837:33;1834:120;;;1873:79;;:::i;:::-;1834:120;1993:1;2018:90;2100:7;2091:6;2080:9;2076:22;2018:90;:::i;:::-;2008:100;;1964:154;2185:3;2174:9;2170:19;2157:33;2217:18;2209:6;2206:30;2203:117;;;2239:79;;:::i;:::-;2203:117;2352:64;2408:7;2399:6;2388:9;2384:22;2352:64;:::i;:::-;2334:82;;;;2128:298;1685:748;;;;;:::o;2476:239::-;2556:5;2597:3;2588:6;2583:3;2579:16;2575:26;2572:113;;;2604:79;;:::i;:::-;2572:113;2703:6;2694:15;;2476:239;;;;:::o;2721:742::-;2834:6;2842;2850;2899:3;2887:9;2878:7;2874:23;2870:33;2867:120;;;2906:79;;:::i;:::-;2867:120;3026:1;3051:87;3130:7;3121:6;3110:9;3106:22;3051:87;:::i;:::-;3041:97;;2997:151;3215:3;3204:9;3200:19;3187:33;3247:18;3239:6;3236:30;3233:117;;;3269:79;;:::i;:::-;3233:117;3382:64;3438:7;3429:6;3418:9;3414:22;3382:64;:::i;:::-;3364:82;;;;3158:298;2721:742;;;;;:::o;3469:149::-;3505:7;3545:66;3538:5;3534:78;3523:89;;3469:149;;;:::o;3624:115::-;3709:23;3726:5;3709:23;:::i;:::-;3704:3;3697:36;3624:115;;:::o;3745:99::-;3797:6;3831:5;3825:12;3815:22;;3745:99;;;:::o;3850:169::-;3934:11;3968:6;3963:3;3956:19;4008:4;4003:3;3999:14;3984:29;;3850:169;;;;:::o;4025:139::-;4114:6;4109:3;4104;4098:23;4155:1;4146:6;4141:3;4137:16;4130:27;4025:139;;;:::o;4170:102::-;4211:6;4262:2;4258:7;4253:2;4246:5;4242:14;4238:28;4228:38;;4170:102;;;:::o;4278:377::-;4366:3;4394:39;4427:5;4394:39;:::i;:::-;4449:71;4513:6;4508:3;4449:71;:::i;:::-;4442:78;;4529:65;4587:6;4582:3;4575:4;4568:5;4564:16;4529:65;:::i;:::-;4619:29;4641:6;4619:29;:::i;:::-;4614:3;4610:39;4603:46;;4370:285;4278:377;;;;:::o;4661:77::-;4698:7;4727:5;4716:16;;4661:77;;;:::o;4744:118::-;4831:24;4849:5;4831:24;:::i;:::-;4826:3;4819:37;4744:118;;:::o;4868:126::-;4905:7;4945:42;4938:5;4934:54;4923:65;;4868:126;;;:::o;5000:96::-;5037:7;5066:24;5084:5;5066:24;:::i;:::-;5055:35;;5000:96;;;:::o;5102:118::-;5189:24;5207:5;5189:24;:::i;:::-;5184:3;5177:37;5102:118;;:::o;5226:77::-;5263:7;5292:5;5281:16;;5226:77;;;:::o;5309:118::-;5396:24;5414:5;5396:24;:::i;:::-;5391:3;5384:37;5309:118;;:::o;5433:114::-;5500:6;5534:5;5528:12;5518:22;;5433:114;;;:::o;5553:184::-;5652:11;5686:6;5681:3;5674:19;5726:4;5721:3;5717:14;5702:29;;5553:184;;;;:::o;5743:132::-;5810:4;5833:3;5825:11;;5863:4;5858:3;5854:14;5846:22;;5743:132;;;:::o;5881:108::-;5958:24;5976:5;5958:24;:::i;:::-;5953:3;5946:37;5881:108;;:::o;5995:179::-;6064:10;6085:46;6127:3;6119:6;6085:46;:::i;:::-;6163:4;6158:3;6154:14;6140:28;;5995:179;;;;:::o;6180:113::-;6250:4;6282;6277:3;6273:14;6265:22;;6180:113;;;:::o;6329:732::-;6448:3;6477:54;6525:5;6477:54;:::i;:::-;6547:86;6626:6;6621:3;6547:86;:::i;:::-;6540:93;;6657:56;6707:5;6657:56;:::i;:::-;6736:7;6767:1;6752:284;6777:6;6774:1;6771:13;6752:284;;;6853:6;6847:13;6880:63;6939:3;6924:13;6880:63;:::i;:::-;6873:70;;6966:60;7019:6;6966:60;:::i;:::-;6956:70;;6812:224;6799:1;6796;6792:9;6787:14;;6752:284;;;6756:14;7052:3;7045:10;;6453:608;;;6329:732;;;;:::o;7067:1215::-;7416:4;7454:3;7443:9;7439:19;7431:27;;7468:69;7534:1;7523:9;7519:17;7510:6;7468:69;:::i;:::-;7584:9;7578:4;7574:20;7569:2;7558:9;7554:18;7547:48;7612:78;7685:4;7676:6;7612:78;:::i;:::-;7604:86;;7737:9;7731:4;7727:20;7722:2;7711:9;7707:18;7700:48;7765:78;7838:4;7829:6;7765:78;:::i;:::-;7757:86;;7853:72;7921:2;7910:9;7906:18;7897:6;7853:72;:::i;:::-;7935:73;8003:3;7992:9;7988:19;7979:6;7935:73;:::i;:::-;8018;8086:3;8075:9;8071:19;8062:6;8018:73;:::i;:::-;8139:9;8133:4;8129:20;8123:3;8112:9;8108:19;8101:49;8167:108;8270:4;8261:6;8167:108;:::i;:::-;8159:116;;7067:1215;;;;;;;;;;:::o;8288:122::-;8361:24;8379:5;8361:24;:::i;:::-;8354:5;8351:35;8341:63;;8400:1;8397;8390:12;8341:63;8288:122;:::o;8416:139::-;8462:5;8500:6;8487:20;8478:29;;8516:33;8543:5;8516:33;:::i;:::-;8416:139;;;;:::o;8561:329::-;8620:6;8669:2;8657:9;8648:7;8644:23;8640:32;8637:119;;;8675:79;;:::i;:::-;8637:119;8795:1;8820:53;8865:7;8856:6;8845:9;8841:22;8820:53;:::i;:::-;8810:63;;8766:117;8561:329;;;;:::o;8896:122::-;8969:24;8987:5;8969:24;:::i;:::-;8962:5;8959:35;8949:63;;9008:1;9005;8998:12;8949:63;8896:122;:::o;9024:139::-;9070:5;9108:6;9095:20;9086:29;;9124:33;9151:5;9124:33;:::i;:::-;9024:139;;;;:::o;9169:329::-;9228:6;9277:2;9265:9;9256:7;9252:23;9248:32;9245:119;;;9283:79;;:::i;:::-;9245:119;9403:1;9428:53;9473:7;9464:6;9453:9;9449:22;9428:53;:::i;:::-;9418:63;;9374:117;9169:329;;;;:::o;9504:174::-;9644:26;9640:1;9632:6;9628:14;9621:50;9504:174;:::o;9684:366::-;9826:3;9847:67;9911:2;9906:3;9847:67;:::i;:::-;9840:74;;9923:93;10012:3;9923:93;:::i;:::-;10041:2;10036:3;10032:12;10025:19;;9684:366;;;:::o;10056:419::-;10222:4;10260:2;10249:9;10245:18;10237:26;;10309:9;10303:4;10299:20;10295:1;10284:9;10280:17;10273:47;10337:131;10463:4;10337:131;:::i;:::-;10329:139;;10056:419;;;:::o;10481:157::-;10621:9;10617:1;10609:6;10605:14;10598:33;10481:157;:::o;10644:365::-;10786:3;10807:66;10871:1;10866:3;10807:66;:::i;:::-;10800:73;;10882:93;10971:3;10882:93;:::i;:::-;11000:2;10995:3;10991:12;10984:19;;10644:365;;;:::o;11015:419::-;11181:4;11219:2;11208:9;11204:18;11196:26;;11268:9;11262:4;11258:20;11254:1;11243:9;11239:17;11232:47;11296:131;11422:4;11296:131;:::i;:::-;11288:139;;11015:419;;;:::o;11440:147::-;11541:11;11578:3;11563:18;;11440:147;;;;:::o;11593:114::-;;:::o;11713:398::-;11872:3;11893:83;11974:1;11969:3;11893:83;:::i;:::-;11886:90;;11985:93;12074:3;11985:93;:::i;:::-;12103:1;12098:3;12094:11;12087:18;;11713:398;;;:::o;12117:379::-;12301:3;12323:147;12466:3;12323:147;:::i;:::-;12316:154;;12487:3;12480:10;;12117:379;;;:::o;12502:169::-;12642:21;12638:1;12630:6;12626:14;12619:45;12502:169;:::o;12677:366::-;12819:3;12840:67;12904:2;12899:3;12840:67;:::i;:::-;12833:74;;12916:93;13005:3;12916:93;:::i;:::-;13034:2;13029:3;13025:12;13018:19;;12677:366;;;:::o;13049:419::-;13215:4;13253:2;13242:9;13238:18;13230:26;;13302:9;13296:4;13292:20;13288:1;13277:9;13273:17;13266:47;13330:131;13456:4;13330:131;:::i;:::-;13322:139;;13049:419;;;:::o;13474:180::-;13522:77;13519:1;13512:88;13619:4;13616:1;13609:15;13643:4;13640:1;13633:15;13660:160;13800:12;13796:1;13788:6;13784:14;13777:36;13660:160;:::o;13826:366::-;13968:3;13989:67;14053:2;14048:3;13989:67;:::i;:::-;13982:74;;14065:93;14154:3;14065:93;:::i;:::-;14183:2;14178:3;14174:12;14167:19;;13826:366;;;:::o;14198:419::-;14364:4;14402:2;14391:9;14387:18;14379:26;;14451:9;14445:4;14441:20;14437:1;14426:9;14422:17;14415:47;14479:131;14605:4;14479:131;:::i;:::-;14471:139;;14198:419;;;:::o;14623:168::-;14763:20;14759:1;14751:6;14747:14;14740:44;14623:168;:::o;14797:366::-;14939:3;14960:67;15024:2;15019:3;14960:67;:::i;:::-;14953:74;;15036:93;15125:3;15036:93;:::i;:::-;15154:2;15149:3;15145:12;15138:19;;14797:366;;;:::o;15169:419::-;15335:4;15373:2;15362:9;15358:18;15350:26;;15422:9;15416:4;15412:20;15408:1;15397:9;15393:17;15386:47;15450:131;15576:4;15450:131;:::i;:::-;15442:139;;15169:419;;;:::o;15594:222::-;15687:4;15725:2;15714:9;15710:18;15702:26;;15738:71;15806:1;15795:9;15791:17;15782:6;15738:71;:::i;:::-;15594:222;;;;:::o;15822:180::-;15870:77;15867:1;15860:88;15967:4;15964:1;15957:15;15991:4;15988:1;15981:15;16008:222;16101:4;16139:2;16128:9;16124:18;16116:26;;16152:71;16220:1;16209:9;16205:17;16196:6;16152:71;:::i;:::-;16008:222;;;;:::o;16236:::-;16329:4;16367:2;16356:9;16352:18;16344:26;;16380:71;16448:1;16437:9;16433:17;16424:6;16380:71;:::i;:::-;16236:222;;;;:::o;16464:180::-;16512:77;16509:1;16502:88;16609:4;16606:1;16599:15;16633:4;16630:1;16623:15;16650:320;16694:6;16731:1;16725:4;16721:12;16711:22;;16778:1;16772:4;16768:12;16799:18;16789:81;;16855:4;16847:6;16843:17;16833:27;;16789:81;16917:2;16909:6;16906:14;16886:18;16883:38;16880:84;;16936:18;;:::i;:::-;16880:84;16701:269;16650:320;;;:::o;16976:664::-;17181:4;17219:3;17208:9;17204:19;17196:27;;17233:71;17301:1;17290:9;17286:17;17277:6;17233:71;:::i;:::-;17314:72;17382:2;17371:9;17367:18;17358:6;17314:72;:::i;:::-;17396;17464:2;17453:9;17449:18;17440:6;17396:72;:::i;:::-;17478;17546:2;17535:9;17531:18;17522:6;17478:72;:::i;:::-;17560:73;17628:3;17617:9;17613:19;17604:6;17560:73;:::i;:::-;16976:664;;;;;;;;:::o;17646:86::-;17681:7;17721:4;17714:5;17710:16;17699:27;;17646:86;;;:::o;17738:112::-;17821:22;17837:5;17821:22;:::i;:::-;17816:3;17809:35;17738:112;;:::o;17856:545::-;18029:4;18067:3;18056:9;18052:19;18044:27;;18081:71;18149:1;18138:9;18134:17;18125:6;18081:71;:::i;:::-;18162:68;18226:2;18215:9;18211:18;18202:6;18162:68;:::i;:::-;18240:72;18308:2;18297:9;18293:18;18284:6;18240:72;:::i;:::-;18322;18390:2;18379:9;18375:18;18366:6;18322:72;:::i;:::-;17856:545;;;;;;;:::o","linkReferences":{},"immutableReferences":{"43526":[{"start":2201,"length":32}],"43528":[{"start":2160,"length":32}],"43530":[{"start":2074,"length":32}],"43532":[{"start":3063,"length":32}],"43534":[{"start":3096,"length":32}],"43537":[{"start":1962,"length":32}],"43540":[{"start":2021,"length":32}]}},"methodIdentifiers":{"eip712Domain()":"84b0196e","invalidateNonce(uint256)":"b70e36f0","transfer((address,uint256,address,uint256,uint256),bytes)":"3b821860","transferEth((uint256,address,uint256,uint256),bytes)":"05b6eb9f"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.29+commit.ab55807c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidShortString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"StringTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"invalidateNonce\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct Delegate.PaymentIntent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct Delegate.EthPaymentIntent\",\"name\":\"intent\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"transferEth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"}},\"kind\":\"dev\",\"methods\":{\"eip712Domain()\":{\"details\":\"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Delegate.sol\":\"Delegate\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xfb223a85dd0b2175cfbbaa325a744e2cd74ecd17c3df2b77b0722f991d2725ee\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84bf1dea0589ec49c8d15d559cc6d86ee493048a89b2d4adb60fbe705a3d89ae\",\"dweb:/ipfs/Qmd56n556d529wk2pRMhYhm5nhMDhviwereodDikjs68w1\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0\",\"dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j\"]},\"lib/openzeppelin-contracts/contracts/utils/Bytes.sol\":{\"keccak256\":\"0x8140d608316521b1fd71167c3b708ebb8659da070723fc8807609553b296ee33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a7bf7db66869ba1e945a0390b85da2f6afc7e42a4735ca918d0d56ac90c50147\",\"dweb:/ipfs/QmRmNyhpBpgzSdQqLtrQCYE7H7eLnVVxh2Yy4YMrySR8AR\"]},\"lib/openzeppelin-contracts/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0x0768b3bdb701fe4994b3be932ca8635551dfebe04c645f77500322741bebf57c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2059f9ca8d3c11c49ca49fc9c5fb070f18cc85d12a7688e45322ed0e2a1cb99\",\"dweb:/ipfs/QmS2gwX51RAvSw4tYbjHccY2CKbh2uvDzqHLAFXdsddgia\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0x36d1750bf1aa5fee9c52adb2f7857ab652daca722fc05dff533b364f67a1139a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e5e7052539b7849d02f3ce25acc1dce29373c11cfae9f0bc918c54b780c549a\",\"dweb:/ipfs/QmRGE32xNkMTo6i4pHHMxjpiu77yPwnTA25SFngw2NXJys\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x360cf86214a764694dae1522a38200b1737fe90e46dcf56a0f89de143071cc20\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e393290a46ca6d1fa1addb40709d26e1d250638ab6acdd103b5af21768ebc7b\",\"dweb:/ipfs/QmPwT3tXwQ9NbGtZ99XRq7sr8LCQP8XaCrzw49JdXGn7us\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8440117ea216b97a7bad690a67449fd372c840d073c8375822667e14702782b4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb6645995b8290d0b9121825e2533e4e28977b2c6befee76e15e58f0feb61d4\",\"dweb:/ipfs/QmVR72j6kL5R2txuihieDev1FeTi4KWJS1Z6ABbwL3Qtph\"]},\"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol\":{\"keccak256\":\"0x6abeed5940e1da7bb329e458db9a1c5c4ea6f86d651b952af99c6bddcd6bbb94\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5fe75e9a6b759c5d7fd82fb59bd4f58c672b36f0a69b84f4789b7c7895d3e61c\",\"dweb:/ipfs/QmX28wsir8w5sS3acfJMNHcBwoPsDpqCu7WDkPnUWLMNiZ\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x09e3f1c72d4c5cbe8e2644ab7313f8f7177533ae2f4c24cdcbbeaf520a73734c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://93208401215d539fa2d81626b207c1f611def7883d0e447b3b5969ebaa7b3c2c\",\"dweb:/ipfs/QmXPxDnQPx8LAweX5ZJqEcwkvs59kP4c64VVDG1Jjq1mef\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"src/Delegate.sol\":{\"keccak256\":\"0x19b08ea0a22487fabef62e2dfc8db4ef7093ab6c0fb19106c93bed705ca8359f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f87689b1f95e940dcc58a60b3af5b8f7f2f0704a230152f0cd619fdfaf7843b6\",\"dweb:/ipfs/QmNdKbXPRG1toBFsUHi9cTyDRqcJFSzv42sButpSRSN9ns\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.29+commit.ab55807c"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"InvalidShortString"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"type":"error","name":"SafeERC20FailedOperation"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"type":"error","name":"StringTooLong"},{"inputs":[],"type":"event","name":"EIP712DomainChanged","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"invalidateNonce"},{"inputs":[{"internalType":"struct Delegate.PaymentIntent","name":"intent","type":"tuple","components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}]},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"transfer"},{"inputs":[{"internalType":"struct Delegate.EthPaymentIntent","name":"intent","type":"tuple","components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}]},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"transferEth"},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"eip712Domain()":{"details":"returns the fields and values that describe the domain separator used by this contract for EIP-712 signature."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/openzeppelin-contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/Delegate.sol":"Delegate"},"evmVersion":"prague","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"keccak256":"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d","urls":["bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100","dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc","urls":["bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037","dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"keccak256":"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44","urls":["bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d","dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol":{"keccak256":"0xfb223a85dd0b2175cfbbaa325a744e2cd74ecd17c3df2b77b0722f991d2725ee","urls":["bzz-raw://84bf1dea0589ec49c8d15d559cc6d86ee493048a89b2d4adb60fbe705a3d89ae","dweb:/ipfs/Qmd56n556d529wk2pRMhYhm5nhMDhviwereodDikjs68w1"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x304d732678032a9781ae85c8f204c8fba3d3a5e31c02616964e75cfdc5049098","urls":["bzz-raw://299ced486011781dc98f638059678323c03079fefae1482abaa2135b22fa92d0","dweb:/ipfs/QmbZNbcPTBxNvwChavN2kkZZs7xHhYL7mv51KrxMhsMs3j"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Bytes.sol":{"keccak256":"0x8140d608316521b1fd71167c3b708ebb8659da070723fc8807609553b296ee33","urls":["bzz-raw://a7bf7db66869ba1e945a0390b85da2f6afc7e42a4735ca918d0d56ac90c50147","dweb:/ipfs/QmRmNyhpBpgzSdQqLtrQCYE7H7eLnVVxh2Yy4YMrySR8AR"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol":{"keccak256":"0x0768b3bdb701fe4994b3be932ca8635551dfebe04c645f77500322741bebf57c","urls":["bzz-raw://a2059f9ca8d3c11c49ca49fc9c5fb070f18cc85d12a7688e45322ed0e2a1cb99","dweb:/ipfs/QmS2gwX51RAvSw4tYbjHccY2CKbh2uvDzqHLAFXdsddgia"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0x36d1750bf1aa5fee9c52adb2f7857ab652daca722fc05dff533b364f67a1139a","urls":["bzz-raw://2e5e7052539b7849d02f3ce25acc1dce29373c11cfae9f0bc918c54b780c549a","dweb:/ipfs/QmRGE32xNkMTo6i4pHHMxjpiu77yPwnTA25SFngw2NXJys"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x360cf86214a764694dae1522a38200b1737fe90e46dcf56a0f89de143071cc20","urls":["bzz-raw://2e393290a46ca6d1fa1addb40709d26e1d250638ab6acdd103b5af21768ebc7b","dweb:/ipfs/QmPwT3tXwQ9NbGtZ99XRq7sr8LCQP8XaCrzw49JdXGn7us"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol":{"keccak256":"0x8440117ea216b97a7bad690a67449fd372c840d073c8375822667e14702782b4","urls":["bzz-raw://ebb6645995b8290d0b9121825e2533e4e28977b2c6befee76e15e58f0feb61d4","dweb:/ipfs/QmVR72j6kL5R2txuihieDev1FeTi4KWJS1Z6ABbwL3Qtph"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol":{"keccak256":"0x6abeed5940e1da7bb329e458db9a1c5c4ea6f86d651b952af99c6bddcd6bbb94","urls":["bzz-raw://5fe75e9a6b759c5d7fd82fb59bd4f58c672b36f0a69b84f4789b7c7895d3e61c","dweb:/ipfs/QmX28wsir8w5sS3acfJMNHcBwoPsDpqCu7WDkPnUWLMNiZ"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0x09e3f1c72d4c5cbe8e2644ab7313f8f7177533ae2f4c24cdcbbeaf520a73734c","urls":["bzz-raw://93208401215d539fa2d81626b207c1f611def7883d0e447b3b5969ebaa7b3c2c","dweb:/ipfs/QmXPxDnQPx8LAweX5ZJqEcwkvs59kP4c64VVDG1Jjq1mef"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"},"src/Delegate.sol":{"keccak256":"0x19b08ea0a22487fabef62e2dfc8db4ef7093ab6c0fb19106c93bed705ca8359f","urls":["bzz-raw://f87689b1f95e940dcc58a60b3af5b8f7f2f0704a230152f0cd619fdfaf7843b6","dweb:/ipfs/QmNdKbXPRG1toBFsUHi9cTyDRqcJFSzv42sButpSRSN9ns"],"license":"MIT"}},"version":1},"id":37}
@@ -1 +0,0 @@
1
- {"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"allowance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"name":"spender","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b506040518060400160405280600981526020017f4d6f636b205553444300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f6d55534443000000000000000000000000000000000000000000000000000000815250816003908161008b91906102e0565b50806004908161009b91906102e0565b5050506103af565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061011e57607f821691505b602082108103610131576101306100da565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610158565b61019d8683610158565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101e16101dc6101d7846101b5565b6101be565b6101b5565b9050919050565b5f819050919050565b6101fa836101c7565b61020e610206826101e8565b848454610164565b825550505050565b5f5f905090565b610225610216565b6102308184846101f1565b505050565b5b81811015610253576102485f8261021d565b600181019050610236565b5050565b601f8211156102985761026981610137565b61027284610149565b81016020851015610281578190505b61029561028d85610149565b830182610235565b50505b505050565b5f82821c905092915050565b5f6102b85f198460080261029d565b1980831691505092915050565b5f6102d083836102a9565b9150826002028217905092915050565b6102e9826100a3565b67ffffffffffffffff811115610302576103016100ad565b5b61030c8254610107565b610317828285610257565b5f60209050601f831160018114610348575f8415610336578287015190505b61034085826102c5565b8655506103a7565b601f19841661035686610137565b5f5b8281101561037d57848901518255600182019150602085019450602081019050610358565b8683101561039a5784890151610396601f8916826102a9565b8355505b6001600288020188555050505b505050505050565b610e96806103bc5f395ff3fe608060405234801561000f575f5ffd5b506004361061009c575f3560e01c806340c10f191161006457806340c10f191461015a57806370a082311461017657806395d89b41146101a6578063a9059cbb146101c4578063dd62ed3e146101f45761009c565b806306fdde03146100a0578063095ea7b3146100be57806318160ddd146100ee57806323b872dd1461010c578063313ce5671461013c575b5f5ffd5b6100a8610224565b6040516100b59190610b0f565b60405180910390f35b6100d860048036038101906100d39190610bc0565b6102b4565b6040516100e59190610c18565b60405180910390f35b6100f66102d6565b6040516101039190610c40565b60405180910390f35b61012660048036038101906101219190610c59565b6102df565b6040516101339190610c18565b60405180910390f35b61014461030d565b6040516101519190610cc4565b60405180910390f35b610174600480360381019061016f9190610bc0565b610315565b005b610190600480360381019061018b9190610cdd565b610323565b60405161019d9190610c40565b60405180910390f35b6101ae610368565b6040516101bb9190610b0f565b60405180910390f35b6101de60048036038101906101d99190610bc0565b6103f8565b6040516101eb9190610c18565b60405180910390f35b61020e60048036038101906102099190610d08565b61041a565b60405161021b9190610c40565b60405180910390f35b60606003805461023390610d73565b80601f016020809104026020016040519081016040528092919081815260200182805461025f90610d73565b80156102aa5780601f10610281576101008083540402835291602001916102aa565b820191905f5260205f20905b81548152906001019060200180831161028d57829003601f168201915b5050505050905090565b5f5f6102be61049c565b90506102cb8185856104a3565b600191505092915050565b5f600254905090565b5f5f6102e961049c565b90506102f68582856104b5565b610301858585610548565b60019150509392505050565b5f6012905090565b61031f8282610638565b5050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606004805461037790610d73565b80601f01602080910402602001604051908101604052809291908181526020018280546103a390610d73565b80156103ee5780601f106103c5576101008083540402835291602001916103ee565b820191905f5260205f20905b8154815290600101906020018083116103d157829003601f168201915b5050505050905090565b5f5f61040261049c565b905061040f818585610548565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b6104b083838360016106b7565b505050565b5f6104c0848461041a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105425781811015610533578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161052a93929190610db2565b60405180910390fd5b61054184848484035f6106b7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105b8575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016105af9190610de7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610628575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161061f9190610de7565b60405180910390fd5b610633838383610886565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106a8575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161069f9190610de7565b60405180910390fd5b6106b35f8383610886565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610727575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161071e9190610de7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610797575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161078e9190610de7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610880578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108779190610c40565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108d6578060025f8282546108ca9190610e2d565b925050819055506109a4565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561095f578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161095693929190610db2565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109eb578060025f8282540392505081905550610a35565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a929190610c40565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610ae182610a9f565b610aeb8185610aa9565b9350610afb818560208601610ab9565b610b0481610ac7565b840191505092915050565b5f6020820190508181035f830152610b278184610ad7565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610b5c82610b33565b9050919050565b610b6c81610b52565b8114610b76575f5ffd5b50565b5f81359050610b8781610b63565b92915050565b5f819050919050565b610b9f81610b8d565b8114610ba9575f5ffd5b50565b5f81359050610bba81610b96565b92915050565b5f5f60408385031215610bd657610bd5610b2f565b5b5f610be385828601610b79565b9250506020610bf485828601610bac565b9150509250929050565b5f8115159050919050565b610c1281610bfe565b82525050565b5f602082019050610c2b5f830184610c09565b92915050565b610c3a81610b8d565b82525050565b5f602082019050610c535f830184610c31565b92915050565b5f5f5f60608486031215610c7057610c6f610b2f565b5b5f610c7d86828701610b79565b9350506020610c8e86828701610b79565b9250506040610c9f86828701610bac565b9150509250925092565b5f60ff82169050919050565b610cbe81610ca9565b82525050565b5f602082019050610cd75f830184610cb5565b92915050565b5f60208284031215610cf257610cf1610b2f565b5b5f610cff84828501610b79565b91505092915050565b5f5f60408385031215610d1e57610d1d610b2f565b5b5f610d2b85828601610b79565b9250506020610d3c85828601610b79565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610d8a57607f821691505b602082108103610d9d57610d9c610d46565b5b50919050565b610dac81610b52565b82525050565b5f606082019050610dc55f830186610da3565b610dd26020830185610c31565b610ddf6040830184610c31565b949350505050565b5f602082019050610dfa5f830184610da3565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e3782610b8d565b9150610e4283610b8d565b9250828201905080821115610e5a57610e59610e00565b5b9291505056fea26469706673582212203070f31498b948b4ae5cdf7908ee2a7c279cdb83d0df4fe322edfdf0ca38c25b64736f6c634300081d0033","sourceMap":"128:171:5:-:0;;;162:44;;;;;;;;;;1582:113:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1656:5;1648;:13;;;;;;:::i;:::-;;1681:7;1671;:17;;;;;;:::i;:::-;;1582:113;;128:171:5;;7:99:6;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:180::-;160:77;157:1;150:88;257:4;254:1;247:15;281:4;278:1;271:15;298:180;346:77;343:1;336:88;443:4;440:1;433:15;467:4;464:1;457:15;484:320;528:6;565:1;559:4;555:12;545:22;;612:1;606:4;602:12;633:18;623:81;;689:4;681:6;677:17;667:27;;623:81;751:2;743:6;740:14;720:18;717:38;714:84;;770:18;;:::i;:::-;714:84;535:269;484:320;;;:::o;810:141::-;859:4;882:3;874:11;;905:3;902:1;895:14;939:4;936:1;926:18;918:26;;810:141;;;:::o;957:93::-;994:6;1041:2;1036;1029:5;1025:14;1021:23;1011:33;;957:93;;;:::o;1056:107::-;1100:8;1150:5;1144:4;1140:16;1119:37;;1056:107;;;;:::o;1169:393::-;1238:6;1288:1;1276:10;1272:18;1311:97;1341:66;1330:9;1311:97;:::i;:::-;1429:39;1459:8;1448:9;1429:39;:::i;:::-;1417:51;;1501:4;1497:9;1490:5;1486:21;1477:30;;1550:4;1540:8;1536:19;1529:5;1526:30;1516:40;;1245:317;;1169:393;;;;;:::o;1568:77::-;1605:7;1634:5;1623:16;;1568:77;;;:::o;1651:60::-;1679:3;1700:5;1693:12;;1651:60;;;:::o;1717:142::-;1767:9;1800:53;1818:34;1827:24;1845:5;1827:24;:::i;:::-;1818:34;:::i;:::-;1800:53;:::i;:::-;1787:66;;1717:142;;;:::o;1865:75::-;1908:3;1929:5;1922:12;;1865:75;;;:::o;1946:269::-;2056:39;2087:7;2056:39;:::i;:::-;2117:91;2166:41;2190:16;2166:41;:::i;:::-;2158:6;2151:4;2145:11;2117:91;:::i;:::-;2111:4;2104:105;2022:193;1946:269;;;:::o;2221:73::-;2266:3;2287:1;2280:8;;2221:73;:::o;2300:189::-;2377:32;;:::i;:::-;2418:65;2476:6;2468;2462:4;2418:65;:::i;:::-;2353:136;2300:189;;:::o;2495:186::-;2555:120;2572:3;2565:5;2562:14;2555:120;;;2626:39;2663:1;2656:5;2626:39;:::i;:::-;2599:1;2592:5;2588:13;2579:22;;2555:120;;;2495:186;;:::o;2687:543::-;2788:2;2783:3;2780:11;2777:446;;;2822:38;2854:5;2822:38;:::i;:::-;2906:29;2924:10;2906:29;:::i;:::-;2896:8;2892:44;3089:2;3077:10;3074:18;3071:49;;;3110:8;3095:23;;3071:49;3133:80;3189:22;3207:3;3189:22;:::i;:::-;3179:8;3175:37;3162:11;3133:80;:::i;:::-;2792:431;;2777:446;2687:543;;;:::o;3236:117::-;3290:8;3340:5;3334:4;3330:16;3309:37;;3236:117;;;;:::o;3359:169::-;3403:6;3436:51;3484:1;3480:6;3472:5;3469:1;3465:13;3436:51;:::i;:::-;3432:56;3517:4;3511;3507:15;3497:25;;3410:118;3359:169;;;;:::o;3533:295::-;3609:4;3755:29;3780:3;3774:4;3755:29;:::i;:::-;3747:37;;3817:3;3814:1;3810:11;3804:4;3801:21;3793:29;;3533:295;;;;:::o;3833:1395::-;3950:37;3983:3;3950:37;:::i;:::-;4052:18;4044:6;4041:30;4038:56;;;4074:18;;:::i;:::-;4038:56;4118:38;4150:4;4144:11;4118:38;:::i;:::-;4203:67;4263:6;4255;4249:4;4203:67;:::i;:::-;4297:1;4321:4;4308:17;;4353:2;4345:6;4342:14;4370:1;4365:618;;;;5027:1;5044:6;5041:77;;;5093:9;5088:3;5084:19;5078:26;5069:35;;5041:77;5144:67;5204:6;5197:5;5144:67;:::i;:::-;5138:4;5131:81;5000:222;4335:887;;4365:618;4417:4;4413:9;4405:6;4401:22;4451:37;4483:4;4451:37;:::i;:::-;4510:1;4524:208;4538:7;4535:1;4532:14;4524:208;;;4617:9;4612:3;4608:19;4602:26;4594:6;4587:42;4668:1;4660:6;4656:14;4646:24;;4715:2;4704:9;4700:18;4687:31;;4561:4;4558:1;4554:12;4549:17;;4524:208;;;4760:6;4751:7;4748:19;4745:179;;;4818:9;4813:3;4809:19;4803:26;4861:48;4903:4;4895:6;4891:17;4880:9;4861:48;:::i;:::-;4853:6;4846:64;4768:156;4745:179;4970:1;4966;4958:6;4954:14;4950:22;4944:4;4937:36;4372:611;;;4335:887;;3925:1303;;;3833:1395;;:::o;128:171:5:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b506004361061009c575f3560e01c806340c10f191161006457806340c10f191461015a57806370a082311461017657806395d89b41146101a6578063a9059cbb146101c4578063dd62ed3e146101f45761009c565b806306fdde03146100a0578063095ea7b3146100be57806318160ddd146100ee57806323b872dd1461010c578063313ce5671461013c575b5f5ffd5b6100a8610224565b6040516100b59190610b0f565b60405180910390f35b6100d860048036038101906100d39190610bc0565b6102b4565b6040516100e59190610c18565b60405180910390f35b6100f66102d6565b6040516101039190610c40565b60405180910390f35b61012660048036038101906101219190610c59565b6102df565b6040516101339190610c18565b60405180910390f35b61014461030d565b6040516101519190610cc4565b60405180910390f35b610174600480360381019061016f9190610bc0565b610315565b005b610190600480360381019061018b9190610cdd565b610323565b60405161019d9190610c40565b60405180910390f35b6101ae610368565b6040516101bb9190610b0f565b60405180910390f35b6101de60048036038101906101d99190610bc0565b6103f8565b6040516101eb9190610c18565b60405180910390f35b61020e60048036038101906102099190610d08565b61041a565b60405161021b9190610c40565b60405180910390f35b60606003805461023390610d73565b80601f016020809104026020016040519081016040528092919081815260200182805461025f90610d73565b80156102aa5780601f10610281576101008083540402835291602001916102aa565b820191905f5260205f20905b81548152906001019060200180831161028d57829003601f168201915b5050505050905090565b5f5f6102be61049c565b90506102cb8185856104a3565b600191505092915050565b5f600254905090565b5f5f6102e961049c565b90506102f68582856104b5565b610301858585610548565b60019150509392505050565b5f6012905090565b61031f8282610638565b5050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60606004805461037790610d73565b80601f01602080910402602001604051908101604052809291908181526020018280546103a390610d73565b80156103ee5780601f106103c5576101008083540402835291602001916103ee565b820191905f5260205f20905b8154815290600101906020018083116103d157829003601f168201915b5050505050905090565b5f5f61040261049c565b905061040f818585610548565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b6104b083838360016106b7565b505050565b5f6104c0848461041a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105425781811015610533578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161052a93929190610db2565b60405180910390fd5b61054184848484035f6106b7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105b8575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016105af9190610de7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610628575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161061f9190610de7565b60405180910390fd5b610633838383610886565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106a8575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161069f9190610de7565b60405180910390fd5b6106b35f8383610886565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610727575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161071e9190610de7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610797575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161078e9190610de7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610880578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108779190610c40565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108d6578060025f8282546108ca9190610e2d565b925050819055506109a4565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561095f578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161095693929190610db2565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109eb578060025f8282540392505081905550610a35565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a929190610c40565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610ae182610a9f565b610aeb8185610aa9565b9350610afb818560208601610ab9565b610b0481610ac7565b840191505092915050565b5f6020820190508181035f830152610b278184610ad7565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610b5c82610b33565b9050919050565b610b6c81610b52565b8114610b76575f5ffd5b50565b5f81359050610b8781610b63565b92915050565b5f819050919050565b610b9f81610b8d565b8114610ba9575f5ffd5b50565b5f81359050610bba81610b96565b92915050565b5f5f60408385031215610bd657610bd5610b2f565b5b5f610be385828601610b79565b9250506020610bf485828601610bac565b9150509250929050565b5f8115159050919050565b610c1281610bfe565b82525050565b5f602082019050610c2b5f830184610c09565b92915050565b610c3a81610b8d565b82525050565b5f602082019050610c535f830184610c31565b92915050565b5f5f5f60608486031215610c7057610c6f610b2f565b5b5f610c7d86828701610b79565b9350506020610c8e86828701610b79565b9250506040610c9f86828701610bac565b9150509250925092565b5f60ff82169050919050565b610cbe81610ca9565b82525050565b5f602082019050610cd75f830184610cb5565b92915050565b5f60208284031215610cf257610cf1610b2f565b5b5f610cff84828501610b79565b91505092915050565b5f5f60408385031215610d1e57610d1d610b2f565b5b5f610d2b85828601610b79565b9250506020610d3c85828601610b79565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610d8a57607f821691505b602082108103610d9d57610d9c610d46565b5b50919050565b610dac81610b52565b82525050565b5f606082019050610dc55f830186610da3565b610dd26020830185610c31565b610ddf6040830184610c31565b949350505050565b5f602082019050610dfa5f830184610da3565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e3782610b8d565b9150610e4283610b8d565b9250828201905080821115610e5a57610e59610e00565b5b9291505056fea26469706673582212203070f31498b948b4ae5cdf7908ee2a7c279cdb83d0df4fe322edfdf0ca38c25b64736f6c634300081d0033","sourceMap":"128:171:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1760:89:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3902:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2803:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4680:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2688:82;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;212:85:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2933:116:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1962:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3244:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3455:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1760:89;1805:13;1837:5;1830:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1760:89;:::o;3902:186::-;3975:4;3991:13;4007:12;:10;:12::i;:::-;3991:28;;4029:31;4038:5;4045:7;4054:5;4029:8;:31::i;:::-;4077:4;4070:11;;;3902:186;;;;:::o;2803:97::-;2855:7;2881:12;;2874:19;;2803:97;:::o;4680:244::-;4767:4;4783:15;4801:12;:10;:12::i;:::-;4783:30;;4823:37;4839:4;4845:7;4854:5;4823:15;:37::i;:::-;4870:26;4880:4;4886:2;4890:5;4870:9;:26::i;:::-;4913:4;4906:11;;;4680:244;;;;;:::o;2688:82::-;2737:5;2761:2;2754:9;;2688:82;:::o;212:85:5:-;273:17;279:2;283:6;273:5;:17::i;:::-;212:85;;:::o;2933:116:1:-;2998:7;3024:9;:18;3034:7;3024:18;;;;;;;;;;;;;;;;3017:25;;2933:116;;;:::o;1962:93::-;2009:13;2041:7;2034:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1962:93;:::o;3244:178::-;3313:4;3329:13;3345:12;:10;:12::i;:::-;3329:28;;3367:27;3377:5;3384:2;3388:5;3367:9;:27::i;:::-;3411:4;3404:11;;;3244:178;;;;:::o;3455:140::-;3535:7;3561:11;:18;3573:5;3561:18;;;;;;;;;;;;;;;:27;3580:7;3561:27;;;;;;;;;;;;;;;;3554:34;;3455:140;;;;:::o;656:96:4:-;709:7;735:10;728:17;;656:96;:::o;8630:128:1:-;8714:37;8723:5;8730:7;8739:5;8746:4;8714:8;:37::i;:::-;8630:128;;;:::o;10321:476::-;10420:24;10447:25;10457:5;10464:7;10447:9;:25::i;:::-;10420:52;;10505:17;10486:16;:36;10482:309;;;10561:5;10542:16;:24;10538:130;;;10620:7;10629:16;10647:5;10593:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;10538:130;10709:57;10718:5;10725:7;10753:5;10734:16;:24;10760:5;10709:8;:57::i;:::-;10482:309;10410:387;10321:476;;;:::o;5297:300::-;5396:1;5380:18;;:4;:18;;;5376:86;;5448:1;5421:30;;;;;;;;;;;:::i;:::-;;;;;;;;5376:86;5489:1;5475:16;;:2;:16;;;5471:86;;5543:1;5514:32;;;;;;;;;;;:::i;:::-;;;;;;;;5471:86;5566:24;5574:4;5580:2;5584:5;5566:7;:24::i;:::-;5297:300;;;:::o;7362:208::-;7451:1;7432:21;;:7;:21;;;7428:91;;7505:1;7476:32;;;;;;;;;;;:::i;:::-;;;;;;;;7428:91;7528:35;7544:1;7548:7;7557:5;7528:7;:35::i;:::-;7362:208;;:::o;9607:432::-;9736:1;9719:19;;:5;:19;;;9715:89;;9790:1;9761:32;;;;;;;;;;;:::i;:::-;;;;;;;;9715:89;9836:1;9817:21;;:7;:21;;;9813:90;;9889:1;9861:31;;;;;;;;;;;:::i;:::-;;;;;;;;9813:90;9942:5;9912:11;:18;9924:5;9912:18;;;;;;;;;;;;;;;:27;9931:7;9912:27;;;;;;;;;;;;;;;:35;;;;9961:9;9957:76;;;10007:7;9991:31;;10000:5;9991:31;;;10016:5;9991:31;;;;;;:::i;:::-;;;;;;;;9957:76;9607:432;;;;:::o;5912:1107::-;6017:1;6001:18;;:4;:18;;;5997:540;;6153:5;6137:12;;:21;;;;;;;:::i;:::-;;;;;;;;5997:540;;;6189:19;6211:9;:15;6221:4;6211:15;;;;;;;;;;;;;;;;6189:37;;6258:5;6244:11;:19;6240:115;;;6315:4;6321:11;6334:5;6290:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;6240:115;6507:5;6493:11;:19;6475:9;:15;6485:4;6475:15;;;;;;;;;;;;;;;:37;;;;6175:362;5997:540;6565:1;6551:16;;:2;:16;;;6547:425;;6730:5;6714:12;;:21;;;;;;;;;;;6547:425;;;6942:5;6925:9;:13;6935:2;6925:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;6547:425;7002:2;6987:25;;6996:4;6987:25;;;7006:5;6987:25;;;;;;:::i;:::-;;;;;;;;5912:1107;;;:::o;7:99:6:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:118::-;3426:24;3444:5;3426:24;:::i;:::-;3421:3;3414:37;3339:118;;:::o;3463:222::-;3556:4;3594:2;3583:9;3579:18;3571:26;;3607:71;3675:1;3664:9;3660:17;3651:6;3607:71;:::i;:::-;3463:222;;;;:::o;3691:619::-;3768:6;3776;3784;3833:2;3821:9;3812:7;3808:23;3804:32;3801:119;;;3839:79;;:::i;:::-;3801:119;3959:1;3984:53;4029:7;4020:6;4009:9;4005:22;3984:53;:::i;:::-;3974:63;;3930:117;4086:2;4112:53;4157:7;4148:6;4137:9;4133:22;4112:53;:::i;:::-;4102:63;;4057:118;4214:2;4240:53;4285:7;4276:6;4265:9;4261:22;4240:53;:::i;:::-;4230:63;;4185:118;3691:619;;;;;:::o;4316:86::-;4351:7;4391:4;4384:5;4380:16;4369:27;;4316:86;;;:::o;4408:112::-;4491:22;4507:5;4491:22;:::i;:::-;4486:3;4479:35;4408:112;;:::o;4526:214::-;4615:4;4653:2;4642:9;4638:18;4630:26;;4666:67;4730:1;4719:9;4715:17;4706:6;4666:67;:::i;:::-;4526:214;;;;:::o;4746:329::-;4805:6;4854:2;4842:9;4833:7;4829:23;4825:32;4822:119;;;4860:79;;:::i;:::-;4822:119;4980:1;5005:53;5050:7;5041:6;5030:9;5026:22;5005:53;:::i;:::-;4995:63;;4951:117;4746:329;;;;:::o;5081:474::-;5149:6;5157;5206:2;5194:9;5185:7;5181:23;5177:32;5174:119;;;5212:79;;:::i;:::-;5174:119;5332:1;5357:53;5402:7;5393:6;5382:9;5378:22;5357:53;:::i;:::-;5347:63;;5303:117;5459:2;5485:53;5530:7;5521:6;5510:9;5506:22;5485:53;:::i;:::-;5475:63;;5430:118;5081:474;;;;;:::o;5561:180::-;5609:77;5606:1;5599:88;5706:4;5703:1;5696:15;5730:4;5727:1;5720:15;5747:320;5791:6;5828:1;5822:4;5818:12;5808:22;;5875:1;5869:4;5865:12;5896:18;5886:81;;5952:4;5944:6;5940:17;5930:27;;5886:81;6014:2;6006:6;6003:14;5983:18;5980:38;5977:84;;6033:18;;:::i;:::-;5977:84;5798:269;5747:320;;;:::o;6073:118::-;6160:24;6178:5;6160:24;:::i;:::-;6155:3;6148:37;6073:118;;:::o;6197:442::-;6346:4;6384:2;6373:9;6369:18;6361:26;;6397:71;6465:1;6454:9;6450:17;6441:6;6397:71;:::i;:::-;6478:72;6546:2;6535:9;6531:18;6522:6;6478:72;:::i;:::-;6560;6628:2;6617:9;6613:18;6604:6;6560:72;:::i;:::-;6197:442;;;;;;:::o;6645:222::-;6738:4;6776:2;6765:9;6761:18;6753:26;;6789:71;6857:1;6846:9;6842:17;6833:6;6789:71;:::i;:::-;6645:222;;;;:::o;6873:180::-;6921:77;6918:1;6911:88;7018:4;7015:1;7008:15;7042:4;7039:1;7032:15;7059:191;7099:3;7118:20;7136:1;7118:20;:::i;:::-;7113:25;;7152:20;7170:1;7152:20;:::i;:::-;7147:25;;7195:1;7192;7188:9;7181:16;;7216:3;7213:1;7210:10;7207:36;;;7223:18;;:::i;:::-;7207:36;7059:191;;;;:::o","linkReferences":{}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","mint(address,uint256)":"40c10f19","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.29+commit.ab55807c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/MockERC20.sol\":\"MockERC20\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/=lib/openzeppelin-contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c\",\"dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x669464167428061ee0f8618b73b3ee90aff8405683e7ddde8cd77dadaa1afe29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0dda78587a7358b4fdf6b9fca0fde5a5e34930f36d5268a16028627fc0170195\",\"dweb:/ipfs/QmQ1b6cCceDRWNxti9HifsTCzmVP25Haxs1bWugm52vTqH\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e\",\"dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"src/MockERC20.sol\":{\"keccak256\":\"0x70ce69b6fa233f7b5e887127ba003f35a3c7f07fcfb30697167aa4a44f1f65be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://46a044ec15ad5825d95e77937610e41f72802bcaa7093b7c079c2e3c004f7477\",\"dweb:/ipfs/QmXsWpAuuynJxUojUnHnGHV6fwzdQAxMjBtqAXKWkCd8cJ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.29+commit.ab55807c"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"ERC20InsufficientAllowance"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"ERC20InsufficientBalance"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"type":"error","name":"ERC20InvalidApprover"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"type":"error","name":"ERC20InvalidReceiver"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"ERC20InvalidSender"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"type":"error","name":"ERC20InvalidSpender"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"mint"},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `value` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"Returns the value of tokens owned by `account`."},"decimals()":{"details":"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"Returns the value of tokens in existence."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `value`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Skips emitting an {Approval} event indicating an allowance update. This is not required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `value`. - the caller must have allowance for ``from``'s tokens of at least `value`."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=lib/openzeppelin-contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/MockERC20.sol":"MockERC20"},"evmVersion":"prague","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x1b88b3fb3d85ba5496d7d5f396f83ee1fddcdd6762059ff65992655b67920998","urls":["bzz-raw://89393bb3212da1c0889601b9706a07b39419ddc4d2faab9eaf6e7f9152cf6a1c","dweb:/ipfs/QmcCfzzxv1Bkdz1c1yF4gQCeYb6Us5BJANnzTFqawfd1HL"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"keccak256":"0x669464167428061ee0f8618b73b3ee90aff8405683e7ddde8cd77dadaa1afe29","urls":["bzz-raw://0dda78587a7358b4fdf6b9fca0fde5a5e34930f36d5268a16028627fc0170195","dweb:/ipfs/QmQ1b6cCceDRWNxti9HifsTCzmVP25Haxs1bWugm52vTqH"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2","urls":["bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303","dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0xd6fa4088198f04eef10c5bce8a2f4d60554b7ec4b987f684393c01bf79b94d9f","urls":["bzz-raw://f95ee0bbd4dd3ac730d066ba3e785ded4565e890dbec2fa7d3b9fe3bad9d0d6e","dweb:/ipfs/QmSLr6bHkPFWT7ntj34jmwfyskpwo97T9jZUrk5sz3sdtR"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"src/MockERC20.sol":{"keccak256":"0x70ce69b6fa233f7b5e887127ba003f35a3c7f07fcfb30697167aa4a44f1f65be","urls":["bzz-raw://46a044ec15ad5825d95e77937610e41f72802bcaa7093b7c079c2e3c004f7477","dweb:/ipfs/QmXsWpAuuynJxUojUnHnGHV6fwzdQAxMjBtqAXKWkCd8cJ"],"license":"MIT"}},"version":1},"id":5}
@@ -1,430 +0,0 @@
1
- import { afterAll, beforeAll, describe, expect, test } from "bun:test";
2
- import {
3
- createPublicClient,
4
- createWalletClient,
5
- http,
6
- parseEther,
7
- type Hex,
8
- } from "viem";
9
- import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
10
- import { foundry } from "viem/chains";
11
-
12
- // Artifacts
13
- import delegateArtifact from "./Delegate.json";
14
- import tokenArtifact from "./MockERC20.json";
15
-
16
- const ANVIL_PORT = 8545;
17
- const SERVER_PORT = 3000;
18
- const CHAIN_ID = 31337;
19
-
20
- const transport = http(`http://127.0.0.1:${ANVIL_PORT}`);
21
- const publicClient = createPublicClient({ chain: foundry, transport });
22
- const walletClient = createWalletClient({ chain: foundry, transport });
23
-
24
- const deployerKey =
25
- "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
26
- const deployer = privateKeyToAccount(deployerKey);
27
-
28
- const relayerKey =
29
- "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d";
30
- const relayer = privateKeyToAccount(relayerKey);
31
-
32
- const userKey = generatePrivateKey();
33
- const user = privateKeyToAccount(userKey);
34
-
35
- let anvilProcess: any;
36
- let serverProcess: any;
37
- let delegateAddress: Hex;
38
- let tokenAddress: Hex;
39
-
40
- describe("x402 EIP-7702 Integration", () => {
41
- beforeAll(async () => {
42
- console.log("Starting Anvil...");
43
- anvilProcess = Bun.spawn(["anvil", "--port", String(ANVIL_PORT)], {
44
- stdout: "ignore",
45
- stderr: "ignore",
46
- });
47
-
48
- await new Promise((r) => setTimeout(r, 2000));
49
-
50
- console.log("Deploying contracts...");
51
-
52
- const deployDelegateHash = await walletClient.deployContract({
53
- account: deployer,
54
- abi: delegateArtifact.abi,
55
- bytecode: delegateArtifact.bytecode.object as Hex,
56
- });
57
- const receipt1 = await publicClient.waitForTransactionReceipt({
58
- hash: deployDelegateHash,
59
- });
60
- delegateAddress = receipt1.contractAddress!;
61
- console.log("Delegate deployed at:", delegateAddress);
62
-
63
- const deployTokenHash = await walletClient.deployContract({
64
- account: deployer,
65
- abi: tokenArtifact.abi,
66
- bytecode: tokenArtifact.bytecode.object as Hex,
67
- });
68
- const receipt2 = await publicClient.waitForTransactionReceipt({
69
- hash: deployTokenHash,
70
- });
71
- tokenAddress = receipt2.contractAddress!;
72
- console.log("Token deployed at:", tokenAddress);
73
-
74
- await walletClient.writeContract({
75
- account: deployer,
76
- address: tokenAddress,
77
- abi: tokenArtifact.abi,
78
- functionName: "mint",
79
- args: [user.address, parseEther("1000")],
80
- });
81
-
82
- await walletClient.sendTransaction({
83
- account: deployer,
84
- to: relayer.address,
85
- value: parseEther("10"),
86
- });
87
-
88
- // Fund user with ETH for ETH transfer test
89
- await walletClient.sendTransaction({
90
- account: deployer,
91
- to: user.address,
92
- value: parseEther("10"),
93
- });
94
-
95
- console.log("Starting Server...");
96
- serverProcess = Bun.spawn(["bun", "run", "src/index.ts"], {
97
- env: {
98
- ...process.env,
99
- PORT: String(SERVER_PORT),
100
- RELAYER_PRIVATE_KEY: relayerKey,
101
- DELEGATE_ADDRESS: delegateAddress,
102
- RPC_URL_31337: `http://127.0.0.1:${ANVIL_PORT}`,
103
- },
104
- stdout: "inherit",
105
- stderr: "inherit",
106
- });
107
-
108
- await new Promise((r) => setTimeout(r, 2000));
109
- });
110
-
111
- afterAll(() => {
112
- if (serverProcess) serverProcess.kill();
113
- if (anvilProcess) anvilProcess.kill();
114
- });
115
-
116
- test("ERC20 transfer with EIP-7702 + EIP-712", async () => {
117
- const facilitatorUrl = `http://localhost:${SERVER_PORT}`;
118
-
119
- const requirements = {
120
- scheme: "eip7702",
121
- network: `eip155:${CHAIN_ID}`,
122
- asset: tokenAddress,
123
- amount: parseEther("10").toString(),
124
- payTo: deployer.address,
125
- maxTimeoutSeconds: 300,
126
- extra: {},
127
- };
128
-
129
- const intent = {
130
- token: tokenAddress,
131
- amount: requirements.amount,
132
- to: requirements.payTo,
133
- nonce: "0",
134
- deadline: Math.floor(Date.now() / 1000) + 3600,
135
- };
136
-
137
- const signature = await user.signTypedData({
138
- domain: {
139
- name: "Delegate",
140
- version: "1.0",
141
- chainId: CHAIN_ID,
142
- verifyingContract: user.address,
143
- },
144
- types: {
145
- PaymentIntent: [
146
- { name: "token", type: "address" },
147
- { name: "amount", type: "uint256" },
148
- { name: "to", type: "address" },
149
- { name: "nonce", type: "uint256" },
150
- { name: "deadline", type: "uint256" },
151
- ],
152
- },
153
- primaryType: "PaymentIntent",
154
- message: {
155
- token: intent.token,
156
- amount: BigInt(intent.amount),
157
- to: intent.to as `0x${string}`,
158
- nonce: BigInt(intent.nonce),
159
- deadline: BigInt(intent.deadline),
160
- },
161
- });
162
-
163
- const authorization = await user.signAuthorization({
164
- contractAddress: delegateAddress,
165
- chainId: CHAIN_ID,
166
- nonce: 0,
167
- });
168
-
169
- const paymentPayload = {
170
- x402Version: 2,
171
- resource: {
172
- url: "http://example.com/resource",
173
- description: "Test Resource",
174
- mimeType: "application/json",
175
- },
176
- accepted: requirements,
177
- payload: {
178
- authorization: {
179
- contractAddress: authorization.address || delegateAddress,
180
- chainId: authorization.chainId,
181
- nonce: authorization.nonce,
182
- r: authorization.r,
183
- s: authorization.s,
184
- yParity: authorization.yParity,
185
- },
186
- intent,
187
- signature,
188
- },
189
- };
190
-
191
- // Verify
192
- console.log("Calling /verify...");
193
- const verifyRes = await fetch(`${facilitatorUrl}/verify`, {
194
- method: "POST",
195
- body: JSON.stringify({
196
- paymentPayload,
197
- paymentRequirements: requirements,
198
- }),
199
- });
200
-
201
- const verifyJson = (await verifyRes.json()) as any;
202
- console.log("Verify Result:", verifyJson);
203
- expect(verifyJson.isValid).toBe(true);
204
- expect(verifyJson.payer?.toLowerCase()).toBe(user.address.toLowerCase());
205
-
206
- // Settle (New Nonce)
207
- const intentSettle = { ...intent, nonce: "1" };
208
-
209
- const signatureSettle = await user.signTypedData({
210
- domain: {
211
- name: "Delegate",
212
- version: "1.0",
213
- chainId: CHAIN_ID,
214
- verifyingContract: user.address,
215
- },
216
- types: {
217
- PaymentIntent: [
218
- { name: "token", type: "address" },
219
- { name: "amount", type: "uint256" },
220
- { name: "to", type: "address" },
221
- { name: "nonce", type: "uint256" },
222
- { name: "deadline", type: "uint256" },
223
- ],
224
- },
225
- primaryType: "PaymentIntent",
226
- message: {
227
- token: intentSettle.token,
228
- amount: BigInt(intentSettle.amount),
229
- to: intentSettle.to as `0x${string}`,
230
- nonce: BigInt(intentSettle.nonce),
231
- deadline: BigInt(intentSettle.deadline),
232
- },
233
- });
234
-
235
- const paymentPayloadSettle = {
236
- ...paymentPayload,
237
- accepted: requirements,
238
- payload: {
239
- authorization: {
240
- contractAddress: authorization.address || delegateAddress,
241
- chainId: authorization.chainId,
242
- nonce: authorization.nonce,
243
- r: authorization.r,
244
- s: authorization.s,
245
- yParity: authorization.yParity,
246
- },
247
- intent: intentSettle,
248
- signature: signatureSettle,
249
- },
250
- };
251
-
252
- console.log("Calling /settle...");
253
- const settleRes = await fetch(`${facilitatorUrl}/settle`, {
254
- method: "POST",
255
- body: JSON.stringify({
256
- paymentPayload: paymentPayloadSettle,
257
- paymentRequirements: requirements,
258
- }),
259
- });
260
-
261
- const settleJson = (await settleRes.json()) as any;
262
- console.log("Settle Result:", settleJson);
263
- expect(settleJson.success).toBe(true);
264
-
265
- // Verify On-Chain State
266
- const balanceUser = await publicClient.readContract({
267
- address: tokenAddress,
268
- abi: tokenArtifact.abi,
269
- functionName: "balanceOf",
270
- args: [user.address],
271
- });
272
- const balancePayTo = await publicClient.readContract({
273
- address: tokenAddress,
274
- abi: tokenArtifact.abi,
275
- functionName: "balanceOf",
276
- args: [deployer.address],
277
- });
278
-
279
- console.log("User Balance:", balanceUser);
280
- console.log("PayTo Balance:", balancePayTo);
281
-
282
- expect(balanceUser).toBe(parseEther("990"));
283
- expect(balancePayTo).toBe(parseEther("10"));
284
- }, 30000);
285
-
286
- test("ETH transfer with EIP-7702 + EIP-712", async () => {
287
- const facilitatorUrl = `http://localhost:${SERVER_PORT}`;
288
- const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000";
289
-
290
- const requirements = {
291
- scheme: "eip7702",
292
- network: `eip155:${CHAIN_ID}`,
293
- asset: ADDRESS_ZERO,
294
- amount: parseEther("1").toString(),
295
- payTo: deployer.address,
296
- maxTimeoutSeconds: 300,
297
- extra: {},
298
- };
299
-
300
- const intent = {
301
- amount: requirements.amount,
302
- to: requirements.payTo,
303
- nonce: "100",
304
- deadline: Math.floor(Date.now() / 1000) + 3600,
305
- };
306
-
307
- const signature = await user.signTypedData({
308
- domain: {
309
- name: "Delegate",
310
- version: "1.0",
311
- chainId: CHAIN_ID,
312
- verifyingContract: user.address,
313
- },
314
- types: {
315
- EthPaymentIntent: [
316
- { name: "amount", type: "uint256" },
317
- { name: "to", type: "address" },
318
- { name: "nonce", type: "uint256" },
319
- { name: "deadline", type: "uint256" },
320
- ],
321
- },
322
- primaryType: "EthPaymentIntent",
323
- message: {
324
- amount: BigInt(intent.amount),
325
- to: intent.to as `0x${string}`,
326
- nonce: BigInt(intent.nonce),
327
- deadline: BigInt(intent.deadline),
328
- },
329
- });
330
-
331
- const authorization = await user.signAuthorization({
332
- contractAddress: delegateAddress,
333
- chainId: CHAIN_ID,
334
- nonce: await publicClient.getTransactionCount({ address: user.address }),
335
- });
336
-
337
- const paymentPayload = {
338
- x402Version: 2,
339
- resource: {
340
- url: "http://example.com/resource",
341
- description: "Test Resource",
342
- mimeType: "application/json",
343
- },
344
- accepted: requirements,
345
- payload: {
346
- authorization: {
347
- contractAddress: authorization.address || delegateAddress,
348
- chainId: authorization.chainId,
349
- nonce: authorization.nonce,
350
- r: authorization.r,
351
- s: authorization.s,
352
- yParity: authorization.yParity,
353
- },
354
- intent,
355
- signature,
356
- },
357
- };
358
-
359
- // Verify
360
- console.log("Calling /verify for ETH...");
361
- const verifyRes = await fetch(`${facilitatorUrl}/verify`, {
362
- method: "POST",
363
- body: JSON.stringify({
364
- paymentPayload,
365
- paymentRequirements: requirements,
366
- }),
367
- });
368
-
369
- const verifyJson = (await verifyRes.json()) as any;
370
- console.log("ETH Verify Result:", verifyJson);
371
- expect(verifyJson.isValid).toBe(true);
372
-
373
- // Settle (New Nonce)
374
- const intentSettle = { ...intent, nonce: "101" };
375
-
376
- const signatureSettle = await user.signTypedData({
377
- domain: {
378
- name: "Delegate",
379
- version: "1.0",
380
- chainId: CHAIN_ID,
381
- verifyingContract: user.address,
382
- },
383
- types: {
384
- EthPaymentIntent: [
385
- { name: "amount", type: "uint256" },
386
- { name: "to", type: "address" },
387
- { name: "nonce", type: "uint256" },
388
- { name: "deadline", type: "uint256" },
389
- ],
390
- },
391
- primaryType: "EthPaymentIntent",
392
- message: {
393
- amount: BigInt(intentSettle.amount),
394
- to: intentSettle.to as `0x${string}`,
395
- nonce: BigInt(intentSettle.nonce),
396
- deadline: BigInt(intentSettle.deadline),
397
- },
398
- });
399
-
400
- const paymentPayloadSettle = {
401
- ...paymentPayload,
402
- accepted: requirements,
403
- payload: {
404
- authorization: {
405
- contractAddress: authorization.address || delegateAddress,
406
- chainId: authorization.chainId,
407
- nonce: authorization.nonce,
408
- r: authorization.r,
409
- s: authorization.s,
410
- yParity: authorization.yParity,
411
- },
412
- intent: intentSettle,
413
- signature: signatureSettle,
414
- },
415
- };
416
-
417
- console.log("Calling /settle for ETH...");
418
- const settleRes = await fetch(`${facilitatorUrl}/settle`, {
419
- method: "POST",
420
- body: JSON.stringify({
421
- paymentPayload: paymentPayloadSettle,
422
- paymentRequirements: requirements,
423
- }),
424
- });
425
-
426
- const settleJson = (await settleRes.json()) as any;
427
- console.log("ETH Settle Result:", settleJson);
428
- expect(settleJson.success).toBe(true);
429
- }, 30000);
430
- });
package/tsconfig.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json"
3
- }