ssh-mcp-pro 1.2.3 → 1.4.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 (200) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +12 -2
  3. package/dist/agent-bin.js +5 -2
  4. package/dist/agent-bin.js.map +1 -1
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +38 -47
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config-security-env.d.ts +4 -0
  10. package/dist/config-security-env.d.ts.map +1 -0
  11. package/dist/config-security-env.js +64 -0
  12. package/dist/config-security-env.js.map +1 -0
  13. package/dist/config.d.ts +2 -2
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +4 -67
  16. package/dist/config.js.map +1 -1
  17. package/dist/connector-profile.d.ts +1 -1
  18. package/dist/connector-profile.d.ts.map +1 -1
  19. package/dist/detect.d.ts.map +1 -1
  20. package/dist/detect.js +226 -192
  21. package/dist/detect.js.map +1 -1
  22. package/dist/ensure-package-service.d.ts +9 -0
  23. package/dist/ensure-package-service.d.ts.map +1 -0
  24. package/dist/ensure-package-service.js +146 -0
  25. package/dist/ensure-package-service.js.map +1 -0
  26. package/dist/ensure-pkg.js +4 -4
  27. package/dist/ensure-pkg.js.map +1 -1
  28. package/dist/ensure.d.ts.map +1 -1
  29. package/dist/ensure.js +15 -144
  30. package/dist/ensure.js.map +1 -1
  31. package/dist/fs-sftp.js +1 -1
  32. package/dist/fs-sftp.js.map +1 -1
  33. package/dist/fs-stat.d.ts +10 -0
  34. package/dist/fs-stat.d.ts.map +1 -0
  35. package/dist/fs-stat.js +62 -0
  36. package/dist/fs-stat.js.map +1 -0
  37. package/dist/fs-tools.d.ts.map +1 -1
  38. package/dist/fs-tools.js +6 -58
  39. package/dist/fs-tools.js.map +1 -1
  40. package/dist/http-security.d.ts.map +1 -1
  41. package/dist/http-security.js +6 -6
  42. package/dist/http-security.js.map +1 -1
  43. package/dist/http-server-runtime.d.ts.map +1 -1
  44. package/dist/http-server-runtime.js +41 -7
  45. package/dist/http-server-runtime.js.map +1 -1
  46. package/dist/index.js +6 -23
  47. package/dist/index.js.map +1 -1
  48. package/dist/mcp-http-web.d.ts +8 -0
  49. package/dist/mcp-http-web.d.ts.map +1 -0
  50. package/dist/mcp-http-web.js +35 -0
  51. package/dist/mcp-http-web.js.map +1 -0
  52. package/dist/mcp.d.ts +6 -2
  53. package/dist/mcp.d.ts.map +1 -1
  54. package/dist/mcp.js +22 -14
  55. package/dist/mcp.js.map +1 -1
  56. package/dist/policy.d.ts +8 -0
  57. package/dist/policy.d.ts.map +1 -1
  58. package/dist/policy.js +147 -105
  59. package/dist/policy.js.map +1 -1
  60. package/dist/process.d.ts.map +1 -1
  61. package/dist/process.js +11 -7
  62. package/dist/process.js.map +1 -1
  63. package/dist/remote/agent-activity-log.d.ts +26 -0
  64. package/dist/remote/agent-activity-log.d.ts.map +1 -0
  65. package/dist/remote/agent-activity-log.js +211 -0
  66. package/dist/remote/agent-activity-log.js.map +1 -0
  67. package/dist/remote/agent-cli.d.ts.map +1 -1
  68. package/dist/remote/agent-cli.js +92 -25
  69. package/dist/remote/agent-cli.js.map +1 -1
  70. package/dist/remote/agent-executor.d.ts.map +1 -1
  71. package/dist/remote/agent-executor.js +22 -10
  72. package/dist/remote/agent-executor.js.map +1 -1
  73. package/dist/remote/agent-handler.d.ts +2 -0
  74. package/dist/remote/agent-handler.d.ts.map +1 -1
  75. package/dist/remote/agent-handler.js +4 -0
  76. package/dist/remote/agent-handler.js.map +1 -1
  77. package/dist/remote/config.d.ts.map +1 -1
  78. package/dist/remote/config.js +12 -1
  79. package/dist/remote/config.js.map +1 -1
  80. package/dist/remote/control-plane.d.ts +12 -0
  81. package/dist/remote/control-plane.d.ts.map +1 -1
  82. package/dist/remote/control-plane.js +164 -56
  83. package/dist/remote/control-plane.js.map +1 -1
  84. package/dist/remote/crypto.d.ts +9 -4
  85. package/dist/remote/crypto.d.ts.map +1 -1
  86. package/dist/remote/crypto.js +41 -9
  87. package/dist/remote/crypto.js.map +1 -1
  88. package/dist/remote/http-util.d.ts.map +1 -1
  89. package/dist/remote/http-util.js +14 -7
  90. package/dist/remote/http-util.js.map +1 -1
  91. package/dist/remote/mcp-tools.d.ts +7 -0
  92. package/dist/remote/mcp-tools.d.ts.map +1 -1
  93. package/dist/remote/mcp-tools.js +28 -0
  94. package/dist/remote/mcp-tools.js.map +1 -1
  95. package/dist/remote/oauth-handler.d.ts +30 -3
  96. package/dist/remote/oauth-handler.d.ts.map +1 -1
  97. package/dist/remote/oauth-handler.js +232 -18
  98. package/dist/remote/oauth-handler.js.map +1 -1
  99. package/dist/remote/policy.js +2 -2
  100. package/dist/remote/policy.js.map +1 -1
  101. package/dist/remote/schemas.d.ts +9 -9
  102. package/dist/remote/schemas.js +6 -6
  103. package/dist/remote/schemas.js.map +1 -1
  104. package/dist/remote/store.d.ts +38 -1
  105. package/dist/remote/store.d.ts.map +1 -1
  106. package/dist/remote/store.js +149 -11
  107. package/dist/remote/store.js.map +1 -1
  108. package/dist/remote/types.d.ts +14 -0
  109. package/dist/remote/types.d.ts.map +1 -1
  110. package/dist/remote/types.js.map +1 -1
  111. package/dist/remote/web-dashboard-client-config.d.ts +77 -0
  112. package/dist/remote/web-dashboard-client-config.d.ts.map +1 -0
  113. package/dist/remote/web-dashboard-client-config.js +81 -0
  114. package/dist/remote/web-dashboard-client-config.js.map +1 -0
  115. package/dist/remote/web-dashboard-html.d.ts +2 -0
  116. package/dist/remote/web-dashboard-html.d.ts.map +1 -0
  117. package/dist/remote/web-dashboard-html.js +433 -0
  118. package/dist/remote/web-dashboard-html.js.map +1 -0
  119. package/dist/remote/web-dashboard-oauth-users.d.ts +4 -0
  120. package/dist/remote/web-dashboard-oauth-users.d.ts.map +1 -0
  121. package/dist/remote/web-dashboard-oauth-users.js +78 -0
  122. package/dist/remote/web-dashboard-oauth-users.js.map +1 -0
  123. package/dist/remote/web-dashboard-static.d.ts +4 -0
  124. package/dist/remote/web-dashboard-static.d.ts.map +1 -0
  125. package/dist/remote/web-dashboard-static.js +19 -0
  126. package/dist/remote/web-dashboard-static.js.map +1 -0
  127. package/dist/remote/web-dashboard-styles.d.ts +2 -0
  128. package/dist/remote/web-dashboard-styles.d.ts.map +1 -0
  129. package/dist/remote/web-dashboard-styles.js +187 -0
  130. package/dist/remote/web-dashboard-styles.js.map +1 -0
  131. package/dist/remote/web-dashboard.d.ts +62 -0
  132. package/dist/remote/web-dashboard.d.ts.map +1 -0
  133. package/dist/remote/web-dashboard.js +467 -0
  134. package/dist/remote/web-dashboard.js.map +1 -0
  135. package/dist/retry.d.ts.map +1 -1
  136. package/dist/retry.js +6 -3
  137. package/dist/retry.js.map +1 -1
  138. package/dist/safety.d.ts.map +1 -1
  139. package/dist/safety.js +56 -6
  140. package/dist/safety.js.map +1 -1
  141. package/dist/session-auth.js +7 -7
  142. package/dist/session-auth.js.map +1 -1
  143. package/dist/session.d.ts +1 -0
  144. package/dist/session.d.ts.map +1 -1
  145. package/dist/session.js +44 -40
  146. package/dist/session.js.map +1 -1
  147. package/dist/shell.d.ts.map +1 -1
  148. package/dist/shell.js +5 -4
  149. package/dist/shell.js.map +1 -1
  150. package/dist/ssh-config.d.ts +2 -2
  151. package/dist/ssh-config.d.ts.map +1 -1
  152. package/dist/ssh-config.js +24 -20
  153. package/dist/ssh-config.js.map +1 -1
  154. package/dist/telemetry.d.ts.map +1 -1
  155. package/dist/telemetry.js +9 -2
  156. package/dist/telemetry.js.map +1 -1
  157. package/dist/tools/connector.provider.d.ts +1 -1
  158. package/dist/tools/connector.provider.d.ts.map +1 -1
  159. package/dist/tools/ensure.provider.d.ts +1 -1
  160. package/dist/tools/ensure.provider.d.ts.map +1 -1
  161. package/dist/tools/fs.provider.d.ts +1 -1
  162. package/dist/tools/fs.provider.d.ts.map +1 -1
  163. package/dist/tools/metadata.d.ts +1 -1
  164. package/dist/tools/metadata.d.ts.map +1 -1
  165. package/dist/tools/output-schemas.d.ts +27 -135
  166. package/dist/tools/output-schemas.d.ts.map +1 -1
  167. package/dist/tools/process.provider.d.ts +1 -1
  168. package/dist/tools/process.provider.d.ts.map +1 -1
  169. package/dist/tools/registry.d.ts +1 -1
  170. package/dist/tools/registry.d.ts.map +1 -1
  171. package/dist/tools/registry.js +16 -13
  172. package/dist/tools/registry.js.map +1 -1
  173. package/dist/tools/session.provider.d.ts +1 -1
  174. package/dist/tools/session.provider.d.ts.map +1 -1
  175. package/dist/tools/system.provider.d.ts +1 -1
  176. package/dist/tools/system.provider.d.ts.map +1 -1
  177. package/dist/tools/transfer.provider.d.ts +1 -1
  178. package/dist/tools/transfer.provider.d.ts.map +1 -1
  179. package/dist/tools/tunnel.provider.d.ts +1 -1
  180. package/dist/tools/tunnel.provider.d.ts.map +1 -1
  181. package/dist/tools/types.d.ts +1 -1
  182. package/dist/tools/types.d.ts.map +1 -1
  183. package/dist/transfer.js +2 -2
  184. package/dist/transfer.js.map +1 -1
  185. package/dist/types.js +1 -1
  186. package/dist/types.js.map +1 -1
  187. package/docs/adding-a-device.md +39 -17
  188. package/docs/agent-activity-monitor.md +34 -0
  189. package/docs/coolify.md +29 -0
  190. package/docs/development/dependency-management.md +1 -1
  191. package/docs/development/mcp-protocol-2026.md +33 -0
  192. package/docs/doppler-guide.md +34 -0
  193. package/docs/reference/compatibility.md +1 -1
  194. package/docs/security/dependency-audit-exceptions.md +3 -7
  195. package/docs/security/hosted-data-inventory.md +81 -0
  196. package/docs/sonarcloud-analysis.md +9 -0
  197. package/mcp.json +1 -1
  198. package/package.json +26 -21
  199. package/registry/ssh-mcp-pro/mcp.json +1 -1
  200. package/server.json +3 -3
@@ -0,0 +1,187 @@
1
+ export const DASHBOARD_STYLES = `
2
+ :root {
3
+ --bg: #0d1117;
4
+ --card-bg: #161b22;
5
+ --card-border: #30363d;
6
+ --text-main: #f0f6fc;
7
+ --text-muted: #8b949e;
8
+ --primary: #238636;
9
+ --primary-hover: #2ea043;
10
+ --blue: #58a6ff;
11
+ --blue-bg: rgba(56, 139, 253, 0.15);
12
+ --red: #f85149;
13
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
14
+ }
15
+ * { box-sizing: border-box; margin: 0; padding: 0; }
16
+ body {
17
+ background-color: var(--bg);
18
+ color: var(--text-main);
19
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
20
+ line-height: 1.5;
21
+ padding-bottom: 60px;
22
+ }
23
+ header {
24
+ background: #161b22;
25
+ border-bottom: 1px solid var(--card-border);
26
+ padding: 16px 24px;
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: space-between;
30
+ position: sticky;
31
+ top: 0;
32
+ z-index: 100;
33
+ }
34
+ .logo-area { display: flex; align-items: center; gap: 12px; }
35
+ .logo-icon { font-size: 24px; }
36
+ .brand-title { font-size: 18px; font-weight: 700; color: #fff; letter-spacing: -0.5px; }
37
+ .brand-sub { font-size: 12px; color: var(--text-muted); }
38
+ .user-area { display: flex; align-items: center; gap: 16px; }
39
+ .badge {
40
+ display: inline-block;
41
+ padding: 2px 8px;
42
+ border-radius: 12px;
43
+ font-size: 11px;
44
+ font-weight: 600;
45
+ text-transform: uppercase;
46
+ }
47
+ .badge-green { background: #238636; color: #fff; }
48
+ .badge-gray { background: #30363d; color: #8b949e; }
49
+ .badge-blue { background: var(--blue-bg); color: var(--blue); border: 1px solid rgba(56,139,253,0.3); }
50
+ .btn {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ gap: 8px;
54
+ padding: 8px 16px;
55
+ border-radius: 6px;
56
+ font-size: 14px;
57
+ font-weight: 600;
58
+ cursor: pointer;
59
+ text-decoration: none;
60
+ border: 1px solid transparent;
61
+ transition: all 0.2s ease;
62
+ }
63
+ .btn-primary { background: var(--primary); color: #fff; border-color: rgba(240,246,252,0.1); }
64
+ .btn-primary:hover { background: var(--primary-hover); }
65
+ .btn-outline { background: transparent; color: var(--text-main); border-color: var(--card-border); }
66
+ .btn-outline:hover { background: #21262d; border-color: #8b949e; }
67
+ .btn-danger { background: rgba(248,81,73,0.1); color: var(--red); border-color: rgba(248,81,73,0.4); }
68
+ .btn-danger:hover { background: var(--red); color: #fff; }
69
+ .btn-sm { padding: 4px 10px; font-size: 12px; }
70
+
71
+ .container { max-width: 1100px; margin: 32px auto; padding: 0 20px; }
72
+
73
+ /* Hero banner */
74
+ .hero {
75
+ background: linear-gradient(180deg, #161b22 0%, #0d1117 100%);
76
+ border: 1px solid var(--card-border);
77
+ border-radius: 12px;
78
+ padding: 48px 32px;
79
+ text-align: center;
80
+ margin-bottom: 32px;
81
+ }
82
+ .hero h1 { font-size: 32px; font-weight: 800; margin-bottom: 12px; color: #fff; }
83
+ .hero p { font-size: 16px; color: var(--text-muted); max-width: 650px; margin: 0 auto 28px; }
84
+ .auth-buttons { display: flex; justify-content: center; gap: 16px; flex-wrap: wrap; }
85
+ .auth-btn {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 12px;
89
+ padding: 12px 24px;
90
+ border-radius: 8px;
91
+ font-weight: 600;
92
+ font-size: 15px;
93
+ text-decoration: none;
94
+ border: 1px solid transparent;
95
+ transition: transform 0.15s ease;
96
+ }
97
+ .auth-btn:hover { transform: translateY(-2px); }
98
+ .auth-btn-google { background: #ffffff; color: #1f2937; border-color: #d1d5db; }
99
+ .auth-btn-github { background: #24292f; color: #ffffff; border-color: #30363d; }
100
+
101
+ /* Tab nav */
102
+ .tabs { display: flex; flex-wrap: wrap; gap: 8px; border-bottom: 1px solid var(--card-border); margin-bottom: 24px; }
103
+ .tab-item {
104
+ background: transparent;
105
+ border: 0;
106
+ font-family: inherit;
107
+ text-align: left;
108
+ padding: 12px 20px;
109
+ cursor: pointer;
110
+ font-weight: 600;
111
+ font-size: 14px;
112
+ color: var(--text-muted);
113
+ border-bottom: 2px solid transparent;
114
+ transition: color 0.15s ease;
115
+ }
116
+ .tab-item.active { color: var(--blue); border-bottom-color: var(--blue); }
117
+ .tab-item:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
118
+ .tab-pane { display: none; }
119
+ .tab-pane.active { display: block; }
120
+
121
+ /* Device Cards */
122
+ .card {
123
+ background: var(--card-bg);
124
+ border: 1px solid var(--card-border);
125
+ border-radius: 8px;
126
+ padding: 20px;
127
+ margin-bottom: 16px;
128
+ }
129
+ .device-row {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ flex-wrap: wrap;
134
+ gap: 16px;
135
+ }
136
+ .device-info { display: flex; align-items: center; gap: 16px; }
137
+ .device-icon {
138
+ font-size: 28px;
139
+ width: 48px;
140
+ height: 48px;
141
+ background: #21262d;
142
+ border-radius: 8px;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ }
147
+ .device-name { font-size: 16px; font-weight: 700; margin-bottom: 4px; display: flex; align-items: center; gap: 8px; }
148
+ .device-meta { font-size: 13px; color: var(--text-muted); font-family: var(--font-mono); }
149
+
150
+ /* Code block */
151
+ .code-box {
152
+ background: #090d13;
153
+ border: 1px solid #30363d;
154
+ border-radius: 6px;
155
+ padding: 14px 18px;
156
+ font-family: var(--font-mono);
157
+ font-size: 13px;
158
+ color: #7ee787;
159
+ overflow-x: auto;
160
+ margin: 12px 0;
161
+ position: relative;
162
+ }
163
+ .copy-btn {
164
+ position: absolute;
165
+ top: 8px;
166
+ right: 8px;
167
+ padding: 4px 8px;
168
+ font-size: 11px;
169
+ background: #21262d;
170
+ color: #c9d1d9;
171
+ border: 1px solid #30363d;
172
+ border-radius: 4px;
173
+ cursor: pointer;
174
+ }
175
+ .copy-btn:hover { background: #30363d; color: #fff; }
176
+
177
+ /* Config guide cards */
178
+ .grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 20px; }
179
+
180
+ /* Empty state */
181
+ .empty-box {
182
+ text-align: center;
183
+ padding: 48px 16px;
184
+ color: var(--text-muted);
185
+ }
186
+ `;
187
+ //# sourceMappingURL=web-dashboard-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-dashboard-styles.js","sourceRoot":"","sources":["../../src/remote/web-dashboard-styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyL/B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type JwtKeyPair } from "./crypto.js";
3
+ import type { OAuthHandler } from "./oauth-handler.js";
4
+ import type { AgentWebSocketHandler } from "./agent-handler.js";
5
+ import { RemoteStore } from "./store.js";
6
+ import type { AuditEvent, RemoteAgentRecord, RemoteConfig, RemotePrincipal } from "./types.js";
7
+ export interface WebDashboardDependencies {
8
+ config: RemoteConfig;
9
+ store: RemoteStore;
10
+ oauth: OAuthHandler;
11
+ agentHandler: AgentWebSocketHandler;
12
+ getJwtKeyPair: () => JwtKeyPair;
13
+ audit: (event: Omit<AuditEvent, "id" | "createdAt">) => void;
14
+ createEnrollmentToken: (principal: RemotePrincipal, args: Record<string, unknown>) => Record<string, unknown>;
15
+ updateAgentPolicy: (principal: RemotePrincipal, agent: RemoteAgentRecord, policyInput: unknown) => RemoteAgentRecord;
16
+ revokeAgent: (principal: RemotePrincipal, agent: RemoteAgentRecord) => RemoteAgentRecord;
17
+ resolveAgent: (userId: string, value: string) => RemoteAgentRecord | undefined;
18
+ }
19
+ export declare class WebDashboardHandler {
20
+ private readonly deps;
21
+ private readonly webAuthTransactions;
22
+ constructor(deps: WebDashboardDependencies);
23
+ private readonly sessionCookieName;
24
+ private sessionCookie;
25
+ private authTransactionCookie;
26
+ private extractSessionToken;
27
+ private matchingAuthTransaction;
28
+ private createWebSession;
29
+ private assertBrowserMutation;
30
+ getPrincipalFromSession(req: IncomingMessage): RemotePrincipal | undefined;
31
+ /** Handle routes for web UI, authentication, dashboard APIs, and agent scripts. */
32
+ handleHttpRequest(req: IncomingMessage, res: ServerResponse, pathname: string): Promise<boolean>;
33
+ private handleScriptRoutes;
34
+ private handleAuthRoutes;
35
+ private handleDashboardApiRoutes;
36
+ private handleDashboardDeviceRoutes;
37
+ private handleDashboardPageRoutes;
38
+ private handleDirectLoginGitHub;
39
+ private handleDirectLoginGoogle;
40
+ /** Authorization state is one-use even after a rejected callback. */
41
+ private consumeWebAuthTransaction;
42
+ private completeWebAuth;
43
+ private handleDirectCallbackGitHub;
44
+ /** A dashboard Google login shares the registered MCP Google callback URL. */
45
+ handleSharedGoogleCallback(req: IncomingMessage, res: ServerResponse): Promise<boolean>;
46
+ private handleDirectCallbackGoogle;
47
+ private handleApiMe;
48
+ private handleApiDevices;
49
+ private quotePosixArg;
50
+ private quotePowerShellArg;
51
+ private handleApiEnrollDevice;
52
+ /** Resolve devices only through the authenticated tenant's ownership boundary. */
53
+ private findOwnedDashboardDevice;
54
+ private handleApiUpdateDevicePolicy;
55
+ /** Revoke access without deleting the inventory or the retained audit trail. */
56
+ private handleApiRevokeDevice;
57
+ private handleApiRemoveDevice;
58
+ private handleApiAudit;
59
+ private handleApiClientConfigs;
60
+ private serveDashboardHtml;
61
+ }
62
+ //# sourceMappingURL=web-dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-dashboard.d.ts","sourceRoot":"","sources":["../../src/remote/web-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAG3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ/F,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,qBAAqB,CAAC;IACpC,aAAa,EAAE,MAAM,UAAU,CAAC;IAChC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,CAAC;IAC7D,qBAAqB,EAAE,CACrB,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,iBAAiB,EAAE,CACjB,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,OAAO,KACjB,iBAAiB,CAAC;IACvB,WAAW,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,KAAK,iBAAiB,CAAC;IACzF,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC;CAChF;AAED,qBAAa,mBAAmB;IAMlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAGhC;gBAEyB,IAAI,EAAE,wBAAwB;IAE3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyB;IAE3D,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,qBAAqB;IAY7B,uBAAuB,CAAC,GAAG,EAAE,eAAe,GAAG,eAAe,GAAG,SAAS;IAsB1E,mFAAmF;IAC7E,iBAAiB,CACrB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IASnB,OAAO,CAAC,kBAAkB;YAcZ,gBAAgB;YAqChB,wBAAwB;YA2BxB,2BAA2B;IAgCzC,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,uBAAuB;IAwC/B,qEAAqE;IACrE,OAAO,CAAC,yBAAyB;IAsBjC,OAAO,CAAC,eAAe;YAgBT,0BAA0B;IAUxC,8EAA8E;IACxE,0BAA0B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;YAQ/E,0BAA0B;IAWxC,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;YAIZ,qBAAqB;IAuCnC,kFAAkF;IAClF,OAAO,CAAC,wBAAwB;YAmBlB,2BAA2B;IAYzC,gFAAgF;IAChF,OAAO,CAAC,qBAAqB;YAWf,qBAAqB;IAyBnC,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,kBAAkB;CAmC3B"}