@typemove/sui 1.2.0-rc.2 → 1.2.0-rc.3
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/dist/cjs/builtin/0x1.d.ts +83 -82
- package/dist/cjs/builtin/0x1.d.ts.map +1 -1
- package/dist/cjs/builtin/0x1.js +164 -164
- package/dist/cjs/builtin/0x1.js.map +1 -1
- package/dist/cjs/builtin/0x2.d.ts +353 -349
- package/dist/cjs/builtin/0x2.d.ts.map +1 -1
- package/dist/cjs/builtin/0x2.js +698 -698
- package/dist/cjs/builtin/0x2.js.map +1 -1
- package/dist/cjs/builtin/0x3.d.ts +101 -100
- package/dist/cjs/builtin/0x3.d.ts.map +1 -1
- package/dist/cjs/builtin/0x3.js +200 -200
- package/dist/cjs/builtin/0x3.js.map +1 -1
- package/dist/cjs/codegen/codegen.d.ts.map +1 -1
- package/dist/cjs/codegen/codegen.js +11 -8
- package/dist/cjs/codegen/codegen.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/models.d.ts +7 -1
- package/dist/cjs/models.d.ts.map +1 -1
- package/dist/cjs/models.js +0 -3
- package/dist/cjs/models.js.map +1 -1
- package/dist/cjs/move-coder.d.ts +6 -3
- package/dist/cjs/move-coder.d.ts.map +1 -1
- package/dist/cjs/move-coder.js +50 -5
- package/dist/cjs/move-coder.js.map +1 -1
- package/dist/cjs/sui-chain-adapter.d.ts +4 -1
- package/dist/cjs/sui-chain-adapter.d.ts.map +1 -1
- package/dist/cjs/sui-chain-adapter.js +10 -4
- package/dist/cjs/sui-chain-adapter.js.map +1 -1
- package/dist/esm/builtin/0x1.d.ts +83 -82
- package/dist/esm/builtin/0x1.d.ts.map +1 -1
- package/dist/esm/builtin/0x1.js +165 -165
- package/dist/esm/builtin/0x1.js.map +1 -1
- package/dist/esm/builtin/0x2.d.ts +353 -349
- package/dist/esm/builtin/0x2.d.ts.map +1 -1
- package/dist/esm/builtin/0x2.js +699 -699
- package/dist/esm/builtin/0x2.js.map +1 -1
- package/dist/esm/builtin/0x3.d.ts +101 -100
- package/dist/esm/builtin/0x3.d.ts.map +1 -1
- package/dist/esm/builtin/0x3.js +201 -201
- package/dist/esm/builtin/0x3.js.map +1 -1
- package/dist/esm/codegen/codegen.d.ts.map +1 -1
- package/dist/esm/codegen/codegen.js +12 -9
- package/dist/esm/codegen/codegen.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/models.d.ts +7 -1
- package/dist/esm/models.d.ts.map +1 -1
- package/dist/esm/models.js +0 -3
- package/dist/esm/models.js.map +1 -1
- package/dist/esm/move-coder.d.ts +6 -3
- package/dist/esm/move-coder.d.ts.map +1 -1
- package/dist/esm/move-coder.js +48 -4
- package/dist/esm/move-coder.js.map +1 -1
- package/dist/esm/sui-chain-adapter.d.ts +4 -1
- package/dist/esm/sui-chain-adapter.d.ts.map +1 -1
- package/dist/esm/sui-chain-adapter.js +10 -4
- package/dist/esm/sui-chain-adapter.js.map +1 -1
- package/package.json +2 -2
- package/src/builtin/0x1.ts +503 -247
- package/src/builtin/0x2.ts +2137 -1049
- package/src/builtin/0x3.ts +611 -301
- package/src/codegen/codegen.ts +14 -10
- package/src/index.ts +1 -1
- package/src/models.ts +7 -4
- package/src/move-coder.ts +57 -6
- package/src/sui-chain-adapter.ts +11 -4
- package/src/tests/types/testnet/0x1e2b124f746a339b3cf99b9f969393a96594519aafb1d06517aacfeeae20e7a5.ts +29 -13
- package/src/tests/types/testnet/0x6c4a21e3e7e6b6d51c4604021633e1d97e24e37a696f8c082cd48f37503e602a.ts +319 -145
- package/src/tests/types/testnet/0xdee9.ts +303 -142
- package/src/tests/types/testnet/0xebaa2ad3eacc230f309cd933958cc52684df0a41ae7ac214d186b80f830867d2.ts +990 -466
package/src/codegen/codegen.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SuiMoveNormalizedModule, SuiEvent, SuiMoveObject } from '@mysten/sui.js/client'
|
|
1
|
+
import { SuiMoveNormalizedModule, SuiEvent, SuiMoveObject, SuiClient } from '@mysten/sui.js/client'
|
|
2
2
|
|
|
3
3
|
import * as fs from 'fs'
|
|
4
4
|
import chalk from 'chalk'
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
InternalMoveFunction,
|
|
11
11
|
InternalMoveFunctionVisibility,
|
|
12
12
|
normalizeToJSName,
|
|
13
|
-
camel
|
|
13
|
+
camel
|
|
14
14
|
} from '@typemove/move'
|
|
15
15
|
import { join } from 'path'
|
|
16
16
|
import { SuiChainAdapter } from '../sui-chain-adapter.js'
|
|
@@ -46,7 +46,7 @@ export class SuiCodegen extends AbstractCodegen<
|
|
|
46
46
|
PAYLOAD_OPTIONAL = true
|
|
47
47
|
|
|
48
48
|
constructor(endpoint: string) {
|
|
49
|
-
super(new SuiChainAdapter(endpoint))
|
|
49
|
+
super(new SuiChainAdapter(new SuiClient({ url: endpoint })))
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
readModulesFile(fullPath: string) {
|
|
@@ -113,7 +113,7 @@ export class SuiCodegen extends AbstractCodegen<
|
|
|
113
113
|
if (arg.reference) {
|
|
114
114
|
args.push({
|
|
115
115
|
paramType: `${this.ADDRESS_TYPE} | ObjectCallArg | TransactionArgument`,
|
|
116
|
-
callValue: `_args.push(TransactionArgument.is(args[${idx}]) ? args[${idx}] : tx.object(args[${idx}]))
|
|
116
|
+
callValue: `_args.push(TransactionArgument.is(args[${idx}]) ? args[${idx}] : tx.object(args[${idx}]))`
|
|
117
117
|
})
|
|
118
118
|
} else if (arg.isVector()) {
|
|
119
119
|
args.push({
|
|
@@ -121,12 +121,12 @@ export class SuiCodegen extends AbstractCodegen<
|
|
|
121
121
|
callValue: `_args.push(TransactionArgument.is(args[${idx}]) ? args[${idx}] : tx.makeMoveVec({
|
|
122
122
|
objects: args[${idx}].map((a: any) => tx.object(a))
|
|
123
123
|
// type: TODO
|
|
124
|
-
}))
|
|
124
|
+
}))`
|
|
125
125
|
})
|
|
126
126
|
} else {
|
|
127
127
|
args.push({
|
|
128
128
|
paramType: `${this.generateTypeForDescriptor(arg, module.address)} | TransactionArgument`,
|
|
129
|
-
callValue: `_args.push(TransactionArgument.is(args[${idx}]) ? args[${idx}] : tx.pure(args[${idx}]))
|
|
129
|
+
callValue: `_args.push(TransactionArgument.is(args[${idx}]) ? args[${idx}] : tx.pure(args[${idx}]))`
|
|
130
130
|
})
|
|
131
131
|
}
|
|
132
132
|
}
|
|
@@ -146,18 +146,22 @@ export class SuiCodegen extends AbstractCodegen<
|
|
|
146
146
|
.join(',')
|
|
147
147
|
|
|
148
148
|
const args = this.generateArgs(module, func)
|
|
149
|
+
const returnType = `${this.generateFunctionReturnTypeParameters(func, module.address)}`
|
|
149
150
|
|
|
150
151
|
return `export async function ${camel(normalizeToJSName(func.name))}${genericString}(
|
|
151
152
|
client: SuiClient,
|
|
152
153
|
args: [${args.map((a) => a.paramType).join(',')}],
|
|
153
|
-
${
|
|
154
|
+
${
|
|
155
|
+
typeParamArg.length > 0 ? `typeArguments: [${typeParamArg}]` : ``
|
|
156
|
+
} ): Promise<TypedDevInspectResults<${returnType}>> {
|
|
154
157
|
const tx = new TransactionBlock()
|
|
155
158
|
builder.${camel(normalizeToJSName(func.name))}(tx, args ${typeParamArg.length > 0 ? `, typeArguments` : ''})
|
|
156
|
-
const
|
|
159
|
+
const insepctRes = await client.devInspectTransactionBlock({
|
|
157
160
|
transactionBlock: tx,
|
|
158
161
|
sender: ZERO_ADDRESS
|
|
159
162
|
})
|
|
160
|
-
|
|
163
|
+
|
|
164
|
+
return (await getMoveCoder(client)).decodeDevInspectResult<${returnType}>(insepctRes)
|
|
161
165
|
}`
|
|
162
166
|
}
|
|
163
167
|
|
|
@@ -200,7 +204,7 @@ export class SuiCodegen extends AbstractCodegen<
|
|
|
200
204
|
generateImports(): string {
|
|
201
205
|
return `
|
|
202
206
|
${super.generateImports()}
|
|
203
|
-
import { ZERO_ADDRESS } from '@typemove/sui'
|
|
207
|
+
import { ZERO_ADDRESS, TypedDevInspectResults, getMoveCoder } from '@typemove/sui'
|
|
204
208
|
import { TransactionBlock } from '@mysten/sui.js/transactions'
|
|
205
209
|
import { ObjectCallArg, TransactionArgument } from '@mysten/sui.js'
|
|
206
210
|
import { SuiClient } from '@mysten/sui.js/client'
|
package/src/index.ts
CHANGED
package/src/models.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SuiEvent, MoveCallSuiTransaction, SuiMoveObject } from '@mysten/sui.js/client'
|
|
1
|
+
import type { SuiEvent, MoveCallSuiTransaction, SuiMoveObject, DevInspectResults } from '@mysten/sui.js/client'
|
|
2
2
|
import { DecodedStruct } from '@typemove/move'
|
|
3
3
|
|
|
4
4
|
export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000000'
|
|
@@ -13,6 +13,9 @@ export type TypedFunctionPayload<T extends Array<any>> = MoveCallSuiTransaction
|
|
|
13
13
|
arguments_decoded: T
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
export type TypedDevInspectResults<T extends Array<any>> = DevInspectResults & {
|
|
17
|
+
/**
|
|
18
|
+
* Decoded return values using ABI, undefined if there is decoding error, usually because the ABI/data mismatch
|
|
19
|
+
*/
|
|
20
|
+
results_decoded?: T
|
|
21
|
+
}
|
package/src/move-coder.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TypedEventInstance, TypedFunctionPayload } from './models.js'
|
|
1
|
+
import { TypedDevInspectResults, TypedEventInstance, TypedFunctionPayload } from './models.js'
|
|
2
2
|
import {
|
|
3
3
|
AbstractMoveCoder,
|
|
4
4
|
ANY_TYPE,
|
|
@@ -13,7 +13,9 @@ import {
|
|
|
13
13
|
SuiCallArg,
|
|
14
14
|
SuiEvent,
|
|
15
15
|
SuiMoveNormalizedModule,
|
|
16
|
-
SuiMoveObject
|
|
16
|
+
SuiMoveObject,
|
|
17
|
+
DevInspectResults,
|
|
18
|
+
SuiClient
|
|
17
19
|
} from '@mysten/sui.js/client'
|
|
18
20
|
import { toInternalModule } from './to-internal.js'
|
|
19
21
|
import { SuiChainAdapter } from './sui-chain-adapter.js'
|
|
@@ -28,8 +30,8 @@ export class MoveCoder extends AbstractMoveCoder<
|
|
|
28
30
|
> {
|
|
29
31
|
bcs = new BCS(getSuiMoveConfig())
|
|
30
32
|
|
|
31
|
-
constructor(
|
|
32
|
-
super(new SuiChainAdapter(
|
|
33
|
+
constructor(client: SuiClient) {
|
|
34
|
+
super(new SuiChainAdapter(client))
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
load(module: SuiMoveNormalizedModule): InternalMoveModule {
|
|
@@ -193,8 +195,15 @@ export class MoveCoder extends AbstractMoveCoder<
|
|
|
193
195
|
}
|
|
194
196
|
}
|
|
195
197
|
|
|
198
|
+
private bcsRegistered = new Set<string>()
|
|
199
|
+
|
|
196
200
|
async registerBCSTypes(type: TypeDescriptor): Promise<void> {
|
|
197
|
-
|
|
201
|
+
const sig = type.getNormalizedSignature()
|
|
202
|
+
if (this.bcsRegistered.has(sig)) {
|
|
203
|
+
return
|
|
204
|
+
}
|
|
205
|
+
this.bcsRegistered.add(sig)
|
|
206
|
+
|
|
198
207
|
await this._registerBCSType('0x1::string::String')
|
|
199
208
|
|
|
200
209
|
for (const typeArg of type.dependedTypes()) {
|
|
@@ -206,16 +215,58 @@ export class MoveCoder extends AbstractMoveCoder<
|
|
|
206
215
|
await this.registerBCSTypes(type)
|
|
207
216
|
return this.bcs.de(type.getNormalizedSignature(), data, encoding)
|
|
208
217
|
}
|
|
218
|
+
|
|
219
|
+
async decodeDevInspectResult<T extends any[]>(insepctRes: DevInspectResults): Promise<TypedDevInspectResults<T>> {
|
|
220
|
+
const returnValues = []
|
|
221
|
+
if (insepctRes.results != null) {
|
|
222
|
+
for (const r of insepctRes.results) {
|
|
223
|
+
if (r.returnValues) {
|
|
224
|
+
const type = parseMoveType(r.returnValues[0][1])
|
|
225
|
+
const value = r.returnValues[0][0]
|
|
226
|
+
const bcsDecoded = await this.decodeBCS(type, new Uint8Array(value))
|
|
227
|
+
const decoded = await this.decodedType(bcsDecoded, type)
|
|
228
|
+
returnValues.push(decoded)
|
|
229
|
+
} else {
|
|
230
|
+
returnValues.push(null)
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { ...insepctRes, results_decoded: returnValues as any }
|
|
235
|
+
}
|
|
209
236
|
}
|
|
210
237
|
|
|
211
238
|
const DEFAULT_ENDPOINT = 'https://fullnode.mainnet.sui.io/'
|
|
212
239
|
const CODER_MAP = new Map<string, MoveCoder>()
|
|
240
|
+
const CHAIN_ID_CODER_MAP = new Map<string, MoveCoder>()
|
|
213
241
|
|
|
214
242
|
export function defaultMoveCoder(endpoint: string = DEFAULT_ENDPOINT): MoveCoder {
|
|
215
243
|
let coder = CODER_MAP.get(endpoint)
|
|
216
244
|
if (!coder) {
|
|
217
|
-
coder = new MoveCoder(DEFAULT_ENDPOINT)
|
|
245
|
+
coder = new MoveCoder(new SuiClient({ url: DEFAULT_ENDPOINT }))
|
|
218
246
|
CODER_MAP.set(endpoint, coder)
|
|
219
247
|
}
|
|
220
248
|
return coder
|
|
221
249
|
}
|
|
250
|
+
|
|
251
|
+
const PROVIDER_CODER_MAP = new Map<SuiClient, MoveCoder>()
|
|
252
|
+
|
|
253
|
+
let DEFAULT_CHAIN_ID: string | undefined
|
|
254
|
+
|
|
255
|
+
export async function getMoveCoder(client: SuiClient): Promise<MoveCoder> {
|
|
256
|
+
let coder = PROVIDER_CODER_MAP.get(client)
|
|
257
|
+
if (!coder) {
|
|
258
|
+
coder = new MoveCoder(client)
|
|
259
|
+
// TODO how to dedup
|
|
260
|
+
const id = await client.getChainIdentifier()
|
|
261
|
+
const defaultCoder = defaultMoveCoder()
|
|
262
|
+
if (!DEFAULT_CHAIN_ID) {
|
|
263
|
+
DEFAULT_CHAIN_ID = await defaultCoder.adapter.getChainId()
|
|
264
|
+
}
|
|
265
|
+
if (id === DEFAULT_CHAIN_ID) {
|
|
266
|
+
coder = defaultCoder
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
PROVIDER_CODER_MAP.set(client, coder)
|
|
270
|
+
}
|
|
271
|
+
return coder
|
|
272
|
+
}
|
package/src/sui-chain-adapter.ts
CHANGED
|
@@ -15,23 +15,30 @@ export class SuiChainAdapter extends ChainAdapter<
|
|
|
15
15
|
SuiMoveNormalizedModule,
|
|
16
16
|
SuiEvent | SuiMoveObject
|
|
17
17
|
> {
|
|
18
|
+
async getChainId() {
|
|
19
|
+
return this.client.getChainIdentifier()
|
|
20
|
+
}
|
|
18
21
|
// static INSTANCE = new SuiChainAdapter()
|
|
19
22
|
|
|
23
|
+
client: SuiClient
|
|
24
|
+
constructor(client: SuiClient) {
|
|
25
|
+
super()
|
|
26
|
+
this.client = client
|
|
27
|
+
}
|
|
28
|
+
|
|
20
29
|
async fetchModule(
|
|
21
30
|
account: string,
|
|
22
31
|
module: string
|
|
23
32
|
// network: SuiNetwork
|
|
24
33
|
): Promise<SuiMoveNormalizedModule> {
|
|
25
|
-
|
|
26
|
-
return await client.getNormalizedMoveModule({ package: account, module })
|
|
34
|
+
return await this.client.getNormalizedMoveModule({ package: account, module })
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
async fetchModules(
|
|
30
38
|
account: string
|
|
31
39
|
// network: SuiNetwork
|
|
32
40
|
): Promise<SuiMoveNormalizedModule[]> {
|
|
33
|
-
const
|
|
34
|
-
const modules = await client.getNormalizedMoveModulesByPackage({
|
|
41
|
+
const modules = await this.client.getNormalizedMoveModulesByPackage({
|
|
35
42
|
package: account
|
|
36
43
|
})
|
|
37
44
|
return Object.values(modules)
|
|
@@ -9,7 +9,11 @@ import { MoveCoder, TypedEventInstance } from "@typemove/sui";
|
|
|
9
9
|
|
|
10
10
|
import { defaultMoveCoder } from "@typemove/sui";
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
ZERO_ADDRESS,
|
|
14
|
+
TypedDevInspectResults,
|
|
15
|
+
getMoveCoder,
|
|
16
|
+
} from "@typemove/sui";
|
|
13
17
|
import { TransactionBlock } from "@mysten/sui.js/transactions";
|
|
14
18
|
import { ObjectCallArg, TransactionArgument } from "@mysten/sui.js";
|
|
15
19
|
import { SuiClient } from "@mysten/sui.js/client";
|
|
@@ -217,27 +221,33 @@ export namespace oracle {
|
|
|
217
221
|
string | ObjectCallArg | TransactionArgument,
|
|
218
222
|
],
|
|
219
223
|
typeArguments: [TypeDescriptor<T0> | string],
|
|
220
|
-
) {
|
|
224
|
+
): Promise<TypedDevInspectResults<[]>> {
|
|
221
225
|
const tx = new TransactionBlock();
|
|
222
226
|
builder.copyKey(tx, args, typeArguments);
|
|
223
|
-
const
|
|
227
|
+
const insepctRes = await client.devInspectTransactionBlock({
|
|
224
228
|
transactionBlock: tx,
|
|
225
229
|
sender: ZERO_ADDRESS,
|
|
226
230
|
});
|
|
227
|
-
|
|
231
|
+
|
|
232
|
+
return (await getMoveCoder(client)).decodeDevInspectResult<[]>(
|
|
233
|
+
insepctRes,
|
|
234
|
+
);
|
|
228
235
|
}
|
|
229
236
|
export async function getOracle<T0 = any>(
|
|
230
237
|
client: SuiClient,
|
|
231
238
|
args: [string | ObjectCallArg | TransactionArgument],
|
|
232
239
|
typeArguments: [TypeDescriptor<T0> | string],
|
|
233
|
-
) {
|
|
240
|
+
): Promise<TypedDevInspectResults<[bigint, bigint, bigint, bigint]>> {
|
|
234
241
|
const tx = new TransactionBlock();
|
|
235
242
|
builder.getOracle(tx, args, typeArguments);
|
|
236
|
-
const
|
|
243
|
+
const insepctRes = await client.devInspectTransactionBlock({
|
|
237
244
|
transactionBlock: tx,
|
|
238
245
|
sender: ZERO_ADDRESS,
|
|
239
246
|
});
|
|
240
|
-
|
|
247
|
+
|
|
248
|
+
return (await getMoveCoder(client)).decodeDevInspectResult<
|
|
249
|
+
[bigint, bigint, bigint, bigint]
|
|
250
|
+
>(insepctRes);
|
|
241
251
|
}
|
|
242
252
|
export async function newOracle<T0 = any>(
|
|
243
253
|
client: SuiClient,
|
|
@@ -246,14 +256,17 @@ export namespace oracle {
|
|
|
246
256
|
string | ObjectCallArg | TransactionArgument,
|
|
247
257
|
],
|
|
248
258
|
typeArguments: [TypeDescriptor<T0> | string],
|
|
249
|
-
) {
|
|
259
|
+
): Promise<TypedDevInspectResults<[]>> {
|
|
250
260
|
const tx = new TransactionBlock();
|
|
251
261
|
builder.newOracle(tx, args, typeArguments);
|
|
252
|
-
const
|
|
262
|
+
const insepctRes = await client.devInspectTransactionBlock({
|
|
253
263
|
transactionBlock: tx,
|
|
254
264
|
sender: ZERO_ADDRESS,
|
|
255
265
|
});
|
|
256
|
-
|
|
266
|
+
|
|
267
|
+
return (await getMoveCoder(client)).decodeDevInspectResult<[]>(
|
|
268
|
+
insepctRes,
|
|
269
|
+
);
|
|
257
270
|
}
|
|
258
271
|
export async function update<T0 = any>(
|
|
259
272
|
client: SuiClient,
|
|
@@ -266,14 +279,17 @@ export namespace oracle {
|
|
|
266
279
|
string | ObjectCallArg | TransactionArgument,
|
|
267
280
|
],
|
|
268
281
|
typeArguments: [TypeDescriptor<T0> | string],
|
|
269
|
-
) {
|
|
282
|
+
): Promise<TypedDevInspectResults<[]>> {
|
|
270
283
|
const tx = new TransactionBlock();
|
|
271
284
|
builder.update(tx, args, typeArguments);
|
|
272
|
-
const
|
|
285
|
+
const insepctRes = await client.devInspectTransactionBlock({
|
|
273
286
|
transactionBlock: tx,
|
|
274
287
|
sender: ZERO_ADDRESS,
|
|
275
288
|
});
|
|
276
|
-
|
|
289
|
+
|
|
290
|
+
return (await getMoveCoder(client)).decodeDevInspectResult<[]>(
|
|
291
|
+
insepctRes,
|
|
292
|
+
);
|
|
277
293
|
}
|
|
278
294
|
}
|
|
279
295
|
}
|