@sentio/sdk 3.0.0-rc-next.1 → 3.0.0-rc-next.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.
Files changed (99) hide show
  1. package/lib/core/base-context.d.ts +2 -4
  2. package/lib/core/base-context.d.ts.map +1 -1
  3. package/lib/core/base-context.js +2 -6
  4. package/lib/core/base-context.js.map +1 -1
  5. package/lib/core/core-plugin.d.ts.map +1 -1
  6. package/lib/core/core-plugin.js +1 -6
  7. package/lib/core/core-plugin.js.map +1 -1
  8. package/lib/core/event-logger.d.ts +0 -5
  9. package/lib/core/event-logger.d.ts.map +1 -1
  10. package/lib/core/event-logger.js +16 -30
  11. package/lib/core/event-logger.js.map +1 -1
  12. package/lib/core/index.d.ts +1 -1
  13. package/lib/core/index.d.ts.map +1 -1
  14. package/lib/core/index.js +1 -1
  15. package/lib/core/index.js.map +1 -1
  16. package/lib/core/meter.d.ts +0 -43
  17. package/lib/core/meter.d.ts.map +1 -1
  18. package/lib/core/meter.js +18 -122
  19. package/lib/core/meter.js.map +1 -1
  20. package/lib/fuel/asset-processor.d.ts.map +1 -1
  21. package/lib/fuel/asset-processor.js +5 -1
  22. package/lib/fuel/asset-processor.js.map +1 -1
  23. package/lib/stark/codegen/codegen.d.ts +2 -0
  24. package/lib/stark/codegen/codegen.d.ts.map +1 -0
  25. package/lib/stark/codegen/codegen.js +110 -0
  26. package/lib/stark/codegen/codegen.js.map +1 -0
  27. package/lib/stark/codegen/index.d.ts +2 -0
  28. package/lib/stark/codegen/index.d.ts.map +1 -0
  29. package/lib/stark/codegen/index.js +2 -0
  30. package/lib/stark/codegen/index.js.map +1 -0
  31. package/lib/stark/codegen/run.d.ts +2 -0
  32. package/lib/stark/codegen/run.d.ts.map +1 -0
  33. package/lib/stark/codegen/run.js +11 -0
  34. package/lib/stark/codegen/run.js.map +1 -0
  35. package/lib/stark/codegen/utils.d.ts +2 -0
  36. package/lib/stark/codegen/utils.d.ts.map +1 -0
  37. package/lib/stark/codegen/utils.js +4 -0
  38. package/lib/stark/codegen/utils.js.map +1 -0
  39. package/lib/stark/context.d.ts +28 -0
  40. package/lib/stark/context.d.ts.map +1 -0
  41. package/lib/stark/context.js +59 -0
  42. package/lib/stark/context.js.map +1 -0
  43. package/lib/stark/contract.d.ts +12 -0
  44. package/lib/stark/contract.d.ts.map +1 -0
  45. package/lib/stark/contract.js +43 -0
  46. package/lib/stark/contract.js.map +1 -0
  47. package/lib/stark/event.d.ts +7 -0
  48. package/lib/stark/event.d.ts.map +1 -0
  49. package/lib/stark/event.js +11 -0
  50. package/lib/stark/event.js.map +1 -0
  51. package/lib/stark/index.d.ts +7 -0
  52. package/lib/stark/index.d.ts.map +1 -0
  53. package/lib/stark/index.js +7 -0
  54. package/lib/stark/index.js.map +1 -0
  55. package/lib/stark/starknet-plugin.d.ts +15 -0
  56. package/lib/stark/starknet-plugin.d.ts.map +1 -0
  57. package/lib/stark/starknet-plugin.js +87 -0
  58. package/lib/stark/starknet-plugin.js.map +1 -0
  59. package/lib/stark/starknet-processor.d.ts +35 -0
  60. package/lib/stark/starknet-processor.d.ts.map +1 -0
  61. package/lib/stark/starknet-processor.js +133 -0
  62. package/lib/stark/starknet-processor.js.map +1 -0
  63. package/lib/stark/types.d.ts +11 -0
  64. package/lib/stark/types.d.ts.map +1 -0
  65. package/lib/stark/types.js +2 -0
  66. package/lib/stark/types.js.map +1 -0
  67. package/lib/testing/starknet-facet.d.ts +9 -0
  68. package/lib/testing/starknet-facet.d.ts.map +1 -0
  69. package/lib/testing/starknet-facet.js +53 -0
  70. package/lib/testing/starknet-facet.js.map +1 -0
  71. package/lib/testing/test-processor-server.d.ts +2 -0
  72. package/lib/testing/test-processor-server.d.ts.map +1 -1
  73. package/lib/testing/test-processor-server.js +3 -0
  74. package/lib/testing/test-processor-server.js.map +1 -1
  75. package/lib/utils/price.js +1 -1
  76. package/package.json +9 -5
  77. package/src/core/base-context.ts +2 -6
  78. package/src/core/core-plugin.ts +1 -6
  79. package/src/core/event-logger.ts +18 -35
  80. package/src/core/index.ts +1 -12
  81. package/src/core/meter.ts +18 -148
  82. package/src/fuel/asset-processor.ts +5 -2
  83. package/src/stark/codegen/codegen.ts +125 -0
  84. package/src/stark/codegen/index.ts +1 -0
  85. package/src/stark/codegen/run.ts +10 -0
  86. package/src/stark/codegen/utils.ts +3 -0
  87. package/src/stark/context.ts +78 -0
  88. package/src/stark/contract.ts +55 -0
  89. package/src/stark/event.ts +7 -0
  90. package/src/stark/index.ts +9 -0
  91. package/src/stark/starknet-plugin.ts +116 -0
  92. package/src/stark/starknet-processor.ts +164 -0
  93. package/src/stark/types.ts +11 -0
  94. package/src/testing/starknet-facet.ts +62 -0
  95. package/src/testing/test-processor-server.ts +3 -0
  96. package/src/utils/price.ts +1 -1
  97. package/lib/core/base-context.test.d.ts +0 -2
  98. package/lib/core/base-context.test.d.ts.map +0 -1
  99. package/lib/core/base-context.test.js.map +0 -1
@@ -0,0 +1,164 @@
1
+ import { Data_StarknetEvent, ProcessResult } from '@sentio/protos'
2
+ import { StarknetChainId } from '@sentio/chain'
3
+ import { CallData, events, ParsedEvent, RpcProvider } from 'starknet'
4
+ import { StarknetContext } from './context.js'
5
+ import { StarknetEvent } from './event.js'
6
+ import { ListStateStorage, mergeProcessResults } from '@sentio/runtime'
7
+ import { StarknetProcessorConfig } from './types.js'
8
+ import { StarknetContractView } from './contract.js'
9
+ import { getHandlerName, proxyProcessor } from '../utils/metrics.js'
10
+ import { HandlerOptions } from '../core/handler-options.js'
11
+
12
+ export class StarknetProcessor {
13
+ callHandlers: CallHandler<Data_StarknetEvent>[] = []
14
+
15
+ private provider: RpcProvider
16
+
17
+ static bind(config: StarknetProcessorConfig): StarknetProcessor {
18
+ const processor = new StarknetProcessor(config)
19
+ StarknetProcessorState.INSTANCE.addValue(processor)
20
+ return processor
21
+ }
22
+
23
+ classHash: string
24
+
25
+ constructor(readonly config: StarknetProcessorConfig) {
26
+ return proxyProcessor(this)
27
+ }
28
+
29
+ async configure() {
30
+ this.provider = new RpcProvider({
31
+ nodeUrl: getRpcEndpoint(this.config.chainId)
32
+ })
33
+ const classHash = await this.provider.getClassHashAt(this.config.address)
34
+ if (!classHash) {
35
+ throw new Error("can't find the class hash defined at " + this.config.address)
36
+ }
37
+ this.classHash = classHash
38
+ if (!this.config.abi) {
39
+ const clazz = await this.provider.getClass(classHash, 'latest')
40
+ this.config.abi = clazz.abi
41
+ }
42
+ }
43
+
44
+ public onEvent(
45
+ event: string | string[],
46
+ handler: (events: StarknetEvent<ParsedEvent>, ctx: StarknetContext<StarknetContractView>) => void | Promise<void>,
47
+ handlerOptions?: HandlerOptions<object, StarknetEvent<ParsedEvent>>
48
+ ) {
49
+ const eventFilter = Array.isArray(event) ? event : [event]
50
+ if (!this.config.abi) {
51
+ throw new Error('abi not found')
52
+ }
53
+ const abi = this.config.abi
54
+ const callHandler = {
55
+ handlerName: getHandlerName(),
56
+ handler: async (call: Data_StarknetEvent) => {
57
+ try {
58
+ const eventData = [call.result] as any[]
59
+ const abiEvents = events.getAbiEvents(abi)
60
+
61
+ const abiStructs = CallData.getAbiStruct(abi)
62
+ const abiEnums = CallData.getAbiEnum(abi)
63
+
64
+ const parsedEvents = events.parseEvents(eventData, abiEvents, abiStructs, abiEnums)
65
+ const results: ProcessResult[] = []
66
+ const { block_hash, block_number, transaction_hash, from_address } = call.result!
67
+ for (let i = 0; i < parsedEvents.length; i++) {
68
+ const ctx = new StarknetContext<StarknetContractView>(
69
+ this.config,
70
+ this.provider,
71
+ block_number,
72
+ block_hash,
73
+ transaction_hash,
74
+ i,
75
+ this.classHash
76
+ )
77
+ const e = new StarknetEvent(from_address, transaction_hash, parsedEvents[i])
78
+ try {
79
+ await handler(e, ctx)
80
+ } catch (e) {
81
+ console.error(e)
82
+ }
83
+ results.push(ctx.stopAndGetResult())
84
+ }
85
+ return mergeProcessResults(results)
86
+ } catch (e) {
87
+ console.error(e)
88
+ return ProcessResult.fromPartial({})
89
+ }
90
+ },
91
+ eventFilter,
92
+ partitionHandler: async (call: Data_StarknetEvent): Promise<string | undefined> => {
93
+ const p = handlerOptions?.partitionKey
94
+ if (!p) return undefined
95
+ if (typeof p === 'function') {
96
+ try {
97
+ const eventData = [call.result] as any[]
98
+ const abiEvents = events.getAbiEvents(abi)
99
+ const abiStructs = CallData.getAbiStruct(abi)
100
+ const abiEnums = CallData.getAbiEnum(abi)
101
+ const parsedEvents = events.parseEvents(eventData, abiEvents, abiStructs, abiEnums)
102
+ if (parsedEvents.length > 0) {
103
+ const { from_address, transaction_hash } = call.result!
104
+ const e = new StarknetEvent(from_address, transaction_hash, parsedEvents[0])
105
+ return p(e)
106
+ }
107
+ return undefined
108
+ } catch (e) {
109
+ console.error(e)
110
+ return undefined
111
+ }
112
+ }
113
+ return p
114
+ }
115
+ }
116
+ this.callHandlers.push(callHandler)
117
+ return this
118
+ }
119
+ }
120
+
121
+ export type CallHandler<T> = {
122
+ handlerName: string
123
+ handler: (call: T) => Promise<ProcessResult>
124
+ eventFilter?: string[]
125
+ partitionHandler?: (call: T) => Promise<string | undefined>
126
+ }
127
+
128
+ function getRpcEndpoint(chainId: StarknetChainId | string) {
129
+ switch (chainId) {
130
+ case StarknetChainId.STARKNET_MAINNET:
131
+ return 'https://starknet-mainnet.g.alchemy.com/starknet/version/rpc/v0_8/8sD5yitBslIYCPFzSq_Q1ObJHqPlZxFw'
132
+ default:
133
+ return 'https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_8/8sD5yitBslIYCPFzSq_Q1ObJHqPlZxFw'
134
+ }
135
+ }
136
+
137
+ export class StarknetProcessorState extends ListStateStorage<StarknetProcessor> {
138
+ static INSTANCE = new StarknetProcessorState()
139
+ }
140
+
141
+ export abstract class AbstractStarknetProcessor {
142
+ private readonly processor: StarknetProcessor
143
+ protected constructor(
144
+ readonly abi: any,
145
+ readonly config: StarknetProcessorConfig
146
+ ) {
147
+ this.processor = new StarknetProcessor(config)
148
+ StarknetProcessorState.INSTANCE.addValue(this.processor)
149
+ return proxyProcessor(this)
150
+ }
151
+
152
+ onEvent<T, C>(
153
+ eventName: string,
154
+ structName: string,
155
+ handler: (event: StarknetEvent<T>, ctx: StarknetContext<C>) => Promise<void>
156
+ ) {
157
+ this.processor.onEvent(eventName, async (events, ctx) => {
158
+ const eventData = events.data[structName] as T
159
+ const e = new StarknetEvent<T>(events.caller, events.transactionHash, eventData)
160
+ await handler(e, ctx as StarknetContext<C>)
161
+ })
162
+ return this
163
+ }
164
+ }
@@ -0,0 +1,11 @@
1
+ import { StarknetChainId } from '@sentio/chain'
2
+ import { Abi } from 'starknet'
3
+
4
+ export type StarknetProcessorConfig = {
5
+ address: string
6
+ name?: string
7
+ chainId: StarknetChainId | string
8
+ startBlock?: bigint
9
+ endBlock?: bigint
10
+ abi?: Abi
11
+ }
@@ -0,0 +1,62 @@
1
+ import { TestProcessorServer } from './test-processor-server.js'
2
+ import { DataBinding, HandlerType } from '@sentio/protos'
3
+ import { StarknetChainId } from '@sentio/chain'
4
+
5
+ export class StarknetFacet {
6
+ server: TestProcessorServer
7
+
8
+ constructor(server: TestProcessorServer) {
9
+ this.server = server
10
+ }
11
+
12
+ testOnEvents(events: any, network: StarknetChainId = StarknetChainId.STARKNET_SEPOLIA) {
13
+ const bindings = this.buildBinding(events, network)
14
+ if (!bindings) {
15
+ throw Error('Invalid test : ' + JSON.stringify(events))
16
+ }
17
+
18
+ return this.server.processBindings({
19
+ bindings
20
+ })
21
+ }
22
+
23
+ private buildBinding(events: any, network: StarknetChainId): DataBinding[] {
24
+ const res: DataBinding[] = []
25
+ const data = Array.isArray(events) ? events : [events]
26
+ for (const event of data) {
27
+ for (const config of this.server.contractConfigs) {
28
+ if (config.contract?.chainId !== network) {
29
+ continue
30
+ }
31
+
32
+ for (const logConfig of config.starknetEventConfigs) {
33
+ const binding = {
34
+ data: {
35
+ starknetEvents: {
36
+ result: event,
37
+ timestamp: new Date()
38
+ }
39
+ },
40
+ handlerIds: [logConfig.handlerId],
41
+ handlerType: HandlerType.STARKNET_EVENT,
42
+ chainId: config.contract.chainId
43
+ }
44
+
45
+ const logFilters = logConfig.filters
46
+ const keys = event.keys as string[]
47
+
48
+ for (const key of keys) {
49
+ for (const logFilter of logFilters) {
50
+ if (logFilter.keys.includes(key)) {
51
+ res.push(binding)
52
+ return res
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ return res
61
+ }
62
+ }
@@ -25,6 +25,7 @@ import { EthFacet } from './eth-facet.js'
25
25
  import { SuiFacet } from './sui-facet.js'
26
26
  import { FuelFacet } from './fuel-facet.js'
27
27
  import { CosmosFacet } from './cosmos-facet.js'
28
+ import { StarknetFacet } from './starknet-facet.js'
28
29
  import { Subject } from 'rxjs'
29
30
  import { MemoryDatabase } from './memory-database.js'
30
31
  import { DatabaseSchemaState } from '../core/database-schema.js'
@@ -53,6 +54,7 @@ export class TestProcessorServer implements ProcessorServiceImplementation {
53
54
  iota: IotaFacet
54
55
  fuel: FuelFacet
55
56
  cosmos: CosmosFacet
57
+ starknet: StarknetFacet
56
58
  _db: MemoryDatabase
57
59
 
58
60
  constructor(loader: () => Promise<any>, httpEndpoints: Record<string, string> = {}) {
@@ -66,6 +68,7 @@ export class TestProcessorServer implements ProcessorServiceImplementation {
66
68
  this.iota = new IotaFacet(this)
67
69
  this.fuel = new FuelFacet(this)
68
70
  this.cosmos = new CosmosFacet(this)
71
+ this.starknet = new StarknetFacet(this)
69
72
 
70
73
  for (const k of Object.keys(ChainInfo)) {
71
74
  const http = httpEndpoints[k] || ''
@@ -23,7 +23,7 @@ export function getPriceClient(basePath = Endpoints.INSTANCE.priceFeedAPI) {
23
23
  basePath = basePath.slice(0, -1)
24
24
  }
25
25
  client.setConfig({
26
- baseUrl: basePath || 'https://app.sentio.xyz',
26
+ baseUrl: basePath || 'https://api.sentio.xyz',
27
27
  auth: getApiKey()
28
28
  })
29
29
  return PriceService
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=base-context.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-context.test.d.ts","sourceRoot":"","sources":["../../src/core/base-context.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-context.test.js","sourceRoot":"","sources":["../../src/core/base-context.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAIvC,iDAAiD;AACjD,MAAM,WAAY,SAAQ,WAAW;IACnC,YAAY,UAAmB;QAC7B,KAAK,CAAC,UAAU,CAAC,CAAA;IACnB,CAAC;IAES,mBAAmB,CAAC,IAAY,EAAE,MAAc;QACxD,OAAO;YACL,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,EAAE;YACnB,gBAAgB,EAAE,CAAC;YACnB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,IAAI;SACX,CAAA;IACH,CAAC;IAED,UAAU;QACR,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF;AAED,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;QAChE,MAAM,UAAU,GAAG,OAAO,CAAA;QAC1B,MAAM,UAAU,GAAG,KAAK,CAAA,CAAC,4BAA4B;QACrD,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,UAAU,EAAE,eAAe,CAAC,CAAA;QAE1E,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACxC,IAAI,cAAsB,CAAA;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,8CAA8C;YAC9C,IAAI,CAAC,GAAG,UAAU,KAAK,CAAC,EAAE,CAAC;gBACzB,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACpC,CAAC;YAED,sDAAsD;YACtD,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE;gBAChC,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI,EAAE,eAAe,CAAC,EAAE;gBACxB,MAAM,EAAE;oBACN,KAAK,EAAE,CAAC,GAAG,CAAC;oBACZ,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;iBAClB;aACF,CAAC,CAAA;YAEF,sCAAsC;YACtC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;gBACtC,MAAM,QAAQ,GAAG,YAAY,GAAG,cAAe,CAAA;gBAC/C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAEpB,sCAAsC;gBACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;gBACtC,OAAO,CAAC,GAAG,CACT,aAAa,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,UAAU,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAClI,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QACtC,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAA;QAEnD,kCAAkC;QAClC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QAClE,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,CAAA;QAEhD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,SAAS,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,qCAAqC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEjF,yBAAyB;QACzB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAEvF,mCAAmC;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAEhE,uEAAuE;QACvE,IAAI,iBAAiB,GAAG,GAAG,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;YACpD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAA;QACjF,CAAC;QAED,+DAA+D;QAC/D,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAA;QAC7B,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAErD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;QAE9C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,qCAAqC;YACrC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,MAAM,CAAC,EAAE,EAAE,CAAA;YACb,CAAC;YAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAA;YAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE;oBACjC,EAAE,EAAE,CAAC;oBACL,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,+BAA+B;iBAChE,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAA;YAChD,MAAM,YAAY,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;YAE5D,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,YAAY,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}