on-zero 0.4.26 → 0.4.28

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 (123) hide show
  1. package/dist/cjs/createZeroClient.cjs +14 -1
  2. package/dist/cjs/createZeroClient.native.js +15 -1
  3. package/dist/cjs/createZeroClient.native.js.map +1 -1
  4. package/dist/cjs/httpPull/auth.test.cjs +197 -0
  5. package/dist/cjs/httpPull/auth.test.native.js +279 -0
  6. package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
  7. package/dist/cjs/httpPull/churn.test.cjs +132 -0
  8. package/dist/cjs/httpPull/churn.test.native.js +155 -0
  9. package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
  10. package/dist/cjs/httpPull/fixtureSchema.cjs +76 -0
  11. package/dist/cjs/httpPull/fixtureSchema.native.js +82 -0
  12. package/dist/cjs/httpPull/fixtureSchema.native.js.map +1 -0
  13. package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
  14. package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
  15. package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
  16. package/dist/cjs/httpPull/integration.test.cjs +53 -0
  17. package/dist/cjs/httpPull/integration.test.native.js +60 -0
  18. package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
  19. package/dist/cjs/httpPull/rebase.test.cjs +360 -0
  20. package/dist/cjs/httpPull/rebase.test.native.js +420 -0
  21. package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
  22. package/dist/cjs/httpPull/relations.test.cjs +107 -0
  23. package/dist/cjs/httpPull/relations.test.native.js +119 -0
  24. package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
  25. package/dist/cjs/httpPull/testHarness.cjs +100 -0
  26. package/dist/cjs/httpPull/testHarness.native.js +112 -0
  27. package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
  28. package/dist/cjs/httpPull/transport.test.cjs +588 -0
  29. package/dist/cjs/httpPull/transport.test.native.js +677 -0
  30. package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
  31. package/dist/cjs/httpPullTransport.cjs +447 -0
  32. package/dist/cjs/httpPullTransport.native.js +710 -0
  33. package/dist/cjs/httpPullTransport.native.js.map +1 -0
  34. package/dist/cjs/index.cjs +1 -0
  35. package/dist/cjs/index.native.js +1 -0
  36. package/dist/cjs/index.native.js.map +1 -1
  37. package/dist/esm/createZeroClient.mjs +14 -1
  38. package/dist/esm/createZeroClient.mjs.map +1 -1
  39. package/dist/esm/createZeroClient.native.js +15 -1
  40. package/dist/esm/createZeroClient.native.js.map +1 -1
  41. package/dist/esm/httpPull/auth.test.mjs +198 -0
  42. package/dist/esm/httpPull/auth.test.mjs.map +1 -0
  43. package/dist/esm/httpPull/auth.test.native.js +277 -0
  44. package/dist/esm/httpPull/auth.test.native.js.map +1 -0
  45. package/dist/esm/httpPull/churn.test.mjs +133 -0
  46. package/dist/esm/httpPull/churn.test.mjs.map +1 -0
  47. package/dist/esm/httpPull/churn.test.native.js +153 -0
  48. package/dist/esm/httpPull/churn.test.native.js.map +1 -0
  49. package/dist/esm/httpPull/fixtureSchema.mjs +50 -0
  50. package/dist/esm/httpPull/fixtureSchema.mjs.map +1 -0
  51. package/dist/esm/httpPull/fixtureSchema.native.js +53 -0
  52. package/dist/esm/httpPull/fixtureSchema.native.js.map +1 -0
  53. package/dist/esm/httpPull/fixtureServer.mjs +315 -0
  54. package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
  55. package/dist/esm/httpPull/fixtureServer.native.js +506 -0
  56. package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
  57. package/dist/esm/httpPull/integration.test.mjs +54 -0
  58. package/dist/esm/httpPull/integration.test.mjs.map +1 -0
  59. package/dist/esm/httpPull/integration.test.native.js +58 -0
  60. package/dist/esm/httpPull/integration.test.native.js.map +1 -0
  61. package/dist/esm/httpPull/rebase.test.mjs +361 -0
  62. package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
  63. package/dist/esm/httpPull/rebase.test.native.js +418 -0
  64. package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
  65. package/dist/esm/httpPull/relations.test.mjs +108 -0
  66. package/dist/esm/httpPull/relations.test.mjs.map +1 -0
  67. package/dist/esm/httpPull/relations.test.native.js +117 -0
  68. package/dist/esm/httpPull/relations.test.native.js.map +1 -0
  69. package/dist/esm/httpPull/testHarness.mjs +72 -0
  70. package/dist/esm/httpPull/testHarness.mjs.map +1 -0
  71. package/dist/esm/httpPull/testHarness.native.js +81 -0
  72. package/dist/esm/httpPull/testHarness.native.js.map +1 -0
  73. package/dist/esm/httpPull/transport.test.mjs +589 -0
  74. package/dist/esm/httpPull/transport.test.mjs.map +1 -0
  75. package/dist/esm/httpPull/transport.test.native.js +675 -0
  76. package/dist/esm/httpPull/transport.test.native.js.map +1 -0
  77. package/dist/esm/httpPullTransport.mjs +421 -0
  78. package/dist/esm/httpPullTransport.mjs.map +1 -0
  79. package/dist/esm/httpPullTransport.native.js +681 -0
  80. package/dist/esm/httpPullTransport.native.js.map +1 -0
  81. package/dist/esm/index.js +1 -0
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/index.mjs +1 -0
  84. package/dist/esm/index.mjs.map +1 -1
  85. package/dist/esm/index.native.js +1 -0
  86. package/dist/esm/index.native.js.map +1 -1
  87. package/package.json +2 -2
  88. package/src/createZeroClient.tsx +22 -0
  89. package/src/httpPull/auth.test.ts +208 -0
  90. package/src/httpPull/churn.test.ts +147 -0
  91. package/src/httpPull/fixtureSchema.ts +82 -0
  92. package/src/httpPull/fixtureServer.ts +391 -0
  93. package/src/httpPull/integration.test.ts +57 -0
  94. package/src/httpPull/rebase.test.ts +368 -0
  95. package/src/httpPull/relations.test.ts +135 -0
  96. package/src/httpPull/testHarness.ts +95 -0
  97. package/src/httpPull/transport.test.ts +603 -0
  98. package/src/httpPullTransport.ts +587 -0
  99. package/src/index.ts +1 -0
  100. package/types/createZeroClient.d.ts +3 -1
  101. package/types/createZeroClient.d.ts.map +1 -1
  102. package/types/httpPull/auth.test.d.ts +2 -0
  103. package/types/httpPull/auth.test.d.ts.map +1 -0
  104. package/types/httpPull/churn.test.d.ts +2 -0
  105. package/types/httpPull/churn.test.d.ts.map +1 -0
  106. package/types/httpPull/fixtureSchema.d.ts +111 -0
  107. package/types/httpPull/fixtureSchema.d.ts.map +1 -0
  108. package/types/httpPull/fixtureServer.d.ts +14 -0
  109. package/types/httpPull/fixtureServer.d.ts.map +1 -0
  110. package/types/httpPull/integration.test.d.ts +2 -0
  111. package/types/httpPull/integration.test.d.ts.map +1 -0
  112. package/types/httpPull/rebase.test.d.ts +2 -0
  113. package/types/httpPull/rebase.test.d.ts.map +1 -0
  114. package/types/httpPull/relations.test.d.ts +2 -0
  115. package/types/httpPull/relations.test.d.ts.map +1 -0
  116. package/types/httpPull/testHarness.d.ts +32 -0
  117. package/types/httpPull/testHarness.d.ts.map +1 -0
  118. package/types/httpPull/transport.test.d.ts +2 -0
  119. package/types/httpPull/transport.test.d.ts.map +1 -0
  120. package/types/httpPullTransport.d.ts +13 -0
  121. package/types/httpPullTransport.d.ts.map +1 -0
  122. package/types/index.d.ts +1 -0
  123. package/types/index.d.ts.map +1 -1
@@ -0,0 +1,361 @@
1
+ import { afterEach, expect, test } from "vitest";
2
+ import { eventually, startZeroHttpHarness, waitForComplete } from "./testHarness.mjs";
3
+ let harness;
4
+ afterEach(async () => {
5
+ await harness?.close();
6
+ harness = void 0;
7
+ });
8
+ test("ack-then-pull keeps optimistic rows visible until the authoritative snapshot lands", async () => {
9
+ const postPushPull = deferred();
10
+ const postPushPullStarted = deferred();
11
+ let shouldHoldPostPushPull = false;
12
+ harness = await startZeroHttpHarness({
13
+ seed: {
14
+ user: [{
15
+ id: "u1",
16
+ name: "ada"
17
+ }],
18
+ project: [{
19
+ id: "p1",
20
+ ownerId: "u1",
21
+ name: "first"
22
+ }],
23
+ member: []
24
+ },
25
+ interceptFetch: next => async (input, init) => {
26
+ const path = new URL(String(input)).pathname;
27
+ if (path === "/push") {
28
+ const response = await next(input, init);
29
+ shouldHoldPostPushPull = true;
30
+ return response;
31
+ }
32
+ if (path === "/pull" && shouldHoldPostPushPull) {
33
+ shouldHoldPostPushPull = false;
34
+ postPushPullStarted.resolve();
35
+ await postPushPull.promise;
36
+ }
37
+ return next(input, init);
38
+ }
39
+ });
40
+ const zero = harness.createZero("u1");
41
+ const view = zero.query.project.materialize();
42
+ await waitForComplete(view);
43
+ const emissions = recordEmissions(view);
44
+ const mutation = zero.mutate.project.create({
45
+ id: "p2",
46
+ ownerId: "u1",
47
+ name: "second"
48
+ });
49
+ await mutation.client;
50
+ await eventually(() => expect(projectIDs(view.data)).toContain("p2"));
51
+ await mutation.server;
52
+ await postPushPullStarted.promise;
53
+ expect(projectIDs(view.data)).toContain("p2");
54
+ postPushPull.resolve();
55
+ await harness.transport.pull();
56
+ await eventually(() => expect(projectIDs(view.data).sort()).toEqual(["p1", "p2"]));
57
+ expectNeverDisappearsAfterFirstSeen(emissions, "p2");
58
+ expect(harness.server.rows("project").sort(byID)).toEqual([{
59
+ id: "p1",
60
+ ownerId: "u1",
61
+ name: "first"
62
+ }, {
63
+ id: "p2",
64
+ ownerId: "u1",
65
+ name: "second"
66
+ }]);
67
+ emissions.cleanup();
68
+ view.destroy();
69
+ });
70
+ test("pull-then-ack rebases optimistic rows over a newer snapshot", async () => {
71
+ const pushGate = deferred();
72
+ const pushStarted = deferred();
73
+ harness = await startZeroHttpHarness({
74
+ seed: {
75
+ user: [{
76
+ id: "u1",
77
+ name: "ada"
78
+ }],
79
+ project: [{
80
+ id: "p1",
81
+ ownerId: "u1",
82
+ name: "first"
83
+ }],
84
+ member: []
85
+ },
86
+ interceptFetch: next => async (input, init) => {
87
+ const path = new URL(String(input)).pathname;
88
+ if (path === "/push") {
89
+ const body = JSON.parse(String(init?.body));
90
+ pushStarted.resolve(body);
91
+ await pushGate.promise;
92
+ }
93
+ return next(input, init);
94
+ }
95
+ });
96
+ const zero = harness.createZero("u1");
97
+ const view = zero.query.project.materialize();
98
+ await waitForComplete(view);
99
+ const emissions = recordEmissions(view);
100
+ const mutation = zero.mutate.project.create({
101
+ id: "p2",
102
+ ownerId: "u1",
103
+ name: "optimistic"
104
+ });
105
+ await mutation.client;
106
+ await eventually(() => expect(projectIDs(view.data)).toContain("p2"));
107
+ const heldPush = await pushStarted.promise;
108
+ await rawPush(harness, {
109
+ clientGroupID: heldPush.clientGroupID,
110
+ clientID: "server-side",
111
+ id: 1,
112
+ name: "project|create",
113
+ args: {
114
+ id: "p-server",
115
+ ownerId: "u1",
116
+ name: "server change"
117
+ }
118
+ });
119
+ await harness.transport.pull();
120
+ await eventually(() => expect(projectIDs(view.data).sort()).toEqual(["p-server", "p1", "p2"]));
121
+ expect(harness.server.rows("project").map(row => row.id).sort()).toEqual(["p-server", "p1"]);
122
+ pushGate.resolve();
123
+ await mutation.server;
124
+ await harness.transport.pull();
125
+ await eventually(() => expect(projectIDs(view.data).sort()).toEqual(["p-server", "p1", "p2"]));
126
+ expectNeverDisappearsAfterFirstSeen(emissions, "p2");
127
+ expect(harness.server.rows("project").sort(byID)).toEqual([{
128
+ id: "p-server",
129
+ ownerId: "u1",
130
+ name: "server change"
131
+ }, {
132
+ id: "p1",
133
+ ownerId: "u1",
134
+ name: "first"
135
+ }, {
136
+ id: "p2",
137
+ ownerId: "u1",
138
+ name: "optimistic"
139
+ }]);
140
+ emissions.cleanup();
141
+ view.destroy();
142
+ });
143
+ test("app-error rollback advances LMID and reverts optimistic state after pull", async () => {
144
+ const pushGate = deferred();
145
+ const pushStarted = deferred();
146
+ let clientGroupID = "";
147
+ harness = await startZeroHttpHarness({
148
+ seed: {
149
+ user: [{
150
+ id: "u1",
151
+ name: "ada"
152
+ }, {
153
+ id: "u2",
154
+ name: "ben"
155
+ }],
156
+ project: [{
157
+ id: "p1",
158
+ ownerId: "u2",
159
+ name: "shared"
160
+ }],
161
+ member: [{
162
+ id: "m1",
163
+ projectId: "p1",
164
+ userId: "u1"
165
+ }]
166
+ },
167
+ interceptFetch: next => async (input, init) => {
168
+ if (new URL(String(input)).pathname === "/push") {
169
+ const body = JSON.parse(String(init?.body));
170
+ clientGroupID = body.clientGroupID;
171
+ pushStarted.resolve();
172
+ await pushGate.promise;
173
+ }
174
+ return next(input, init);
175
+ }
176
+ });
177
+ const zero = harness.createZero("u1");
178
+ const view = zero.query.project.materialize();
179
+ await waitForComplete(view);
180
+ const emissions = recordEmissions(view);
181
+ const mutation = zero.mutate.project.rename({
182
+ id: "p1",
183
+ name: "stolen"
184
+ });
185
+ await mutation.client;
186
+ await pushStarted.promise;
187
+ expect(projectName(view.data, "p1")).toBe("stolen");
188
+ expect(harness.server.rows("project")).toEqual([{
189
+ id: "p1",
190
+ ownerId: "u2",
191
+ name: "shared"
192
+ }]);
193
+ pushGate.resolve();
194
+ await expect(mutation.server).resolves.toMatchObject({
195
+ type: "error",
196
+ error: {
197
+ type: "app",
198
+ details: "forbidden"
199
+ }
200
+ });
201
+ await harness.transport.pull();
202
+ await eventually(() => expect(projectName(view.data, "p1")).toBe("shared"));
203
+ expect(emissions.values.map(rows => projectName(rows, "p1"))).toContain("stolen");
204
+ expect(emissions.values.at(-1)?.[0]).toEqual({
205
+ id: "p1",
206
+ ownerId: "u2",
207
+ name: "shared"
208
+ });
209
+ expect(harness.server.rows("project")).toEqual([{
210
+ id: "p1",
211
+ ownerId: "u2",
212
+ name: "shared"
213
+ }]);
214
+ const pull = await rawPull(harness, "u1", {
215
+ clientGroupID
216
+ });
217
+ expect(Object.values(pull.lastMutationIDChanges)).toContain(1);
218
+ emissions.cleanup();
219
+ view.destroy();
220
+ });
221
+ test("app-error rollback removes phantom optimistic create after pull", async () => {
222
+ const pushGate = deferred();
223
+ const pushStarted = deferred();
224
+ let clientGroupID = "";
225
+ harness = await startZeroHttpHarness({
226
+ seed: {
227
+ user: [{
228
+ id: "u1",
229
+ name: "ada"
230
+ }, {
231
+ id: "u2",
232
+ name: "ben"
233
+ }],
234
+ project: [],
235
+ member: []
236
+ },
237
+ interceptFetch: next => async (input, init) => {
238
+ if (new URL(String(input)).pathname === "/push") {
239
+ const body = JSON.parse(String(init?.body));
240
+ clientGroupID = body.clientGroupID;
241
+ pushStarted.resolve();
242
+ await pushGate.promise;
243
+ }
244
+ return next(input, init);
245
+ }
246
+ });
247
+ const zero = harness.createZero("u1");
248
+ const view = zero.query.project.materialize();
249
+ await waitForComplete(view);
250
+ const emissions = recordEmissions(view);
251
+ const mutation = zero.mutate.project.create({
252
+ id: "p-phantom",
253
+ ownerId: "u2",
254
+ name: "forbidden"
255
+ });
256
+ await mutation.client;
257
+ await pushStarted.promise;
258
+ await eventually(() => expect(projectIDs(view.data)).toContain("p-phantom"));
259
+ expect(harness.server.rows("project")).toEqual([]);
260
+ pushGate.resolve();
261
+ await expect(mutation.server).resolves.toMatchObject({
262
+ type: "error",
263
+ error: {
264
+ type: "app",
265
+ details: "forbidden"
266
+ }
267
+ });
268
+ await harness.transport.pull();
269
+ await eventually(() => expect(projectIDs(view.data)).not.toContain("p-phantom"));
270
+ expect(emissions.values.some(rows => projectIDs(rows).includes("p-phantom"))).toBe(true);
271
+ expect(emissions.values.at(-1)).toEqual([]);
272
+ expect(harness.server.rows("project")).toEqual([]);
273
+ const pull = await rawPull(harness, "u1", {
274
+ clientGroupID
275
+ });
276
+ expect(Object.values(pull.lastMutationIDChanges)).toContain(1);
277
+ emissions.cleanup();
278
+ view.destroy();
279
+ });
280
+ async function rawPush(harness2, mutation) {
281
+ const response = await fetch(`${harness2.server.url}/push`, {
282
+ method: "POST",
283
+ headers: {
284
+ authorization: "Bearer token-u1",
285
+ "content-type": "application/json"
286
+ },
287
+ body: JSON.stringify({
288
+ timestamp: Date.now(),
289
+ clientGroupID: mutation.clientGroupID,
290
+ pushVersion: 1,
291
+ requestID: `raw-${mutation.clientID}-${mutation.id}`,
292
+ mutations: [{
293
+ type: "custom",
294
+ name: mutation.name,
295
+ id: mutation.id,
296
+ clientID: mutation.clientID,
297
+ args: [mutation.args]
298
+ }]
299
+ })
300
+ });
301
+ expect(response.status).toBe(200);
302
+ return response.json();
303
+ }
304
+ async function rawPull(harness2, userID, body) {
305
+ const response = await fetch(`${harness2.server.url}/pull`, {
306
+ method: "POST",
307
+ headers: {
308
+ authorization: `Bearer token-${userID}`,
309
+ "content-type": "application/json"
310
+ },
311
+ body: JSON.stringify({
312
+ clientID: "raw-pull",
313
+ clientGroupID: body.clientGroupID,
314
+ cookie: null
315
+ })
316
+ });
317
+ expect(response.status).toBe(200);
318
+ return response.json();
319
+ }
320
+ function recordEmissions(view) {
321
+ const values = [];
322
+ const cleanup = view.addListener(data => values.push(snapshot(data)));
323
+ return {
324
+ values,
325
+ cleanup
326
+ };
327
+ }
328
+ function snapshot(rows) {
329
+ return JSON.parse(JSON.stringify(rows));
330
+ }
331
+ function projectIDs(rows) {
332
+ return rows.map(row => row.id);
333
+ }
334
+ function projectName(rows, id) {
335
+ return rows.find(row => row.id === id)?.name;
336
+ }
337
+ function expectNeverDisappearsAfterFirstSeen(emissions, id) {
338
+ let seen = false;
339
+ for (const rows of emissions.values) {
340
+ if (projectIDs(rows).includes(id)) seen = true;
341
+ if (seen) expect(projectIDs(rows)).toContain(id);
342
+ }
343
+ expect(seen).toBe(true);
344
+ }
345
+ function byID(a, b) {
346
+ return a.id.localeCompare(b.id);
347
+ }
348
+ function deferred() {
349
+ let resolve;
350
+ let reject;
351
+ const promise = new Promise((res, rej) => {
352
+ resolve = res;
353
+ reject = rej;
354
+ });
355
+ return {
356
+ promise,
357
+ resolve,
358
+ reject
359
+ };
360
+ }
361
+ //# sourceMappingURL=rebase.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["afterEach","expect","test","eventually","startZeroHttpHarness","waitForComplete","harness","close","postPushPull","deferred","postPushPullStarted","shouldHoldPostPushPull","seed","user","id","name","project","ownerId","member","interceptFetch","next","input","init","path","URL","String","pathname","response","resolve","promise","zero","createZero","view","query","materialize","emissions","recordEmissions","mutation","mutate","create","client","projectIDs","data","toContain","server","transport","pull","sort","toEqual","expectNeverDisappearsAfterFirstSeen","rows","byID","cleanup","destroy","pushGate","pushStarted","body","JSON","parse","heldPush","rawPush","clientGroupID","clientID","args","map","row","projectId","userId","rename","projectName","toBe","resolves","toMatchObject","type","error","details","values","at","rawPull","Object","lastMutationIDChanges","not","some","includes","harness2","fetch","url","method","headers","authorization","stringify","timestamp","Date","now","pushVersion","requestID","mutations","status","json","userID","cookie","addListener","push","snapshot","find","seen","a","b","localeCompare","reject","Promise","res","rej"],"sources":["../../../src/httpPull/rebase.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,MAAA,EAAQC,IAAA,QAAY;AAExC,SACEC,UAAA,EACAC,oBAAA,EACAC,eAAA,QAEK;AAEP,IAAIC,OAAA;AAEJN,SAAA,CAAU,YAAY;EACpB,MAAMM,OAAA,EAASC,KAAA,CAAM;EACrBD,OAAA,GAAU;AACZ,CAAC;AAEDJ,IAAA,CAAK,sFAAsF,YAAY;EACrG,MAAMM,YAAA,GAAeC,QAAA,CAAe;EACpC,MAAMC,mBAAA,GAAsBD,QAAA,CAAe;EAC3C,IAAIE,sBAAA,GAAyB;EAE7BL,OAAA,GAAU,MAAMF,oBAAA,CAAqB;IACnCQ,IAAA,EAAM;MACJC,IAAA,EAAM,CAAC;QAAEC,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,CAAC;MAChCC,OAAA,EAAS,CAAC;QAAEF,EAAA,EAAI;QAAMG,OAAA,EAAS;QAAMF,IAAA,EAAM;MAAQ,CAAC;MACpDG,MAAA,EAAQ;IACV;IACAC,cAAA,EAAiBC,IAAA,IAAS,OAAOC,KAAA,EAAOC,IAAA,KAAS;MAC/C,MAAMC,IAAA,GAAO,IAAIC,GAAA,CAAIC,MAAA,CAAOJ,KAAK,CAAC,EAAEK,QAAA;MACpC,IAAIH,IAAA,KAAS,SAAS;QACpB,MAAMI,QAAA,GAAW,MAAMP,IAAA,CAAKC,KAAA,EAAOC,IAAI;QACvCX,sBAAA,GAAyB;QACzB,OAAOgB,QAAA;MACT;MACA,IAAIJ,IAAA,KAAS,WAAWZ,sBAAA,EAAwB;QAC9CA,sBAAA,GAAyB;QACzBD,mBAAA,CAAoBkB,OAAA,CAAQ;QAC5B,MAAMpB,YAAA,CAAaqB,OAAA;MACrB;MACA,OAAOT,IAAA,CAAKC,KAAA,EAAOC,IAAI;IACzB;EACF,CAAC;EACD,MAAMQ,IAAA,GAAOxB,OAAA,CAAQyB,UAAA,CAAW,IAAI;EACpC,MAAMC,IAAA,GAAOF,IAAA,CAAKG,KAAA,CAAMjB,OAAA,CAAQkB,WAAA,CAAY;EAC5C,MAAM7B,eAAA,CAAuB2B,IAAI;EACjC,MAAMG,SAAA,GAAYC,eAAA,CAAgBJ,IAAI;EAEtC,MAAMK,QAAA,GAAWP,IAAA,CAAKQ,MAAA,CAAOtB,OAAA,CAAQuB,MAAA,CAAO;IAC1CzB,EAAA,EAAI;IACJG,OAAA,EAAS;IACTF,IAAA,EAAM;EACR,CAAC;EACD,MAAMsB,QAAA,CAASG,MAAA;EACf,MAAMrC,UAAA,CAAW,MAAMF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,CAAC,EAAEC,SAAA,CAAU,IAAI,CAAC;EACpE,MAAMN,QAAA,CAASO,MAAA;EACf,MAAMlC,mBAAA,CAAoBmB,OAAA;EAE1B5B,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,CAAC,EAAEC,SAAA,CAAU,IAAI;EAC5CnC,YAAA,CAAaoB,OAAA,CAAQ;EACrB,MAAMtB,OAAA,CAAQuC,SAAA,CAAUC,IAAA,CAAK;EAC7B,MAAM3C,UAAA,CAAW,MAAMF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,EAAEK,IAAA,CAAK,CAAC,EAAEC,OAAA,CAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;EAEjFC,mCAAA,CAAoCd,SAAA,EAAW,IAAI;EACnDlC,MAAA,CAAOK,OAAA,CAAQsC,MAAA,CAAOM,IAAA,CAAK,SAAS,EAAEH,IAAA,CAAKI,IAAI,CAAC,EAAEH,OAAA,CAAQ,CACxD;IAAElC,EAAA,EAAI;IAAMG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAQ,GACzC;IAAED,EAAA,EAAI;IAAMG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAS,EAC3C;EACDoB,SAAA,CAAUiB,OAAA,CAAQ;EAClBpB,IAAA,CAAKqB,OAAA,CAAQ;AACf,CAAC;AAEDnD,IAAA,CAAK,+DAA+D,YAAY;EAC9E,MAAMoD,QAAA,GAAW7C,QAAA,CAAe;EAChC,MAAM8C,WAAA,GAAc9C,QAAA,CAAc;EAElCH,OAAA,GAAU,MAAMF,oBAAA,CAAqB;IACnCQ,IAAA,EAAM;MACJC,IAAA,EAAM,CAAC;QAAEC,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,CAAC;MAChCC,OAAA,EAAS,CAAC;QAAEF,EAAA,EAAI;QAAMG,OAAA,EAAS;QAAMF,IAAA,EAAM;MAAQ,CAAC;MACpDG,MAAA,EAAQ;IACV;IACAC,cAAA,EAAiBC,IAAA,IAAS,OAAOC,KAAA,EAAOC,IAAA,KAAS;MAC/C,MAAMC,IAAA,GAAO,IAAIC,GAAA,CAAIC,MAAA,CAAOJ,KAAK,CAAC,EAAEK,QAAA;MACpC,IAAIH,IAAA,KAAS,SAAS;QACpB,MAAMiC,IAAA,GAAOC,IAAA,CAAKC,KAAA,CAAMjC,MAAA,CAAOH,IAAA,EAAMkC,IAAI,CAAC;QAC1CD,WAAA,CAAY3B,OAAA,CAAQ4B,IAAI;QACxB,MAAMF,QAAA,CAASzB,OAAA;MACjB;MACA,OAAOT,IAAA,CAAKC,KAAA,EAAOC,IAAI;IACzB;EACF,CAAC;EACD,MAAMQ,IAAA,GAAOxB,OAAA,CAAQyB,UAAA,CAAW,IAAI;EACpC,MAAMC,IAAA,GAAOF,IAAA,CAAKG,KAAA,CAAMjB,OAAA,CAAQkB,WAAA,CAAY;EAC5C,MAAM7B,eAAA,CAAuB2B,IAAI;EACjC,MAAMG,SAAA,GAAYC,eAAA,CAAgBJ,IAAI;EAEtC,MAAMK,QAAA,GAAWP,IAAA,CAAKQ,MAAA,CAAOtB,OAAA,CAAQuB,MAAA,CAAO;IAC1CzB,EAAA,EAAI;IACJG,OAAA,EAAS;IACTF,IAAA,EAAM;EACR,CAAC;EACD,MAAMsB,QAAA,CAASG,MAAA;EACf,MAAMrC,UAAA,CAAW,MAAMF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,CAAC,EAAEC,SAAA,CAAU,IAAI,CAAC;EAEpE,MAAMgB,QAAA,GAAW,MAAMJ,WAAA,CAAY1B,OAAA;EACnC,MAAM+B,OAAA,CAAQtD,OAAA,EAAS;IACrBuD,aAAA,EAAeF,QAAA,CAASE,aAAA;IACxBC,QAAA,EAAU;IACVhD,EAAA,EAAI;IACJC,IAAA,EAAM;IACNgD,IAAA,EAAM;MAAEjD,EAAA,EAAI;MAAYG,OAAA,EAAS;MAAMF,IAAA,EAAM;IAAgB;EAC/D,CAAC;EACD,MAAMT,OAAA,CAAQuC,SAAA,CAAUC,IAAA,CAAK;EAE7B,MAAM3C,UAAA,CAAW,MACfF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,EAAEK,IAAA,CAAK,CAAC,EAAEC,OAAA,CAAQ,CAAC,YAAY,MAAM,IAAI,CAAC,CACvE;EACA/C,MAAA,CACEK,OAAA,CAAQsC,MAAA,CACLM,IAAA,CAAK,SAAS,EACdc,GAAA,CAAKC,GAAA,IAAQA,GAAA,CAAInD,EAAE,EACnBiC,IAAA,CAAK,CACV,EAAEC,OAAA,CAAQ,CAAC,YAAY,IAAI,CAAC;EAE5BM,QAAA,CAAS1B,OAAA,CAAQ;EACjB,MAAMS,QAAA,CAASO,MAAA;EACf,MAAMtC,OAAA,CAAQuC,SAAA,CAAUC,IAAA,CAAK;EAC7B,MAAM3C,UAAA,CAAW,MACfF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,EAAEK,IAAA,CAAK,CAAC,EAAEC,OAAA,CAAQ,CAAC,YAAY,MAAM,IAAI,CAAC,CACvE;EAEAC,mCAAA,CAAoCd,SAAA,EAAW,IAAI;EACnDlC,MAAA,CAAOK,OAAA,CAAQsC,MAAA,CAAOM,IAAA,CAAK,SAAS,EAAEH,IAAA,CAAKI,IAAI,CAAC,EAAEH,OAAA,CAAQ,CACxD;IAAElC,EAAA,EAAI;IAAYG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAgB,GACvD;IAAED,EAAA,EAAI;IAAMG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAQ,GACzC;IAAED,EAAA,EAAI;IAAMG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAa,EAC/C;EACDoB,SAAA,CAAUiB,OAAA,CAAQ;EAClBpB,IAAA,CAAKqB,OAAA,CAAQ;AACf,CAAC;AAEDnD,IAAA,CAAK,4EAA4E,YAAY;EAC3F,MAAMoD,QAAA,GAAW7C,QAAA,CAAe;EAChC,MAAM8C,WAAA,GAAc9C,QAAA,CAAe;EACnC,IAAIoD,aAAA,GAAgB;EAEpBvD,OAAA,GAAU,MAAMF,oBAAA,CAAqB;IACnCQ,IAAA,EAAM;MACJC,IAAA,EAAM,CACJ;QAAEC,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,GACxB;QAAED,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,EAC1B;MACAC,OAAA,EAAS,CAAC;QAAEF,EAAA,EAAI;QAAMG,OAAA,EAAS;QAAMF,IAAA,EAAM;MAAS,CAAC;MACrDG,MAAA,EAAQ,CAAC;QAAEJ,EAAA,EAAI;QAAMoD,SAAA,EAAW;QAAMC,MAAA,EAAQ;MAAK,CAAC;IACtD;IACAhD,cAAA,EAAiBC,IAAA,IAAS,OAAOC,KAAA,EAAOC,IAAA,KAAS;MAC/C,IAAI,IAAIE,GAAA,CAAIC,MAAA,CAAOJ,KAAK,CAAC,EAAEK,QAAA,KAAa,SAAS;QAC/C,MAAM8B,IAAA,GAAOC,IAAA,CAAKC,KAAA,CAAMjC,MAAA,CAAOH,IAAA,EAAMkC,IAAI,CAAC;QAC1CK,aAAA,GAAgBL,IAAA,CAAKK,aAAA;QACrBN,WAAA,CAAY3B,OAAA,CAAQ;QACpB,MAAM0B,QAAA,CAASzB,OAAA;MACjB;MACA,OAAOT,IAAA,CAAKC,KAAA,EAAOC,IAAI;IACzB;EACF,CAAC;EACD,MAAMQ,IAAA,GAAOxB,OAAA,CAAQyB,UAAA,CAAW,IAAI;EACpC,MAAMC,IAAA,GAAOF,IAAA,CAAKG,KAAA,CAAMjB,OAAA,CAAQkB,WAAA,CAAY;EAC5C,MAAM7B,eAAA,CAAuB2B,IAAI;EACjC,MAAMG,SAAA,GAAYC,eAAA,CAAgBJ,IAAI;EAEtC,MAAMK,QAAA,GAAWP,IAAA,CAAKQ,MAAA,CAAOtB,OAAA,CAAQoD,MAAA,CAAO;IAAEtD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAS,CAAC;EACxE,MAAMsB,QAAA,CAASG,MAAA;EACf,MAAMe,WAAA,CAAY1B,OAAA;EAClB5B,MAAA,CAAOoE,WAAA,CAAYrC,IAAA,CAAKU,IAAA,EAAM,IAAI,CAAC,EAAE4B,IAAA,CAAK,QAAQ;EAClDrE,MAAA,CAAOK,OAAA,CAAQsC,MAAA,CAAOM,IAAA,CAAK,SAAS,CAAC,EAAEF,OAAA,CAAQ,CAC7C;IAAElC,EAAA,EAAI;IAAMG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAS,EAC3C;EAEDuC,QAAA,CAAS1B,OAAA,CAAQ;EACjB,MAAM3B,MAAA,CAAOoC,QAAA,CAASO,MAAM,EAAE2B,QAAA,CAASC,aAAA,CAAc;IACnDC,IAAA,EAAM;IACNC,KAAA,EAAO;MACLD,IAAA,EAAM;MACNE,OAAA,EAAS;IACX;EACF,CAAC;EAED,MAAMrE,OAAA,CAAQuC,SAAA,CAAUC,IAAA,CAAK;EAC7B,MAAM3C,UAAA,CAAW,MAAMF,MAAA,CAAOoE,WAAA,CAAYrC,IAAA,CAAKU,IAAA,EAAM,IAAI,CAAC,EAAE4B,IAAA,CAAK,QAAQ,CAAC;EAC1ErE,MAAA,CAAOkC,SAAA,CAAUyC,MAAA,CAAOZ,GAAA,CAAKd,IAAA,IAASmB,WAAA,CAAYnB,IAAA,EAAM,IAAI,CAAC,CAAC,EAAEP,SAAA,CAAU,QAAQ;EAClF1C,MAAA,CAAOkC,SAAA,CAAUyC,MAAA,CAAOC,EAAA,CAAG,EAAE,IAAI,CAAC,CAAC,EAAE7B,OAAA,CAAQ;IAC3ClC,EAAA,EAAI;IACJG,OAAA,EAAS;IACTF,IAAA,EAAM;EACR,CAAC;EACDd,MAAA,CAAOK,OAAA,CAAQsC,MAAA,CAAOM,IAAA,CAAK,SAAS,CAAC,EAAEF,OAAA,CAAQ,CAC7C;IAAElC,EAAA,EAAI;IAAMG,OAAA,EAAS;IAAMF,IAAA,EAAM;EAAS,EAC3C;EAED,MAAM+B,IAAA,GAAO,MAAMgC,OAAA,CAAQxE,OAAA,EAAS,MAAM;IAAEuD;EAAc,CAAC;EAC3D5D,MAAA,CAAO8E,MAAA,CAAOH,MAAA,CAAO9B,IAAA,CAAKkC,qBAAqB,CAAC,EAAErC,SAAA,CAAU,CAAC;EAC7DR,SAAA,CAAUiB,OAAA,CAAQ;EAClBpB,IAAA,CAAKqB,OAAA,CAAQ;AACf,CAAC;AAEDnD,IAAA,CAAK,mEAAmE,YAAY;EAClF,MAAMoD,QAAA,GAAW7C,QAAA,CAAe;EAChC,MAAM8C,WAAA,GAAc9C,QAAA,CAAe;EACnC,IAAIoD,aAAA,GAAgB;EAEpBvD,OAAA,GAAU,MAAMF,oBAAA,CAAqB;IACnCQ,IAAA,EAAM;MACJC,IAAA,EAAM,CACJ;QAAEC,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,GACxB;QAAED,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,EAC1B;MACAC,OAAA,EAAS,EAAC;MACVE,MAAA,EAAQ;IACV;IACAC,cAAA,EAAiBC,IAAA,IAAS,OAAOC,KAAA,EAAOC,IAAA,KAAS;MAC/C,IAAI,IAAIE,GAAA,CAAIC,MAAA,CAAOJ,KAAK,CAAC,EAAEK,QAAA,KAAa,SAAS;QAC/C,MAAM8B,IAAA,GAAOC,IAAA,CAAKC,KAAA,CAAMjC,MAAA,CAAOH,IAAA,EAAMkC,IAAI,CAAC;QAC1CK,aAAA,GAAgBL,IAAA,CAAKK,aAAA;QACrBN,WAAA,CAAY3B,OAAA,CAAQ;QACpB,MAAM0B,QAAA,CAASzB,OAAA;MACjB;MACA,OAAOT,IAAA,CAAKC,KAAA,EAAOC,IAAI;IACzB;EACF,CAAC;EACD,MAAMQ,IAAA,GAAOxB,OAAA,CAAQyB,UAAA,CAAW,IAAI;EACpC,MAAMC,IAAA,GAAOF,IAAA,CAAKG,KAAA,CAAMjB,OAAA,CAAQkB,WAAA,CAAY;EAC5C,MAAM7B,eAAA,CAAuB2B,IAAI;EACjC,MAAMG,SAAA,GAAYC,eAAA,CAAgBJ,IAAI;EAEtC,MAAMK,QAAA,GAAWP,IAAA,CAAKQ,MAAA,CAAOtB,OAAA,CAAQuB,MAAA,CAAO;IAC1CzB,EAAA,EAAI;IACJG,OAAA,EAAS;IACTF,IAAA,EAAM;EACR,CAAC;EACD,MAAMsB,QAAA,CAASG,MAAA;EACf,MAAMe,WAAA,CAAY1B,OAAA;EAClB,MAAM1B,UAAA,CAAW,MAAMF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,CAAC,EAAEC,SAAA,CAAU,WAAW,CAAC;EAC3E1C,MAAA,CAAOK,OAAA,CAAQsC,MAAA,CAAOM,IAAA,CAAK,SAAS,CAAC,EAAEF,OAAA,CAAQ,EAAE;EAEjDM,QAAA,CAAS1B,OAAA,CAAQ;EACjB,MAAM3B,MAAA,CAAOoC,QAAA,CAASO,MAAM,EAAE2B,QAAA,CAASC,aAAA,CAAc;IACnDC,IAAA,EAAM;IACNC,KAAA,EAAO;MACLD,IAAA,EAAM;MACNE,OAAA,EAAS;IACX;EACF,CAAC;EAED,MAAMrE,OAAA,CAAQuC,SAAA,CAAUC,IAAA,CAAK;EAC7B,MAAM3C,UAAA,CAAW,MAAMF,MAAA,CAAOwC,UAAA,CAAWT,IAAA,CAAKU,IAAI,CAAC,EAAEuC,GAAA,CAAItC,SAAA,CAAU,WAAW,CAAC;EAC/E1C,MAAA,CAAOkC,SAAA,CAAUyC,MAAA,CAAOM,IAAA,CAAMhC,IAAA,IAAST,UAAA,CAAWS,IAAI,EAAEiC,QAAA,CAAS,WAAW,CAAC,CAAC,EAAEb,IAAA,CAC9E,IACF;EACArE,MAAA,CAAOkC,SAAA,CAAUyC,MAAA,CAAOC,EAAA,CAAG,EAAE,CAAC,EAAE7B,OAAA,CAAQ,EAAE;EAC1C/C,MAAA,CAAOK,OAAA,CAAQsC,MAAA,CAAOM,IAAA,CAAK,SAAS,CAAC,EAAEF,OAAA,CAAQ,EAAE;EAEjD,MAAMF,IAAA,GAAO,MAAMgC,OAAA,CAAQxE,OAAA,EAAS,MAAM;IAAEuD;EAAc,CAAC;EAC3D5D,MAAA,CAAO8E,MAAA,CAAOH,MAAA,CAAO9B,IAAA,CAAKkC,qBAAqB,CAAC,EAAErC,SAAA,CAAU,CAAC;EAC7DR,SAAA,CAAUiB,OAAA,CAAQ;EAClBpB,IAAA,CAAKqB,OAAA,CAAQ;AACf,CAAC;AAED,eAAeO,QACbwB,QAAA,EACA/C,QAAA,EAOA;EACA,MAAMV,QAAA,GAAW,MAAM0D,KAAA,CAAM,GAAGD,QAAA,CAAQxC,MAAA,CAAO0C,GAAG,SAAS;IACzDC,MAAA,EAAQ;IACRC,OAAA,EAAS;MACPC,aAAA,EAAe;MACf,gBAAgB;IAClB;IACAjC,IAAA,EAAMC,IAAA,CAAKiC,SAAA,CAAU;MACnBC,SAAA,EAAWC,IAAA,CAAKC,GAAA,CAAI;MACpBhC,aAAA,EAAexB,QAAA,CAASwB,aAAA;MACxBiC,WAAA,EAAa;MACbC,SAAA,EAAW,OAAO1D,QAAA,CAASyB,QAAQ,IAAIzB,QAAA,CAASvB,EAAE;MAClDkF,SAAA,EAAW,CACT;QACEvB,IAAA,EAAM;QACN1D,IAAA,EAAMsB,QAAA,CAAStB,IAAA;QACfD,EAAA,EAAIuB,QAAA,CAASvB,EAAA;QACbgD,QAAA,EAAUzB,QAAA,CAASyB,QAAA;QACnBC,IAAA,EAAM,CAAC1B,QAAA,CAAS0B,IAAI;MACtB;IAEJ,CAAC;EACH,CAAC;EACD9D,MAAA,CAAO0B,QAAA,CAASsE,MAAM,EAAE3B,IAAA,CAAK,GAAG;EAChC,OAAO3C,QAAA,CAASuE,IAAA,CAAK;AACvB;AAEA,eAAepB,QACbM,QAAA,EACAe,MAAA,EACA3C,IAAA,EACA;EACA,MAAM7B,QAAA,GAAW,MAAM0D,KAAA,CAAM,GAAGD,QAAA,CAAQxC,MAAA,CAAO0C,GAAG,SAAS;IACzDC,MAAA,EAAQ;IACRC,OAAA,EAAS;MACPC,aAAA,EAAe,gBAAgBU,MAAM;MACrC,gBAAgB;IAClB;IACA3C,IAAA,EAAMC,IAAA,CAAKiC,SAAA,CAAU;MACnB5B,QAAA,EAAU;MACVD,aAAA,EAAeL,IAAA,CAAKK,aAAA;MACpBuC,MAAA,EAAQ;IACV,CAAC;EACH,CAAC;EACDnG,MAAA,CAAO0B,QAAA,CAASsE,MAAM,EAAE3B,IAAA,CAAK,GAAG;EAChC,OAAO3C,QAAA,CAASuE,IAAA,CAAK;AAGvB;AAEA,SAAS9D,gBAAgBJ,IAAA,EAEtB;EACD,MAAM4C,MAAA,GAAkB,EAAC;EACzB,MAAMxB,OAAA,GAAUpB,IAAA,CAAKqE,WAAA,CAAa3D,IAAA,IAASkC,MAAA,CAAO0B,IAAA,CAAKC,QAAA,CAAS7D,IAAI,CAAC,CAAC;EACtE,OAAO;IAAEkC,MAAA;IAAQxB;EAAQ;AAC3B;AAEA,SAASmD,SAASrD,IAAA,EAAa;EAC7B,OAAOO,IAAA,CAAKC,KAAA,CAAMD,IAAA,CAAKiC,SAAA,CAAUxC,IAAI,CAAC;AACxC;AAEA,SAAST,WAAWS,IAAA,EAAa;EAC/B,OAAOA,IAAA,CAAKc,GAAA,CAAKC,GAAA,IAAQA,GAAA,CAAInD,EAAE;AACjC;AAEA,SAASuD,YAAYnB,IAAA,EAAapC,EAAA,EAAY;EAC5C,OAAOoC,IAAA,CAAKsD,IAAA,CAAMvC,GAAA,IAAQA,GAAA,CAAInD,EAAA,KAAOA,EAAE,GAAGC,IAAA;AAC5C;AAEA,SAASkC,oCAAoCd,SAAA,EAAgCrB,EAAA,EAAY;EACvF,IAAI2F,IAAA,GAAO;EACX,WAAWvD,IAAA,IAAQf,SAAA,CAAUyC,MAAA,EAAQ;IACnC,IAAInC,UAAA,CAAWS,IAAI,EAAEiC,QAAA,CAASrE,EAAE,GAAG2F,IAAA,GAAO;IAC1C,IAAIA,IAAA,EAAMxG,MAAA,CAAOwC,UAAA,CAAWS,IAAI,CAAC,EAAEP,SAAA,CAAU7B,EAAE;EACjD;EACAb,MAAA,CAAOwG,IAAI,EAAEnC,IAAA,CAAK,IAAI;AACxB;AAEA,SAASnB,KAAKuD,CAAA,EAA2BC,CAAA,EAA2B;EAClE,OAAOD,CAAA,CAAE5F,EAAA,CAAG8F,aAAA,CAAcD,CAAA,CAAE7F,EAAE;AAChC;AAEA,SAASL,SAAA,EAAc;EACrB,IAAImB,OAAA;EACJ,IAAIiF,MAAA;EACJ,MAAMhF,OAAA,GAAU,IAAIiF,OAAA,CAAW,CAACC,GAAA,EAAKC,GAAA,KAAQ;IAC3CpF,OAAA,GAAUmF,GAAA;IACVF,MAAA,GAASG,GAAA;EACX,CAAC;EACD,OAAO;IAAEnF,OAAA;IAASD,OAAA;IAASiF;EAAO;AACpC","ignoreList":[]}