{"version":3,"file":"plugin-support.mjs","names":[],"sources":["../src/plugin/errors.ts","../src/plugin/shared-state.ts","../src/plugin/session.ts","../src/plugin/utils/canonical-id.ts"],"sourcesContent":["/**\n * Error types and formatters for plugin-babel.\n * Simplified from plugin-shared to include only types actually used by the Babel transformer.\n */\n\nimport type { CanonicalId } from \"@soda-gql/common\";\nimport type { BuilderError } from \"../types\";\n\ntype OptionsInvalidBuilderConfig = { readonly code: \"INVALID_BUILDER_CONFIG\"; readonly message: string };\ntype OptionsMissingBuilderConfig = { readonly code: \"MISSING_BUILDER_CONFIG\"; readonly message: string };\ntype OptionsConfigLoadFailed = { readonly code: \"CONFIG_LOAD_FAILED\"; readonly message: string };\n\ntype BuilderEntryNotFound = Extract<BuilderError, { code: \"ENTRY_NOT_FOUND\" }>;\ntype BuilderDocDuplicate = Extract<BuilderError, { code: \"DOC_DUPLICATE\" }>;\ntype BuilderCircularDependency = Extract<BuilderError, { code: \"GRAPH_CIRCULAR_DEPENDENCY\" }>;\ntype BuilderModuleEvaluationFailed = Extract<BuilderError, { code: \"RUNTIME_MODULE_LOAD_FAILED\" }>;\ntype BuilderWriteFailed = Extract<BuilderError, { code: \"WRITE_FAILED\" }>;\n\ntype AnalysisMetadataMissingCause = { readonly filename: string };\ntype AnalysisArtifactMissingCause = { readonly filename: string; readonly canonicalId: CanonicalId };\ntype AnalysisUnsupportedArtifactTypeCause = {\n  readonly filename: string;\n  readonly canonicalId: CanonicalId;\n  readonly artifactType: string;\n};\n\ntype PluginErrorBase<Code extends string, Cause> = {\n  readonly type: \"PluginError\";\n  readonly code: Code;\n  readonly message: string;\n  readonly cause: Cause;\n};\n\nexport type PluginOptionsInvalidBuilderConfigError = PluginErrorBase<\n  \"OPTIONS_INVALID_BUILDER_CONFIG\",\n  OptionsInvalidBuilderConfig | OptionsMissingBuilderConfig | OptionsConfigLoadFailed\n> & { readonly stage: \"normalize-options\" };\n\nexport type PluginBuilderEntryNotFoundError = PluginErrorBase<\"SODA_GQL_BUILDER_ENTRY_NOT_FOUND\", BuilderEntryNotFound> & {\n  readonly stage: \"builder\";\n  readonly entry: string;\n};\n\nexport type PluginBuilderDocDuplicateError = PluginErrorBase<\"SODA_GQL_BUILDER_DOC_DUPLICATE\", BuilderDocDuplicate> & {\n  readonly stage: \"builder\";\n  readonly name: string;\n  readonly sources: readonly string[];\n};\n\nexport type PluginBuilderCircularDependencyError = PluginErrorBase<\n  \"SODA_GQL_BUILDER_CIRCULAR_DEPENDENCY\",\n  BuilderCircularDependency\n> & { readonly stage: \"builder\"; readonly chain: readonly string[] };\n\nexport type PluginBuilderModuleEvaluationFailedError = PluginErrorBase<\n  \"SODA_GQL_BUILDER_MODULE_EVALUATION_FAILED\",\n  BuilderModuleEvaluationFailed\n> & { readonly stage: \"builder\"; readonly filePath: string; readonly astPath: string };\n\nexport type PluginBuilderWriteFailedError = PluginErrorBase<\"SODA_GQL_BUILDER_WRITE_FAILED\", BuilderWriteFailed> & {\n  readonly stage: \"builder\";\n  readonly outPath: string;\n};\n\nexport type PluginBuilderUnexpectedError = PluginErrorBase<\"SODA_GQL_BUILDER_UNEXPECTED\", unknown> & {\n  readonly stage: \"builder\";\n};\n\nexport type PluginAnalysisMetadataMissingError = PluginErrorBase<\"SODA_GQL_METADATA_NOT_FOUND\", AnalysisMetadataMissingCause> & {\n  readonly stage: \"analysis\";\n  readonly filename: string;\n};\n\nexport type PluginAnalysisArtifactMissingError = PluginErrorBase<\n  \"SODA_GQL_ANALYSIS_ARTIFACT_NOT_FOUND\",\n  AnalysisArtifactMissingCause\n> & { readonly stage: \"analysis\"; readonly filename: string; readonly canonicalId: CanonicalId };\n\nexport type PluginAnalysisUnsupportedArtifactTypeError = PluginErrorBase<\n  \"SODA_GQL_UNSUPPORTED_ARTIFACT_TYPE\",\n  AnalysisUnsupportedArtifactTypeCause\n> & {\n  readonly stage: \"analysis\";\n  readonly filename: string;\n  readonly canonicalId: CanonicalId;\n  readonly artifactType: string;\n};\n\ntype TransformMissingBuilderArgCause = { readonly filename: string; readonly builderType: string; readonly argName: string };\ntype TransformUnsupportedValueTypeCause = { readonly valueType: string };\ntype TransformAstVisitorFailedCause = { readonly filename: string; readonly reason: string };\n\nexport type PluginTransformMissingBuilderArgError = PluginErrorBase<\n  \"SODA_GQL_TRANSFORM_MISSING_BUILDER_ARG\",\n  TransformMissingBuilderArgCause\n> & {\n  readonly stage: \"transform\";\n  readonly filename: string;\n  readonly builderType: string;\n  readonly argName: string;\n};\n\nexport type PluginTransformUnsupportedValueTypeError = PluginErrorBase<\n  \"SODA_GQL_TRANSFORM_UNSUPPORTED_VALUE_TYPE\",\n  TransformUnsupportedValueTypeCause\n> & { readonly stage: \"transform\"; readonly valueType: string };\n\nexport type PluginTransformAstVisitorFailedError = PluginErrorBase<\n  \"SODA_GQL_TRANSFORM_AST_VISITOR_FAILED\",\n  TransformAstVisitorFailedCause\n> & { readonly stage: \"transform\"; readonly filename: string; readonly reason: string };\n\n/**\n * Union of all plugin error types.\n */\nexport type PluginError =\n  | PluginOptionsInvalidBuilderConfigError\n  | PluginBuilderEntryNotFoundError\n  | PluginBuilderDocDuplicateError\n  | PluginBuilderCircularDependencyError\n  | PluginBuilderModuleEvaluationFailedError\n  | PluginBuilderWriteFailedError\n  | PluginBuilderUnexpectedError\n  | PluginAnalysisMetadataMissingError\n  | PluginAnalysisArtifactMissingError\n  | PluginAnalysisUnsupportedArtifactTypeError\n  | PluginTransformMissingBuilderArgError\n  | PluginTransformUnsupportedValueTypeError\n  | PluginTransformAstVisitorFailedError;\n\n/**\n * Format a PluginError into a human-readable message.\n */\nexport const formatPluginError = (error: PluginError): string => {\n  const codePrefix = `[${error.code}]`;\n  const stageInfo = \"stage\" in error ? ` (${error.stage})` : \"\";\n  return `${codePrefix}${stageInfo} ${error.message}`;\n};\n\n/**\n * Type guard for PluginError.\n */\nexport const isPluginError = (value: unknown): value is PluginError => {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"type\" in value &&\n    value.type === \"PluginError\" &&\n    \"code\" in value &&\n    \"message\" in value\n  );\n};\n\n/**\n * Assertion helper for unreachable code paths.\n * This is the ONLY acceptable throw in plugin code.\n */\nexport const assertUnreachable = (value: never, context?: string): never => {\n  throw new Error(`[INTERNAL] Unreachable code path${context ? ` in ${context}` : \"\"}: received ${JSON.stringify(value)}`);\n};\n","import type { BuilderArtifact } from \"../artifact/types\";\nimport type { BuilderService } from \"../service\";\nimport type { PluginSession } from \"./session\";\n\n/**\n * Transformer type for code transformation.\n * - 'babel': Use Babel plugin (default, wider compatibility)\n * - 'swc': Use SWC transformer (faster, requires @soda-gql/swc)\n */\nexport type TransformerType = \"babel\" | \"swc\";\n\n/**\n * Minimal interface for SWC transformer.\n * Matches the Transformer interface from @soda-gql/swc.\n */\nexport interface SwcTransformerInterface {\n  transform(input: { sourceCode: string; sourcePath: string; inputSourceMap?: string }): {\n    transformed: boolean;\n    sourceCode: string;\n    sourceMap?: string;\n    errors: ReadonlyArray<{ readonly code: string; readonly message: string; readonly stage: string }>;\n  };\n}\n\n/**\n * Shared state between bundler plugins and loaders.\n * Enables efficient artifact sharing across build pipeline stages.\n */\nexport type SharedState = {\n  pluginSession: PluginSession | null;\n  currentArtifact: BuilderArtifact | null;\n  moduleAdjacency: Map<string, Set<string>>;\n  generation: number;\n  swcTransformer: SwcTransformerInterface | null;\n  transformerType: TransformerType | null;\n  builderService: BuilderService | null;\n};\n\n// Global state for sharing between plugin and loader\nconst sharedStates = new Map<string, SharedState>();\n\n/**\n * Get shared state for a given project (identified by config path or cwd).\n */\nexport const getSharedState = (key: string): SharedState => {\n  let state = sharedStates.get(key);\n  if (!state) {\n    state = {\n      pluginSession: null,\n      currentArtifact: null,\n      moduleAdjacency: new Map(),\n      generation: 0,\n      swcTransformer: null,\n      transformerType: null,\n      builderService: null,\n    };\n    sharedStates.set(key, state);\n  }\n  return state;\n};\n\n/**\n * Update shared artifact.\n */\nexport const setSharedArtifact = (\n  key: string,\n  artifact: BuilderArtifact | null,\n  moduleAdjacency?: Map<string, Set<string>>,\n): void => {\n  const state = getSharedState(key);\n  state.currentArtifact = artifact;\n  if (moduleAdjacency) {\n    state.moduleAdjacency = moduleAdjacency;\n  }\n  state.generation++;\n};\n\n/**\n * Get shared artifact.\n */\nexport const getSharedArtifact = (key: string): BuilderArtifact | null => {\n  return getSharedState(key).currentArtifact;\n};\n\n/**\n * Get shared plugin session.\n */\nexport const getSharedPluginSession = (key: string): PluginSession | null => {\n  return getSharedState(key).pluginSession;\n};\n\n/**\n * Set shared plugin session.\n */\nexport const setSharedPluginSession = (key: string, session: PluginSession | null): void => {\n  getSharedState(key).pluginSession = session;\n};\n\n/**\n * Get the state key from config path or cwd.\n */\nexport const getStateKey = (configPath?: string): string => {\n  return configPath ?? process.cwd();\n};\n\n/**\n * Set shared SWC transformer.\n */\nexport const setSharedSwcTransformer = (key: string, transformer: SwcTransformerInterface | null): void => {\n  getSharedState(key).swcTransformer = transformer;\n};\n\n/**\n * Get shared SWC transformer.\n */\nexport const getSharedSwcTransformer = (key: string): SwcTransformerInterface | null => {\n  return getSharedState(key).swcTransformer;\n};\n\n/**\n * Set shared transformer type.\n */\nexport const setSharedTransformerType = (key: string, transformerType: TransformerType | null): void => {\n  getSharedState(key).transformerType = transformerType;\n};\n\n/**\n * Get shared transformer type.\n */\nexport const getSharedTransformerType = (key: string): TransformerType | null => {\n  return getSharedState(key).transformerType;\n};\n\n/**\n * Get shared BuilderService.\n */\nexport const getSharedBuilderService = (key: string): BuilderService | null => {\n  return getSharedState(key).builderService;\n};\n\n/**\n * Set shared BuilderService.\n */\nexport const setSharedBuilderService = (key: string, service: BuilderService | null): void => {\n  getSharedState(key).builderService = service;\n};\n","/**\n * Plugin session management for all plugins.\n * Unified from plugin-babel and plugin-swc implementations.\n */\n\nimport { loadConfig, type ResolvedSodaGqlConfig } from \"@soda-gql/config\";\nimport { loadArtifactSync } from \"../artifact/loader\";\nimport type { BuilderArtifact } from \"../artifact/types\";\nimport { formatBuilderErrorForCLI } from \"../errors/formatter\";\nimport type { BuilderService } from \"../service\";\nimport { createBuilderService } from \"../service\";\nimport { getSharedBuilderService, getStateKey, setSharedBuilderService } from \"./shared-state\";\n\n/**\n * Plugin options shared across all plugins.\n */\nexport type PluginOptions = {\n  readonly configPath?: string;\n  readonly enabled?: boolean;\n  /**\n   * Whether to fail the build on error.\n   * When true (default), throws an error that fails the bundler build.\n   * When false, logs the error and continues (graceful degradation).\n   */\n  readonly failOnError?: boolean;\n};\n\n/**\n * Plugin session containing builder service and configuration.\n */\nexport type PluginSession = {\n  readonly config: ResolvedSodaGqlConfig;\n  readonly getArtifact: () => BuilderArtifact | null;\n  readonly getArtifactAsync: () => Promise<BuilderArtifact | null>;\n  /**\n   * Whether the session is using a pre-built artifact.\n   * When true, artifacts are loaded from a file instead of built dynamically.\n   */\n  readonly isPrebuiltMode: boolean;\n};\n\n/**\n * Create plugin session by loading config and creating cached builder service.\n * Returns null if disabled or config load fails.\n *\n * @param options - Plugin options\n * @param pluginName - Name of the plugin for error messages\n * @throws Error if failOnError is true and config load fails\n */\nexport const createPluginSession = (options: PluginOptions, pluginName: string): PluginSession | null => {\n  const enabled = options.enabled ?? true;\n  const failOnError = options.failOnError ?? true;\n\n  if (!enabled) {\n    return null;\n  }\n\n  const configResult = loadConfig(options.configPath);\n  if (configResult.isErr()) {\n    const errorMsg = `[${pluginName}] Failed to load config: ${configResult.error.message}`;\n    console.error(errorMsg, {\n      code: configResult.error.code,\n      filePath: configResult.error.filePath,\n      cause: configResult.error.cause,\n    });\n    if (failOnError) {\n      throw new Error(errorMsg, { cause: configResult.error });\n    }\n    return null;\n  }\n\n  const config = configResult.value;\n\n  // Check if pre-built artifact mode is enabled\n  if (config.artifact?.path) {\n    const artifactResult = loadArtifactSync(config.artifact.path);\n\n    if (artifactResult.isErr()) {\n      const errorMsg = `[${pluginName}] Failed to load pre-built artifact: ${artifactResult.error.message}`;\n      console.error(errorMsg, {\n        code: artifactResult.error.code,\n        filePath: artifactResult.error.filePath,\n      });\n      if (failOnError) {\n        throw new Error(errorMsg, { cause: artifactResult.error });\n      }\n      return null;\n    }\n\n    const prebuiltArtifact = artifactResult.value;\n    console.log(`[${pluginName}] Using pre-built artifact: ${config.artifact.path}`);\n\n    return {\n      config,\n      getArtifact: () => prebuiltArtifact,\n      getArtifactAsync: async () => prebuiltArtifact,\n      isPrebuiltMode: true,\n    };\n  }\n\n  // Dynamic build mode\n  const stateKey = getStateKey(options.configPath);\n\n  // Use global BuilderService cache to share FileTracker state across plugin instances\n  const ensureBuilderService = (): BuilderService => {\n    const existing = getSharedBuilderService(stateKey);\n    if (existing) {\n      return existing;\n    }\n\n    const service = createBuilderService({ config });\n    setSharedBuilderService(stateKey, service);\n    return service;\n  };\n\n  /**\n   * Build artifact on every invocation (like tsc-plugin).\n   * This ensures the artifact is always up-to-date with the latest source files.\n   *\n   * @throws Error if failOnError is true and build fails\n   */\n  const getArtifact = (): BuilderArtifact | null => {\n    const builderService = ensureBuilderService();\n    const buildResult = builderService.build();\n    if (buildResult.isErr()) {\n      const formattedError = formatBuilderErrorForCLI(buildResult.error);\n      console.error(`[${pluginName}] Build failed:\\n${formattedError}`);\n      if (failOnError) {\n        throw new Error(`[${pluginName}] ${buildResult.error.message}`, { cause: buildResult.error });\n      }\n      return null;\n    }\n    return buildResult.value;\n  };\n\n  /**\n   * Async version of getArtifact.\n   * Supports async metadata factories and parallel element evaluation.\n   *\n   * @throws Error if failOnError is true and build fails\n   */\n  const getArtifactAsync = async (): Promise<BuilderArtifact | null> => {\n    const builderService = ensureBuilderService();\n    const buildResult = await builderService.buildAsync();\n    if (buildResult.isErr()) {\n      const formattedError = formatBuilderErrorForCLI(buildResult.error);\n      console.error(`[${pluginName}] Build failed:\\n${formattedError}`);\n      if (failOnError) {\n        throw new Error(`[${pluginName}] ${buildResult.error.message}`, { cause: buildResult.error });\n      }\n      return null;\n    }\n    return buildResult.value;\n  };\n\n  return {\n    config,\n    getArtifact,\n    getArtifactAsync,\n    isPrebuiltMode: false,\n  };\n};\n","/**\n * Utility for working with canonical IDs.\n */\n\nimport { resolve } from \"node:path\";\nimport { type CanonicalId, createCanonicalId } from \"@soda-gql/common\";\n\n/**\n * Options for resolving a canonical ID.\n */\nexport type ResolveCanonicalIdOptions = {\n  /**\n   * Base directory for relative path computation.\n   * When provided, the canonical ID will use a path relative to this directory.\n   */\n  readonly baseDir?: string;\n};\n\n/**\n * Resolve a canonical ID from a filename and AST path.\n *\n * @param filename - The source file path (absolute or relative)\n * @param astPath - The AST path within the file\n * @param options - Optional settings including baseDir for relative paths\n * @returns A canonical ID in the format `{path}::{astPath}`\n */\nexport const resolveCanonicalId = (filename: string, astPath: string, options?: ResolveCanonicalIdOptions): CanonicalId => {\n  const { baseDir } = options ?? {};\n  if (baseDir) {\n    return createCanonicalId(filename, astPath, { baseDir });\n  }\n  return createCanonicalId(resolve(filename), astPath);\n};\n"],"mappings":";;;;;;;;;AAqIA,MAAa,qBAAqB,UAA+B;CAC/D,MAAM,aAAa,IAAI,MAAM,KAAK;CAClC,MAAM,YAAY,WAAW,QAAQ,KAAK,MAAM,MAAM,KAAK;AAC3D,QAAO,GAAG,aAAa,UAAU,GAAG,MAAM;;;;;AAM5C,MAAa,iBAAiB,UAAyC;AACrE,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,iBACf,UAAU,SACV,aAAa;;;;;;AAQjB,MAAa,qBAAqB,OAAc,YAA4B;AAC1E,OAAM,IAAI,MAAM,mCAAmC,UAAU,OAAO,YAAY,GAAG,aAAa,KAAK,UAAU,MAAM,GAAG;;;;;ACvH1H,MAAM,eAAe,IAAI,KAA0B;;;;AAKnD,MAAa,kBAAkB,QAA6B;CAC1D,IAAI,QAAQ,aAAa,IAAI,IAAI;AACjC,KAAI,CAAC,OAAO;AACV,UAAQ;GACN,eAAe;GACf,iBAAiB;GACjB,iBAAiB,IAAI,KAAK;GAC1B,YAAY;GACZ,gBAAgB;GAChB,iBAAiB;GACjB,gBAAgB;GACjB;AACD,eAAa,IAAI,KAAK,MAAM;;AAE9B,QAAO;;;;;AAMT,MAAa,qBACX,KACA,UACA,oBACS;CACT,MAAM,QAAQ,eAAe,IAAI;AACjC,OAAM,kBAAkB;AACxB,KAAI,iBAAiB;AACnB,QAAM,kBAAkB;;AAE1B,OAAM;;;;;AAMR,MAAa,qBAAqB,QAAwC;AACxE,QAAO,eAAe,IAAI,CAAC;;;;;AAM7B,MAAa,0BAA0B,QAAsC;AAC3E,QAAO,eAAe,IAAI,CAAC;;;;;AAM7B,MAAa,0BAA0B,KAAa,YAAwC;AAC1F,gBAAe,IAAI,CAAC,gBAAgB;;;;;AAMtC,MAAa,eAAe,eAAgC;AAC1D,QAAO,cAAc,QAAQ,KAAK;;;;;AAMpC,MAAa,2BAA2B,KAAa,gBAAsD;AACzG,gBAAe,IAAI,CAAC,iBAAiB;;;;;AAMvC,MAAa,2BAA2B,QAAgD;AACtF,QAAO,eAAe,IAAI,CAAC;;;;;AAM7B,MAAa,4BAA4B,KAAa,oBAAkD;AACtG,gBAAe,IAAI,CAAC,kBAAkB;;;;;AAMxC,MAAa,4BAA4B,QAAwC;AAC/E,QAAO,eAAe,IAAI,CAAC;;;;;AAM7B,MAAa,2BAA2B,QAAuC;AAC7E,QAAO,eAAe,IAAI,CAAC;;;;;AAM7B,MAAa,2BAA2B,KAAa,YAAyC;AAC5F,gBAAe,IAAI,CAAC,iBAAiB;;;;;;;;;;;;;;;;;AC/FvC,MAAa,uBAAuB,SAAwB,eAA6C;CACvG,MAAM,UAAU,QAAQ,WAAW;CACnC,MAAM,cAAc,QAAQ,eAAe;AAE3C,KAAI,CAAC,SAAS;AACZ,SAAO;;CAGT,MAAM,eAAe,WAAW,QAAQ,WAAW;AACnD,KAAI,aAAa,OAAO,EAAE;EACxB,MAAM,WAAW,IAAI,WAAW,2BAA2B,aAAa,MAAM;AAC9E,UAAQ,MAAM,UAAU;GACtB,MAAM,aAAa,MAAM;GACzB,UAAU,aAAa,MAAM;GAC7B,OAAO,aAAa,MAAM;GAC3B,CAAC;AACF,MAAI,aAAa;AACf,SAAM,IAAI,MAAM,UAAU,EAAE,OAAO,aAAa,OAAO,CAAC;;AAE1D,SAAO;;CAGT,MAAM,SAAS,aAAa;AAG5B,KAAI,OAAO,UAAU,MAAM;EACzB,MAAM,iBAAiB,iBAAiB,OAAO,SAAS,KAAK;AAE7D,MAAI,eAAe,OAAO,EAAE;GAC1B,MAAM,WAAW,IAAI,WAAW,uCAAuC,eAAe,MAAM;AAC5F,WAAQ,MAAM,UAAU;IACtB,MAAM,eAAe,MAAM;IAC3B,UAAU,eAAe,MAAM;IAChC,CAAC;AACF,OAAI,aAAa;AACf,UAAM,IAAI,MAAM,UAAU,EAAE,OAAO,eAAe,OAAO,CAAC;;AAE5D,UAAO;;EAGT,MAAM,mBAAmB,eAAe;AACxC,UAAQ,IAAI,IAAI,WAAW,8BAA8B,OAAO,SAAS,OAAO;AAEhF,SAAO;GACL;GACA,mBAAmB;GACnB,kBAAkB,YAAY;GAC9B,gBAAgB;GACjB;;CAIH,MAAM,WAAW,YAAY,QAAQ,WAAW;CAGhD,MAAM,6BAA6C;EACjD,MAAM,WAAW,wBAAwB,SAAS;AAClD,MAAI,UAAU;AACZ,UAAO;;EAGT,MAAM,UAAU,qBAAqB,EAAE,QAAQ,CAAC;AAChD,0BAAwB,UAAU,QAAQ;AAC1C,SAAO;;;;;;;;CAST,MAAM,oBAA4C;EAChD,MAAM,iBAAiB,sBAAsB;EAC7C,MAAM,cAAc,eAAe,OAAO;AAC1C,MAAI,YAAY,OAAO,EAAE;GACvB,MAAM,iBAAiB,yBAAyB,YAAY,MAAM;AAClE,WAAQ,MAAM,IAAI,WAAW,mBAAmB,iBAAiB;AACjE,OAAI,aAAa;AACf,UAAM,IAAI,MAAM,IAAI,WAAW,IAAI,YAAY,MAAM,WAAW,EAAE,OAAO,YAAY,OAAO,CAAC;;AAE/F,UAAO;;AAET,SAAO,YAAY;;;;;;;;CASrB,MAAM,mBAAmB,YAA6C;EACpE,MAAM,iBAAiB,sBAAsB;EAC7C,MAAM,cAAc,MAAM,eAAe,YAAY;AACrD,MAAI,YAAY,OAAO,EAAE;GACvB,MAAM,iBAAiB,yBAAyB,YAAY,MAAM;AAClE,WAAQ,MAAM,IAAI,WAAW,mBAAmB,iBAAiB;AACjE,OAAI,aAAa;AACf,UAAM,IAAI,MAAM,IAAI,WAAW,IAAI,YAAY,MAAM,WAAW,EAAE,OAAO,YAAY,OAAO,CAAC;;AAE/F,UAAO;;AAET,SAAO,YAAY;;AAGrB,QAAO;EACL;EACA;EACA;EACA,gBAAgB;EACjB;;;;;;;;;;;;;;;;ACtIH,MAAa,sBAAsB,UAAkB,SAAiB,YAAqD;CACzH,MAAM,EAAE,YAAY,WAAW,EAAE;AACjC,KAAI,SAAS;AACX,SAAO,kBAAkB,UAAU,SAAS,EAAE,SAAS,CAAC;;AAE1D,QAAO,kBAAkB,QAAQ,SAAS,EAAE,QAAQ"}