{"version":3,"file":"ImageElement.cjs","sources":["../../../src/elements/ImageElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\nimport { DEFAULT_IMAGE_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { ElementType } from '../types/enums.js';\nimport { loadImage } from '@napi-rs/canvas';\nimport { toPixels } from '../utils/unit-converter.js';\nimport paper from '@chnak/paper';\nimport { calculateImageFit } from '../utils/image-fit.js';\nimport { getPresetAnimation } from '../animations/preset-animations.js';\nimport { TransformAnimation } from '../animations/TransformAnimation.js';\nimport { KeyframeAnimation } from '../animations/KeyframeAnimation.js';\nimport fs from 'fs';\n/**\n * 图片元素\n */\nexport class ImageElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.IMAGE;\n    // 重新合并配置，确保传入的config优先级最高\n    this.config = deepMerge({}, DEFAULT_IMAGE_CONFIG, config);\n    this.src = this.config.src;\n    this.imageData = null;\n    this.loaded = false;\n    this._warnedMissing = false;\n\n    // 缓存 auto 模式选择的方向\n    this._cachedZoomDirection = null;\n\n    // 自动注入缩放动画（非 auto 模式）\n    this._injectZoomAnimation();\n  }\n\n  /**\n   * 自动注入缩放动画到动画系统\n   * 注意：在构造函数中调用时，startTime/endTime 可能还未设置\n   * 所以如果 startTime 无效，延迟到 initialize 时再注入\n   */\n  _injectZoomAnimation() {\n    const zoomDirection = this.config.zoomDirection || 'none';\n    if (zoomDirection === 'none' || zoomDirection === 'auto') return;\n\n\n    // 如果 startTime 无效（undefined），延迟到 initialize 时再注入\n    if (this.startTime === undefined || this.startTime === null) {\n      return;\n    }\n\n    this._doInjectZoomAnimation();\n  }\n\n\n  /**\n   * 实际执行 Ken Burns 动画注入\n   * 可在需要时调用以重新计算动画\n   */\n  _doInjectZoomAnimation() {\n    const zoomDirection = this.config.zoomDirection || 'none';\n    if (zoomDirection === 'none' || zoomDirection === 'auto') return;\n\n    // 获取 Ken Burns 参数\n    const zoomAmount = this.config.zoomAmount !== undefined ? this.config.zoomAmount : 0.2;\n    // 动画时长使用元素的有效时长（endTime - startTime），确保动画覆盖整个元素周期\n    const elementDuration = (this.endTime !== undefined && this.endTime !== Infinity) \n      ? (this.endTime - this.startTime) \n      : (this.duration || 5);\n    \n    // 设置 this.duration 确保 _getProgress 正确计算进度\n    this.duration = elementDuration;\n\n    // 计算缩放值\n    // zoomAmount = 0.2 → scale 从 1.0 到 1.3\n    const scaleTo = 1 + zoomAmount * 1.5;\n    const scaleFrom = 1.0;\n\n    // 计算最大平移量\n    // 根据时长动态调整：如果场景时长超过5秒，位移按比例增加\n    // 与放大效果保持一致：放大最终值为 1 + zoomAmount * 1.5\n    // 位移最终值 = zoomAmount * zoomPanRatio * (elementDuration / 5)\n    // zoomPanRatio 可配置，默认 300 像素\n    const zoomPanRatio = this.config.zoomPanRatio !== undefined ? this.config.zoomPanRatio : 300;\n    const maxPan = zoomAmount * zoomPanRatio * (elementDuration / 5);\n\n    // 根据方向计算起始和结束位置的平移\n    // 关键：从全屏中心开始，向一个方向缓慢移动\n    let startPanX = 0, startPanY = 0;\n    let endPanX = 0, endPanY = 0;\n\n    if (zoomDirection === 'left') {\n      // 向左移动 → 看到的内容从中心向右移动\n      endPanX = -maxPan;\n    } else if (zoomDirection === 'right') {\n      // 向右移动 → 图片位置增加（向右）\n      endPanX = maxPan;\n    } else if (zoomDirection === 'up') {\n      // 向上移动 → 图片位置减少（向上）\n      endPanY = -maxPan;\n    } else if (zoomDirection === 'down') {\n      // 向下移动 → 图片位置增加（向下）\n      endPanY = maxPan;\n    } else if (zoomDirection === 'diagonal1') {\n      // 左上到右下 → 向右下方向\n      endPanX = maxPan;\n      endPanY = maxPan;\n    } else if (zoomDirection === 'diagonal2') {\n      // 右上到左下 → 向左下方向\n      endPanX = -maxPan;\n      endPanY = maxPan;\n    } else if (zoomDirection === 'diagonal3') {\n      // 左下到右上 → 向右上方向\n      endPanX = maxPan;\n      endPanY = -maxPan;\n    } else if (zoomDirection === 'diagonal4') {\n      // 右下到左上 → 向左上方向\n      endPanX = -maxPan;\n      endPanY = -maxPan;\n    } else if (zoomDirection === 'diagonal5') {\n      // 左上到右下（大角度，更水平）\n      endPanX = maxPan;\n      endPanY = maxPan;\n    } else if (zoomDirection === 'diagonal6') {\n      // 右上到左下（大角度，更水平）\n      endPanX = -maxPan;\n      endPanY = maxPan;\n    }\n\n    // 创建 Ken Burns 关键帧动画\n    // 从全屏中心开始，随着放大有轻微的平移\n    // 使用秒级时间格式（关键帧 time 使用秒）\n    const kenBurnsConfig = {\n      type: 'keyframe',\n      keyframes: [\n        {\n          time: 0,\n          scaleX: scaleFrom,\n          scaleY: scaleFrom,\n          translateX: startPanX,\n          translateY: startPanY,\n        },\n        {\n          time: elementDuration,  // 使用秒级时间\n          scaleX: scaleTo,\n          scaleY: scaleTo,\n          translateX: endPanX,\n          translateY: endPanY,\n        },\n      ],\n      duration: elementDuration,\n      // 设置 startTime 为元素的 startTime，确保动画在元素激活时开始\n      startTime: this.startTime || 0,\n      easing: 'linear',\n    };\n\n    const animation = new KeyframeAnimation(kenBurnsConfig);\n    // 标记为 Ken Burns 动画，便于在 render 时识别和更新\n    animation._isKenBurns = true;\n    // 关键：将 Ken Burns 动画添加到数组开头，确保它优先于淡入/淡出动画\n    // 这样 Ken Burns 的初始状态（scaleX=1, translateX=0）能正确覆盖淡入动画的 finalState\n    this.animations.unshift(animation);\n  }\n\n\n  /**\n   * 初始化方法 - 使用 canvas loadImage 加载图片\n   */\n  async initialize(loaded) {\n    if(!loaded) {\n      await super.initialize();\n    }\n\n    // 在 initialize 时，如果 Ken Burns 动画还未注入，则注入\n    // 此时 startTime/endTime 应该已经被父容器设置好了\n    if (!this._kenBurnsInjected && this.config.zoomDirection && \n        this.config.zoomDirection !== 'none' && this.config.zoomDirection !== 'auto') {\n      this._kenBurnsInjected = true;\n      this._doInjectZoomAnimation();\n    }\n\n    if (this.src && !this.loaded) {\n      try {\n        const isUrl = /^https?:\\/\\//i.test(this.src);\n        if (!isUrl) {\n          try {\n            if (!fs.existsSync(this.src)) {\n              this.loaded = false;\n              return;\n            }\n          } catch (_) {}\n        }\n        this.imageData = await loadImage(this.src);\n        this.loaded = true;\n        this._callOnLoaded(this.startTime || 0, null, null);\n      } catch (error) {\n        console.error(`Failed to load image: ${this.config.src}`, error);\n        this.loaded = false;\n      }\n    }\n  }\n\n\n\n  /**\n   * 设置图片源\n   */\n  async setSrc(src) {\n    this.src = src;\n    this.loaded = false;\n    this.imageData = null;\n    await this.initialize(false);\n  }\n\n  /**\n   * 设置图片适配方式\n   */\n  setFit(fit) {\n    this.config.fit = fit;\n  }\n\n  /**\n   * 应用视觉效果（滤镜、边框、阴影等）\n   */\n  applyVisualEffects(raster, state, width, height, paperInstance = null) {\n    const { paper: p } = this.getPaperInstance(paperInstance);\n    const hasBorder = state.borderWidth > 0;\n    const hasShadow = state.shadowBlur > 0;\n    const hasFlip = state.flipX || state.flipY;\n    const hasBlendMode = state.blendMode && state.blendMode !== 'normal';\n    const hasFilter = state.filter ||\n      (state.brightness !== 1 || state.contrast !== 1 || state.saturation !== 1 ||\n       state.hue !== 0 || state.grayscale > 0);\n    const hasGlassEffect = state.glassEffect;\n\n    if (!hasBorder && !hasShadow && !hasFlip && !hasBlendMode && !hasFilter && !hasGlassEffect) {\n      return raster;\n    }\n\n    const group = new p.Group();\n\n    if (hasFlip) {\n      if (state.flipX) raster.scale(-1, 1, raster.position);\n      if (state.flipY) raster.scale(1, -1, raster.position);\n    }\n\n    if (hasBlendMode) {\n      raster.blendMode = state.blendMode;\n    }\n\n    if (hasShadow) {\n      const shadowRaster = raster.clone();\n      shadowRaster.position = new p.Point(\n        raster.position.x + (state.shadowOffsetX || 0),\n        raster.position.y + (state.shadowOffsetY || 0)\n      );\n      shadowRaster.opacity = 0.3;\n      if (state.shadowColor) {\n        const shadowColor = new p.Color(state.shadowColor);\n        shadowRaster.tint = shadowColor;\n      }\n      if (state.shadowBlur > 0) {\n        const blurFactor = Math.max(1, state.shadowBlur / 10);\n        shadowRaster.size = new p.Size(\n          shadowRaster.size.width * (1 + blurFactor * 0.1),\n          shadowRaster.size.height * (1 + blurFactor * 0.1)\n        );\n      }\n      group.addChild(shadowRaster);\n    }\n\n    group.addChild(raster);\n\n    if (hasBorder) {\n      const borderPath = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(\n          raster.position.x - width / 2,\n          raster.position.y - height / 2,\n          width,\n          height\n        ),\n        radius: state.borderRadius || 0,\n      });\n      borderPath.strokeColor = new p.Color(state.borderColor || '#000000');\n      borderPath.strokeWidth = state.borderWidth;\n      borderPath.fillColor = null;\n      group.addChild(borderPath);\n    }\n\n    if (hasGlassEffect && state.glassBorder) {\n      const glassBorderPath = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(\n          raster.position.x - width / 2,\n          raster.position.y - height / 2,\n          width,\n          height\n        ),\n        radius: state.borderRadius || 0,\n      });\n      glassBorderPath.strokeColor = new p.Color(state.glassBorderColor || '#ffffff');\n      glassBorderPath.strokeWidth = state.glassBorderWidth || 1;\n      glassBorderPath.fillColor = null;\n      glassBorderPath.opacity = 0.5;\n      group.addChild(glassBorderPath);\n    }\n\n    return group.children.length > 1 ? group : raster;\n  }\n\n  /**\n   * 计算当前元素进度 (0-1)\n   * 使用元素的实际时长（endTime - startTime）来计算进度\n   */\n  _getProgress(time) {\n    const start = this.startTime || 0;\n    // 使用实际的元素时长，而不是可能不准确的 this.duration\n    const elementDuration = (this.endTime !== undefined && this.endTime !== Infinity) \n      ? (this.endTime - start) \n      : (this.duration || 5);\n    return Math.max(0, Math.min(1, (time - start) / elementDuration));\n  }\n\n  /**\n   * 获取 auto 模式的随机方向\n   */\n  _getAutoZoomDirection() {\n    if (!this._cachedZoomDirection) {\n      const directions = ['left', 'right', 'in', 'out'];\n      this._cachedZoomDirection = directions[Math.floor(Math.random() * directions.length)];\n    }\n    return this._cachedZoomDirection;\n  }\n\n  /**\n   * 渲染图片元素\n   */\n  async render(layer, time, paperInstance = null) {\n    if (!this.visible) return null;\n    if (!this.isActiveAtTime(time)) return null;\n\n    if (!this.loaded) {\n      try {\n        await Promise.race([\n          this.initialize(),\n          new Promise((_, reject) => setTimeout(() => reject(new Error('Image initialization timeout (5s)')), 5000))\n        ]);\n      } catch (error) {\n        console.error(`[ImageElement] 初始化失败 (id: ${this.id}):`, error.message);\n        return null;\n      }\n    }\n\n    if (!this.loaded || !this.imageData) {\n      if (!this._warnedMissing) {\n        console.warn(`[ImageElement] 图片未加载 (id: ${this.id})`);\n        this._warnedMissing = true;\n      }\n      return null;\n    }\n\n    const { paper: p, project } = this.getPaperInstance(paperInstance);\n    const viewSize = project?.view?.viewSize || { width: 1920, height: 1080 };\n    const context = { width: viewSize.width, height: viewSize.height };\n    const state = this.getStateAtTime(time, context);\n\n    // 计算容器尺寸\n    const containerSize = this.convertSize(state.width, state.height, context);\n    const containerWidth = containerSize.width || viewSize.width;\n    const containerHeight = containerSize.height || viewSize.height;\n\n    // 获取图片原始尺寸\n    const imageWidth = this.imageData.width || 0;\n    const imageHeight = this.imageData.height || 0;\n\n    // 根据 fit 参数计算实际显示尺寸\n    const fit = state.fit || this.config.fit || 'cover';\n\n    let width;\n    let height;\n    let coverClipRect = null;\n\n    if (fit === 'cover') {\n      // cover：图片尺寸超过容器，使用 Group+clipMask 裁剪\n      const coverFit = calculateImageFit({\n        imageWidth, imageHeight, containerWidth, containerHeight, fit: 'cover'\n      });\n      width = coverFit.width;\n      height = coverFit.height;\n      // 记录需要的 clip 矩形（后面创建组时使用，使用容器的绝对坐标）\n      coverClipRect = { x: 0, y: 0, width: containerWidth, height: containerHeight };\n    } else {\n      const fitResult = calculateImageFit({\n        imageWidth, imageHeight, containerWidth, containerHeight, fit\n      });\n      width = fitResult.width;\n      height = fitResult.height;\n    }\n\n    // 先按容器尺寸计算位置，得到容器的 top-left (x, y)\n    const { x, y } = this.calculatePosition(state, context, { elementWidth: containerWidth, elementHeight: containerHeight });\n\n    if (!this.imageData) {\n      console.warn('[ImageElement] 图片数据未加载');\n      return null;\n    }\n\n    // 创建 Raster\n    // calculatePosition 返回容器左上角（根据 anchor 调整过）\n    // Paper.js 的 raster.position 是中心点 → 偏移 containerWidth/2, containerHeight/2\n    const raster = new p.Raster(this.imageData);\n    raster.size = new p.Size(width, height);\n    raster.position = new p.Point(x + containerWidth / 2, y + containerHeight / 2);\n\n    // 处理 zoomDirection\n    const zoomDirection = this.config.zoomDirection || 'none';\n    const zoomAmount = this.config.zoomAmount !== undefined ? this.config.zoomAmount : 0.1;\n\n    const isCover = fit === 'cover';\n\n    // 在 clipGroup 包装前对 raster 应用 zoom 效果（非 cover 和 cover 都适用）\n    if (zoomDirection === 'auto') {\n      const actualDir = this._getAutoZoomDirection();\n      this._applyZoomEffect(raster, time, actualDir, zoomAmount, x, y, p);\n    } else if (zoomDirection !== 'none') {\n      this._applyZoomEffect(raster, time, zoomDirection, zoomAmount, x, y, p);\n    }\n\n    // 应用基础变换（Ken Burns 缩放等；不应用位置以保留 zoom 的 translate）\n    this.applyTransform(raster, state, {\n      applyPosition: false,\n      applyOpacity: true,\n      applyRotation: true,\n      applyScale: true,\n      paperInstance: p\n    });\n\n    // 应用视觉效果\n    // 对于 cover 模式：边框/阴影应基于容器尺寸（而不是 cover-fit 尺寸），否则会偏大\n    const effectWidth = isCover ? containerWidth : width;\n    const effectHeight = isCover ? containerHeight : height;\n    const visualItem = this.applyVisualEffects(raster, state, effectWidth, effectHeight, p);\n\n    // cover 模式：使用 Group + clipMask 实现裁剪\n    let finalItem = visualItem;\n    if (isCover && coverClipRect) {\n      // 元素的中心点（世界坐标）\n      const centerX = x + containerWidth / 2;\n      const centerY = y + containerHeight / 2;\n\n      // 1) 关键：raster 经过 zoom + applyTransform 后位置/缩放都已就位，\n      //    此时它仍处于 world 坐标系。要放进 clipGroup 的局部坐标系，\n      //    必须把 raster 的位置从 world 转为 group 局部坐标（减去 group.position）。\n      //    visualItem 的所有子项（raster/shadow/border）相对于 visualItem 也有偏移，\n      //    一并转换。\n\n      // 2) 在 group 局部坐标 (-containerW/2, -containerH/2) 创建裁剪矩形\n      const clipPath = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(\n          -containerWidth / 2,\n          -containerHeight / 2,\n          containerWidth,\n          containerHeight\n        ),\n      });\n\n      // 3) 组装 clipGroup\n      const clipGroup = new p.Group();\n      clipGroup.addChild(clipPath);\n      clipPath.clipMask = true;\n      clipGroup.clipped = true;\n\n      // 把 visualItem 放进 clipGroup，并把 visualItem 内所有子项的坐标从 world 转为 group 局部\n      // （包括 raster 已应用的 zoom translate 和 Ken Burns scale 矩阵）\n      if (visualItem === raster) {\n        // 简单情况：raster 的 position 是 world 坐标，需要转为局部\n        raster.position = new p.Point(\n          raster.position.x - centerX,\n          raster.position.y - centerY\n        );\n        clipGroup.addChild(visualItem);\n      } else {\n        // 视觉特效情况：visualItem 是 Group，遍历其子项转换坐标\n        const children = visualItem.children ? [...visualItem.children] : [visualItem];\n        for (const child of children) {\n          if (child.position) {\n            child.position = new p.Point(\n              child.position.x - centerX,\n              child.position.y - centerY\n            );\n          }\n        }\n        clipGroup.addChild(visualItem);\n      }\n\n      // 4) 设置 group.position（必须在添加完所有子项后）\n      clipGroup.position = new p.Point(centerX, centerY);\n\n      finalItem = clipGroup;\n    }\n\n    if (layer) {\n      layer.addChild(finalItem);\n    }\n\n    return finalItem;\n  }\n\n  /**\n   * 获取缩放因子（与 editly getZoomParams 一致）\n   */\n  _getZoomFactor(progress, direction, amount) {\n    if (direction === 'left' || direction === 'right') {\n      return 1.3 + amount;\n    }\n    if (direction === 'in') {\n      return 1 + amount * progress;\n    }\n    if (direction === 'out') {\n      return 1 + amount * (1 - progress);\n    }\n    return 1;\n  }\n\n  /**\n   * 获取平移参数（与 editly getTranslationParams 一致）\n   * 注意：editly 的 range = zoomAmount * 1000，是像素值\n   */\n  _getTranslation(progress, direction, amount, elementDuration = 5) {\n    // 根据时长动态调整位移范围，与 _injectZoomAnimation 中的 maxPan 计算保持一致\n    const zoomPanRatio = this.config.zoomPanRatio !== undefined ? this.config.zoomPanRatio : 300;\n    const range = amount * zoomPanRatio * (elementDuration / 5);\n    let translateX = 0, translateY = 0;\n\n    if (direction === 'left') {\n      translateX = -progress * range;\n    } else if (direction === 'right') {\n      translateX = progress * range;\n    } else if (direction === 'up') {\n      translateY = -progress * range;\n    } else if (direction === 'down') {\n      translateY = progress * range;\n    } else if (direction === 'diagonal1') {\n      // 左上→右下\n      translateX = progress * range * 0.7;\n      translateY = progress * range * 0.7;\n    } else if (direction === 'diagonal2') {\n      // 右上→左下\n      translateX = -progress * range * 0.7;\n      translateY = progress * range * 0.7;\n    } else if (direction === 'diagonal3') {\n      // 左下→右上\n      translateX = progress * range * 0.7;\n      translateY = -progress * range * 0.7;\n    } else if (direction === 'diagonal4') {\n      // 右下→左上\n      translateX = -progress * range * 0.7;\n      translateY = -progress * range * 0.7;\n    } else if (direction === 'diagonal5') {\n      // 左上→右下(更陡)\n      translateX = progress * range * 0.5;\n      translateY = progress * range * 0.8;\n    } else if (direction === 'diagonal6') {\n      // 右上→左下(更陡)\n      translateX = -progress * range * 0.5;\n      translateY = progress * range * 0.8;\n    }\n\n    // 返回 translateX，translateY 在 _applyZoomEffect 中单独处理\n    this._currentTranslateX = translateX;\n    this._currentTranslateY = translateY;\n    return translateX;\n  }\n\n  /**\n   * 应用缩放效果（与 editly 行为一致）\n   */\n  _applyZoomEffect(raster, time, direction, amount, baseX, baseY, paper) {\n    const progress = this._getProgress(time);\n\n    // 获取缩放因子\n    const scaleFactor = this._getZoomFactor(progress, direction, amount);\n\n    // 获取时长用于计算位移\n    const elementDuration = (this.endTime !== undefined && this.endTime !== Infinity) \n      ? (this.endTime - this.startTime) \n      : (this.duration || 5);\n\n    // 获取平移参数\n    this._getTranslation(progress, direction, amount, elementDuration);\n    const translateX = this._currentTranslateX || 0;\n    const translateY = this._currentTranslateY || 0;\n\n    // 应用缩放（基于 raster 的中心点）\n    if (scaleFactor !== 1) {\n      raster.scale(scaleFactor, scaleFactor, raster.position);\n    }\n\n    // 应用平移（X 和 Y 方向）- 在 raster 当前位置基础上偏移\n    // 不直接用 baseX/baseY，因为 cover 模式下 raster.position 已被设为容器中心\n    if (translateX !== 0 || translateY !== 0) {\n      raster.position = new paper.Point(\n        raster.position.x + translateX,\n        raster.position.y + translateY\n      );\n    }\n  }\n}\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_IMAGE_CONFIG","KeyframeAnimation","loadImage","calculateImageFit"],"mappings":";;;;;;;;;;;;AAYA;AACA;AACA;AACO,MAAM,YAAY,SAASA,gCAAW,CAAC;AAC9C,EAAE,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE;AAC3B,IAAI,KAAK,CAAC,MAAM,CAAC;AACjB,IAAI,IAAI,CAAC,IAAI,GAAGC,uBAAW,CAAC,KAAK;AACjC;AACA,IAAI,IAAI,CAAC,MAAM,GAAGC,uBAAS,CAAC,EAAE,EAAEC,oCAAoB,EAAE,MAAM,CAAC;AAC7D,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AAC9B,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI;AACzB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;AACvB,IAAI,IAAI,CAAC,cAAc,GAAG,KAAK;;AAE/B;AACA,IAAI,IAAI,CAAC,oBAAoB,GAAG,IAAI;;AAEpC;AACA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC/B,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAE,oBAAoB,GAAG;AACzB,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM;AAC7D,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,MAAM,EAAE;;;AAG9D;AACA,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AACjE,MAAM;AACN,IAAI;;AAEJ,IAAI,IAAI,CAAC,sBAAsB,EAAE;AACjC,EAAE;;;AAGF;AACA;AACA;AACA;AACA,EAAE,sBAAsB,GAAG;AAC3B,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM;AAC7D,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,MAAM,EAAE;;AAE9D;AACA,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG;AAC1F;AACA,IAAI,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;AACpF,SAAS,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS;AACtC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC5B;AACA;AACA,IAAI,IAAI,CAAC,QAAQ,GAAG,eAAe;;AAEnC;AACA;AACA,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,GAAG,GAAG;AACxC,IAAI,MAAM,SAAS,GAAG,GAAG;;AAEzB;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG;AAChG,IAAI,MAAM,MAAM,GAAG,UAAU,GAAG,YAAY,IAAI,eAAe,GAAG,CAAC,CAAC;;AAEpE;AACA;AACA,IAAI,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC;AACpC,IAAI,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;;AAEhC,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE;AAClC;AACA,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,OAAO,EAAE;AAC1C;AACA,MAAM,OAAO,GAAG,MAAM;AACtB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,IAAI,EAAE;AACvC;AACA,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,MAAM,EAAE;AACzC;AACA,MAAM,OAAO,GAAG,MAAM;AACtB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW,EAAE;AAC9C;AACA,MAAM,OAAO,GAAG,MAAM;AACtB,MAAM,OAAO,GAAG,MAAM;AACtB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW,EAAE;AAC9C;AACA,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,MAAM,OAAO,GAAG,MAAM;AACtB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW,EAAE;AAC9C;AACA,MAAM,OAAO,GAAG,MAAM;AACtB,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW,EAAE;AAC9C;AACA,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW,EAAE;AAC9C;AACA,MAAM,OAAO,GAAG,MAAM;AACtB,MAAM,OAAO,GAAG,MAAM;AACtB,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,WAAW,EAAE;AAC9C;AACA,MAAM,OAAO,GAAG,CAAC,MAAM;AACvB,MAAM,OAAO,GAAG,MAAM;AACtB,IAAI;;AAEJ;AACA;AACA;AACA,IAAI,MAAM,cAAc,GAAG;AAC3B,MAAM,IAAI,EAAE,UAAU;AACtB,MAAM,SAAS,EAAE;AACjB,QAAQ;AACR,UAAU,IAAI,EAAE,CAAC;AACjB,UAAU,MAAM,EAAE,SAAS;AAC3B,UAAU,MAAM,EAAE,SAAS;AAC3B,UAAU,UAAU,EAAE,SAAS;AAC/B,UAAU,UAAU,EAAE,SAAS;AAC/B,SAAS;AACT,QAAQ;AACR,UAAU,IAAI,EAAE,eAAe;AAC/B,UAAU,MAAM,EAAE,OAAO;AACzB,UAAU,MAAM,EAAE,OAAO;AACzB,UAAU,UAAU,EAAE,OAAO;AAC7B,UAAU,UAAU,EAAE,OAAO;AAC7B,SAAS;AACT,OAAO;AACP,MAAM,QAAQ,EAAE,eAAe;AAC/B;AACA,MAAM,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC;AACpC,MAAM,MAAM,EAAE,QAAQ;AACtB,KAAK;;AAEL,IAAI,MAAM,SAAS,GAAG,IAAIC,8CAAiB,CAAC,cAAc,CAAC;AAC3D;AACA,IAAI,SAAS,CAAC,WAAW,GAAG,IAAI;AAChC;AACA;AACA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;AACtC,EAAE;;;AAGF;AACA;AACA;AACA,EAAE,MAAM,UAAU,CAAC,MAAM,EAAE;AAC3B,IAAI,GAAG,CAAC,MAAM,EAAE;AAChB,MAAM,MAAM,KAAK,CAAC,UAAU,EAAE;AAC9B,IAAI;;AAEJ;AACA;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa;AAC5D,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE;AACtF,MAAM,IAAI,CAAC,iBAAiB,GAAG,IAAI;AACnC,MAAM,IAAI,CAAC,sBAAsB,EAAE;AACnC,IAAI;;AAEJ,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAClC,MAAM,IAAI;AACV,QAAQ,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACpD,QAAQ,IAAI,CAAC,KAAK,EAAE;AACpB,UAAU,IAAI;AACd,YAAY,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAC1C,cAAc,IAAI,CAAC,MAAM,GAAG,KAAK;AACjC,cAAc;AACd,YAAY;AACZ,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AACvB,QAAQ;AACR,QAAQ,IAAI,CAAC,SAAS,GAAG,MAAMC,gBAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AAClD,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI;AAC1B,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;AAC3D,MAAM,CAAC,CAAC,OAAO,KAAK,EAAE;AACtB,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;AACxE,QAAQ,IAAI,CAAC,MAAM,GAAG,KAAK;AAC3B,MAAM;AACN,IAAI;AACJ,EAAE;;;;AAIF;AACA;AACA;AACA,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE;AACpB,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG;AAClB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;AACvB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI;AACzB,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAChC,EAAE;;AAEF;AACA;AACA;AACA,EAAE,MAAM,CAAC,GAAG,EAAE;AACd,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG;AACzB,EAAE;;AAEF;AACA;AACA;AACA,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE;AACzE,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AAC7D,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC;AAC3C,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC;AAC1C,IAAI,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;AAC9C,IAAI,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;AACxE,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM;AAClC,OAAO,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC;AAC/E,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;AAC9C,IAAI,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW;;AAE5C,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,EAAE;AAChG,MAAM,OAAO,MAAM;AACnB,IAAI;;AAEJ,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE;;AAE/B,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;AAC3D,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;AAC3D,IAAI;;AAEJ,IAAI,IAAI,YAAY,EAAE;AACtB,MAAM,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AACxC,IAAI;;AAEJ,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE;AACzC,MAAM,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK;AACzC,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AACtD,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC;AACrD,OAAO;AACP,MAAM,YAAY,CAAC,OAAO,GAAG,GAAG;AAChC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE;AAC7B,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;AAC1D,QAAQ,YAAY,CAAC,IAAI,GAAG,WAAW;AACvC,MAAM;AACN,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE;AAChC,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;AAC7D,QAAQ,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI;AACtC,UAAU,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,GAAG,CAAC;AAC1D,UAAU,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,GAAG,GAAG;AAC1D,SAAS;AACT,MAAM;AACN,MAAM,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;AAClC,IAAI;;AAEJ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAE1B,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;AAC9C,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS;AAClC,UAAU,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACvC,UAAU,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;AACxC,UAAU,KAAK;AACf,UAAU;AACV,SAAS;AACT,QAAQ,MAAM,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;AACvC,OAAO,CAAC;AACR,MAAM,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,SAAS,CAAC;AAC1E,MAAM,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;AAChD,MAAM,UAAU,CAAC,SAAS,GAAG,IAAI;AACjC,MAAM,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;AAChC,IAAI;;AAEJ,IAAI,IAAI,cAAc,IAAI,KAAK,CAAC,WAAW,EAAE;AAC7C,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;AACnD,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS;AAClC,UAAU,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACvC,UAAU,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;AACxC,UAAU,KAAK;AACf,UAAU;AACV,SAAS;AACT,QAAQ,MAAM,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;AACvC,OAAO,CAAC;AACR,MAAM,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,SAAS,CAAC;AACpF,MAAM,eAAe,CAAC,WAAW,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC;AAC/D,MAAM,eAAe,CAAC,SAAS,GAAG,IAAI;AACtC,MAAM,eAAe,CAAC,OAAO,GAAG,GAAG;AACnC,MAAM,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;AACrC,IAAI;;AAEJ,IAAI,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM;AACrD,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,IAAI,EAAE;AACrB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC;AACrC;AACA,IAAI,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;AACpF,SAAS,IAAI,CAAC,OAAO,GAAG,KAAK;AAC7B,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC5B,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,eAAe,CAAC,CAAC;AACrE,EAAE;;AAEF;AACA;AACA;AACA,EAAE,qBAAqB,GAAG;AAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AACpC,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;AACvD,MAAM,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3F,IAAI;AACJ,IAAI,OAAO,IAAI,CAAC,oBAAoB;AACpC,EAAE;;AAEF;AACA;AACA;AACA,EAAE,MAAM,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE;AAClD,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI;AAClC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI;;AAE/C,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACtB,MAAM,IAAI;AACV,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC;AAC3B,UAAU,IAAI,CAAC,UAAU,EAAE;AAC3B,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,EAAE,IAAI,CAAC;AACnH,SAAS,CAAC;AACV,MAAM,CAAC,CAAC,OAAO,KAAK,EAAE;AACtB,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,0BAA0B,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;AAC9E,QAAQ,OAAO,IAAI;AACnB,MAAM;AACN,IAAI;;AAEJ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACzC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAChC,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,0BAA0B,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,QAAQ,IAAI,CAAC,cAAc,GAAG,IAAI;AAClC,MAAM;AACN,MAAM,OAAO,IAAI;AACjB,IAAI;;AAEJ,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AACtE,IAAI,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAC7E,IAAI,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;AACtE,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;;AAEpD;AACA,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;AAC9E,IAAI,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;AAChE,IAAI,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;;AAEnE;AACA,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;AAChD,IAAI,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC;;AAElD;AACA,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO;;AAEvD,IAAI,IAAI,KAAK;AACb,IAAI,IAAI,MAAM;AACd,IAAI,IAAI,aAAa,GAAG,IAAI;;AAE5B,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE;AACzB;AACA,MAAM,MAAM,QAAQ,GAAGC,gCAAiB,CAAC;AACzC,QAAQ,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,EAAE;AACvE,OAAO,CAAC;AACR,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK;AAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC9B;AACA,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE;AACpF,IAAI,CAAC,MAAM;AACX,MAAM,MAAM,SAAS,GAAGA,gCAAiB,CAAC;AAC1C,QAAQ,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE;AAClE,OAAO,CAAC;AACR,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK;AAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM;AAC/B,IAAI;;AAEJ;AACA,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;;AAE7H,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACzB,MAAM,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC5C,MAAM,OAAO,IAAI;AACjB,IAAI;;AAEJ;AACA;AACA;AACA,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC/C,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;AAC3C,IAAI,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,cAAc,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,GAAG,CAAC,CAAC;;AAElF;AACA,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM;AAC7D,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG;;AAE1F,IAAI,MAAM,OAAO,GAAG,GAAG,KAAK,OAAO;;AAEnC;AACA,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE;AAClC,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACpD,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACzE,IAAI,CAAC,MAAM,IAAI,aAAa,KAAK,MAAM,EAAE;AACzC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7E,IAAI;;AAEJ;AACA,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE;AACvC,MAAM,aAAa,EAAE,KAAK;AAC1B,MAAM,YAAY,EAAE,IAAI;AACxB,MAAM,aAAa,EAAE,IAAI;AACzB,MAAM,UAAU,EAAE,IAAI;AACtB,MAAM,aAAa,EAAE;AACrB,KAAK,CAAC;;AAEN;AACA;AACA,IAAI,MAAM,WAAW,GAAG,OAAO,GAAG,cAAc,GAAG,KAAK;AACxD,IAAI,MAAM,YAAY,GAAG,OAAO,GAAG,eAAe,GAAG,MAAM;AAC3D,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;;AAE3F;AACA,IAAI,IAAI,SAAS,GAAG,UAAU;AAC9B,IAAI,IAAI,OAAO,IAAI,aAAa,EAAE;AAClC;AACA,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,cAAc,GAAG,CAAC;AAC5C,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,eAAe,GAAG,CAAC;;AAE7C;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5C,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS;AAClC,UAAU,CAAC,cAAc,GAAG,CAAC;AAC7B,UAAU,CAAC,eAAe,GAAG,CAAC;AAC9B,UAAU,cAAc;AACxB,UAAU;AACV,SAAS;AACT,OAAO,CAAC;;AAER;AACA,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE;AACrC,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAClC,MAAM,QAAQ,CAAC,QAAQ,GAAG,IAAI;AAC9B,MAAM,SAAS,CAAC,OAAO,GAAG,IAAI;;AAE9B;AACA;AACA,MAAM,IAAI,UAAU,KAAK,MAAM,EAAE;AACjC;AACA,QAAQ,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK;AACrC,UAAU,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO;AACrC,UAAU,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG;AAC9B,SAAS;AACT,QAAQ,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM;AACb;AACA,QAAQ,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;AACtF,QAAQ,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AACtC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE;AAC9B,YAAY,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK;AACxC,cAAc,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO;AACxC,cAAc,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG;AACjC,aAAa;AACb,UAAU;AACV,QAAQ;AACR,QAAQ,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;AACtC,MAAM;;AAEN;AACA,MAAM,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;;AAExD,MAAM,SAAS,GAAG,SAAS;AAC3B,IAAI;;AAEJ,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC/B,IAAI;;AAEJ,IAAI,OAAO,SAAS;AACpB,EAAE;;AAEF;AACA;AACA;AACA,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE;AAC9C,IAAI,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE;AACvD,MAAM,OAAO,GAAG,GAAG,MAAM;AACzB,IAAI;AACJ,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE;AAC5B,MAAM,OAAO,CAAC,GAAG,MAAM,GAAG,QAAQ;AAClC,IAAI;AACJ,IAAI,IAAI,SAAS,KAAK,KAAK,EAAE;AAC7B,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC;AACxC,IAAI;AACJ,IAAI,OAAO,CAAC;AACZ,EAAE;;AAEF;AACA;AACA;AACA;AACA,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,CAAC,EAAE;AACpE;AACA,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG;AAChG,IAAI,MAAM,KAAK,GAAG,MAAM,GAAG,YAAY,IAAI,eAAe,GAAG,CAAC,CAAC;AAC/D,IAAI,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC;;AAEtC,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE;AAC9B,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK;AACpC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE;AACtC,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK;AACnC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,IAAI,EAAE;AACnC,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK;AACpC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE;AACrC,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK;AACnC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AAC1C;AACA,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AAC1C;AACA,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG;AAC1C,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AAC1C;AACA,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG;AAC1C,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AAC1C;AACA,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG;AAC1C,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG;AAC1C,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AAC1C;AACA,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,WAAW,EAAE;AAC1C;AACA,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG;AAC1C,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG;AACzC,IAAI;;AAEJ;AACA,IAAI,IAAI,CAAC,kBAAkB,GAAG,UAAU;AACxC,IAAI,IAAI,CAAC,kBAAkB,GAAG,UAAU;AACxC,IAAI,OAAO,UAAU;AACrB,EAAE;;AAEF;AACA;AACA;AACA,EAAE,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACzE,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;AAE5C;AACA,IAAI,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;;AAExE;AACA,IAAI,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;AACpF,SAAS,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS;AACtC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;;AAE5B;AACA,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC;AACtE,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC;AACnD,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAC;;AAEnD;AACA,IAAI,IAAI,WAAW,KAAK,CAAC,EAAE;AAC3B,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;AAC7D,IAAI;;AAEJ;AACA;AACA,IAAI,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,EAAE;AAC9C,MAAM,MAAM,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,KAAK;AACvC,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU;AACtC,QAAQ,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG;AAC5B,OAAO;AACP,IAAI;AACJ,EAAE;AACF;;;;"}