{"version":3,"file":"utils.cjs","sources":["../../../../src/graveyard/TimeSeries/utils.ts"],"sourcesContent":["import { isNumber } from 'lodash';\nimport uPlot from 'uplot';\n\nimport {\n  DashboardCursorSync,\n  DataFrame,\n  FieldConfig,\n  FieldType,\n  formattedValueToString,\n  getFieldColorModeForField,\n  getFieldSeriesColor,\n  getFieldDisplayName,\n  getDisplayProcessor,\n  FieldColorModeId,\n  DecimalCount,\n} from '@grafana/data';\nimport {\n  AxisPlacement,\n  GraphDrawStyle,\n  GraphFieldConfig,\n  GraphThresholdsStyleMode,\n  VisibilityMode,\n  ScaleDirection,\n  ScaleOrientation,\n  StackingMode,\n  GraphTransform,\n  AxisColorMode,\n  GraphGradientMode,\n} from '@grafana/schema';\n\n// unit lookup needed to determine if we want power-of-2 or power-of-10 axis ticks\n// see categories.ts is @grafana/data\nconst IEC_UNITS = new Set([\n  'bytes',\n  'bits',\n  'kbytes',\n  'mbytes',\n  'gbytes',\n  'tbytes',\n  'pbytes',\n  'binBps',\n  'binbps',\n  'KiBs',\n  'Kibits',\n  'MiBs',\n  'Mibits',\n  'GiBs',\n  'Gibits',\n  'TiBs',\n  'Tibits',\n  'PiBs',\n  'Pibits',\n]);\n\nconst BIN_INCRS = Array(53);\n\nfor (let i = 0; i < BIN_INCRS.length; i++) {\n  BIN_INCRS[i] = 2 ** i;\n}\n\nimport { UPlotConfigBuilder, UPlotConfigPrepFn } from '../../components/uPlot/config/UPlotConfigBuilder';\nimport { getScaleGradientFn } from '../../components/uPlot/config/gradientFills';\nimport { getStackingGroups, preparePlotData2 } from '../../components/uPlot/utils';\nimport { buildScaleKey } from '../GraphNG/utils';\n\nconst defaultFormatter = (v: any, decimals: DecimalCount = 1) => (v == null ? '-' : v.toFixed(decimals));\n\nconst defaultConfig: GraphFieldConfig = {\n  drawStyle: GraphDrawStyle.Line,\n  showPoints: VisibilityMode.Auto,\n  axisPlacement: AxisPlacement.Auto,\n};\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<{\n  sync?: () => DashboardCursorSync;\n}> = ({\n  frame,\n  theme,\n  timeZones,\n  getTimeRange,\n  sync,\n  allFrames,\n  renderers,\n  tweakScale = (opts) => opts,\n  tweakAxis = (opts) => opts,\n}) => {\n  const eventsScope = '__global_';\n\n  const builder = new UPlotConfigBuilder(timeZones[0]);\n\n  let alignedFrame: DataFrame;\n\n  builder.setPrepData((frames) => {\n    // cache alignedFrame\n    alignedFrame = frames[0];\n\n    return preparePlotData2(frames[0], builder.getStackingGroups());\n  });\n\n  // X is the first field in the aligned frame\n  const xField = frame.fields[0];\n  if (!xField) {\n    return builder; // empty frame with no options\n  }\n\n  const xScaleKey = 'x';\n  let yScaleKey = '';\n\n  const xFieldAxisPlacement =\n    xField.config.custom?.axisPlacement !== AxisPlacement.Hidden ? AxisPlacement.Bottom : AxisPlacement.Hidden;\n  const xFieldAxisShow = xField.config.custom?.axisPlacement !== AxisPlacement.Hidden;\n\n  if (xField.type === FieldType.time) {\n    builder.addScale({\n      scaleKey: xScaleKey,\n      orientation: ScaleOrientation.Horizontal,\n      direction: ScaleDirection.Right,\n      isTime: true,\n      range: () => {\n        const r = getTimeRange();\n        return [r.from.valueOf(), r.to.valueOf()];\n      },\n    });\n\n    // filters first 2 ticks to make space for timezone labels\n    const filterTicks: uPlot.Axis.Filter | undefined =\n      timeZones.length > 1\n        ? (u, splits) => {\n            return splits.map((v, i) => (i < 2 ? null : v));\n          }\n        : undefined;\n\n    for (let i = 0; i < timeZones.length; i++) {\n      const timeZone = timeZones[i];\n      builder.addAxis({\n        scaleKey: xScaleKey,\n        isTime: true,\n        placement: xFieldAxisPlacement,\n        show: xFieldAxisShow,\n        label: xField.config.custom?.axisLabel,\n        timeZone,\n        theme,\n        grid: { show: i === 0 && xField.config.custom?.axisGridShow },\n        filter: filterTicks,\n      });\n    }\n\n    // render timezone labels\n    if (timeZones.length > 1) {\n      builder.addHook('drawAxes', (u: uPlot) => {\n        u.ctx.save();\n\n        u.ctx.fillStyle = theme.colors.text.primary;\n        u.ctx.textAlign = 'left';\n        u.ctx.textBaseline = 'bottom';\n\n        let i = 0;\n        u.axes.forEach((a) => {\n          if (a.side === 2) {\n            //@ts-ignore\n            let cssBaseline: number = a._pos + a._size;\n            u.ctx.fillText(timeZones[i], u.bbox.left, cssBaseline * uPlot.pxRatio);\n            i++;\n          }\n        });\n\n        u.ctx.restore();\n      });\n    }\n  } else {\n    builder.addScale({\n      scaleKey: xScaleKey,\n      orientation: ScaleOrientation.Horizontal,\n      direction: ScaleDirection.Right,\n      range: (u, dataMin, dataMax) => [xField.config.min ?? dataMin, xField.config.max ?? dataMax],\n    });\n\n    builder.addAxis({\n      scaleKey: xScaleKey,\n      placement: xFieldAxisPlacement,\n      show: xFieldAxisShow,\n      label: xField.config.custom?.axisLabel,\n      theme,\n      grid: { show: xField.config.custom?.axisGridShow },\n      formatValue: (v, decimals) => formattedValueToString(xField.display!(v, decimals)),\n    });\n  }\n\n  let customRenderedFields =\n    renderers?.flatMap((r) => Object.values(r.fieldMap).filter((name) => r.indicesOnly.indexOf(name) === -1)) ?? [];\n\n  let indexByName: Map<string, number> | undefined;\n\n  for (let i = 1; i < frame.fields.length; i++) {\n    const field = frame.fields[i];\n\n    const config: FieldConfig<GraphFieldConfig> = {\n      ...field.config,\n      custom: {\n        ...defaultConfig,\n        ...field.config.custom,\n      },\n    };\n\n    const customConfig: GraphFieldConfig = config.custom!;\n\n    if (field === xField || (field.type !== FieldType.number && field.type !== FieldType.enum)) {\n      continue;\n    }\n\n    let fmt = field.display ?? defaultFormatter;\n    if (field.config.custom?.stacking?.mode === StackingMode.Percent) {\n      fmt = getDisplayProcessor({\n        field: {\n          ...field,\n          config: {\n            ...field.config,\n            unit: 'percentunit',\n          },\n        },\n        theme,\n      });\n    }\n    const scaleKey = buildScaleKey(config, field.type);\n    const colorMode = getFieldColorModeForField(field);\n    const scaleColor = getFieldSeriesColor(field, theme);\n    const seriesColor = scaleColor.color;\n\n    // The builder will manage unique scaleKeys and combine where appropriate\n    builder.addScale(\n      tweakScale(\n        {\n          scaleKey,\n          orientation: ScaleOrientation.Vertical,\n          direction: ScaleDirection.Up,\n          distribution: customConfig.scaleDistribution?.type,\n          log: customConfig.scaleDistribution?.log,\n          linearThreshold: customConfig.scaleDistribution?.linearThreshold,\n          min: field.config.min,\n          max: field.config.max,\n          softMin: customConfig.axisSoftMin,\n          softMax: customConfig.axisSoftMax,\n          centeredZero: customConfig.axisCenteredZero,\n          range:\n            customConfig.stacking?.mode === StackingMode.Percent\n              ? (u: uPlot, dataMin: number, dataMax: number) => {\n                  dataMin = dataMin < 0 ? -1 : 0;\n                  dataMax = dataMax > 0 ? 1 : 0;\n                  return [dataMin, dataMax];\n                }\n              : field.type === FieldType.enum\n                ? (u: uPlot, dataMin: number, dataMax: number) => {\n                    // this is the exhaustive enum (stable)\n                    let len = field.config.type!.enum!.text!.length;\n\n                    return [-1, len];\n\n                    // these are only values that are present\n                    // return [dataMin - 1, dataMax + 1]\n                  }\n                : undefined,\n          decimals: field.config.decimals,\n        },\n        field\n      )\n    );\n\n    if (!yScaleKey) {\n      yScaleKey = scaleKey;\n    }\n\n    if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\n      let axisColor: uPlot.Axis.Stroke | undefined;\n\n      if (customConfig.axisColorMode === AxisColorMode.Series) {\n        if (\n          colorMode.isByValue &&\n          field.config.custom?.gradientMode === GraphGradientMode.Scheme &&\n          colorMode.id === FieldColorModeId.Thresholds\n        ) {\n          axisColor = getScaleGradientFn(1, theme, colorMode, field.config.thresholds);\n        } else {\n          axisColor = seriesColor;\n        }\n      }\n\n      const axisDisplayOptions = {\n        border: {\n          show: customConfig.axisBorderShow || false,\n          width: 1 / devicePixelRatio,\n          stroke: axisColor || theme.colors.text.primary,\n        },\n        ticks: {\n          show: customConfig.axisBorderShow || false,\n          stroke: axisColor || theme.colors.text.primary,\n        },\n        color: axisColor || theme.colors.text.primary,\n      };\n\n      let incrs: uPlot.Axis.Incrs | undefined;\n\n      // TODO: these will be dynamic with frame updates, so need to accept getYTickLabels()\n      let values: uPlot.Axis.Values | undefined;\n      let splits: uPlot.Axis.Splits | undefined;\n\n      if (IEC_UNITS.has(config.unit!)) {\n        incrs = BIN_INCRS;\n      } else if (field.type === FieldType.enum) {\n        let text = field.config.type!.enum!.text!;\n        splits = text.map((v: string, i: number) => i);\n        values = text;\n      }\n\n      builder.addAxis(\n        tweakAxis(\n          {\n            scaleKey,\n            label: customConfig.axisLabel,\n            size: customConfig.axisWidth,\n            placement: customConfig.axisPlacement ?? AxisPlacement.Auto,\n            formatValue: (v, decimals) => formattedValueToString(fmt(v, decimals)),\n            theme,\n            grid: { show: customConfig.axisGridShow },\n            decimals: field.config.decimals,\n            distr: customConfig.scaleDistribution?.type,\n            splits,\n            values,\n            incrs,\n            ...axisDisplayOptions,\n          },\n          field\n        )\n      );\n    }\n\n    const showPoints =\n      customConfig.drawStyle === GraphDrawStyle.Points ? VisibilityMode.Always : customConfig.showPoints;\n\n    let pointsFilter: uPlot.Series.Points.Filter = () => null;\n\n    if (customConfig.spanNulls !== true) {\n      pointsFilter = (u, seriesIdx, show, gaps) => {\n        let filtered = [];\n\n        let series = u.series[seriesIdx];\n\n        if (!show && gaps && gaps.length) {\n          const [firstIdx, lastIdx] = series.idxs!;\n          const xData = u.data[0];\n          const yData = u.data[seriesIdx];\n          const firstPos = Math.round(u.valToPos(xData[firstIdx], 'x', true));\n          const lastPos = Math.round(u.valToPos(xData[lastIdx], 'x', true));\n\n          if (gaps[0][0] === firstPos) {\n            filtered.push(firstIdx);\n          }\n\n          // show single points between consecutive gaps that share end/start\n          for (let i = 0; i < gaps.length; i++) {\n            let thisGap = gaps[i];\n            let nextGap = gaps[i + 1];\n\n            if (nextGap && thisGap[1] === nextGap[0]) {\n              // approx when data density is > 1pt/px, since gap start/end pixels are rounded\n              let approxIdx = u.posToIdx(thisGap[1], true);\n\n              if (yData[approxIdx] == null) {\n                // scan left/right alternating to find closest index with non-null value\n                for (let j = 1; j < 100; j++) {\n                  if (yData[approxIdx + j] != null) {\n                    approxIdx += j;\n                    break;\n                  }\n                  if (yData[approxIdx - j] != null) {\n                    approxIdx -= j;\n                    break;\n                  }\n                }\n              }\n\n              filtered.push(approxIdx);\n            }\n          }\n\n          if (gaps[gaps.length - 1][1] === lastPos) {\n            filtered.push(lastIdx);\n          }\n        }\n\n        return filtered.length ? filtered : null;\n      };\n    }\n\n    let { fillOpacity } = customConfig;\n\n    let pathBuilder: uPlot.Series.PathBuilder | null = null;\n    let pointsBuilder: uPlot.Series.Points.Show | null = null;\n\n    if (field.state?.origin) {\n      if (!indexByName) {\n        indexByName = getNamesToFieldIndex(frame, allFrames);\n      }\n\n      const originFrame = allFrames[field.state.origin.frameIndex];\n      const originField = originFrame?.fields[field.state.origin.fieldIndex];\n\n      const dispName = getFieldDisplayName(originField ?? field, originFrame, allFrames);\n\n      // disable default renderers\n      if (customRenderedFields.indexOf(dispName) >= 0) {\n        pathBuilder = () => null;\n        pointsBuilder = () => undefined;\n      } else if (customConfig.transform === GraphTransform.Constant) {\n        // patch some monkeys!\n        const defaultBuilder = uPlot.paths!.linear!();\n\n        pathBuilder = (u, seriesIdx) => {\n          //eslint-disable-next-line\n          const _data: any[] = (u as any)._data; // uplot.AlignedData not exposed in types\n\n          // the data we want the line renderer to pull is x at each plot edge with paired flat y values\n\n          const r = getTimeRange();\n          let xData = [r.from.valueOf(), r.to.valueOf()];\n          let firstY = _data[seriesIdx].find((v: number | null | undefined) => v != null);\n          let yData = [firstY, firstY];\n          let fauxData = _data.slice();\n          fauxData[0] = xData;\n          fauxData[seriesIdx] = yData;\n\n          //eslint-disable-next-line\n          return defaultBuilder(\n            {\n              ...u,\n              _data: fauxData,\n            } as any,\n            seriesIdx,\n            0,\n            1\n          );\n        };\n      }\n\n      if (customConfig.fillBelowTo) {\n        const fillBelowToField = frame.fields.find(\n          (f) =>\n            customConfig.fillBelowTo === f.name ||\n            customConfig.fillBelowTo === f.config?.displayNameFromDS ||\n            customConfig.fillBelowTo === getFieldDisplayName(f, frame, allFrames)\n        );\n\n        const fillBelowDispName = fillBelowToField\n          ? getFieldDisplayName(fillBelowToField, frame, allFrames)\n          : customConfig.fillBelowTo;\n\n        const t = indexByName.get(dispName);\n        const b = indexByName.get(fillBelowDispName);\n        if (isNumber(b) && isNumber(t)) {\n          builder.addBand({\n            series: [t, b],\n            fill: undefined, // using null will have the band use fill options from `t`\n          });\n\n          if (!fillOpacity) {\n            fillOpacity = 35; // default from flot\n          }\n        } else {\n          fillOpacity = 0;\n        }\n      }\n    }\n\n    let dynamicSeriesColor: ((seriesIdx: number) => string | undefined) | undefined = undefined;\n\n    if (colorMode.id === FieldColorModeId.Thresholds) {\n      dynamicSeriesColor = (seriesIdx) => getFieldSeriesColor(alignedFrame.fields[seriesIdx], theme).color;\n    }\n\n    builder.addSeries({\n      pathBuilder,\n      pointsBuilder,\n      scaleKey,\n      showPoints,\n      pointsFilter,\n      colorMode,\n      fillOpacity,\n      theme,\n      dynamicSeriesColor,\n      drawStyle: customConfig.drawStyle!,\n      lineColor: customConfig.lineColor ?? seriesColor,\n      lineWidth: customConfig.lineWidth,\n      lineInterpolation: customConfig.lineInterpolation,\n      lineStyle: customConfig.lineStyle,\n      barAlignment: customConfig.barAlignment,\n      barWidthFactor: customConfig.barWidthFactor,\n      barMaxWidth: customConfig.barMaxWidth,\n      pointSize: customConfig.pointSize,\n      spanNulls: customConfig.spanNulls || false,\n      show: !customConfig.hideFrom?.viz,\n      gradientMode: customConfig.gradientMode,\n      thresholds: config.thresholds,\n      hardMin: field.config.min,\n      hardMax: field.config.max,\n      softMin: customConfig.axisSoftMin,\n      softMax: customConfig.axisSoftMax,\n      // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n      dataFrameFieldIndex: field.state?.origin,\n    });\n\n    // Render thresholds in graph\n    if (customConfig.thresholdsStyle && config.thresholds) {\n      const thresholdDisplay = customConfig.thresholdsStyle.mode ?? GraphThresholdsStyleMode.Off;\n      if (thresholdDisplay !== GraphThresholdsStyleMode.Off) {\n        builder.addThresholds({\n          config: customConfig.thresholdsStyle,\n          thresholds: config.thresholds,\n          scaleKey,\n          theme,\n          hardMin: field.config.min,\n          hardMax: field.config.max,\n          softMin: customConfig.axisSoftMin,\n          softMax: customConfig.axisSoftMax,\n        });\n      }\n    }\n  }\n\n  let stackingGroups = getStackingGroups(frame);\n\n  builder.setStackingGroups(stackingGroups);\n\n  // hook up custom/composite renderers\n  renderers?.forEach((r) => {\n    if (!indexByName) {\n      indexByName = getNamesToFieldIndex(frame, allFrames);\n    }\n    let fieldIndices: Record<string, number> = {};\n\n    for (let key in r.fieldMap) {\n      let dispName = r.fieldMap[key];\n      fieldIndices[key] = indexByName.get(dispName)!;\n    }\n\n    r.init(builder, fieldIndices);\n  });\n\n  builder.scaleKeys = [xScaleKey, yScaleKey];\n\n  // if hovered value is null, how far we may scan left/right to hover nearest non-null\n  const hoverProximityPx = 15;\n\n  let cursor: Partial<uPlot.Cursor> = {\n    // this scans left and right from cursor position to find nearest data index with value != null\n    // TODO: do we want to only scan past undefined values, but halt at explicit null values?\n    dataIdx: (self, seriesIdx, hoveredIdx, cursorXVal) => {\n      let seriesData = self.data[seriesIdx];\n\n      if (seriesData[hoveredIdx] == null) {\n        let nonNullLft = null,\n          nonNullRgt = null,\n          i;\n\n        i = hoveredIdx;\n        while (nonNullLft == null && i-- > 0) {\n          if (seriesData[i] != null) {\n            nonNullLft = i;\n          }\n        }\n\n        i = hoveredIdx;\n        while (nonNullRgt == null && i++ < seriesData.length) {\n          if (seriesData[i] != null) {\n            nonNullRgt = i;\n          }\n        }\n\n        let xVals = self.data[0];\n\n        let curPos = self.valToPos(cursorXVal, 'x');\n        let rgtPos = nonNullRgt == null ? Infinity : self.valToPos(xVals[nonNullRgt], 'x');\n        let lftPos = nonNullLft == null ? -Infinity : self.valToPos(xVals[nonNullLft], 'x');\n\n        let lftDelta = curPos - lftPos;\n        let rgtDelta = rgtPos - curPos;\n\n        if (lftDelta <= rgtDelta) {\n          if (lftDelta <= hoverProximityPx) {\n            hoveredIdx = nonNullLft!;\n          }\n        } else {\n          if (rgtDelta <= hoverProximityPx) {\n            hoveredIdx = nonNullRgt!;\n          }\n        }\n      }\n\n      return hoveredIdx;\n    },\n  };\n\n  if (sync && sync() !== DashboardCursorSync.Off) {\n    cursor.sync = {\n      key: eventsScope,\n      scales: [xScaleKey, null],\n    };\n  }\n\n  builder.setCursor(cursor);\n\n  return builder;\n};\n\nexport function getNamesToFieldIndex(frame: DataFrame, allFrames: DataFrame[]): Map<string, number> {\n  const originNames = new Map<string, number>();\n  frame.fields.forEach((field, i) => {\n    const origin = field.state?.origin;\n    if (origin) {\n      const origField = allFrames[origin.frameIndex]?.fields[origin.fieldIndex];\n      if (origField) {\n        originNames.set(getFieldDisplayName(origField, allFrames[origin.frameIndex], allFrames), i);\n      }\n    }\n  });\n  return originNames;\n}\n"],"names":["GraphDrawStyle","VisibilityMode","AxisPlacement","UPlotConfigBuilder","preparePlotData2","FieldType","ScaleOrientation","ScaleDirection","uPlot","_a","_b","formattedValueToString","StackingMode","getDisplayProcessor","buildScaleKey","getFieldColorModeForField","getFieldSeriesColor","AxisColorMode","GraphGradientMode","FieldColorModeId","getScaleGradientFn","i","getFieldDisplayName","GraphTransform","isNumber","GraphThresholdsStyleMode","getStackingGroups","DashboardCursorSync"],"mappings":";;;;;;;;;;;;;;;;;;AAgCA,MAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,SAAA,GAAY,MAAM,EAAE,CAAA;AAE1B,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,EAAA,SAAA,CAAU,CAAC,IAAI,CAAA,IAAK,CAAA;AACtB;AAOA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAQ,QAAA,GAAyB,CAAA,KAAO,KAAK,IAAA,GAAO,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAEtG,MAAM,aAAA,GAAkC;AAAA,EACtC,WAAWA,qBAAA,CAAe,IAAA;AAAA,EAC1B,YAAYC,qBAAA,CAAe,IAAA;AAAA,EAC3B,eAAeC,oBAAA,CAAc;AAC/B,CAAA;AAEO,MAAM,2BAER,CAAC;AAAA,EACJ,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA,GAAa,CAAC,IAAA,KAAS,IAAA;AAAA,EACvB,SAAA,GAAY,CAAC,IAAA,KAAS;AACxB,CAAA,KAAM;AArFN,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAsFE,EAAA,MAAM,WAAA,GAAc,WAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,IAAIC,qCAAA,CAAmB,SAAA,CAAU,CAAC,CAAC,CAAA;AAEnD,EAAA,IAAI,YAAA;AAEJ,EAAA,OAAA,CAAQ,WAAA,CAAY,CAAC,MAAA,KAAW;AAE9B,IAAA,YAAA,GAAe,OAAO,CAAC,CAAA;AAEvB,IAAA,OAAOC,uBAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,CAAQ,mBAAmB,CAAA;AAAA,EAChE,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,MAAM,mBAAA,GAAA,CAAA,CACJ,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,mBAAkBF,oBAAA,CAAc,MAAA,GAASA,oBAAA,CAAc,MAAA,GAASA,oBAAA,CAAc,MAAA;AACtG,EAAA,MAAM,mBAAiB,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,mBAAkBA,oBAAA,CAAc,MAAA;AAE7E,EAAA,IAAI,MAAA,CAAO,IAAA,KAASG,cAAA,CAAU,IAAA,EAAM;AAClC,IAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,MACf,QAAA,EAAU,SAAA;AAAA,MACV,aAAaC,uBAAA,CAAiB,UAAA;AAAA,MAC9B,WAAWC,qBAAA,CAAe,KAAA;AAAA,MAC1B,MAAA,EAAQ,IAAA;AAAA,MACR,OAAO,MAAM;AACX,QAAA,MAAM,IAAI,YAAA,EAAa;AACvB,QAAA,OAAO,CAAC,EAAE,IAAA,CAAK,OAAA,IAAW,CAAA,CAAE,EAAA,CAAG,SAAS,CAAA;AAAA,MAC1C;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,cACJ,SAAA,CAAU,MAAA,GAAS,CAAA,GACf,CAAC,GAAG,MAAA,KAAW;AACb,MAAA,OAAO,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,OAAO,CAAE,CAAA;AAAA,IAChD,CAAA,GACA,KAAA,CAAA;AAEN,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,MAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,QACd,QAAA,EAAU,SAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,mBAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAA,CAAO,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,SAAA;AAAA,QAC7B,QAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,KAAM,OAAK,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,YAAA,CAAA,EAAa;AAAA,QAC5D,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,CAAC,CAAA,KAAa;AACxC,QAAA,CAAA,CAAE,IAAI,IAAA,EAAK;AAEX,QAAA,CAAA,CAAE,GAAA,CAAI,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA;AACpC,QAAA,CAAA,CAAE,IAAI,SAAA,GAAY,MAAA;AAClB,QAAA,CAAA,CAAE,IAAI,YAAA,GAAe,QAAA;AAErB,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM;AACpB,UAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAEhB,YAAA,IAAI,WAAA,GAAsB,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA;AACrC,YAAA,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,EAAG,EAAE,IAAA,CAAK,IAAA,EAAM,WAAA,GAAcC,sBAAA,CAAM,OAAO,CAAA;AACrE,YAAA,CAAA,EAAA;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,CAAA,CAAE,IAAI,OAAA,EAAQ;AAAA,MAChB,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,MACf,QAAA,EAAU,SAAA;AAAA,MACV,aAAaF,uBAAA,CAAiB,UAAA;AAAA,MAC9B,WAAWC,qBAAA,CAAe,KAAA;AAAA,MAC1B,KAAA,EAAO,CAAC,CAAA,EAAG,OAAA,EAAS,OAAA,KAAS;AA9KnC,QAAA,IAAAE,GAAAA,EAAAC,GAAAA;AA8KsC,QAAA,OAAA,CAAA,CAACD,GAAAA,GAAA,MAAA,CAAO,MAAA,CAAO,GAAA,KAAd,IAAA,GAAAA,GAAAA,GAAqB,OAAA,EAAA,CAASC,GAAAA,GAAA,MAAA,CAAO,MAAA,CAAO,GAAA,KAAd,IAAA,GAAAA,MAAqB,OAAO,CAAA;AAAA,MAAA;AAAA,KAC5F,CAAA;AAED,IAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,MACd,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,mBAAA;AAAA,MACX,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAA,CAAO,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,SAAA;AAAA,MAC7B,KAAA;AAAA,MACA,MAAM,EAAE,IAAA,EAAA,CAAM,YAAO,MAAA,CAAO,MAAA,KAAd,mBAAsB,YAAA,EAAa;AAAA,MACjD,WAAA,EAAa,CAAC,CAAA,EAAG,QAAA,KAAaC,4BAAuB,MAAA,CAAO,OAAA,CAAS,CAAA,EAAG,QAAQ,CAAC;AAAA,KAClF,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,oBAAA,GAAA,CACF,4CAAW,OAAA,CAAQ,CAAC,MAAM,MAAA,CAAO,MAAA,CAAO,EAAE,QAAQ,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,EAAE,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA,KAAM,CAAA,CAAE,CAAA,CAAA,KAAvG,IAAA,GAAA,EAAA,GAA6G,EAAC;AAEhH,EAAA,IAAI,WAAA;AAEJ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAE5B,IAAA,MAAM,MAAA,GAAwC;AAAA,MAC5C,GAAG,KAAA,CAAM,MAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,GAAG,aAAA;AAAA,QACH,GAAG,MAAM,MAAA,CAAO;AAAA;AAClB,KACF;AAEA,IAAA,MAAM,eAAiC,MAAA,CAAO,MAAA;AAE9C,IAAA,IAAI,KAAA,KAAU,UAAW,KAAA,CAAM,IAAA,KAASN,eAAU,MAAA,IAAU,KAAA,CAAM,IAAA,KAASA,cAAA,CAAU,IAAA,EAAO;AAC1F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,GAAA,CAAM,EAAA,GAAA,KAAA,CAAM,OAAA,KAAN,IAAA,GAAA,EAAA,GAAiB,gBAAA;AAC3B,IAAA,IAAA,CAAA,CAAI,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,OAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,aAArB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA+B,IAAA,MAASO,oBAAa,OAAA,EAAS;AAChE,MAAA,GAAA,GAAMC,wBAAA,CAAoB;AAAA,QACxB,KAAA,EAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,MAAA,EAAQ;AAAA,YACN,GAAG,KAAA,CAAM,MAAA;AAAA,YACT,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAWC,qBAAA,CAAc,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AACjD,IAAA,MAAM,SAAA,GAAYC,+BAA0B,KAAK,CAAA;AACjD,IAAA,MAAM,UAAA,GAAaC,wBAAA,CAAoB,KAAA,EAAO,KAAK,CAAA;AACnD,IAAA,MAAM,cAAc,UAAA,CAAW,KAAA;AAG/B,IAAA,OAAA,CAAQ,QAAA;AAAA,MACN,UAAA;AAAA,QACE;AAAA,UACE,QAAA;AAAA,UACA,aAAaV,uBAAA,CAAiB,QAAA;AAAA,UAC9B,WAAWC,qBAAA,CAAe,EAAA;AAAA,UAC1B,YAAA,EAAA,CAAc,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,IAAA;AAAA,UAC9C,GAAA,EAAA,CAAK,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,GAAA;AAAA,UACrC,eAAA,EAAA,CAAiB,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,eAAA;AAAA,UACjD,GAAA,EAAK,MAAM,MAAA,CAAO,GAAA;AAAA,UAClB,GAAA,EAAK,MAAM,MAAA,CAAO,GAAA;AAAA,UAClB,SAAS,YAAA,CAAa,WAAA;AAAA,UACtB,SAAS,YAAA,CAAa,WAAA;AAAA,UACtB,cAAc,YAAA,CAAa,gBAAA;AAAA,UAC3B,KAAA,EAAA,CAAA,CACE,EAAA,GAAA,YAAA,CAAa,QAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,IAAA,MAASK,oBAAa,OAAA,GACzC,CAAC,CAAA,EAAU,OAAA,EAAiB,OAAA,KAAoB;AAC9C,YAAA,OAAA,GAAU,OAAA,GAAU,IAAI,CAAA,CAAA,GAAK,CAAA;AAC7B,YAAA,OAAA,GAAU,OAAA,GAAU,IAAI,CAAA,GAAI,CAAA;AAC5B,YAAA,OAAO,CAAC,SAAS,OAAO,CAAA;AAAA,UAC1B,CAAA,GACA,MAAM,IAAA,KAASP,cAAA,CAAU,OACvB,CAAC,CAAA,EAAU,SAAiB,OAAA,KAAoB;AAE9C,YAAA,IAAI,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAM,KAAM,IAAA,CAAM,MAAA;AAEzC,YAAA,OAAO,CAAC,IAAI,GAAG,CAAA;AAAA,UAIjB,CAAA,GACA,KAAA,CAAA;AAAA,UACR,QAAA,EAAU,MAAM,MAAA,CAAO;AAAA,SACzB;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAY,QAAA;AAAA,IACd;AAEA,IAAA,IAAI,YAAA,CAAa,aAAA,KAAkBH,oBAAA,CAAc,MAAA,EAAQ;AACvD,MAAA,IAAI,SAAA;AAEJ,MAAA,IAAI,YAAA,CAAa,aAAA,KAAkBe,oBAAA,CAAc,MAAA,EAAQ;AACvD,QAAA,IACE,SAAA,CAAU,SAAA,IAAA,CAAA,CACV,EAAA,GAAA,KAAA,CAAM,MAAA,CAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,YAAA,MAAiBC,wBAAA,CAAkB,MAAA,IACxD,SAAA,CAAU,EAAA,KAAOC,qBAAA,CAAiB,UAAA,EAClC;AACA,UAAA,SAAA,GAAYC,iCAAmB,CAAA,EAAG,KAAA,EAAO,SAAA,EAAW,KAAA,CAAM,OAAO,UAAU,CAAA;AAAA,QAC7E,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,WAAA;AAAA,QACd;AAAA,MACF;AAEA,MAAA,MAAM,kBAAA,GAAqB;AAAA,QACzB,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,aAAa,cAAA,IAAkB,KAAA;AAAA,UACrC,OAAO,CAAA,GAAI,gBAAA;AAAA,UACX,MAAA,EAAQ,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,SACzC;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,aAAa,cAAA,IAAkB,KAAA;AAAA,UACrC,MAAA,EAAQ,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,SACzC;AAAA,QACA,KAAA,EAAO,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,OACxC;AAEA,MAAA,IAAI,KAAA;AAGJ,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,MAAA;AAEJ,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAK,CAAA,EAAG;AAC/B,QAAA,KAAA,GAAQ,SAAA;AAAA,MACV,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASf,cAAA,CAAU,IAAA,EAAM;AACxC,QAAA,IAAI,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAM,IAAA,CAAM,IAAA;AACpC,QAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAWgB,OAAcA,EAAC,CAAA;AAC7C,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAEA,MAAA,OAAA,CAAQ,OAAA;AAAA,QACN,SAAA;AAAA,UACE;AAAA,YACE,QAAA;AAAA,YACA,OAAO,YAAA,CAAa,SAAA;AAAA,YACpB,MAAM,YAAA,CAAa,SAAA;AAAA,YACnB,SAAA,EAAA,CAAW,EAAA,GAAA,YAAA,CAAa,aAAA,KAAb,IAAA,GAAA,EAAA,GAA8BnB,oBAAA,CAAc,IAAA;AAAA,YACvD,WAAA,EAAa,CAAC,CAAA,EAAG,QAAA,KAAaS,4BAAuB,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,YACrE,KAAA;AAAA,YACA,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,CAAa,YAAA,EAAa;AAAA,YACxC,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA;AAAA,YACvB,KAAA,EAAA,CAAO,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,IAAA;AAAA,YACvC,MAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA;AAAA,YACA,GAAG;AAAA,WACL;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,aACJ,YAAA,CAAa,SAAA,KAAcX,sBAAe,MAAA,GAASC,qBAAA,CAAe,SAAS,YAAA,CAAa,UAAA;AAE1F,IAAA,IAAI,eAA2C,MAAM,IAAA;AAErD,IAAA,IAAI,YAAA,CAAa,cAAc,IAAA,EAAM;AACnC,MAAA,YAAA,GAAe,CAAC,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,IAAA,KAAS;AAC3C,QAAA,IAAI,WAAW,EAAC;AAEhB,QAAA,IAAI,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA;AAE/B,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,IAAQ,IAAA,CAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,CAAC,QAAA,EAAU,OAAO,CAAA,GAAI,MAAA,CAAO,IAAA;AACnC,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACtB,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AAC9B,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAA,CAAS,MAAM,QAAQ,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AAClE,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAA,CAAS,MAAM,OAAO,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AAEhE,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,MAAM,QAAA,EAAU;AAC3B,YAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,UACxB;AAGA,UAAA,KAAA,IAASoB,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,IAAA,CAAK,QAAQA,EAAAA,EAAAA,EAAK;AACpC,YAAA,IAAI,OAAA,GAAU,KAAKA,EAAC,CAAA;AACpB,YAAA,IAAI,OAAA,GAAU,IAAA,CAAKA,EAAAA,GAAI,CAAC,CAAA;AAExB,YAAA,IAAI,WAAW,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAExC,cAAA,IAAI,YAAY,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,IAAI,CAAA;AAE3C,cAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,IAAA,EAAM;AAE5B,gBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,kBAAA,IAAI,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,IAAA,EAAM;AAChC,oBAAA,SAAA,IAAa,CAAA;AACb,oBAAA;AAAA,kBACF;AACA,kBAAA,IAAI,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,IAAA,EAAM;AAChC,oBAAA,SAAA,IAAa,CAAA;AACb,oBAAA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAEA,cAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,YACzB;AAAA,UACF;AAEA,UAAA,IAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,MAAM,OAAA,EAAS;AACxC,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,UACvB;AAAA,QACF;AAEA,QAAA,OAAO,QAAA,CAAS,SAAS,QAAA,GAAW,IAAA;AAAA,MACtC,CAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAE,aAAY,GAAI,YAAA;AAEtB,IAAA,IAAI,WAAA,GAA+C,IAAA;AACnD,IAAA,IAAI,aAAA,GAAiD,IAAA;AAErD,IAAA,IAAA,CAAI,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,MAAA,EAAQ;AACvB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,WAAA,GAAc,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAAA,MACrD;AAEA,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,KAAA,CAAM,OAAO,UAAU,CAAA;AAC3D,MAAA,MAAM,WAAA,GAAc,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAa,MAAA,CAAO,KAAA,CAAM,MAAM,MAAA,CAAO,UAAA,CAAA;AAE3D,MAAA,MAAM,QAAA,GAAWC,wBAAA,CAAoB,WAAA,IAAA,IAAA,GAAA,WAAA,GAAe,KAAA,EAAO,aAAa,SAAS,CAAA;AAGjF,MAAA,IAAI,oBAAA,CAAqB,OAAA,CAAQ,QAAQ,CAAA,IAAK,CAAA,EAAG;AAC/C,QAAA,WAAA,GAAc,MAAM,IAAA;AACpB,QAAA,aAAA,GAAgB,MAAM,KAAA,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,YAAA,CAAa,SAAA,KAAcC,qBAAA,CAAe,QAAA,EAAU;AAE7D,QAAA,MAAM,cAAA,GAAiBf,sBAAA,CAAM,KAAA,CAAO,MAAA,EAAQ;AAE5C,QAAA,WAAA,GAAc,CAAC,GAAG,SAAA,KAAc;AAE9B,UAAA,MAAM,QAAgB,CAAA,CAAU,KAAA;AAIhC,UAAA,MAAM,IAAI,YAAA,EAAa;AACvB,UAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,SAAQ,EAAG,CAAA,CAAE,EAAA,CAAG,OAAA,EAAS,CAAA;AAC7C,UAAA,IAAI,MAAA,GAAS,MAAM,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA,KAAiC,KAAK,IAAI,CAAA;AAC9E,UAAA,IAAI,KAAA,GAAQ,CAAC,MAAA,EAAQ,MAAM,CAAA;AAC3B,UAAA,IAAI,QAAA,GAAW,MAAM,KAAA,EAAM;AAC3B,UAAA,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA;AACd,UAAA,QAAA,CAAS,SAAS,CAAA,GAAI,KAAA;AAGtB,UAAA,OAAO,cAAA;AAAA,YACL;AAAA,cACE,GAAG,CAAA;AAAA,cACH,KAAA,EAAO;AAAA,aACT;AAAA,YACA,SAAA;AAAA,YACA,CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,QAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,IAAA;AAAA,UACpC,CAAC,CAAA,KAAG;AA7bd,YAAA,IAAAC,GAAAA;AA8bY,YAAA,OAAA,YAAA,CAAa,gBAAgB,CAAA,CAAE,IAAA,IAC/B,YAAA,CAAa,WAAA,MAAA,CAAgBA,MAAA,CAAA,CAAE,MAAA,KAAF,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAU,sBACvC,YAAA,CAAa,WAAA,KAAgBa,wBAAA,CAAoB,CAAA,EAAG,OAAO,SAAS,CAAA;AAAA,UAAA;AAAA,SACxE;AAEA,QAAA,MAAM,oBAAoB,gBAAA,GACtBA,wBAAA,CAAoB,kBAAkB,KAAA,EAAO,SAAS,IACtD,YAAA,CAAa,WAAA;AAEjB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAClC,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA;AAC3C,QAAA,IAAIE,eAAA,CAAS,CAAC,CAAA,IAAKA,eAAA,CAAS,CAAC,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,YACd,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,YACb,IAAA,EAAM,KAAA;AAAA;AAAA,WACP,CAAA;AAED,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,WAAA,GAAc,EAAA;AAAA,UAChB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,WAAA,GAAc,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,kBAAA,GAA8E,KAAA,CAAA;AAElF,IAAA,IAAI,SAAA,CAAU,EAAA,KAAOL,qBAAA,CAAiB,UAAA,EAAY;AAChD,MAAA,kBAAA,GAAqB,CAAC,cAAcH,wBAAA,CAAoB,YAAA,CAAa,OAAO,SAAS,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA;AAAA,IACjG;AAEA,IAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,MAChB,WAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,SAAA,EAAA,CAAW,EAAA,GAAA,YAAA,CAAa,SAAA,KAAb,IAAA,GAAA,EAAA,GAA0B,WAAA;AAAA,MACrC,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,mBAAmB,YAAA,CAAa,iBAAA;AAAA,MAChC,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,cAAc,YAAA,CAAa,YAAA;AAAA,MAC3B,gBAAgB,YAAA,CAAa,cAAA;AAAA,MAC7B,aAAa,YAAA,CAAa,WAAA;AAAA,MAC1B,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,SAAA,EAAW,aAAa,SAAA,IAAa,KAAA;AAAA,MACrC,IAAA,EAAM,EAAA,CAAC,EAAA,GAAA,YAAA,CAAa,QAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,GAAA,CAAA;AAAA,MAC9B,cAAc,YAAA,CAAa,YAAA;AAAA,MAC3B,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,MACtB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,MACtB,SAAS,YAAA,CAAa,WAAA;AAAA,MACtB,SAAS,YAAA,CAAa,WAAA;AAAA;AAAA,MAEtB,mBAAA,EAAA,CAAqB,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa;AAAA,KACnC,CAAA;AAGD,IAAA,IAAI,YAAA,CAAa,eAAA,IAAmB,MAAA,CAAO,UAAA,EAAY;AACrD,MAAA,MAAM,gBAAA,GAAA,CAAmB,EAAA,GAAA,YAAA,CAAa,eAAA,CAAgB,IAAA,KAA7B,YAAqCS,+BAAA,CAAyB,GAAA;AACvF,MAAA,IAAI,gBAAA,KAAqBA,gCAAyB,GAAA,EAAK;AACrD,QAAA,OAAA,CAAQ,aAAA,CAAc;AAAA,UACpB,QAAQ,YAAA,CAAa,eAAA;AAAA,UACrB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,QAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,UACtB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,UACtB,SAAS,YAAA,CAAa,WAAA;AAAA,UACtB,SAAS,YAAA,CAAa;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,GAAiBC,wBAAkB,KAAK,CAAA;AAE5C,EAAA,OAAA,CAAQ,kBAAkB,cAAc,CAAA;AAGxC,EAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,KAAM;AACxB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,eAAuC,EAAC;AAE5C,IAAA,KAAA,IAAS,GAAA,IAAO,EAAE,QAAA,EAAU;AAC1B,MAAA,IAAI,QAAA,GAAW,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAC7B,MAAA,YAAA,CAAa,GAAG,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAAA,IAC9C;AAEA,IAAA,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EAC9B,CAAA,CAAA;AAEA,EAAA,OAAA,CAAQ,SAAA,GAAY,CAAC,SAAA,EAAW,SAAS,CAAA;AAGzC,EAAA,MAAM,gBAAA,GAAmB,EAAA;AAEzB,EAAA,IAAI,MAAA,GAAgC;AAAA;AAAA;AAAA,IAGlC,OAAA,EAAS,CAAC,IAAA,EAAM,SAAA,EAAW,YAAY,UAAA,KAAe;AACpD,MAAA,IAAI,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAEpC,MAAA,IAAI,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA,EAAM;AAClC,QAAA,IAAI,UAAA,GAAa,IAAA,EACf,UAAA,GAAa,IAAA,EACb,CAAA;AAEF,QAAA,CAAA,GAAI,UAAA;AACJ,QAAA,OAAO,UAAA,IAAc,IAAA,IAAQ,CAAA,EAAA,GAAM,CAAA,EAAG;AACpC,UAAA,IAAI,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA,EAAM;AACzB,YAAA,UAAA,GAAa,CAAA;AAAA,UACf;AAAA,QACF;AAEA,QAAA,CAAA,GAAI,UAAA;AACJ,QAAA,OAAO,UAAA,IAAc,IAAA,IAAQ,CAAA,EAAA,GAAM,UAAA,CAAW,MAAA,EAAQ;AACpD,UAAA,IAAI,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA,EAAM;AACzB,YAAA,UAAA,GAAa,CAAA;AAAA,UACf;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAEvB,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,GAAG,CAAA;AAC1C,QAAA,IAAI,MAAA,GAAS,cAAc,IAAA,GAAO,QAAA,GAAW,KAAK,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,EAAG,GAAG,CAAA;AACjF,QAAA,IAAI,MAAA,GAAS,cAAc,IAAA,GAAO,CAAA,QAAA,GAAY,KAAK,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,EAAG,GAAG,CAAA;AAElF,QAAA,IAAI,WAAW,MAAA,GAAS,MAAA;AACxB,QAAA,IAAI,WAAW,MAAA,GAAS,MAAA;AAExB,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,YAAA,UAAA,GAAa,UAAA;AAAA,UACf;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,YAAA,UAAA,GAAa,UAAA;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAK,KAAMC,wBAAA,CAAoB,GAAA,EAAK;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO;AAAA,MACZ,GAAA,EAAK,WAAA;AAAA,MACL,MAAA,EAAQ,CAAC,SAAA,EAAW,IAAI;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,UAAU,MAAM,CAAA;AAExB,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,oBAAA,CAAqB,OAAkB,SAAA,EAA6C;AAClG,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAtmBrC,IAAA,IAAA,EAAA,EAAA,EAAA;AAumBI,IAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,MAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,aAAY,EAAA,GAAA,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA,KAA3B,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,OAAO,MAAA,CAAO,UAAA,CAAA;AAC9D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,WAAA,CAAY,GAAA,CAAIL,yBAAoB,SAAA,EAAW,SAAA,CAAU,OAAO,UAAU,CAAA,EAAG,SAAS,CAAA,EAAG,CAAC,CAAA;AAAA,MAC5F;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,WAAA;AACT;;;;;"}