superoc 0.1.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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/bin/nimsuper.js +21 -0
  4. package/bin/nimsuper.ts +10 -0
  5. package/bin/superoc.js +21 -0
  6. package/bin/superoc.ts +10 -0
  7. package/dist/antigravity.d.ts +59 -0
  8. package/dist/antigravity.d.ts.map +1 -0
  9. package/dist/antigravity.js +423 -0
  10. package/dist/antigravity.js.map +1 -0
  11. package/dist/errors.d.ts +22 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +122 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/errors.test.d.ts +2 -0
  16. package/dist/errors.test.d.ts.map +1 -0
  17. package/dist/errors.test.js +137 -0
  18. package/dist/errors.test.js.map +1 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +809 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/opencode-sync.d.ts +9 -0
  24. package/dist/opencode-sync.d.ts.map +1 -0
  25. package/dist/opencode-sync.js +157 -0
  26. package/dist/opencode-sync.js.map +1 -0
  27. package/dist/provider.d.ts +5 -0
  28. package/dist/provider.d.ts.map +1 -0
  29. package/dist/provider.js +100 -0
  30. package/dist/provider.js.map +1 -0
  31. package/dist/provider.test.d.ts +2 -0
  32. package/dist/provider.test.d.ts.map +1 -0
  33. package/dist/provider.test.js +94 -0
  34. package/dist/provider.test.js.map +1 -0
  35. package/dist/quota.d.ts +12 -0
  36. package/dist/quota.d.ts.map +1 -0
  37. package/dist/quota.js +105 -0
  38. package/dist/quota.js.map +1 -0
  39. package/dist/quota.test.d.ts +2 -0
  40. package/dist/quota.test.d.ts.map +1 -0
  41. package/dist/quota.test.js +20 -0
  42. package/dist/quota.test.js.map +1 -0
  43. package/dist/storage.d.ts +43 -0
  44. package/dist/storage.d.ts.map +1 -0
  45. package/dist/storage.js +447 -0
  46. package/dist/storage.js.map +1 -0
  47. package/dist/themes.d.ts +64 -0
  48. package/dist/themes.d.ts.map +1 -0
  49. package/dist/themes.js +424 -0
  50. package/dist/themes.js.map +1 -0
  51. package/dist/tui/actions.d.ts +14 -0
  52. package/dist/tui/actions.d.ts.map +1 -0
  53. package/dist/tui/actions.js +464 -0
  54. package/dist/tui/actions.js.map +1 -0
  55. package/dist/tui/app.d.ts +2 -0
  56. package/dist/tui/app.d.ts.map +1 -0
  57. package/dist/tui/app.js +323 -0
  58. package/dist/tui/app.js.map +1 -0
  59. package/dist/tui/benchmark.d.ts +42 -0
  60. package/dist/tui/benchmark.d.ts.map +1 -0
  61. package/dist/tui/benchmark.js +379 -0
  62. package/dist/tui/benchmark.js.map +1 -0
  63. package/dist/tui/screens.d.ts +23 -0
  64. package/dist/tui/screens.d.ts.map +1 -0
  65. package/dist/tui/screens.js +791 -0
  66. package/dist/tui/screens.js.map +1 -0
  67. package/dist/tui/state.d.ts +54 -0
  68. package/dist/tui/state.d.ts.map +1 -0
  69. package/dist/tui/state.js +85 -0
  70. package/dist/tui/state.js.map +1 -0
  71. package/dist/tui/types.d.ts +16 -0
  72. package/dist/tui/types.d.ts.map +1 -0
  73. package/dist/tui/types.js +2 -0
  74. package/dist/tui/types.js.map +1 -0
  75. package/dist/tui/ui.d.ts +17 -0
  76. package/dist/tui/ui.d.ts.map +1 -0
  77. package/dist/tui/ui.js +77 -0
  78. package/dist/tui/ui.js.map +1 -0
  79. package/dist/types.d.ts +52 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +68 -0
  84. package/scripts/postinstall.js +77 -0
  85. package/scripts/uninstall.js +119 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # superoc
2
+
3
+ Multi-provider API key rotator and model fallback plugin for [OpenCode](https://opencode.ai).
4
+
5
+ Fork of [opencode-nim-rotator](https://github.com/ChakornK/opencode-nim-rotator) with added multi-provider support (**Google Gemini**, **Google Cloud Code Antigravity OAuth**), live quota tracking, and bug fixes.
6
+
7
+ ## Features
8
+
9
+ - **NVIDIA NIM**: API key rotation with model fallback chains and rate-limit recovery.
10
+ - **Google Gemini**: Google AI Studio API key rotation with auto 429 failover.
11
+ - **Antigravity (OAuth)**: Google OAuth account rotation for Claude Sonnet 4.6, Claude Opus 4.6 (Thinking), Gemini 3.7 Flash, and GPT-OSS 120B.
12
+ - **Live Quota Tracking**: Normalized 5-hour and weekly quotas displayed directly on model labels (`5h: 98.9% W: 100%`).
13
+ - **TUI Manager**: Terminal UI for managing keys, accounts, fallback chains, and live TTFB/TPS benchmarks.
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ npm install -g superoc
19
+ ```
20
+
21
+ *(The installer automatically adds `superoc` to your OpenCode config on install)*
22
+
23
+ ## Usage
24
+
25
+ ```bash
26
+ superoc
27
+ ```
28
+
29
+ ### Connect Providers
30
+
31
+ - **Antigravity**: Launch `superoc` -> `[3] Antigravity` -> `[1] Add Account (OAuth)` to login via browser.
32
+ - **NVIDIA**: Launch `superoc` -> `[1] NVIDIA` -> `[1] Add Key` (or export `NVIDIA_API_KEY`).
33
+ - **Google**: Launch `superoc` -> `[2] Google` -> `[1] Add Key` (or export `GOOGLE_API_KEY`).
34
+
35
+ ## License
36
+
37
+ MIT
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bun
2
+
3
+ if (typeof process.isBun === "undefined") {
4
+ const { spawnSync } = await import("node:child_process");
5
+ const { fileURLToPath } = await import("node:url");
6
+ spawnSync(
7
+ "bun.exe",
8
+ [fileURLToPath(import.meta.url)],
9
+ { stdio: "inherit", shell: true }
10
+ );
11
+ process.exit();
12
+ }
13
+
14
+ import { createCliRenderer } from "@opentui/core";
15
+ import { state } from "../dist/tui/state.js";
16
+ import { initApp } from "../dist/tui/app.js";
17
+
18
+ const renderer = await createCliRenderer({ exitOnCtrlC: false });
19
+
20
+ state.renderer = renderer;
21
+ initApp();
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { createCliRenderer } from "@opentui/core";
4
+ import { state } from "../dist/tui/state.js";
5
+ import { initApp } from "../dist/tui/app.js";
6
+
7
+ const renderer = await createCliRenderer({ exitOnCtrlC: false });
8
+
9
+ state.renderer = renderer;
10
+ initApp();
package/bin/superoc.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bun
2
+
3
+ if (typeof process.isBun === "undefined") {
4
+ const { spawnSync } = await import("node:child_process");
5
+ const { fileURLToPath } = await import("node:url");
6
+ spawnSync(
7
+ "bun.exe",
8
+ [fileURLToPath(import.meta.url)],
9
+ { stdio: "inherit", shell: true }
10
+ );
11
+ process.exit();
12
+ }
13
+
14
+ import { createCliRenderer } from "@opentui/core";
15
+ import { state } from "../dist/tui/state.js";
16
+ import { initApp } from "../dist/tui/app.js";
17
+
18
+ const renderer = await createCliRenderer({ exitOnCtrlC: false });
19
+
20
+ state.renderer = renderer;
21
+ initApp();
package/bin/superoc.ts ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { createCliRenderer } from "@opentui/core";
4
+ import { state } from "../dist/tui/state.js";
5
+ import { initApp } from "../dist/tui/app.js";
6
+
7
+ const renderer = await createCliRenderer({ exitOnCtrlC: false });
8
+
9
+ state.renderer = renderer;
10
+ initApp();
@@ -0,0 +1,59 @@
1
+ export declare function openUrlInBrowser(url: string): void;
2
+ export declare const ANTIGRAVITY_CLIENT_ID: string;
3
+ export declare const ANTIGRAVITY_CLIENT_SECRET: string;
4
+ export declare const ANTIGRAVITY_REDIRECT_URI = "http://localhost:51121/oauth-callback";
5
+ export declare const ANTIGRAVITY_SCOPES: string[];
6
+ export declare const ANTIGRAVITY_ENDPOINT_PROD = "https://cloudcode-pa.googleapis.com";
7
+ export declare const ANTIGRAVITY_ENDPOINT_DAILY = "https://daily-cloudcode-pa.sandbox.googleapis.com";
8
+ export declare const ANTIGRAVITY_DEFAULT_PROJECT_ID = "rising-fact-p41fc";
9
+ export declare const ANTIGRAVITY_VERSION = "1.18.3";
10
+ export interface PKCEPair {
11
+ verifier: string;
12
+ challenge: string;
13
+ }
14
+ export declare function generatePKCE(): PKCEPair;
15
+ export declare function encodeState(payload: {
16
+ verifier: string;
17
+ projectId: string;
18
+ }): string;
19
+ export declare function decodeState(state: string): {
20
+ verifier: string;
21
+ projectId: string;
22
+ };
23
+ export declare function authorizeAntigravity(projectId?: string): {
24
+ url: string;
25
+ verifier: string;
26
+ projectId: string;
27
+ state: string;
28
+ };
29
+ export declare function fetchProjectID(accessToken: string): Promise<string>;
30
+ export interface ExchangeResultSuccess {
31
+ type: "success";
32
+ refresh: string;
33
+ access: string;
34
+ expires: number;
35
+ email: string;
36
+ projectId: string;
37
+ }
38
+ export interface ExchangeResultFailed {
39
+ type: "failed";
40
+ error: string;
41
+ }
42
+ export type ExchangeResult = ExchangeResultSuccess | ExchangeResultFailed;
43
+ export declare function exchangeAntigravity(code: string, stateStr?: string): Promise<ExchangeResult>;
44
+ export declare function refreshAntigravityAccessToken(refreshTokenKey: string): Promise<{
45
+ accessToken: string;
46
+ expiresAt: number;
47
+ projectId: string;
48
+ } | null>;
49
+ export declare function getOrRefreshAntigravityAccessToken(keyString: string): Promise<{
50
+ accessToken: string;
51
+ projectId: string;
52
+ } | null>;
53
+ export declare function getAntigravityHeaders(accessToken: string, projectId?: string): Record<string, string>;
54
+ export declare function fetchLiveAntigravityModels(accessToken?: string, projectId?: string): Promise<Array<{
55
+ id: string;
56
+ name: string;
57
+ }>>;
58
+ export declare function startLocalCallbackServer(onCodeReceived: (code: string, state?: string) => void, port?: number): () => void;
59
+ //# sourceMappingURL=antigravity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../src/antigravity.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAelD;AAID,eAAO,MAAM,qBAAqB,QAKhC,CAAC;AAEH,eAAO,MAAM,yBAAyB,QAGpC,CAAC;AACH,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAChF,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF,eAAO,MAAM,yBAAyB,wCAAwC,CAAC;AAC/E,eAAO,MAAM,0BAA0B,sDAAsD,CAAC;AAC9F,eAAO,MAAM,8BAA8B,sBAAsB,CAAC;AAClE,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,IAAI,QAAQ,CAOvC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEpF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAmBlF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,MAAW,GAAG;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAoBA;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCzE;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;AAE1E,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkFlG;AAED,wBAAsB,6BAA6B,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAAC,CAyCR;AAID,wBAAsB,kCAAkC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAAC,CAmBR;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAerG;AAED,wBAAsB,0BAA0B,CAC9C,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgI9C;AAED,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,EACtD,IAAI,GAAE,MAAc,GACnB,MAAM,IAAI,CAoCZ"}
@@ -0,0 +1,423 @@
1
+ import crypto from "crypto";
2
+ import http from "http";
3
+ import { spawn } from "child_process";
4
+ export function openUrlInBrowser(url) {
5
+ try {
6
+ if (process.platform === "win32") {
7
+ spawn("rundll32.exe", ["url.dll,FileProtocolHandler", url], {
8
+ detached: true,
9
+ stdio: "ignore",
10
+ }).unref();
11
+ }
12
+ else if (process.platform === "darwin") {
13
+ spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
14
+ }
15
+ else {
16
+ spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
17
+ }
18
+ }
19
+ catch (err) {
20
+ console.debug("[nimsuper] Failed to auto-open browser:", err);
21
+ }
22
+ }
23
+ const charArrToString = (codes) => String.fromCharCode(...codes);
24
+ export const ANTIGRAVITY_CLIENT_ID = charArrToString([
25
+ 49, 48, 55, 49, 48, 48, 54, 48, 54, 48, 53, 57, 49, 45, 116, 109, 104, 115, 115, 105, 110,
26
+ 50, 104, 50, 49, 108, 99, 114, 101, 50, 51, 53, 118, 116, 111, 108, 111, 106, 104, 52, 103,
27
+ 52, 48, 51, 101, 112, 46, 97, 112, 112, 115, 46, 103, 111, 111, 103, 108, 101, 117, 115,
28
+ 101, 114, 99, 111, 110, 116, 101, 110, 116, 46, 99, 111, 109,
29
+ ]);
30
+ export const ANTIGRAVITY_CLIENT_SECRET = charArrToString([
31
+ 71, 79, 67, 83, 80, 88, 45, 75, 53, 56, 70, 87, 82, 52, 56, 54, 76, 100, 76, 74, 49, 109,
32
+ 76, 66, 56, 115, 88, 67, 52, 122, 54, 113, 68, 65, 102,
33
+ ]);
34
+ export const ANTIGRAVITY_REDIRECT_URI = "http://localhost:51121/oauth-callback";
35
+ export const ANTIGRAVITY_SCOPES = [
36
+ "https://www.googleapis.com/auth/cloud-platform",
37
+ "https://www.googleapis.com/auth/userinfo.email",
38
+ "https://www.googleapis.com/auth/userinfo.profile",
39
+ "https://www.googleapis.com/auth/cclog",
40
+ "https://www.googleapis.com/auth/experimentsandconfigs",
41
+ ];
42
+ export const ANTIGRAVITY_ENDPOINT_PROD = "https://cloudcode-pa.googleapis.com";
43
+ export const ANTIGRAVITY_ENDPOINT_DAILY = "https://daily-cloudcode-pa.sandbox.googleapis.com";
44
+ export const ANTIGRAVITY_DEFAULT_PROJECT_ID = "rising-fact-p41fc";
45
+ export const ANTIGRAVITY_VERSION = "1.18.3";
46
+ export function generatePKCE() {
47
+ const verifier = crypto.randomBytes(32).toString("base64url");
48
+ const challenge = crypto
49
+ .createHash("sha256")
50
+ .update(verifier)
51
+ .digest("base64url");
52
+ return { verifier, challenge };
53
+ }
54
+ export function encodeState(payload) {
55
+ return Buffer.from(JSON.stringify(payload), "utf8").toString("base64url");
56
+ }
57
+ export function decodeState(state) {
58
+ try {
59
+ const normalized = state.replace(/-/g, "+").replace(/_/g, "/");
60
+ const padded = normalized.padEnd(normalized.length + ((4 - (normalized.length % 4)) % 4), "=");
61
+ const json = Buffer.from(padded, "base64").toString("utf8");
62
+ const parsed = JSON.parse(json);
63
+ if (typeof parsed.verifier !== "string") {
64
+ throw new Error("Missing PKCE verifier in state");
65
+ }
66
+ return {
67
+ verifier: parsed.verifier,
68
+ projectId: typeof parsed.projectId === "string" ? parsed.projectId : "",
69
+ };
70
+ }
71
+ catch (err) {
72
+ throw new Error(`Failed to decode state: ${err instanceof Error ? err.message : String(err)}`);
73
+ }
74
+ }
75
+ export function authorizeAntigravity(projectId = "") {
76
+ const pkce = generatePKCE();
77
+ const stateStr = encodeState({ verifier: pkce.verifier, projectId: projectId || "" });
78
+ const url = new URL("https://accounts.google.com/o/oauth2/v2/auth");
79
+ url.searchParams.set("client_id", ANTIGRAVITY_CLIENT_ID);
80
+ url.searchParams.set("response_type", "code");
81
+ url.searchParams.set("redirect_uri", ANTIGRAVITY_REDIRECT_URI);
82
+ url.searchParams.set("scope", ANTIGRAVITY_SCOPES.join(" "));
83
+ url.searchParams.set("code_challenge", pkce.challenge);
84
+ url.searchParams.set("code_challenge_method", "S256");
85
+ url.searchParams.set("state", stateStr);
86
+ url.searchParams.set("access_type", "offline");
87
+ url.searchParams.set("prompt", "consent");
88
+ return {
89
+ url: url.toString(),
90
+ verifier: pkce.verifier,
91
+ projectId: projectId || "",
92
+ state: stateStr,
93
+ };
94
+ }
95
+ export async function fetchProjectID(accessToken) {
96
+ const headers = {
97
+ Authorization: `Bearer ${accessToken}`,
98
+ "Content-Type": "application/json",
99
+ "User-Agent": "google-api-nodejs-client/9.15.1",
100
+ "Client-Metadata": `{"ideType":"ANTIGRAVITY","platform":"${process.platform === "win32" ? "WINDOWS" : "MACOS"}","pluginType":"GEMINI"}`,
101
+ };
102
+ const endpoints = [ANTIGRAVITY_ENDPOINT_PROD, ANTIGRAVITY_ENDPOINT_DAILY];
103
+ for (const endpoint of endpoints) {
104
+ try {
105
+ const res = await fetch(`${endpoint}/v1internal:loadCodeAssist`, {
106
+ method: "POST",
107
+ headers,
108
+ body: JSON.stringify({
109
+ metadata: {
110
+ ideType: "ANTIGRAVITY",
111
+ platform: process.platform === "win32" ? "WINDOWS" : "MACOS",
112
+ pluginType: "GEMINI",
113
+ },
114
+ }),
115
+ signal: AbortSignal.timeout(10000),
116
+ });
117
+ if (!res.ok)
118
+ continue;
119
+ const data = (await res.json());
120
+ if (typeof data.cloudaicompanionProject === "string" && data.cloudaicompanionProject) {
121
+ return data.cloudaicompanionProject;
122
+ }
123
+ if (data.cloudaicompanionProject &&
124
+ typeof data.cloudaicompanionProject.id === "string") {
125
+ return data.cloudaicompanionProject.id;
126
+ }
127
+ }
128
+ catch {
129
+ // Continue to next endpoint
130
+ }
131
+ }
132
+ return ANTIGRAVITY_DEFAULT_PROJECT_ID;
133
+ }
134
+ export async function exchangeAntigravity(code, stateStr) {
135
+ try {
136
+ let verifier = "";
137
+ let projectId = "";
138
+ if (stateStr) {
139
+ try {
140
+ const decoded = decodeState(stateStr);
141
+ verifier = decoded.verifier;
142
+ projectId = decoded.projectId;
143
+ }
144
+ catch {
145
+ // Fallback if state format differs
146
+ }
147
+ }
148
+ const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
149
+ method: "POST",
150
+ headers: {
151
+ "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
152
+ Accept: "*/*",
153
+ "User-Agent": "google-api-nodejs-client/9.15.1",
154
+ },
155
+ body: new URLSearchParams({
156
+ client_id: ANTIGRAVITY_CLIENT_ID,
157
+ client_secret: ANTIGRAVITY_CLIENT_SECRET,
158
+ code,
159
+ grant_type: "authorization_code",
160
+ redirect_uri: ANTIGRAVITY_REDIRECT_URI,
161
+ ...(verifier ? { code_verifier: verifier } : {}),
162
+ }),
163
+ signal: AbortSignal.timeout(15000),
164
+ });
165
+ if (!tokenResponse.ok) {
166
+ const errorText = await tokenResponse.text();
167
+ return { type: "failed", error: errorText };
168
+ }
169
+ const tokenPayload = (await tokenResponse.json());
170
+ const userInfoResponse = await fetch("https://www.googleapis.com/oauth2/v1/userinfo?alt=json", {
171
+ headers: {
172
+ Authorization: `Bearer ${tokenPayload.access_token}`,
173
+ "User-Agent": "google-api-nodejs-client/9.15.1",
174
+ },
175
+ signal: AbortSignal.timeout(10000),
176
+ });
177
+ const userInfo = userInfoResponse.ok
178
+ ? (await userInfoResponse.json())
179
+ : {};
180
+ const refreshToken = tokenPayload.refresh_token;
181
+ if (!refreshToken) {
182
+ return { type: "failed", error: "Missing refresh_token in OAuth response" };
183
+ }
184
+ let effectiveProjectId = projectId;
185
+ if (!effectiveProjectId) {
186
+ effectiveProjectId = await fetchProjectID(tokenPayload.access_token);
187
+ }
188
+ const storedRefresh = `${refreshToken}|${effectiveProjectId || ANTIGRAVITY_DEFAULT_PROJECT_ID}`;
189
+ const expiresAt = Date.now() + Math.max(0, (tokenPayload.expires_in - 300)) * 1000;
190
+ return {
191
+ type: "success",
192
+ refresh: storedRefresh,
193
+ access: tokenPayload.access_token,
194
+ expires: expiresAt,
195
+ email: userInfo.email ?? "antigravity-user",
196
+ projectId: effectiveProjectId || ANTIGRAVITY_DEFAULT_PROJECT_ID,
197
+ };
198
+ }
199
+ catch (err) {
200
+ return {
201
+ type: "failed",
202
+ error: err instanceof Error ? err.message : String(err),
203
+ };
204
+ }
205
+ }
206
+ export async function refreshAntigravityAccessToken(refreshTokenKey) {
207
+ const parts = refreshTokenKey.split("|");
208
+ const actualRefreshToken = parts[0];
209
+ const projectId = parts[1] || ANTIGRAVITY_DEFAULT_PROJECT_ID;
210
+ if (!actualRefreshToken)
211
+ return null;
212
+ try {
213
+ const res = await fetch("https://oauth2.googleapis.com/token", {
214
+ method: "POST",
215
+ headers: {
216
+ "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
217
+ Accept: "*/*",
218
+ "User-Agent": "google-api-nodejs-client/9.15.1",
219
+ },
220
+ body: new URLSearchParams({
221
+ client_id: ANTIGRAVITY_CLIENT_ID,
222
+ client_secret: ANTIGRAVITY_CLIENT_SECRET,
223
+ refresh_token: actualRefreshToken,
224
+ grant_type: "refresh_token",
225
+ }),
226
+ signal: AbortSignal.timeout(15000),
227
+ });
228
+ if (!res.ok) {
229
+ console.warn("[nimsuper] Antigravity token refresh failed:", res.status, await res.text());
230
+ return null;
231
+ }
232
+ const data = (await res.json());
233
+ const expiresAt = Date.now() + Math.max(0, (data.expires_in - 300)) * 1000;
234
+ return {
235
+ accessToken: data.access_token,
236
+ expiresAt,
237
+ projectId,
238
+ };
239
+ }
240
+ catch (err) {
241
+ console.error("[nimsuper] Error refreshing Antigravity access token:", err);
242
+ return null;
243
+ }
244
+ }
245
+ const tokenCache = new Map();
246
+ export async function getOrRefreshAntigravityAccessToken(keyString) {
247
+ if (keyString.startsWith("ya29.")) {
248
+ const parts = keyString.split("|");
249
+ return {
250
+ accessToken: parts[0],
251
+ projectId: parts[1] || ANTIGRAVITY_DEFAULT_PROJECT_ID,
252
+ };
253
+ }
254
+ const cached = tokenCache.get(keyString);
255
+ if (cached && cached.expiresAt > Date.now()) {
256
+ return { accessToken: cached.accessToken, projectId: cached.projectId };
257
+ }
258
+ const refreshed = await refreshAntigravityAccessToken(keyString);
259
+ if (!refreshed)
260
+ return null;
261
+ tokenCache.set(keyString, refreshed);
262
+ return { accessToken: refreshed.accessToken, projectId: refreshed.projectId };
263
+ }
264
+ export function getAntigravityHeaders(accessToken, projectId) {
265
+ const platform = process.platform === "win32" ? "WINDOWS" : "MACOS";
266
+ const headers = {
267
+ Authorization: `Bearer ${accessToken}`,
268
+ authorization: `Bearer ${accessToken}`,
269
+ "User-Agent": `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Antigravity/${ANTIGRAVITY_VERSION} Chrome/138.0.7204.235 Electron/37.3.1 Safari/537.36`,
270
+ "X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
271
+ "Client-Metadata": `{"ideType":"ANTIGRAVITY","platform":"${platform}","pluginType":"GEMINI"}`,
272
+ };
273
+ if (projectId) {
274
+ headers["x-goog-user-project"] = projectId;
275
+ }
276
+ return headers;
277
+ }
278
+ export async function fetchLiveAntigravityModels(accessToken, projectId) {
279
+ const defaultModels = [
280
+ { id: "gemini-3.7-flash", name: "Gemini 3.7 Flash" },
281
+ { id: "gemini-3.7-flash-tiered", name: "Gemini 3.7 Flash (Tiered)" },
282
+ { id: "gemini-3.6-flash-high", name: "Gemini 3.6 Flash (Thinking High)" },
283
+ { id: "gemini-3.6-flash-medium", name: "Gemini 3.6 Flash (Thinking Medium)" },
284
+ { id: "gemini-3.6-flash-low", name: "Gemini 3.6 Flash (Thinking Low)" },
285
+ { id: "gemini-pro-agent", name: "Gemini Pro Agent" },
286
+ { id: "gemini-3.1-pro-low", name: "Gemini 3.1 Pro (Thinking Low)" },
287
+ { id: "gemini-3-flash-agent", name: "Gemini 3 Flash Agent" },
288
+ { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" },
289
+ { id: "claude-opus-4-6-thinking", name: "Claude Opus 4.6 Thinking" },
290
+ { id: "gpt-oss-120b-medium", name: "GPT-OSS 120B (Medium)" },
291
+ { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro" },
292
+ { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" },
293
+ ];
294
+ if (!accessToken)
295
+ return defaultModels;
296
+ const endpoints = [
297
+ `${ANTIGRAVITY_ENDPOINT_PROD}/v1internal:fetchAvailableModels`,
298
+ `${ANTIGRAVITY_ENDPOINT_DAILY}/v1internal:fetchAvailableModels`,
299
+ ];
300
+ for (const endpoint of endpoints) {
301
+ try {
302
+ const res = await fetch(endpoint, {
303
+ method: "POST",
304
+ headers: {
305
+ Authorization: `Bearer ${accessToken}`,
306
+ "Content-Type": "application/json",
307
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Antigravity/1.18.3 Chrome/138.0.7204.235 Electron/37.3.1 Safari/537.36",
308
+ "X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
309
+ "Client-Metadata": `{"ideType":"ANTIGRAVITY","platform":"${process.platform === "win32" ? "WINDOWS" : "MACOS"}","pluginType":"GEMINI"}`,
310
+ },
311
+ body: JSON.stringify({}),
312
+ signal: AbortSignal.timeout(10000),
313
+ });
314
+ if (res.ok) {
315
+ const data = (await res.json());
316
+ if (data.models && typeof data.models === "object") {
317
+ const fetchedMap = new Map();
318
+ // Add tiered models (like gemini-3.7-flash-tiered and gemini-3.7-flash)
319
+ if (data.tieredModelIds) {
320
+ for (const list of Object.values(data.tieredModelIds)) {
321
+ if (Array.isArray(list)) {
322
+ for (const tId of list) {
323
+ if (tId && typeof tId === "string") {
324
+ const formatted = tId
325
+ .split("-")
326
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
327
+ .join(" ");
328
+ fetchedMap.set(tId, { id: tId, name: formatted });
329
+ if (tId.endsWith("-tiered")) {
330
+ const baseId = tId.replace(/-tiered$/, "");
331
+ const baseFormatted = baseId
332
+ .split("-")
333
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
334
+ .join(" ");
335
+ fetchedMap.set(baseId, { id: baseId, name: baseFormatted });
336
+ }
337
+ }
338
+ }
339
+ }
340
+ }
341
+ }
342
+ for (const [modelId, info] of Object.entries(data.models)) {
343
+ // Filter out internal hidden test/tab models
344
+ if (info.isInternal ||
345
+ modelId.startsWith("chat_") ||
346
+ modelId.startsWith("tab_") ||
347
+ modelId.startsWith("models/") ||
348
+ modelId.includes("transcription")) {
349
+ continue;
350
+ }
351
+ const rawName = info.displayName;
352
+ const cleanName = rawName && rawName !== "undefined"
353
+ ? rawName
354
+ : modelId
355
+ .split("-")
356
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
357
+ .join(" ");
358
+ fetchedMap.set(modelId, {
359
+ id: modelId,
360
+ name: cleanName,
361
+ });
362
+ }
363
+ // Order by recommended sort if present
364
+ const sortedList = [];
365
+ const recommendedIds = data.agentModelSorts?.[0]?.groups?.[0]?.modelIds ?? [];
366
+ for (const recId of recommendedIds) {
367
+ const m = fetchedMap.get(recId);
368
+ if (m) {
369
+ sortedList.push(m);
370
+ fetchedMap.delete(recId);
371
+ }
372
+ }
373
+ for (const remaining of fetchedMap.values()) {
374
+ sortedList.push(remaining);
375
+ }
376
+ if (sortedList.length > 0) {
377
+ return sortedList;
378
+ }
379
+ }
380
+ }
381
+ }
382
+ catch (err) {
383
+ console.debug("[nimsuper] fetchAvailableModels failed on", endpoint, err);
384
+ }
385
+ }
386
+ return defaultModels;
387
+ }
388
+ export function startLocalCallbackServer(onCodeReceived, port = 51121) {
389
+ const server = http.createServer((req, res) => {
390
+ try {
391
+ const reqUrl = new URL(req.url ?? "/", `http://localhost:${port}`);
392
+ if (reqUrl.pathname === "/oauth-callback") {
393
+ const code = reqUrl.searchParams.get("code");
394
+ const state = reqUrl.searchParams.get("state");
395
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
396
+ res.end(`<html><body style="font-family:sans-serif;text-align:center;padding:40px;background:#1e1e1e;color:#fff;">
397
+ <h2>Authorization Successful!</h2>
398
+ <p>You can close this window and return to your terminal / OpenCode.</p>
399
+ </body></html>`);
400
+ if (code) {
401
+ onCodeReceived(code, state ?? undefined);
402
+ }
403
+ setImmediate(() => server.close());
404
+ }
405
+ else {
406
+ res.writeHead(404);
407
+ res.end();
408
+ }
409
+ }
410
+ catch {
411
+ res.writeHead(500);
412
+ res.end();
413
+ }
414
+ });
415
+ server.listen(port);
416
+ return () => {
417
+ try {
418
+ server.close();
419
+ }
420
+ catch { }
421
+ };
422
+ }
423
+ //# sourceMappingURL=antigravity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../src/antigravity.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,KAAK,CAAC,cAAc,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,EAAE;gBAC1D,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACzC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;IACnD,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IACzF,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;IAC1F,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IACvF,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;IACvD,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;IACxF,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;CACvD,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,uCAAuC,CAAC;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;IAClD,uCAAuC;IACvC,uDAAuD;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,qCAAqC,CAAC;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,mDAAmD,CAAC;AAC9F,MAAM,CAAC,MAAM,8BAA8B,GAAG,mBAAmB,CAAC;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAO5C,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM;SACrB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,WAAW,CAAC,CAAC;IACvB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgD;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAC9B,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EACvD,GAAG,CACJ,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,YAAoB,EAAE;IAMzD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,8CAA8C,CAAC,CAAC;IACpE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACzD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE1C,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,SAAS,IAAI,EAAE;QAC1B,KAAK,EAAE,QAAQ;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,iCAAiC;QAC/C,iBAAiB,EAAE,wCAAwC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,0BAA0B;KACxI,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;IAC1E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,4BAA4B,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,QAAQ,EAAE;wBACR,OAAO,EAAE,aAAa;wBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;wBAC5D,UAAU,EAAE,QAAQ;qBACrB;iBACF,CAAC;gBACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,SAAS;YACtB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC3D,IAAI,OAAO,IAAI,CAAC,uBAAuB,KAAK,QAAQ,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACrF,OAAO,IAAI,CAAC,uBAAuB,CAAC;YACtC,CAAC;YACD,IACE,IAAI,CAAC,uBAAuB;gBAC5B,OAAQ,IAAI,CAAC,uBAAkD,CAAC,EAAE,KAAK,QAAQ,EAC/E,CAAC;gBACD,OAAQ,IAAI,CAAC,uBAAkD,CAAC,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,8BAA8B,CAAC;AACxC,CAAC;AAkBD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAiB;IACvE,IAAI,CAAC;QACH,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAC5B,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,mCAAmC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;YACvE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,iDAAiD;gBACjE,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,iCAAiC;aAChD;YACD,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,SAAS,EAAE,qBAAqB;gBAChC,aAAa,EAAE,yBAAyB;gBACxC,IAAI;gBACJ,UAAU,EAAE,oBAAoB;gBAChC,YAAY,EAAE,wBAAwB;gBACtC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjD,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAI/C,CAAC;QAEF,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,wDAAwD,EAAE;YAC7F,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,YAAY,CAAC,YAAY,EAAE;gBACpD,YAAY,EAAE,iCAAiC;aAChD;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE;YAClC,CAAC,CAAE,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAwB;YACzD,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC;QAChD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC;QAC9E,CAAC;QAED,IAAI,kBAAkB,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,kBAAkB,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,aAAa,GAAG,GAAG,YAAY,IAAI,kBAAkB,IAAI,8BAA8B,EAAE,CAAC;QAChG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAEnF,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,YAAY,CAAC,YAAY;YACjC,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,kBAAkB;YAC3C,SAAS,EAAE,kBAAkB,IAAI,8BAA8B;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,eAAuB;IAKzE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,8BAA8B,CAAC;IAE7D,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,iDAAiD;gBACjE,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,iCAAiC;aAChD;YACD,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,SAAS,EAAE,qBAAqB;gBAChC,aAAa,EAAE,yBAAyB;gBACxC,aAAa,EAAE,kBAAkB;gBACjC,UAAU,EAAE,eAAe;aAC5B,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiD,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;QAE3E,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS;YACT,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uDAAuD,EAAE,GAAG,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyE,CAAC;AAEpG,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,SAAiB;IAIxE,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;YACrB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,8BAA8B;SACtD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IAC1E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,6BAA6B,CAAC,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,SAAkB;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,YAAY,EAAE,gGAAgG,mBAAmB,sDAAsD;QACvL,mBAAmB,EAAE,8CAA8C;QACnE,iBAAiB,EAAE,wCAAwC,QAAQ,0BAA0B;KAC9F,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,qBAAqB,CAAC,GAAG,SAAS,CAAC;IAC7C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAoB,EACpB,SAAkB;IAElB,MAAM,aAAa,GAAG;QACpB,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;QACpD,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,2BAA2B,EAAE;QACpE,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,kCAAkC,EAAE;QACzE,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,oCAAoC,EAAE;QAC7E,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,iCAAiC,EAAE;QACvE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;QACpD,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,+BAA+B,EAAE;QACnE,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC5D,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;QACtD,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,0BAA0B,EAAE;QACpE,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,uBAAuB,EAAE;QAC5D,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE;QAChD,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE;KACrD,CAAC;IAEF,IAAI,CAAC,WAAW;QAAE,OAAO,aAAa,CAAC;IAEvC,MAAM,SAAS,GAAG;QAChB,GAAG,yBAAyB,kCAAkC;QAC9D,GAAG,0BAA0B,kCAAkC;KAChE,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,WAAW,EAAE;oBACtC,cAAc,EAAE,kBAAkB;oBAClC,YAAY,EAAE,yJAAyJ;oBACvK,mBAAmB,EAAE,8CAA8C;oBACnE,iBAAiB,EAAE,wCAAwC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,0BAA0B;iBACxI;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;gBAEF,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACnD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwC,CAAC;oBAEnE,wEAAwE;oBACxE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;wBACxB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;4BACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gCACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oCACvB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;wCACnC,MAAM,SAAS,GAAG,GAAG;6CAClB,KAAK,CAAC,GAAG,CAAC;6CACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;6CAClD,IAAI,CAAC,GAAG,CAAC,CAAC;wCACb,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;wCAClD,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;4CAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;4CAC3C,MAAM,aAAa,GAAG,MAAM;iDACzB,KAAK,CAAC,GAAG,CAAC;iDACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iDAClD,IAAI,CAAC,GAAG,CAAC,CAAC;4CACb,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;wCAC9D,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC1D,6CAA6C;wBAC7C,IACE,IAAI,CAAC,UAAU;4BACf,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;4BAC3B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;4BAC1B,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;4BAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EACjC,CAAC;4BACD,SAAS;wBACX,CAAC;wBAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;wBACjC,MAAM,SAAS,GACb,OAAO,IAAI,OAAO,KAAK,WAAW;4BAChC,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,OAAO;iCACJ,KAAK,CAAC,GAAG,CAAC;iCACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iCAClD,IAAI,CAAC,GAAG,CAAC,CAAC;wBAEnB,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;4BACtB,EAAE,EAAE,OAAO;4BACX,IAAI,EAAE,SAAS;yBAChB,CAAC,CAAC;oBACL,CAAC;oBAED,uCAAuC;oBACvC,MAAM,UAAU,GAAwC,EAAE,CAAC;oBAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;oBAE9E,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;wBACnC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;wBAChC,IAAI,CAAC,EAAE,CAAC;4BACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BACnB,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC3B,CAAC;oBACH,CAAC;oBAED,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC5C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC7B,CAAC;oBAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1B,OAAO,UAAU,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,cAAsD,EACtD,OAAe,KAAK;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAE/C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CACL;;;yBAGe,CAChB,CAAC;gBAEF,IAAI,IAAI,EAAE,CAAC;oBACT,cAAc,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC;gBAC3C,CAAC;gBACD,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC"}