@apex-inc/mcp-server 0.28.1 → 0.30.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.
@@ -0,0 +1,506 @@
1
+ /**
2
+ * MCP catch-up tools for Set up Apex. Each tool wraps a hub route.
3
+ * Steps still finish when the real thing happens — these tools never
4
+ * stamp the rail complete.
5
+ */
6
+ import { z } from "zod";
7
+ import { apiGet, apiPatch, apiPost, apiPut, getActiveOrg, getActiveWorkspace, } from "./api-client.js";
8
+ const APEX = "Apex";
9
+ function jsonResult(data, error = null) {
10
+ return {
11
+ content: [
12
+ {
13
+ type: "text",
14
+ text: JSON.stringify({ data, error }, null, 2),
15
+ },
16
+ ],
17
+ };
18
+ }
19
+ function resolveOrgId(orgId) {
20
+ return orgId?.trim() || getActiveOrg();
21
+ }
22
+ const VERTICALS = [
23
+ "b2b-saas",
24
+ "ecommerce",
25
+ "marketplace",
26
+ "agency",
27
+ "other",
28
+ ];
29
+ const CONVERSION_MODELS = [
30
+ "sales-assisted",
31
+ "self-serve",
32
+ "transaction",
33
+ "two-sided",
34
+ "hybrid",
35
+ ];
36
+ const CONSENT_BANNERS = [
37
+ "standard",
38
+ "gcm",
39
+ "onetrust",
40
+ "cookiebot",
41
+ "tcf",
42
+ "custom",
43
+ "none",
44
+ ];
45
+ function scoringWeightsToApi(weights) {
46
+ return {
47
+ intent: weights.intent,
48
+ icpFit: weights.icp_fit,
49
+ account: weights.account,
50
+ engagement: weights.engagement,
51
+ risk: weights.risk,
52
+ };
53
+ }
54
+ export const setupCatchupTools = {
55
+ update_organization: {
56
+ description: `${APEX} — Rename the organization. Same save as Set up Apex → name your organization. Admin only. Does not create an organization from nothing (that stays inside start_apex_login). The rail finishes when the name is saved — do not mark the step complete.`,
57
+ schema: z.object({
58
+ orgId: z
59
+ .string()
60
+ .optional()
61
+ .describe("Organization id. Defaults to the active org."),
62
+ name: z.string().min(1).describe("What the shop should be called."),
63
+ }),
64
+ handler: async ({ orgId, name }) => {
65
+ const id = resolveOrgId(orgId);
66
+ if (!id) {
67
+ return jsonResult(null, "No active organization. Pass org_id or switch_org first.");
68
+ }
69
+ const data = await apiPatch("/api/org", { orgId: id, name: name.trim() });
70
+ return jsonResult(data);
71
+ },
72
+ },
73
+ update_workspace: {
74
+ description: `${APEX} — Name the workspace and set vertical, conversion model, and website. One save, same as Set up Apex first-run. Omit a field to leave it unchanged. Admin only. The rail finishes from the live name / vertical / conversion model — do not mark the step complete.`,
75
+ schema: z.object({
76
+ workspaceName: z
77
+ .string()
78
+ .optional()
79
+ .describe("Workspace name customers and teammates see."),
80
+ vertical: z
81
+ .enum(VERTICALS)
82
+ .optional()
83
+ .describe("What the shop does (b2b-saas, ecommerce, marketplace, agency, other)."),
84
+ conversionModel: z
85
+ .enum(CONVERSION_MODELS)
86
+ .optional()
87
+ .describe("How people convert (sales-assisted, self-serve, transaction, two-sided, hybrid)."),
88
+ websiteUrl: z
89
+ .string()
90
+ .optional()
91
+ .describe("The shop's website URL."),
92
+ }),
93
+ handler: async ({ workspaceName, vertical, conversionModel, websiteUrl, }) => {
94
+ const body = {};
95
+ if (workspaceName?.trim())
96
+ body.name = workspaceName.trim();
97
+ if (vertical)
98
+ body.vertical = vertical;
99
+ if (conversionModel)
100
+ body.conversionModel = conversionModel;
101
+ if (websiteUrl !== undefined)
102
+ body.url = websiteUrl.trim();
103
+ if (Object.keys(body).length === 0) {
104
+ return jsonResult(null, "Provide at least one of workspace_name, vertical, conversion_model, website_url.");
105
+ }
106
+ const workspaceKey = getActiveWorkspace();
107
+ if (workspaceName?.trim() && workspaceKey) {
108
+ await apiPatch(`/api/workspaces/${encodeURIComponent(workspaceKey)}`, {
109
+ name: workspaceName.trim(),
110
+ });
111
+ }
112
+ const data = await apiPatch("/api/config", body);
113
+ return jsonResult(data);
114
+ },
115
+ },
116
+ claim_links_subdomain: {
117
+ description: `${APEX} — Claim the shop's links subdomain (name.links.apex.inc). Same save as Set up Apex → claim links subdomain. Admin only. Fails if another workspace already has that name.`,
118
+ schema: z.object({
119
+ subdomain: z
120
+ .string()
121
+ .min(1)
122
+ .describe("Subdomain only, e.g. acme — not the full hostname."),
123
+ }),
124
+ handler: async ({ subdomain }) => {
125
+ const data = await apiPatch("/api/config", {
126
+ linkSubdomain: subdomain.trim(),
127
+ });
128
+ return jsonResult(data);
129
+ },
130
+ },
131
+ set_consent_posture: {
132
+ description: `${APEX} — Save the shop's consent-form answers (do they have a box, which kind). Does NOT attest outbound sending and does NOT fake a live-site tap. The merchant still has to tap Allow on their site. Admin only.`,
133
+ schema: z.object({
134
+ hasForm: z
135
+ .enum(["yes", "no"])
136
+ .describe("Whether the shop already shows a consent box."),
137
+ banner: z
138
+ .enum(CONSENT_BANNERS)
139
+ .optional()
140
+ .describe("Which box they use. Ignored when has_form is no (saved as none)."),
141
+ }),
142
+ handler: async ({ hasForm, banner, }) => {
143
+ const consentPolicy = {
144
+ banner: hasForm === "no" ? "none" : (banner ?? "standard"),
145
+ };
146
+ const data = await apiPatch("/api/config", { consentPolicy });
147
+ return jsonResult(data);
148
+ },
149
+ },
150
+ list_webhook_destinations: {
151
+ description: `${APEX} — List webhook destinations this workspace has registered. Signing keys are hidden.`,
152
+ schema: z.object({}),
153
+ handler: async () => {
154
+ const data = await apiGet("/api/webhook-destinations");
155
+ return jsonResult(data);
156
+ },
157
+ },
158
+ add_webhook_destination: {
159
+ description: `${APEX} — Register an HTTPS webhook destination. Private / loopback addresses are rejected. Admin only.`,
160
+ schema: z.object({
161
+ name: z.string().min(1).describe("Label for this destination."),
162
+ baseUrl: z.string().url().describe("HTTPS URL Apex will POST to."),
163
+ }),
164
+ handler: async ({ name, baseUrl }) => {
165
+ const data = await apiPost("/api/webhook-destinations", {
166
+ name,
167
+ baseUrl,
168
+ });
169
+ return jsonResult(data);
170
+ },
171
+ },
172
+ get_messaging_guardrails: {
173
+ description: `${APEX} — Read holdout percent and channel send limits for Adaptive Journeys.`,
174
+ schema: z.object({}),
175
+ handler: async () => {
176
+ const data = await apiGet("/api/journeys/settings");
177
+ return jsonResult(data);
178
+ },
179
+ },
180
+ set_messaging_guardrails: {
181
+ description: `${APEX} — Set holdout and channel send limits. Omit a field to keep the current value. Admin only.`,
182
+ schema: z.object({
183
+ holdoutPct: z.number().min(0).max(100).optional(),
184
+ attributionWindowDays: z.number().int().min(1).max(90).optional(),
185
+ nudgeCapPerDay: z.number().int().min(0).optional(),
186
+ fireOnTestEvents: z.boolean().optional(),
187
+ capPolicy: z
188
+ .object({
189
+ daily: z.object({
190
+ email: z.number().int(),
191
+ in_app: z.number().int(),
192
+ mobile_push: z.number().int(),
193
+ }),
194
+ weekly: z.object({
195
+ email: z.number().int(),
196
+ in_app: z.number().int(),
197
+ mobile_push: z.number().int(),
198
+ }),
199
+ })
200
+ .optional(),
201
+ }),
202
+ handler: async (args) => {
203
+ const current = await apiGet("/api/journeys/settings");
204
+ const data = await apiPatch("/api/journeys/settings", {
205
+ holdoutPct: args.holdoutPct ?? current.holdoutPct,
206
+ attributionWindowDays: args.attributionWindowDays ?? current.attributionWindowDays,
207
+ nudgeCapPerDay: args.nudgeCapPerDay ?? current.nudgeCapPerDay,
208
+ fireOnTestEvents: args.fireOnTestEvents ?? current.fireOnTestEvents,
209
+ capPolicy: args.capPolicy ?? current.capPolicy,
210
+ });
211
+ return jsonResult(data);
212
+ },
213
+ },
214
+ set_app_surface_paths: {
215
+ description: `${APEX} — Name the product-path prefixes (e.g. /dashboard) so in-app pages are not filed as the marketing site. Admin only.`,
216
+ schema: z.object({
217
+ paths: z
218
+ .array(z.string())
219
+ .describe("Path prefixes that are the logged-in product."),
220
+ }),
221
+ handler: async ({ paths }) => {
222
+ const data = await apiPatch("/api/config", {
223
+ appSurfacePaths: paths,
224
+ });
225
+ return jsonResult(data);
226
+ },
227
+ },
228
+ get_scoring_model: {
229
+ description: `${APEX} — Read the active scoring weights. 404 if the shop has not saved a model yet (the vertical preset is still in use).`,
230
+ schema: z.object({}),
231
+ handler: async () => {
232
+ const data = await apiGet("/api/scoring/models/active");
233
+ return jsonResult(data);
234
+ },
235
+ },
236
+ set_scoring_weights: {
237
+ description: `${APEX} — Save scoring weights (must sum to 100) and make them active. Same path as Set up Apex → scoring. Admin only.`,
238
+ schema: z.object({
239
+ weights: z.object({
240
+ intent: z.number(),
241
+ icp_fit: z.number(),
242
+ account: z.number(),
243
+ engagement: z.number(),
244
+ risk: z.number(),
245
+ }),
246
+ name: z.string().optional(),
247
+ }),
248
+ handler: async ({ weights, name, }) => {
249
+ const apiWeights = scoringWeightsToApi(weights);
250
+ const sum = Object.values(apiWeights).reduce((a, b) => a + b, 0);
251
+ if (sum !== 100) {
252
+ return jsonResult(null, `Dimension weights must sum to 100, got ${sum}`);
253
+ }
254
+ const created = await apiPost("/api/scoring/models", {
255
+ name,
256
+ weights: apiWeights,
257
+ bucketThresholds: { hot: 75, warm: 55, cool: 35 },
258
+ rules: [],
259
+ createdBy: "mcp",
260
+ });
261
+ if (!created.isActive) {
262
+ await apiPut("/api/scoring/models/active", { version: created.version });
263
+ }
264
+ try {
265
+ await apiPost("/api/contacts/re-score", { modelVersion: created.version });
266
+ }
267
+ catch {
268
+ // Weights are saved. Re-score is best-effort, same as the hub.
269
+ }
270
+ return jsonResult(created);
271
+ },
272
+ },
273
+ invite_teammate: {
274
+ description: `${APEX} — Email a teammate an invite to this organization. They accept in the browser. Admin only. Does not invite a partner (use invite_partner for that).`,
275
+ schema: z.object({
276
+ email: z.string().email(),
277
+ role: z.enum(["owner", "admin", "member"]).optional(),
278
+ orgId: z
279
+ .string()
280
+ .optional()
281
+ .describe("Organization id. Defaults to the active org."),
282
+ }),
283
+ handler: async ({ email, role, orgId, }) => {
284
+ const id = resolveOrgId(orgId);
285
+ if (!id) {
286
+ return jsonResult(null, "No active organization. Pass org_id or switch_org first.");
287
+ }
288
+ const created = await apiPost(`/api/orgs/${encodeURIComponent(id)}/invitations`, {
289
+ email,
290
+ role: role ?? "member",
291
+ });
292
+ const { token: _token, ...safe } = created;
293
+ void _token;
294
+ return jsonResult(safe);
295
+ },
296
+ },
297
+ set_engagement_analytics: {
298
+ description: `${APEX} — Say who counts as using the product (daily-active events, activation events, churn window). Same save as Engagement Analytics in Set up Apex. Admin only.`,
299
+ schema: z.object({
300
+ profile: z
301
+ .enum(["saas", "ecommerce", "marketplace", "agency", "mobile-app", "custom"])
302
+ .optional(),
303
+ qualifyingEvents: z.array(z.string()).optional(),
304
+ activationEvents: z.array(z.string()).optional(),
305
+ churnWindowDays: z.number().int().positive().optional(),
306
+ lifecycleEventMap: z
307
+ .object({
308
+ overridden: z.boolean(),
309
+ rules: z.array(z.object({
310
+ event_name: z.string(),
311
+ to_stage: z.string(),
312
+ })),
313
+ })
314
+ .optional(),
315
+ }),
316
+ handler: async (args) => {
317
+ const body = {};
318
+ if (args.profile ||
319
+ args.qualifyingEvents ||
320
+ args.activationEvents ||
321
+ args.churnWindowDays) {
322
+ body.activeUserDefinition = {
323
+ profile: args.profile ?? "custom",
324
+ qualifyingEvents: args.qualifyingEvents ?? [],
325
+ activationEvents: args.activationEvents ?? [],
326
+ churnWindowDays: args.churnWindowDays ?? 30,
327
+ source: "events",
328
+ overridden: true,
329
+ };
330
+ }
331
+ if (args.lifecycleEventMap) {
332
+ body.lifecycleEventMap = {
333
+ overridden: args.lifecycleEventMap.overridden,
334
+ rules: args.lifecycleEventMap.rules.map((r) => ({
335
+ eventName: r.event_name,
336
+ toStage: r.to_stage,
337
+ })),
338
+ };
339
+ }
340
+ if (Object.keys(body).length === 0) {
341
+ return jsonResult(null, "Provide qualifying_events, activation_events, or lifecycle_event_map.");
342
+ }
343
+ const data = await apiPatch("/api/config", body);
344
+ return jsonResult(data);
345
+ },
346
+ },
347
+ set_app_platforms: {
348
+ description: `${APEX} — Tell Apex where the app ships (iOS / Android / web app) and whether they buy install ads. Also sets attribution windows when provided. Merges into the existing app settings so bundle IDs are not wiped. Admin only.`,
349
+ schema: z.object({
350
+ platforms: z.array(z.enum(["ios", "android", "web"])).min(1),
351
+ outcome: z.enum(["behavior", "ad-roi", "partners"]).optional(),
352
+ attributionWindows: z
353
+ .object({
354
+ click_through: z.number().optional(),
355
+ view_through: z.number().optional(),
356
+ reattribution: z.number().optional(),
357
+ reengagement: z.number().optional(),
358
+ })
359
+ .optional(),
360
+ }),
361
+ handler: async (args) => {
362
+ const current = await apiGet("/api/config");
363
+ const existing = current.mobileAppConfig ?? {};
364
+ const windows = args.attributionWindows;
365
+ const mobileAppConfig = {
366
+ ...existing,
367
+ platforms: args.platforms,
368
+ ...(args.outcome ? { outcome: args.outcome } : {}),
369
+ };
370
+ if (windows) {
371
+ const prev = (existing.attributionWindows ?? {});
372
+ mobileAppConfig.attributionWindows = {
373
+ ...prev,
374
+ ...(windows.click_through !== undefined
375
+ ? { clickThrough: windows.click_through }
376
+ : {}),
377
+ ...(windows.view_through !== undefined
378
+ ? { viewThrough: windows.view_through }
379
+ : {}),
380
+ ...(windows.reattribution !== undefined
381
+ ? { reattribution: windows.reattribution }
382
+ : {}),
383
+ ...(windows.reengagement !== undefined
384
+ ? { reengagement: windows.reengagement }
385
+ : {}),
386
+ };
387
+ }
388
+ const data = await apiPatch("/api/config", { mobileAppConfig });
389
+ return jsonResult(data);
390
+ },
391
+ },
392
+ set_attribution_model: {
393
+ description: `${APEX} — Pick how credit is split (first_touch, last_touch, linear, time_decay). Same save as Attribution in settings. Admin only.`,
394
+ schema: z.object({
395
+ attributionModel: z.enum([
396
+ "first_touch",
397
+ "last_touch",
398
+ "linear",
399
+ "time_decay",
400
+ ]),
401
+ }),
402
+ handler: async ({ attributionModel, }) => {
403
+ const data = await apiPatch("/api/settings/attribution", {
404
+ attributionModel,
405
+ });
406
+ return jsonResult(data);
407
+ },
408
+ },
409
+ start_sender_domain: {
410
+ description: `${APEX} — Start verifying a sending domain. Returns the DNS records to paste at the registrar. Does NOT claim the domain is green — poll get_sender_domain until status is verified. Admin only. You cannot click the registrar for them.`,
411
+ schema: z.object({
412
+ domain: z.string().min(1).describe("e.g. mail.example.com"),
413
+ orgId: z.string().optional(),
414
+ }),
415
+ handler: async ({ domain, orgId }) => {
416
+ const id = resolveOrgId(orgId);
417
+ if (!id) {
418
+ return jsonResult(null, "No active organization. Pass org_id or switch_org first.");
419
+ }
420
+ const res = await apiPost(`/api/orgs/${encodeURIComponent(id)}/email-domains`, { domain });
421
+ const row = (res.data ?? res);
422
+ return jsonResult({
423
+ ...row,
424
+ verified: false,
425
+ green: false,
426
+ note: "Records issued is not verified. Paste them at the registrar, then poll get_sender_domain.",
427
+ });
428
+ },
429
+ },
430
+ get_sender_domain: {
431
+ description: `${APEX} — Poll sender-domain verification. verified/green is true only when the domain status is verified — never when records were merely issued.`,
432
+ schema: z.object({
433
+ domain: z.string().optional().describe("Filter to one domain."),
434
+ orgId: z.string().optional(),
435
+ }),
436
+ handler: async ({ domain, orgId }) => {
437
+ const id = resolveOrgId(orgId);
438
+ if (!id) {
439
+ return jsonResult(null, "No active organization. Pass org_id or switch_org first.");
440
+ }
441
+ const res = await apiGet(`/api/orgs/${encodeURIComponent(id)}/email-domains`);
442
+ const rows = res.data ?? [];
443
+ const filtered = domain
444
+ ? rows.filter((r) => r.domain.toLowerCase() === domain.toLowerCase())
445
+ : rows;
446
+ const payload = filtered.map((r) => ({
447
+ ...r,
448
+ verified: r.status === "verified" && r.healthStatus !== "paused",
449
+ green: r.status === "verified" && r.healthStatus !== "paused",
450
+ }));
451
+ return jsonResult(payload);
452
+ },
453
+ },
454
+ set_push_credentials: {
455
+ description: `${APEX} — Store Apple or Google push keys. Send FILE CONTENTS, never a path on this laptop. Same secret store the Push setup step uses. Download the file from Apple/Google first (that stays a hop). Admin only.`,
456
+ schema: z.object({
457
+ platform: z.enum(["ios", "android"]),
458
+ fileContents: z
459
+ .string()
460
+ .min(1)
461
+ .describe("The .p8 PEM (iOS) or service-account JSON (Android), as text."),
462
+ teamId: z.string().optional().describe("Apple Team ID (iOS)."),
463
+ keyId: z.string().optional().describe("Apple Key ID (iOS)."),
464
+ bundleId: z.string().optional().describe("iOS bundle id."),
465
+ environment: z.enum(["production", "sandbox"]).optional(),
466
+ fcmWorkspaceId: z.string().optional().describe("Firebase project id (Android)."),
467
+ packageName: z.string().optional().describe("Android package name."),
468
+ }),
469
+ handler: async (args) => {
470
+ if (args.platform === "ios") {
471
+ if (!args.teamId || !args.keyId || !args.bundleId) {
472
+ return jsonResult(null, "iOS needs team_id, key_id, and bundle_id plus the .p8 file contents.");
473
+ }
474
+ const data = await apiPost("/api/mobile/push/credentials", {
475
+ p8: args.fileContents,
476
+ teamId: args.teamId,
477
+ keyId: args.keyId,
478
+ bundleId: args.bundleId,
479
+ environment: args.environment,
480
+ });
481
+ return jsonResult(data);
482
+ }
483
+ const data = await apiPost("/api/mobile/push/fcm-credentials", {
484
+ serviceAccount: args.fileContents,
485
+ fcmWorkspaceId: args.fcmWorkspaceId,
486
+ packageName: args.packageName,
487
+ });
488
+ return jsonResult(data);
489
+ },
490
+ },
491
+ set_protect_auto_pause: {
492
+ description: `${APEX} — Turn on or off auto-pause when a protected metric is hurt. Same switch as Protect your experiments in Set up Apex. Admin only.`,
493
+ schema: z.object({
494
+ enabled: z
495
+ .boolean()
496
+ .describe("True = pause the test automatically. False = block promotion and alert only."),
497
+ }),
498
+ handler: async ({ enabled }) => {
499
+ const data = await apiPatch("/api/config", {
500
+ autoPauseOnCriticalBreach: enabled,
501
+ });
502
+ return jsonResult(data);
503
+ },
504
+ },
505
+ };
506
+ //# sourceMappingURL=setup-catchup-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-catchup-tools.js","sourceRoot":"","sources":["../src/setup-catchup-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,MAAM,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,SAAS,UAAU,CAAC,IAAa,EAAE,QAAuB,IAAI;IAC5D,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC/C;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,UAAU;IACV,WAAW;IACX,aAAa;IACb,QAAQ;IACR,OAAO;CACC,CAAC;AAEX,MAAM,iBAAiB,GAAG;IACxB,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,QAAQ;CACA,CAAC;AAEX,MAAM,eAAe,GAAG;IACtB,UAAU;IACV,KAAK;IACL,UAAU;IACV,WAAW;IACX,KAAK;IACL,QAAQ;IACR,MAAM;CACE,CAAC;AAEX,SAAS,mBAAmB,CAAC,OAM5B;IACC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,OAAO;QACvB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,mBAAmB,EAAE;QACnB,WAAW,EAAE,GAAG,IAAI,yPAAyP;QAC7Q,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAoC,EAAE,EAAE;YACnE,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,IAAI,EAAE,0DAA0D,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,gBAAgB,EAAE;QAChB,WAAW,EAAE,GAAG,IAAI,qQAAqQ;QACzR,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6CAA6C,CAAC;YAC1D,QAAQ,EAAE,CAAC;iBACR,IAAI,CAAC,SAAS,CAAC;iBACf,QAAQ,EAAE;iBACV,QAAQ,CAAC,uEAAuE,CAAC;YACpF,eAAe,EAAE,CAAC;iBACf,IAAI,CAAC,iBAAiB,CAAC;iBACvB,QAAQ,EAAE;iBACV,QAAQ,CAAC,kFAAkF,CAAC;YAC/F,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yBAAyB,CAAC;SACvC,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EACd,aAAa,EACb,QAAQ,EACR,eAAe,EACf,UAAU,GAMX,EAAE,EAAE;YACH,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,IAAI,aAAa,EAAE,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YAC5D,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACvC,IAAI,eAAe;gBAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;YAC5D,IAAI,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,UAAU,CAAC,IAAI,EAAE,kFAAkF,CAAC,CAAC;YAC9G,CAAC;YAED,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;YAC1C,IAAI,aAAa,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC1C,MAAM,QAAQ,CAAC,mBAAmB,kBAAkB,CAAC,YAAY,CAAC,EAAE,EAAE;oBACpE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE;iBAC3B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE,IAAI,CAAC,CAAC;YAC1D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,qBAAqB,EAAE;QACrB,WAAW,EAAE,GAAG,IAAI,4KAA4K;QAChM,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,oDAAoD,CAAC;SAClE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAyB,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE;gBAClD,aAAa,EAAE,SAAS,CAAC,IAAI,EAAE;aAChC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,mBAAmB,EAAE;QACnB,WAAW,EAAE,GAAG,IAAI,8MAA8M;QAClO,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;iBACnB,QAAQ,CAAC,+CAA+C,CAAC;YAC5D,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,eAAe,CAAC;iBACrB,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;SAChF,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EACd,OAAO,EACP,MAAM,GAIP,EAAE,EAAE;YACH,MAAM,aAAa,GAA4B;gBAC7C,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,UAAU,CAAC;aAC3D,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;YACvE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,yBAAyB,EAAE;QACzB,WAAW,EAAE,GAAG,IAAI,sFAAsF;QAC1G,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAU,2BAA2B,CAAC,CAAC;YAChE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,uBAAuB,EAAE;QACvB,WAAW,EAAE,GAAG,IAAI,kGAAkG;QACtH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SACnE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAqC,EAAE,EAAE;YACtE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAU,2BAA2B,EAAE;gBAC/D,IAAI;gBACJ,OAAO;aACR,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,wBAAwB,EAAE;QACxB,WAAW,EAAE,GAAG,IAAI,wEAAwE;QAC5F,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAU,wBAAwB,CAAC,CAAC;YAC7D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,wBAAwB,EAAE;QACxB,WAAW,EAAE,GAAG,IAAI,6FAA6F;QACjH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;YACjD,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;YACjE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YAClD,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YACxC,SAAS,EAAE,CAAC;iBACT,MAAM,CAAC;gBACN,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;oBACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;oBACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;iBAC9B,CAAC;gBACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;oBACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;oBACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;iBAC9B,CAAC;aACH,CAAC;iBACD,QAAQ,EAAE;SACd,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CASzB,wBAAwB,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,wBAAwB,EAAE;gBAC7D,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;gBACjD,qBAAqB,EACnB,IAAI,CAAC,qBAAqB,IAAI,OAAO,CAAC,qBAAqB;gBAC7D,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc;gBAC7D,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,gBAAgB;gBACnE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;aAC/C,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,qBAAqB,EAAE;QACrB,WAAW,EAAE,GAAG,IAAI,sHAAsH;QAC1I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,CAAC,+CAA+C,CAAC;SAC7D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAuB,EAAE,EAAE;YAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE;gBAClD,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,iBAAiB,EAAE;QACjB,WAAW,EAAE,GAAG,IAAI,sHAAsH;QAC1I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAU,4BAA4B,CAAC,CAAC;YACjE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,mBAAmB,EAAE;QACnB,WAAW,EAAE,GAAG,IAAI,iHAAiH;QACrI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;gBAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;gBAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;gBACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;gBACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;gBACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;aACjB,CAAC;YACF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC5B,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EACd,OAAO,EACP,IAAI,GAUL,EAAE,EAAE;YACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBAChB,OAAO,UAAU,CAAC,IAAI,EAAE,0CAA0C,GAAG,EAAE,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3B,qBAAqB,EACrB;gBACE,IAAI;gBACJ,OAAO,EAAE,UAAU;gBACnB,gBAAgB,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;gBACjD,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,KAAK;aACjB,CACF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,MAAM,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,wBAAwB,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;YACjE,CAAC;YACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;KACF;IAED,eAAe,EAAE;QACf,WAAW,EAAE,GAAG,IAAI,sJAAsJ;QAC1K,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;YACrD,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8CAA8C,CAAC;SAC5D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EACd,KAAK,EACL,IAAI,EACJ,KAAK,GAKN,EAAE,EAAE;YACH,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,IAAI,EAAE,0DAA0D,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAM1B,aAAa,kBAAkB,CAAC,EAAE,CAAC,cAAc,EAAE;gBACpD,KAAK;gBACL,IAAI,EAAE,IAAI,IAAI,QAAQ;aACvB,CAAC,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;YAC3C,KAAK,MAAM,CAAC;YACZ,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,wBAAwB,EAAE;QACxB,WAAW,EAAE,GAAG,IAAI,8JAA8J;QAClL,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;iBAC5E,QAAQ,EAAE;YACb,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAChD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAChD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YACvD,iBAAiB,EAAE,CAAC;iBACjB,MAAM,CAAC;gBACN,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;gBACvB,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;oBACP,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;oBACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;iBACrB,CAAC,CACH;aACF,CAAC;iBACD,QAAQ,EAAE;SACd,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;YACH,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,IACE,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,gBAAgB;gBACrB,IAAI,CAAC,gBAAgB;gBACrB,IAAI,CAAC,eAAe,EACpB,CAAC;gBACD,IAAI,CAAC,oBAAoB,GAAG;oBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ;oBACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;oBAC7C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;oBAC7C,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;oBAC3C,MAAM,EAAE,QAAQ;oBAChB,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,GAAG;oBACvB,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,UAAU;oBAC7C,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC9C,SAAS,EAAE,CAAC,CAAC,UAAU;wBACvB,OAAO,EAAE,CAAC,CAAC,QAAQ;qBACpB,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,UAAU,CAAC,IAAI,EAAE,uEAAuE,CAAC,CAAC;YACnG,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE,IAAI,CAAC,CAAC;YAC1D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,iBAAiB,EAAE;QACjB,WAAW,EAAE,GAAG,IAAI,0NAA0N;QAC9O,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC9D,kBAAkB,EAAE,CAAC;iBAClB,MAAM,CAAC;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACnC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aACpC,CAAC;iBACD,QAAQ,EAAE;SACd,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAC1B,aAAa,CACd,CAAC;YACF,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC;YACxC,MAAM,eAAe,GAA4B;gBAC/C,GAAG,QAAQ;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnD,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,IAAI,EAAE,CAA4B,CAAC;gBAC5E,eAAe,CAAC,kBAAkB,GAAG;oBACnC,GAAG,IAAI;oBACP,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;wBACrC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,aAAa,EAAE;wBACzC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;wBACpC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,YAAY,EAAE;wBACvC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;wBACrC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;wBAC1C,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;wBACpC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE;wBACxC,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YACzE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,qBAAqB,EAAE;QACrB,WAAW,EAAE,GAAG,IAAI,8HAA8H;QAClJ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC;gBACvB,aAAa;gBACb,YAAY;gBACZ,QAAQ;gBACR,YAAY;aACb,CAAC;SACH,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EACd,gBAAgB,GAGjB,EAAE,EAAE;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,2BAA2B,EAAE;gBAChE,gBAAgB;aACjB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,mBAAmB,EAAE;QACnB,WAAW,EAAE,GAAG,IAAI,oOAAoO;QACxP,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC7B,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAsC,EAAE,EAAE;YACvE,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,IAAI,EAAE,0DAA0D,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,aAAa,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EACnD,EAAE,MAAM,EAAE,CACX,CAAC;YACF,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAyC,CAAC;YACtE,OAAO,UAAU,CAAC;gBAChB,GAAG,GAAG;gBACN,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,2FAA2F;aAClG,CAAC,CAAC;QACL,CAAC;KACF;IAED,iBAAiB,EAAE;QACjB,WAAW,EAAE,GAAG,IAAI,6IAA6I;QACjK,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC7B,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAuC,EAAE,EAAE;YACxE,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,IAAI,EAAE,0DAA0D,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAErB,aAAa,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM;gBACrB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrE,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,GAAG,CAAC;gBACJ,QAAQ,EAAE,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,YAAY,KAAK,QAAQ;gBAChE,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,YAAY,KAAK,QAAQ;aAC9D,CAAC,CAAC,CAAC;YACJ,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;KACF;IAED,oBAAoB,EAAE;QACpB,WAAW,EAAE,GAAG,IAAI,4MAA4M;QAChO,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACpC,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC5D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC1D,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;YACzD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAChF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACrE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;YACH,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClD,OAAO,UAAU,CACf,IAAI,EACJ,sEAAsE,CACvE,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAU,8BAA8B,EAAE;oBAClE,EAAE,EAAE,IAAI,CAAC,YAAY;oBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC,CAAC;gBACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAU,kCAAkC,EAAE;gBACtE,cAAc,EAAE,IAAI,CAAC,YAAY;gBACjC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;IAED,sBAAsB,EAAE;QACtB,WAAW,EAAE,GAAG,IAAI,mIAAmI;QACvJ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,CAAC,8EAA8E,CAAC;SAC5F,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAwB,EAAE,EAAE;YACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAU,aAAa,EAAE;gBAClD,yBAAyB,EAAE,OAAO;aACnC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF;CACF,CAAC"}