@samanhappy/mcphub 1.1.15 → 1.2.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.
- package/README.fr.md +1 -0
- package/README.md +1 -0
- package/README.zh.md +1 -0
- package/dist/clients/openapi.js +3 -2
- package/dist/clients/openapi.js.map +1 -1
- package/dist/controllers/credentialBindingController.js +1 -1
- package/dist/controllers/credentialBindingController.js.map +1 -1
- package/dist/controllers/healthController.js +23 -1
- package/dist/controllers/healthController.js.map +1 -1
- package/dist/controllers/metricsController.js +9 -1
- package/dist/controllers/metricsController.js.map +1 -1
- package/dist/controllers/oauthDynamicRegistrationController.js +5 -5
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
- package/dist/db/connection.js +6 -2
- package/dist/db/connection.js.map +1 -1
- package/dist/db/entities/OAuthState.js +43 -0
- package/dist/db/entities/OAuthState.js.map +1 -0
- package/dist/db/entities/index.js +3 -1
- package/dist/db/entities/index.js.map +1 -1
- package/dist/db/replicaSchema.js +40 -0
- package/dist/db/replicaSchema.js.map +1 -0
- package/dist/db/setup.js +25 -0
- package/dist/db/setup.js.map +1 -0
- package/dist/db/transactionContext.js +21 -0
- package/dist/db/transactionContext.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/middlewares/replicaConfig.js +134 -0
- package/dist/middlewares/replicaConfig.js.map +1 -0
- package/dist/middlewares/userContext.js +1 -1
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +57 -7
- package/dist/models/OAuth.js.map +1 -1
- package/dist/routes/index.js +14 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/server.js +13 -4
- package/dist/server.js.map +1 -1
- package/dist/services/credentialBindingService.js +5 -1
- package/dist/services/credentialBindingService.js.map +1 -1
- package/dist/services/mcpOAuthProvider.js +91 -5
- package/dist/services/mcpOAuthProvider.js.map +1 -1
- package/dist/services/mcpService.js +110 -7
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/metricsService.js +4 -0
- package/dist/services/metricsService.js.map +1 -1
- package/dist/services/oauthClientRegistration.js +21 -1
- package/dist/services/oauthClientRegistration.js.map +1 -1
- package/dist/services/oauthServerService.js +5 -6
- package/dist/services/oauthServerService.js.map +1 -1
- package/dist/services/oauthSettingsStore.js +21 -0
- package/dist/services/oauthSettingsStore.js.map +1 -1
- package/dist/services/personalOAuthService.js +40 -2
- package/dist/services/personalOAuthService.js.map +1 -1
- package/dist/services/replicaLock.js +30 -0
- package/dist/services/replicaLock.js.map +1 -0
- package/dist/services/replicaService.js +111 -0
- package/dist/services/replicaService.js.map +1 -0
- package/dist/services/sseService.js +3 -2
- package/dist/services/sseService.js.map +1 -1
- package/dist/utils/logger.js +7 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/migration.js +3 -0
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/replicaLogContext.js +3 -0
- package/dist/utils/replicaLogContext.js.map +1 -0
- package/dist/utils/replicaMode.js +17 -0
- package/dist/utils/replicaMode.js.map +1 -0
- package/dist/utils/serverConfigPersistence.js +4 -0
- package/dist/utils/serverConfigPersistence.js.map +1 -1
- package/dist/utils/settingsSync.js +1 -0
- package/dist/utils/settingsSync.js.map +1 -1
- package/frontend/dist/assets/{ActivityPage-Bi-TjKez.js → ActivityPage-CSXEpl6y.js} +2 -2
- package/frontend/dist/assets/{ActivityPage-Bi-TjKez.js.map → ActivityPage-CSXEpl6y.js.map} +1 -1
- package/frontend/dist/assets/{CredentialsPage-C4Ucer3d.js → CredentialsPage-CPxOHQUZ.js} +2 -2
- package/frontend/dist/assets/{CredentialsPage-C4Ucer3d.js.map → CredentialsPage-CPxOHQUZ.js.map} +1 -1
- package/frontend/dist/assets/{Dashboard-C_2KkuoD.js → Dashboard-Da-YT_l_.js} +2 -2
- package/frontend/dist/assets/{Dashboard-C_2KkuoD.js.map → Dashboard-Da-YT_l_.js.map} +1 -1
- package/frontend/dist/assets/{EndpointCopy-DITVC2YQ.js → EndpointCopy-CZOjiFAH.js} +2 -2
- package/frontend/dist/assets/{EndpointCopy-DITVC2YQ.js.map → EndpointCopy-CZOjiFAH.js.map} +1 -1
- package/frontend/dist/assets/{GroupsPage-sE6YJyuK.js → GroupsPage-CSA5G9_H.js} +2 -2
- package/frontend/dist/assets/{GroupsPage-sE6YJyuK.js.map → GroupsPage-CSA5G9_H.js.map} +1 -1
- package/frontend/dist/assets/{LoginPage-CFsd_nY-.js → LoginPage-7RswUPtG.js} +2 -2
- package/frontend/dist/assets/{LoginPage-CFsd_nY-.js.map → LoginPage-7RswUPtG.js.map} +1 -1
- package/frontend/dist/assets/{LogsPage-BxZuGDuc.js → LogsPage-Dbef_68F.js} +2 -2
- package/frontend/dist/assets/{LogsPage-BxZuGDuc.js.map → LogsPage-Dbef_68F.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-CDBs4vMb.js → MarketPage-rSBdHZxo.js} +2 -2
- package/frontend/dist/assets/{MarketPage-CDBs4vMb.js.map → MarketPage-rSBdHZxo.js.map} +1 -1
- package/frontend/dist/assets/{OAuthConsentPage-BN_ucViM.js → OAuthConsentPage-BH9O7bk3.js} +2 -2
- package/frontend/dist/assets/{OAuthConsentPage-BN_ucViM.js.map → OAuthConsentPage-BH9O7bk3.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-Bl3ySXGK.js → PromptsPage-B558MhVU.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-Bl3ySXGK.js.map → PromptsPage-B558MhVU.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-BOzQkQ92.js → ResourcesPage-DQpy8B9L.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-BOzQkQ92.js.map → ResourcesPage-DQpy8B9L.js.map} +1 -1
- package/frontend/dist/assets/{ServersPage-DHYwQ5AM.js → ServersPage-DBcC8pG2.js} +4 -4
- package/frontend/dist/assets/ServersPage-DBcC8pG2.js.map +1 -0
- package/frontend/dist/assets/{SettingsPage-CSJ35jlM.js → SettingsPage-BcpeHFR3.js} +2 -2
- package/frontend/dist/assets/{SettingsPage-CSJ35jlM.js.map → SettingsPage-BcpeHFR3.js.map} +1 -1
- package/frontend/dist/assets/{StatusDot-NSjojGCy.js → StatusDot-CLxRrJ5l.js} +2 -2
- package/frontend/dist/assets/{StatusDot-NSjojGCy.js.map → StatusDot-CLxRrJ5l.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-BIZWpNzm.js → ToggleGroup-DuWJZU41.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-BIZWpNzm.js.map → ToggleGroup-DuWJZU41.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-DC51v2b8.js → UsersPage-B158Bofs.js} +2 -2
- package/frontend/dist/assets/{UsersPage-DC51v2b8.js.map → UsersPage-B158Bofs.js.map} +1 -1
- package/frontend/dist/assets/{clipboard-ik5YV95M.js → clipboard-BLr_gbf8.js} +2 -2
- package/frontend/dist/assets/{clipboard-ik5YV95M.js.map → clipboard-BLr_gbf8.js.map} +1 -1
- package/frontend/dist/assets/{costRevision-Bxov9_vH.js → costRevision-Dzec2k_b.js} +2 -2
- package/frontend/dist/assets/{costRevision-Bxov9_vH.js.map → costRevision-Dzec2k_b.js.map} +1 -1
- package/frontend/dist/assets/index-CGRjM_NC.js +3 -0
- package/frontend/dist/assets/index-CGRjM_NC.js.map +1 -0
- package/frontend/dist/assets/{resourceService-DMzCAZ0B.js → resourceService-BNH7uNar.js} +2 -2
- package/frontend/dist/assets/{resourceService-DMzCAZ0B.js.map → resourceService-BNH7uNar.js.map} +1 -1
- package/frontend/dist/assets/{useCostData-CcFSYViI.js → useCostData-B2d2eLCD.js} +2 -2
- package/frontend/dist/assets/{useCostData-CcFSYViI.js.map → useCostData-B2d2eLCD.js.map} +1 -1
- package/frontend/dist/assets/{variableDetection-CbYSa1ka.js → variableDetection-DRdE941j.js} +14 -14
- package/frontend/dist/assets/{variableDetection-CbYSa1ka.js.map → variableDetection-DRdE941j.js.map} +1 -1
- package/frontend/dist/index.html +1 -1
- package/package.json +3 -1
- package/frontend/dist/assets/ServersPage-DHYwQ5AM.js.map +0 -1
- package/frontend/dist/assets/index-6AyPtx0A.js +0 -3
- package/frontend/dist/assets/index-6AyPtx0A.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as c,l as t,j as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=resourceService-
|
|
1
|
+
import{i as c,l as t,j as n}from"./index-CGRjM_NC.js";import"./framework-vendor-D0S_ys6r.js";import"./i18n-vendor-COTriSc6.js";import"./icons-vendor-DZjjGrOu.js";const d=async(r,o,s)=>{try{const e=await t(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/toggle`,{enabled:s},{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message}}catch(e){return console.error("Error toggling resource",{serverName:r,resourceUri:o,enabled:s,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}},g=async(r,o,s)=>{try{const e=await n(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/description`,{description:s},{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message}}catch(e){return console.error("Error updating resource description",{serverName:r,resourceUri:o,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}},m=async(r,o)=>{var s;try{const e=await c(`/servers/${encodeURIComponent(r)}/resources/${encodeURIComponent(o)}/description`,{headers:{Authorization:`Bearer ${localStorage.getItem("mcphub_token")}`}});return{success:e.success,error:e.success?void 0:e.message,description:(s=e.data)==null?void 0:s.description}}catch(e){return console.error("Error resetting resource description",{serverName:r,resourceUri:o,error:e}),{success:!1,error:e instanceof Error?e.message:"Unknown error occurred"}}};export{m as resetResourceDescription,d as toggleResource,g as updateResourceDescription};
|
|
2
|
+
//# sourceMappingURL=resourceService-BNH7uNar.js.map
|
package/frontend/dist/assets/{resourceService-DMzCAZ0B.js.map → resourceService-BNH7uNar.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resourceService-
|
|
1
|
+
{"version":3,"file":"resourceService-BNH7uNar.js","sources":["../../src/services/resourceService.ts"],"sourcesContent":["import { apiDelete, apiPost, apiPut } from '../utils/fetchInterceptor';\n\n/**\n * Toggle a resource's enabled state for a specific server\n */\nexport const toggleResource = async (\n serverName: string,\n resourceUri: string,\n enabled: boolean,\n): Promise<{ success: boolean; error?: string }> => {\n try {\n const response = await apiPost<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/toggle`,\n { enabled },\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n };\n } catch (error) {\n console.error('Error toggling resource', { serverName, resourceUri, enabled, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n\n/**\n * Update a resource's description for a specific server\n */\nexport const updateResourceDescription = async (\n serverName: string,\n resourceUri: string,\n description: string,\n): Promise<{ success: boolean; error?: string }> => {\n try {\n const response = await apiPut<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/description`,\n { description },\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n };\n } catch (error) {\n console.error('Error updating resource description', { serverName, resourceUri, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n\nexport const resetResourceDescription = async (\n serverName: string,\n resourceUri: string,\n): Promise<{ success: boolean; error?: string; description?: string }> => {\n try {\n const response = await apiDelete<any>(\n `/servers/${encodeURIComponent(serverName)}/resources/${encodeURIComponent(resourceUri)}/description`,\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('mcphub_token')}`,\n },\n },\n );\n\n return {\n success: response.success,\n error: response.success ? undefined : response.message,\n description: response.data?.description,\n };\n } catch (error) {\n console.error('Error resetting resource description', { serverName, resourceUri, error });\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n};\n"],"names":["toggleResource","serverName","resourceUri","enabled","response","apiPost","error","updateResourceDescription","description","apiPut","resetResourceDescription","apiDelete","_a"],"mappings":"kKAKO,MAAMA,EAAiB,MAC5BC,EACAC,EACAC,IACkD,CAClD,GAAI,CACF,MAAMC,EAAW,MAAMC,EACrB,YAAY,mBAAmBJ,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,UACvF,CAAE,QAAAC,CAAA,EACF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASC,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,OAAA,CAEnD,OAASE,EAAO,CACd,eAAQ,MAAM,0BAA2B,CAAE,WAAAL,EAAY,YAAAC,EAAa,QAAAC,EAAS,MAAAG,EAAO,EAC7E,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF,EAKaC,EAA4B,MACvCN,EACAC,EACAM,IACkD,CAClD,GAAI,CACF,MAAMJ,EAAW,MAAMK,EACrB,YAAY,mBAAmBR,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,eACvF,CAAE,YAAAM,CAAA,EACF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASJ,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,OAAA,CAEnD,OAASE,EAAO,CACd,eAAQ,MAAM,sCAAuC,CAAE,WAAAL,EAAY,YAAAC,EAAa,MAAAI,EAAO,EAChF,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF,EAEaI,EAA2B,MACtCT,EACAC,IACwE,OACxE,GAAI,CACF,MAAME,EAAW,MAAMO,EACrB,YAAY,mBAAmBV,CAAU,CAAC,cAAc,mBAAmBC,CAAW,CAAC,eACvF,CACE,QAAS,CACP,cAAe,UAAU,aAAa,QAAQ,cAAc,CAAC,EAAA,CAC/D,CACF,EAGF,MAAO,CACL,QAASE,EAAS,QAClB,MAAOA,EAAS,QAAU,OAAYA,EAAS,QAC/C,aAAaQ,EAAAR,EAAS,OAAT,YAAAQ,EAAe,WAAA,CAEhC,OAASN,EAAO,CACd,eAAQ,MAAM,uCAAwC,CAAE,WAAAL,EAAY,YAAAC,EAAa,MAAAI,EAAO,EACjF,CACL,QAAS,GACT,MAAOA,aAAiB,MAAQA,EAAM,QAAU,wBAAA,CAEpD,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{p as v,h as d}from"./index-
|
|
2
|
-
//# sourceMappingURL=useCostData-
|
|
1
|
+
import{p as v,h as d}from"./index-CGRjM_NC.js";import{r as s}from"./framework-vendor-D0S_ys6r.js";const w=r=>{const c=v(),{refreshIfNeeded:u}=c;return s.useEffect(()=>{r!=null&&r.refreshOnMount&&u()},[r==null?void 0:r.refreshOnMount,u]),c},E=(r="")=>{const[c,u]=s.useState([]),[h,C]=s.useState([]),[m,o]=s.useState(!0),a=s.useRef(null),f=s.useCallback(async()=>{try{o(!0);const[e,t]=await Promise.all([d("/cost/servers"),d("/cost/groups")]);return e!=null&&e.success&&Array.isArray(e.data)&&u(e.data),t!=null&&t.success&&Array.isArray(t.data)&&C(t.data),!!(e!=null&&e.success&&Array.isArray(e.data)&&(t!=null&&t.success)&&Array.isArray(t.data))}catch(e){return console.error("Error fetching context footprint:",e),!1}finally{o(!1)}},[]),n=s.useCallback(()=>(a.current||(a.current=f().finally(()=>{a.current=null})),a.current),[f]);return s.useEffect(()=>{let e=!0,t,i=0;const l=async()=>{const A=await n();e&&!A&&i<3&&(t=setTimeout(()=>void l(),2e3*2**i++))},y=a.current;return(async()=>(y&&await y,e&&await l()))(),()=>{e=!1,clearTimeout(t)}},[n,r]),{serverCosts:c,groupCosts:h,loading:m,refetch:n}};export{E as a,w as u};
|
|
2
|
+
//# sourceMappingURL=useCostData-B2d2eLCD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCostData-
|
|
1
|
+
{"version":3,"file":"useCostData-B2d2eLCD.js","sources":["../../src/hooks/useServerData.ts","../../src/hooks/useCostData.ts"],"sourcesContent":["// This hook now delegates to the ServerContext to avoid duplicate requests\n// All components will share the same server data and polling mechanism\nimport { useServerContext } from '@/contexts/ServerContext';\nimport { useEffect } from 'react';\n\nexport const useServerData = (options?: { refreshOnMount?: boolean }) => {\n const context = useServerContext();\n const { refreshIfNeeded } = context;\n\n // Optionally refresh on mount for pages that need fresh data\n useEffect(() => {\n if (options?.refreshOnMount) {\n refreshIfNeeded();\n }\n }, [options?.refreshOnMount, refreshIfNeeded]);\n\n return context;\n};\n\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { apiGet } from '../utils/fetchInterceptor';\nimport type { ApiResponse, ServerCost, GroupCost } from '@/types';\n\nexport const useCostData = (revision = '') => {\n const [serverCosts, setServerCosts] = useState<ServerCost[]>([]);\n const [groupCosts, setGroupCosts] = useState<GroupCost[]>([]);\n const [loading, setLoading] = useState(true);\n\n const inFlight = useRef<Promise<boolean> | null>(null);\n\n const loadCosts = useCallback(async () => {\n try {\n setLoading(true);\n const [servers, groups] = await Promise.all([\n apiGet('/cost/servers') as Promise<ApiResponse<ServerCost[]>>,\n apiGet('/cost/groups') as Promise<ApiResponse<GroupCost[]>>,\n ]);\n if (servers?.success && Array.isArray(servers.data)) setServerCosts(servers.data);\n if (groups?.success && Array.isArray(groups.data)) setGroupCosts(groups.data);\n return Boolean(\n servers?.success &&\n Array.isArray(servers.data) &&\n groups?.success &&\n Array.isArray(groups.data),\n );\n } catch (err) {\n console.error('Error fetching context footprint:', err);\n return false;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const fetchCosts = useCallback(() => {\n if (!inFlight.current) {\n inFlight.current = loadCosts().finally(() => {\n inFlight.current = null;\n });\n }\n return inFlight.current;\n }, [loadCosts]);\n\n useEffect(() => {\n // A revision change during an active request must still fetch the new state.\n let active = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let retries = 0;\n const refresh = async () => {\n const success = await fetchCosts();\n if (active && !success && retries < 3) {\n // Retry transient failures even when catalog revisions stay unchanged.\n timer = setTimeout(() => void refresh(), 2000 * 2 ** retries++);\n }\n };\n const previous = inFlight.current;\n void (async () => {\n if (previous) await previous;\n if (active) await refresh();\n })();\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [fetchCosts, revision]);\n\n return { serverCosts, groupCosts, loading, refetch: fetchCosts };\n};\n"],"names":["useServerData","options","context","useServerContext","refreshIfNeeded","useEffect","useCostData","revision","serverCosts","setServerCosts","useState","groupCosts","setGroupCosts","loading","setLoading","inFlight","useRef","loadCosts","useCallback","servers","groups","apiGet","err","fetchCosts","active","timer","retries","refresh","success","previous"],"mappings":"kGAKO,MAAMA,EAAiBC,GAA2C,CACvE,MAAMC,EAAUC,EAAA,EACV,CAAE,gBAAAC,GAAoBF,EAG5BG,OAAAA,EAAAA,UAAU,IAAM,CACVJ,GAAA,MAAAA,EAAS,gBACXG,EAAA,CAEJ,EAAG,CAACH,GAAA,YAAAA,EAAS,eAAgBG,CAAe,CAAC,EAEtCF,CACT,ECbaI,EAAc,CAACC,EAAW,KAAO,CAC5C,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAuB,CAAA,CAAE,EACzD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAsB,CAAA,CAAE,EACtD,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAAS,EAAI,EAErCK,EAAWC,EAAAA,OAAgC,IAAI,EAE/CC,EAAYC,EAAAA,YAAY,SAAY,CACxC,GAAI,CACFJ,EAAW,EAAI,EACf,KAAM,CAACK,EAASC,CAAM,EAAI,MAAM,QAAQ,IAAI,CAC1CC,EAAO,eAAe,EACtBA,EAAO,cAAc,CAAA,CACtB,EACD,OAAIF,GAAA,MAAAA,EAAS,SAAW,MAAM,QAAQA,EAAQ,IAAI,GAAGV,EAAeU,EAAQ,IAAI,EAC5EC,GAAA,MAAAA,EAAQ,SAAW,MAAM,QAAQA,EAAO,IAAI,GAAGR,EAAcQ,EAAO,IAAI,EACrE,GACLD,GAAA,MAAAA,EAAS,SACP,MAAM,QAAQA,EAAQ,IAAI,IAC1BC,GAAA,MAAAA,EAAQ,UACR,MAAM,QAAQA,EAAO,IAAI,EAE/B,OAASE,EAAK,CACZ,eAAQ,MAAM,oCAAqCA,CAAG,EAC/C,EACT,QAAA,CACER,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAECS,EAAaL,EAAAA,YAAY,KACxBH,EAAS,UACZA,EAAS,QAAUE,EAAA,EAAY,QAAQ,IAAM,CAC3CF,EAAS,QAAU,IACrB,CAAC,GAEIA,EAAS,SACf,CAACE,CAAS,CAAC,EAEdZ,OAAAA,EAAAA,UAAU,IAAM,CAEd,IAAImB,EAAS,GACTC,EACAC,EAAU,EACd,MAAMC,EAAU,SAAY,CAC1B,MAAMC,EAAU,MAAML,EAAA,EAClBC,GAAU,CAACI,GAAWF,EAAU,IAElCD,EAAQ,WAAW,IAAM,KAAKE,IAAW,IAAO,GAAKD,GAAS,EAElE,EACMG,EAAWd,EAAS,QAC1B,OAAM,UACAc,GAAU,MAAMA,EAChBL,SAAcG,EAAA,MAEb,IAAM,CACXH,EAAS,GACT,aAAaC,CAAK,CACpB,CACF,EAAG,CAACF,EAAYhB,CAAQ,CAAC,EAElB,CAAE,YAAAC,EAAa,WAAAG,EAAY,QAAAE,EAAS,QAASU,CAAA,CACtD"}
|