@gobob/bob-sdk 4.3.15 → 4.4.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.
@@ -1,232 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
- var __importDefault = (this && this.__importDefault) || function (mod) {
37
- return (mod && mod.__esModule) ? mod : { "default": mod };
38
- };
39
- Object.defineProperty(exports, "__esModule", { value: true });
40
- const viem_1 = require("viem");
41
- const fs = __importStar(require("fs"));
42
- const path = __importStar(require("path"));
43
- const chains_1 = require("viem/chains");
44
- const ajv_1 = __importDefault(require("ajv"));
45
- const ajv_formats_1 = __importDefault(require("ajv-formats"));
46
- const SCHEMA_URL = 'https://raw.githubusercontent.com/Uniswap/token-lists/refs/heads/main/src/tokenlist.schema.json';
47
- const tokenlistPath = path.join(__dirname, '../../../token-list.json');
48
- const erc20Abi = (0, viem_1.parseAbi)([
49
- 'function name() view returns (string)',
50
- 'function symbol() view returns (string)',
51
- 'function decimals() view returns (uint8)',
52
- ]);
53
- function validateTokenAddress(address) {
54
- try {
55
- if (!(0, viem_1.isAddress)(address)) {
56
- return false;
57
- }
58
- const checksummed = (0, viem_1.getAddress)(address);
59
- return address === checksummed;
60
- }
61
- catch {
62
- return false;
63
- }
64
- }
65
- async function getTokenInfo(chain, address) {
66
- try {
67
- const client = (0, viem_1.createPublicClient)({
68
- chain,
69
- transport: (0, viem_1.http)(),
70
- });
71
- if (address === '0x0000000000000000000000000000000000000000') {
72
- return { name: 'Ether', symbol: 'ETH', decimals: 18 };
73
- }
74
- const [name, symbol, decimals] = await Promise.all([
75
- client.readContract({
76
- address: address,
77
- abi: erc20Abi,
78
- functionName: 'name',
79
- }),
80
- client.readContract({
81
- address: address,
82
- abi: erc20Abi,
83
- functionName: 'symbol',
84
- }),
85
- client.readContract({
86
- address: address,
87
- abi: erc20Abi,
88
- functionName: 'decimals',
89
- }),
90
- ]);
91
- return {
92
- name: name,
93
- symbol: symbol,
94
- decimals: Number(decimals),
95
- };
96
- }
97
- catch (error) {
98
- console.error(`Error fetching token info for ${address}:`, error);
99
- return null;
100
- }
101
- }
102
- async function validateToken(token) {
103
- const issues = [];
104
- const result = {
105
- address: token.address,
106
- symbol: token.symbol,
107
- issues,
108
- };
109
- if (token.chainId !== 60808) {
110
- issues.push(`Invalid chainId: expected 60808, got ${token.chainId}`);
111
- }
112
- const isValidAddress = validateTokenAddress(token.address);
113
- if (!isValidAddress) {
114
- issues.push(`Invalid or non-checksummed address, should be ${(0, viem_1.getAddress)(token.address)}`);
115
- return result;
116
- }
117
- const onChainData = await getTokenInfo(chains_1.bob, token.address);
118
- if (!onChainData) {
119
- issues.push('Unable to fetch on-chain token data - contract may not exist or not be ERC20');
120
- return result;
121
- }
122
- result.onChainData = onChainData;
123
- if (token.name !== onChainData.name) {
124
- issues.push(`Name mismatch: tokenlist="${token.name}", onchain="${onChainData.name}"`);
125
- }
126
- if (token.symbol !== onChainData.symbol) {
127
- issues.push(`Symbol mismatch: tokenlist="${token.symbol}", onchain="${onChainData.symbol}"`);
128
- }
129
- if (token.decimals !== onChainData.decimals) {
130
- issues.push(`Decimals mismatch: tokenlist=${token.decimals}, onchain=${onChainData.decimals}`);
131
- }
132
- if (!token.logoURI.startsWith('http') && !token.logoURI.startsWith('ipfs://')) {
133
- issues.push('Invalid logoURI: must start with http or ipfs://');
134
- }
135
- if (token.extensions && token.extensions['bridgeInfo']['1']) {
136
- const bridgeInfo = token.extensions['bridgeInfo']['1'];
137
- const l1TokenAddress = bridgeInfo['tokenAddress'];
138
- if (l1TokenAddress) {
139
- if (!validateTokenAddress(l1TokenAddress)) {
140
- issues.push(`Invalid L1 token address in bridgeInfo: ${l1TokenAddress}, should be ${(0, viem_1.getAddress)(l1TokenAddress)}`);
141
- }
142
- const onChainL1Data = await getTokenInfo(chains_1.mainnet, l1TokenAddress);
143
- if (!onChainL1Data) {
144
- issues.push('Unable to fetch on-chain token data - contract may not exist or not be ERC20');
145
- return result;
146
- }
147
- if (token.name !== onChainL1Data.name) {
148
- issues.push(`Name mismatch: tokenlist="${token.name}", onchain="${onChainL1Data.name}"`);
149
- }
150
- if (token.symbol !== onChainL1Data.symbol) {
151
- issues.push(`Symbol mismatch: tokenlist="${token.symbol}", onchain="${onChainL1Data.symbol}"`);
152
- }
153
- if (token.decimals !== onChainL1Data.decimals) {
154
- issues.push(`Decimals mismatch: tokenlist=${token.decimals}, onchain=${onChainL1Data.decimals}`);
155
- }
156
- }
157
- }
158
- return result;
159
- }
160
- async function validateSchema() {
161
- const ajv = new ajv_1.default({ allErrors: true, verbose: true });
162
- (0, ajv_formats_1.default)(ajv);
163
- const schemaResponse = await fetch(SCHEMA_URL);
164
- const schema = await schemaResponse.json();
165
- const validator = ajv.compile(schema);
166
- const data = JSON.parse(fs.readFileSync(tokenlistPath, 'utf8'));
167
- const valid = validator(data);
168
- if (valid) {
169
- console.log('Valid List.');
170
- return valid;
171
- }
172
- if (validator.errors) {
173
- throw validator.errors.map((error) => {
174
- delete error.data;
175
- return error;
176
- });
177
- }
178
- }
179
- async function main() {
180
- console.log('šŸ” Verifying BOB tokenlist...\n');
181
- if (!fs.existsSync(tokenlistPath)) {
182
- console.error('āŒ tokenlist.json not found');
183
- process.exit(1);
184
- }
185
- await validateSchema();
186
- const { tokens } = JSON.parse(fs.readFileSync(tokenlistPath, 'utf8'));
187
- console.log(`šŸ“‹ Found ${tokens.length} tokens to validate\n`);
188
- let totalIssues = 0;
189
- const results = [];
190
- for (let i = 0; i < tokens.length; i++) {
191
- const token = tokens[i];
192
- console.log(`[${i + 1}/${tokens.length}] Validating ${token.symbol} (${token.address})...`);
193
- const result = await validateToken(token);
194
- results.push(result);
195
- if (result.issues.length > 0) {
196
- console.log(` āŒ ${result.issues.length} issue(s):`);
197
- result.issues.forEach((issue) => console.log(` • ${issue}`));
198
- totalIssues += result.issues.length;
199
- }
200
- else {
201
- console.log(` āœ… Valid`);
202
- }
203
- if (i < tokens.length - 1) {
204
- await new Promise((resolve) => setTimeout(resolve, 100));
205
- }
206
- }
207
- console.log('\nšŸ“Š Validation Summary:');
208
- console.log(` Total tokens: ${tokens.length}`);
209
- console.log(` Valid tokens: ${results.filter((r) => r.issues.length === 0).length}`);
210
- console.log(` Tokens with issues: ${results.filter((r) => r.issues.length > 0).length}`);
211
- console.log(` Total issues: ${totalIssues}`);
212
- const addresses = tokens.map((t) => t.address.toLowerCase());
213
- const duplicates = addresses.filter((addr, index) => addresses.indexOf(addr) !== index);
214
- if (duplicates.length > 0) {
215
- console.log(`\nāš ļø Duplicate addresses found: ${[...new Set(duplicates)].join(', ')}`);
216
- }
217
- const symbols = tokens.map((t) => t.symbol);
218
- const duplicateSymbols = symbols.filter((symbol, index) => symbols.indexOf(symbol) !== index);
219
- if (duplicateSymbols.length > 0) {
220
- console.log(`\nāš ļø Duplicate symbols found: ${[...new Set(duplicateSymbols)].join(', ')}`);
221
- }
222
- if (totalIssues === 0 && duplicates.length === 0) {
223
- console.log('\nšŸŽ‰ All tokens are valid!');
224
- process.exit(0);
225
- }
226
- else {
227
- console.log('\nāŒ Validation failed with issues');
228
- process.exit(1);
229
- }
230
- }
231
- main().catch(console.error);
232
- //# sourceMappingURL=verify-tokenlist.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify-tokenlist.js","sourceRoot":"","sources":["../../src/scripts/verify-tokenlist.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,+BAAwF;AACxF,uCAAyB;AACzB,2CAA6B;AAC7B,wCAA2C;AAC3C,8CAAsB;AACtB,8DAAqC;AAErC,MAAM,UAAU,GAAG,iGAAiG,CAAC;AACrH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;AAGvE,MAAM,QAAQ,GAAG,IAAA,eAAQ,EAAC;IACtB,uCAAuC;IACvC,yCAAyC;IACzC,0CAA0C;CAC7C,CAAC,CAAC;AAgCH,SAAS,oBAAoB,CAAC,OAAe;IACzC,IAAI,CAAC;QAED,IAAI,CAAC,IAAA,gBAAS,EAAC,OAAO,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC;QAGD,MAAM,WAAW,GAAG,IAAA,iBAAU,EAAC,OAAO,CAAC,CAAC;QACxC,OAAO,OAAO,KAAK,WAAW,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACvB,KAAY,EACZ,OAAe;IAEf,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC;YAC9B,KAAK;YACL,SAAS,EAAE,IAAA,WAAI,GAAE;SACpB,CAAC,CAAC;QAGH,IAAI,OAAO,KAAK,4CAA4C,EAAE,CAAC;YAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/C,MAAM,CAAC,YAAY,CAAC;gBAChB,OAAO,EAAE,OAAwB;gBACjC,GAAG,EAAE,QAAQ;gBACb,YAAY,EAAE,MAAM;aACvB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAChB,OAAO,EAAE,OAAwB;gBACjC,GAAG,EAAE,QAAQ;gBACb,YAAY,EAAE,QAAQ;aACzB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAChB,OAAO,EAAE,OAAwB;gBACjC,GAAG,EAAE,QAAQ;gBACb,YAAY,EAAE,UAAU;aAC3B,CAAC;SACL,CAAC,CAAC;QAEH,OAAO;YACH,IAAI,EAAE,IAAc;YACpB,MAAM,EAAE,MAAgB;YACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;SAC7B,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAAY;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAqB;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM;KACT,CAAC;IAGF,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAGD,MAAM,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,iDAAiD,IAAA,iBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC;IAClB,CAAC;IAGD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,YAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IAGjC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,IAAI,eAAe,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,CAAC,MAAM,eAAe,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,QAAQ,aAAa,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnG,CAAC;IAGD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CACP,2CAA2C,cAAc,eAAe,IAAA,iBAAU,EAAC,cAAc,CAAC,EAAE,CACvG,CAAC;YACN,CAAC;YACD,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,gBAAO,EAAE,cAAc,CAAC,CAAC;YAClE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;gBAC5F,OAAO,MAAM,CAAC;YAClB,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,IAAI,eAAe,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;YAC7F,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,CAAC,MAAM,eAAe,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YACnG,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,CAAC,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,QAAQ,aAAa,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrG,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,cAAc;IACzB,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAA,qBAAU,EAAC,GAAG,CAAC,CAAC;IAChB,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,KAAK,CAAC,IAAI,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAG/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,cAAc,EAAE,CAAC;IAEvB,MAAM,EAAE,MAAM,EAAE,GAAwB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,uBAAuB,CAAC,CAAC;IAE9D,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,OAAO,GAAuB,EAAE,CAAC;IAGvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,gBAAgB,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;QAE5F,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC;YACjE,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;QAGD,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;IAGD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;IAG/C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;IACxF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAGD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;IAC9F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,WAAW,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}