{"version":3,"file":"beastcss.cjs","sources":["../src/utils/get-stylesheet-id.ts","../src/utils/special-chars.ts","../src/utils/logging.ts","../src/utils/units-formatter.ts","../src/utils/html-parser.ts","../src/Beastcss.ts"],"sourcesContent":["let count = 0;\n\nexport default function getStylesheetId() {\n  const id = count.toString();\n\n  count += 1;\n\n  return id;\n}\n","/**\n * Replace specials characters in html class attributes by unique strings.\n */\nexport function replaceHTMLClasses(html: string) {\n  return html.replace(\n    /class=[\"'][^\"']*[\"']/gm,\n    (m) =>\n      m\n        .replace(/:/gm, '__0__') // :\n        .replace(/\\//gm, '__1__') // /\n        .replace(/\\?/gm, '__2__') // ?\n        .replace(/\\(/gm, '__3__') // (\n        .replace(/\\)/gm, '__4__') // )\n        .replace(/!/gm, '__5__') // !\n        .replace(/<|&lt;/gm, '__6__') // < or &lt;\n        .replace(/>|&gt;/gm, '__7__') // > or &gt;\n        .replace(/{/gm, '__8__') // {\n        .replace(/}/gm, '__9__') // }\n        .replace(/\\[/gm, '__10__') // [\n        .replace(/\\]/gm, '__11__') // ]\n        .replace(/\\./gm, '__12__') // .\n  );\n}\n\n/**\n * Replace escaped specials characters in css selectors by unique strings.\n */\nexport function replaceCSSSelectors(css: string) {\n  return css\n    .replace(/\\\\:/gm, '__0__') // \\:\n    .replace(/\\\\\\//gm, '__1__') // \\/\n    .replace(/\\\\\\?/gm, '__2__') // \\?\n    .replace(/\\\\\\(/gm, '__3__') // \\(\n    .replace(/\\\\\\)/gm, '__4__') // \\)\n    .replace(/\\\\!/gm, '__5__') // \\!\n    .replace(/\\\\</gm, '__6__') // \\<\n    .replace(/\\\\>/gm, '__7__') // \\>\n    .replace(/\\\\{/gm, '__8__') // \\{\n    .replace(/\\\\}/gm, '__9__') // \\}\n    .replace(/\\\\\\[/gm, '__10__') // \\[\n    .replace(/\\\\\\]/gm, '__11__') // \\]\n    .replace(/\\\\\\./gm, '__12__'); // \\.\n}\n\n/**\n * Restore escaped specials characters in css selectors replaced by unique strings.\n */\nexport function restoreCSSSelectors(css: string) {\n  return css\n    .replace(/__0__/gm, '\\\\:')\n    .replace(/__1__/gm, '\\\\/')\n    .replace(/__2__/gm, '\\\\?')\n    .replace(/__3__/gm, '\\\\(')\n    .replace(/__4__/gm, '\\\\)')\n    .replace(/__5__/gm, '\\\\!')\n    .replace(/__6__/gm, '\\\\<')\n    .replace(/__7__/gm, '\\\\>')\n    .replace(/__8__/gm, '\\\\{')\n    .replace(/__9__/gm, '\\\\}')\n    .replace(/__10__/gm, '\\\\[')\n    .replace(/__11__/gm, '\\\\]')\n    .replace(/__12__/gm, '\\\\.');\n}\n","/* eslint-disable no-console */\nimport { bold, yellow, blue, red } from 'kolorist';\nimport type Beastcss from '../Beastcss';\n\nexport declare const Levels: readonly [\n  'debug',\n  'info',\n  'warn',\n  'error',\n  'silent'\n];\n\nexport type LogLevel = (typeof Levels)[number];\n\nexport interface Logger {\n  debug: (msg: string, processId?: Beastcss.ProcessId) => void;\n  info: (msg: string, processId?: Beastcss.ProcessId) => void;\n  warn: (msg: string, processId?: Beastcss.ProcessId) => void;\n  error: (msg: string, processId?: Beastcss.ProcessId) => void;\n}\n\n/**\n * Log levels ordered by verbosity.\n */\nconst levels: typeof Levels = ['debug', 'info', 'warn', 'error', 'silent'];\n\nexport const defaultLogger: Logger = {\n  debug(msg: string, processId: Beastcss.ProcessId) {\n    console.debug(`${processId ? `[${processId}] ` : ''}${msg}`);\n  },\n  info(msg: string, processId: Beastcss.ProcessId) {\n    console.info(bold(blue(`${processId ? `[${processId}] ` : ''}${msg}`)));\n  },\n  warn(msg: string, processId: Beastcss.ProcessId) {\n    console.warn(yellow(`${processId ? `[${processId}] ` : ''}${msg}`));\n  },\n  error(msg: string, processId: Beastcss.ProcessId) {\n    console.error(bold(red(`${processId ? `[${processId}] ` : ''}${msg}`)));\n  },\n};\n\n/**\n * Set the verbosity output of logger.\n */\nexport function setVerbosity(logger: Logger, logLevel: LogLevel): Logger {\n  const logLevelIdx = levels.indexOf(logLevel);\n\n  levels.forEach((type: LogLevel, index) => {\n    if (index < logLevelIdx && type !== 'silent') {\n      logger[type] = () => undefined; // silent\n    }\n  });\n\n  return logger;\n}\n","const formatDigital = new Intl.NumberFormat('en', {\n  style: 'unit',\n  unit: 'kilobyte',\n  maximumFractionDigits: 4,\n});\n\nconst formatDuration = new Intl.NumberFormat('en', {\n  style: 'unit',\n  unit: 'millisecond',\n  maximumFractionDigits: 0,\n});\n\nconst formatConcentration = new Intl.NumberFormat('en', {\n  style: 'unit',\n  unit: 'percent',\n  maximumFractionDigits: 2,\n});\n\n/**\n * Format a number (`Buffer.byteLength`) as Kilobytes.\n */\nexport const formatToKB = (number: number) =>\n  formatDigital.format(number / 1000);\n\n/**\n * Format a number (`process.hrtime.bigint`) as milliseconds.\n */\nexport const formatToMs = (number: number | bigint) =>\n  formatDuration.format(Number(number) / 1000000);\n\n/**\n * Format as percentage concentration of `partial` number by its `total` number.\n */\nexport const formatToPercent = (partial: number, total: number) =>\n  formatConcentration.format((partial / total) * 100);\n","import { parse, HTMLElement, type Node } from 'node-html-parser';\n\nexport declare class ExtendedHTMLElement extends HTMLElement {\n  public $$external: boolean;\n\n  public before(node: Node): Node;\n  public after(node: Node): Node;\n\n  public querySelector(selector: string): ExtendedHTMLElement | null;\n  public querySelectorAll(selector: string): ExtendedHTMLElement[];\n}\n\n/**\n * Extend `node-html-parser` HTMLElement with `before` and `after` methods.\n */\nexport const extendHTMLElement = (el: HTMLElement) => {\n  const elProto: unknown = Object.getPrototypeOf(el);\n\n  Object.defineProperties(elProto, {\n    before: {\n      value(this: HTMLElement, node: Node) {\n        const idx = this.parentNode.childNodes.findIndex(\n          (child: Node) => child === this\n        );\n\n        this.parentNode.childNodes.splice(idx, 0, node);\n\n        if (node instanceof HTMLElement) {\n          node.parentNode = this.parentNode;\n        }\n\n        return node;\n      },\n      enumerable: true,\n      configurable: true,\n    },\n\n    after: {\n      value(this: HTMLElement, node: Node) {\n        const idx = this.parentNode.childNodes.findIndex(\n          (child: Node) => child === this\n        );\n\n        this.parentNode.childNodes.splice(idx + 1, 0, node);\n\n        if (node instanceof HTMLElement) {\n          node.parentNode = this.parentNode;\n        }\n\n        return node;\n      },\n      enumerable: true,\n      configurable: true,\n    },\n  });\n\n  return el as ExtendedHTMLElement;\n};\n\n/**\n * Parse HTML into a mutable, serializable DOM Object.\n */\nexport function parseHTML(html: string): ExtendedHTMLElement {\n  const rootElement = parse(html, { comment: true }); // very important to keep comments for SSR\n\n  return extendHTMLElement(rootElement);\n}\n\nexport { HTMLElement };\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport { callbackify, promisify } from 'util';\nimport { AsyncLocalStorage } from 'async_hooks';\n\nimport dropcss, { type DropcssOptions } from '@freddy38510/dropcss';\nimport { transform as transformCss, browserslistToTargets } from 'lightningcss';\nimport type { FileSystemAdapter } from 'fast-glob';\n\nimport {\n  htmlParser,\n  specialChars,\n  logging,\n  formatter,\n  getStylesheetId,\n} from './utils';\n\nclass Beastcss {\n  public opts: Beastcss.Options;\n\n  protected fs: Beastcss.FSAdapter;\n\n  protected cachedStylesheetsSource = new Map<\n    string,\n    Promise<Beastcss.StylesheetSource | undefined>\n  >();\n\n  protected get processId() {\n    return this.executionContext.getStore();\n  }\n\n  private criticalSelectors = new Set<string>();\n\n  private executionContext = new AsyncLocalStorage<Beastcss.ProcessId>();\n\n  constructor(options?: Partial<Beastcss.Options>) {\n    this.opts = {\n      path: process.cwd(),\n      publicPath: '',\n      additionalStylesheets: [],\n      externalThreshold: 0,\n      minifyTargets: [],\n      eventHandlers: 'attr',\n      logger: logging.defaultLogger,\n      logLevel: 'info',\n      ...(options || {}),\n    };\n\n    if (this.opts.autoRemoveStyleTags === true) {\n      this.opts.merge = false;\n    }\n\n    if (Array.isArray(this.opts.whitelist)) {\n      this.opts.whitelist = this.opts.whitelist.map((sel) => {\n        if (sel instanceof RegExp) {\n          return new RegExp(\n            specialChars.replaceCSSSelectors(sel.source),\n            sel.flags\n          );\n        }\n\n        return specialChars.replaceCSSSelectors(sel);\n      });\n    }\n\n    this.setVerbosity();\n\n    this.fs = Beastcss.createFsAdapter(this.opts.fs || fs);\n\n    // no need to keep it in memory\n    delete this.opts.fs;\n  }\n\n  /**\n   * Apply critical CSS processing to the html.\n   */\n  public async process(html: string, processId?: Beastcss.ProcessId) {\n    return this.executionContext.run(processId, async () => {\n      const start = process.hrtime.bigint();\n\n      const astHTML = htmlParser.parseHTML(html);\n\n      const escapedHtml = specialChars.replaceHTMLClasses(html);\n\n      const hasRemovedNonCriticalCss: boolean[] = [];\n\n      if (this.opts.internal !== false) {\n        hasRemovedNonCriticalCss.push(\n          ...astHTML\n            .querySelectorAll('style')\n            .map((style) => this.processInternalStylesheet(escapedHtml, style))\n        );\n      }\n\n      if (this.opts.external !== false) {\n        const externalStylesheets = await this.getExternalStylesheets(astHTML);\n\n        hasRemovedNonCriticalCss.push(\n          ...(await Promise.all(\n            externalStylesheets.map(async (stylesheet) =>\n              this.processExternalStylesheet(astHTML, escapedHtml, stylesheet)\n            )\n          ))\n        );\n      }\n\n      if (this.opts.eventHandlers === 'script') {\n        this.moveEventHandlers(astHTML);\n      }\n\n      if (!hasRemovedNonCriticalCss.includes(true)) {\n        this.opts.logger.info(\n          'No non-critical css rules was removed.',\n          processId\n        );\n\n        return html;\n      }\n\n      if (this.opts.merge !== false) {\n        this.mergeStylesheets(astHTML);\n      }\n\n      const output = astHTML.toString();\n\n      const end = process.hrtime.bigint();\n\n      this.opts.logger.info(\n        `Processed in ${formatter.formatToMs(end - start)}.`,\n        processId\n      );\n\n      return output;\n    });\n  }\n\n  /**\n   * Remove all previously collected critical CSS from external stylesheets.\n   */\n  public async pruneSources(processId?: Beastcss.ProcessId) {\n    return this.executionContext.run(processId, async () => {\n      const hasPrunedStylesheets = await Promise.all(\n        [...this.cachedStylesheetsSource.keys()].map(async (stylesheetPath) =>\n          this.pruneSource(stylesheetPath)\n        )\n      );\n\n      if (!hasPrunedStylesheets.includes(true)) {\n        this.opts.logger.info('No stylesheets was pruned.', this.processId);\n      }\n    });\n  }\n\n  /**\n   * Free up memory by clearing cached stylesheets and critical selectors.\n   */\n  public clear() {\n    this.criticalSelectors.clear();\n\n    this.cachedStylesheetsSource.clear();\n  }\n\n  /**\n   * Set the logging verbosity.\n   */\n  public setVerbosity(logLevel?: logging.LogLevel) {\n    this.opts.logger = logging.setVerbosity(\n      this.opts.logger,\n      logLevel || this.opts.logLevel\n    );\n  }\n\n  /**\n   * Returns the sha256 hash of the script containing the event handlers\n   * for asynchronously loaded external stylesheets.\n   *\n   * This is useful for Content Security Policy.\n   */\n  public getScriptCSPHash(): string | null {\n    if (this.opts.eventHandlers === 'script') {\n      if (this.opts.asyncLoadExternalStylesheets === false) {\n        if (this.opts.autoRemoveStyleTags === true) {\n          return 'A/wfhB35UabxOsb1JHSev+WuhSzV6UVdrXroQoJGHjs=';\n        }\n\n        return null;\n      }\n\n      if (this.opts.autoRemoveStyleTags === true) {\n        return '3co704+RoS/4/+160cUCCJcbeqklc8Xjxvu+mUntI/g=';\n      }\n\n      return '5Tv55JY7KfsCmpqJE8qIYBmAY0tukwtjE0lGd4c3ZJY=';\n    }\n\n    if (this.opts.autoRemoveStyleTags === true) {\n      if (this.opts.asyncLoadExternalStylesheets === false) {\n        return 'Nnn7CC8aSvx01msRxf6LzPaz8ZD4Jjs+KYOoMWCg1TM=';\n      }\n\n      return 'ASKMmekk3KUgRvb2C/X8MJrbBvEWdig1Lh4/C5XXhjU=';\n    }\n\n    if (this.opts.asyncLoadExternalStylesheets === false) {\n      return null;\n    }\n\n    return 'dRZ1sPlGAaDC1F4f7tarcT3BjBY9XkskErevAM4KpY8=';\n  }\n\n  protected static createFsAdapter(fileSystem: Beastcss.FSLike) {\n    return {\n      readFile: fileSystem.readFile.toString().match(/callback/i)\n        ? promisify(fileSystem.readFile.bind(fileSystem) as typeof fs.readFile)\n        : fileSystem.readFile,\n      writeFile: fileSystem.writeFile.toString().match(/callback/i)\n        ? promisify(\n            fileSystem.writeFile.bind(fileSystem) as typeof fs.writeFile\n          )\n        : fileSystem.writeFile,\n      unlink: fileSystem.unlink.toString().match(/callback/i)\n        ? promisify(fileSystem.unlink.bind(fileSystem) as typeof fs.unlink)\n        : fileSystem.unlink,\n      readdir: fileSystem.readdir.toString().match(/callback/i)\n        ? (fileSystem.readdir.bind(fileSystem) as typeof fs.readdir)\n        : (callbackify(\n            fileSystem.readdir.bind(fileSystem) as typeof fs.promises.readdir\n          ) as Beastcss.FSAdapter['readdir']),\n      lstat: fileSystem.lstat.toString().match(/callback/i)\n        ? fileSystem.lstat.bind(fileSystem)\n        : callbackify(\n            fileSystem.lstat.bind(fileSystem) as typeof fs.promises.lstat\n          ),\n      stat: fileSystem.stat.toString().match(/callback/i)\n        ? fileSystem.stat.bind(fileSystem)\n        : callbackify(\n            fileSystem.stat.bind(fileSystem) as typeof fs.promises.stat\n          ),\n    } as Beastcss.FSAdapter;\n  }\n\n  protected async getStylesheetSource(stylesheetPath: string) {\n    if (this.cachedStylesheetsSource.has(stylesheetPath)) {\n      return this.cachedStylesheetsSource.get(stylesheetPath);\n    }\n\n    const promise = (async () => {\n      try {\n        const content = await this.fs.readFile(stylesheetPath);\n\n        return {\n          content,\n          size: Buffer.byteLength(content),\n        };\n      } catch (e) {\n        this.opts.logger.warn(\n          `External stylesheet \"${stylesheetPath}\" not found.`,\n          this.processId\n        );\n\n        return undefined;\n      }\n    })();\n\n    this.cachedStylesheetsSource.set(stylesheetPath, promise);\n\n    return promise;\n  }\n\n  protected getStylesheetPath(src: string) {\n    const pathPrefix = `${this.opts.publicPath.replace(/(^\\/|\\/$)/g, '')}/`;\n\n    let normalizedPath = src.replace(/^\\//, '').replace(/\\?\\w+$/, '');\n\n    if (normalizedPath.indexOf(pathPrefix) === 0) {\n      normalizedPath = normalizedPath\n        .substring(pathPrefix.length)\n        .replace(/^\\//, '');\n    }\n\n    return path.resolve(this.opts.path, normalizedPath);\n  }\n\n  protected async getAdditionalStylesheets() {\n    const { default: fastGlob } = await import('fast-glob');\n\n    const additionalStylesheets: Beastcss.ExternalStylesheet[] = [];\n\n    const matches = await fastGlob(this.opts.additionalStylesheets, {\n      cwd: this.opts.path,\n      baseNameMatch: true,\n      unique: true,\n      suppressErrors: true,\n      onlyFiles: true,\n      fs: this.fs,\n    });\n\n    matches.forEach((match) => {\n      if (this.isExcluded(match)) {\n        this.opts.logger.debug(\n          `Excluded additional stylesheet \"${match}\".`,\n          this.processId\n        );\n\n        return;\n      }\n\n      additionalStylesheets.push({\n        path: this.getStylesheetPath(match),\n        filename: path.basename(match),\n      });\n    });\n\n    return additionalStylesheets;\n  }\n\n  protected async updateExternalStylesheet(\n    stylesheetPath: string,\n    css: string\n  ) {\n    return this.fs.writeFile(stylesheetPath, css);\n  }\n\n  protected async removeExternalStylesheet(stylesheetPath: string) {\n    try {\n      await this.fs.unlink(stylesheetPath);\n    } catch (e) {\n      // continue regardless of error\n    }\n  }\n\n  protected isExcluded(stylesheetPath: string) {\n    // Exclude remote stylesheets\n    if (\n      /^https?:\\/\\//.test(stylesheetPath) ||\n      stylesheetPath.startsWith('//')\n    ) {\n      return true;\n    }\n\n    if (\n      this.opts.exclude instanceof RegExp &&\n      this.opts.exclude.test(stylesheetPath)\n    ) {\n      return true;\n    }\n\n    if (\n      this.opts.exclude instanceof Function &&\n      this.opts.exclude(stylesheetPath)\n    ) {\n      return true;\n    }\n\n    return !/\\.css$/.test(stylesheetPath.replace(/\\?\\w+$/, ''));\n  }\n\n  private async getExternalStylesheets(\n    astHTML: htmlParser.ExtendedHTMLElement\n  ) {\n    const externalStylesheets: Beastcss.ExternalStylesheet[] = [];\n    const stylesheetPaths: string[] = [];\n\n    astHTML.querySelectorAll('link[rel=\"stylesheet\"]').forEach((link) => {\n      const href = link.getAttribute('href');\n      const media = link.getAttribute('media');\n\n      if (!href) {\n        this.opts.logger.warn(\n          `External stylesheet href attribute is missing.`,\n          this.processId\n        );\n\n        return;\n      }\n\n      if (media && media === 'print') {\n        this.opts.logger.debug(\n          `Skipped external stylesheet \"${href}\" as it targeted print media.`,\n          this.processId\n        );\n\n        return;\n      }\n\n      if (this.isExcluded(href)) {\n        this.opts.logger.debug(\n          `Excluded external stylesheet \"${href}\".`,\n          this.processId\n        );\n\n        return;\n      }\n\n      const stylesheetPath = this.getStylesheetPath(href);\n\n      if (!stylesheetPaths.includes(stylesheetPath)) {\n        externalStylesheets.push({\n          path: stylesheetPath,\n          filename: path.basename(href),\n          link,\n        });\n\n        stylesheetPaths.push(stylesheetPath);\n      }\n    });\n\n    if (this.opts.additionalStylesheets.length > 0) {\n      const additionalStylesheets: Beastcss.ExternalStylesheet[] =\n        await this.getAdditionalStylesheets();\n\n      additionalStylesheets.forEach((stylesheet) => {\n        if (!stylesheetPaths.includes(stylesheet.path)) {\n          externalStylesheets.push(stylesheet);\n\n          stylesheetPaths.push(stylesheet.path);\n        }\n      });\n    }\n\n    return externalStylesheets;\n  }\n\n  private isSelectorWhitelisted(selector: string) {\n    if (Array.isArray(this.opts.whitelist)) {\n      return this.opts.whitelist.some((whitelistedSelector) =>\n        typeof whitelistedSelector === 'string'\n          ? whitelistedSelector === selector\n          : whitelistedSelector.test(selector)\n      );\n    }\n\n    return false;\n  }\n\n  private getCriticalCss(\n    html: string,\n    css: string,\n    filename = 'internal style',\n    reverse = false\n  ) {\n    const fontFace = this.opts.fontFace !== true; // @font-face rules are not critical unless set to true\n    const keyframes = this.opts.keyframes === false; // @keyframes rules are critical unless set to false\n\n    const options = {\n      html,\n      css: specialChars.replaceCSSSelectors(css),\n      dropUsedFontFace: reverse ? !fontFace : fontFace,\n      dropUsedKeyframes: reverse ? !keyframes : keyframes,\n      shouldDrop: (sel: string) =>\n        reverse\n          ? this.criticalSelectors.has(sel) || this.isSelectorWhitelisted(sel)\n          : !this.isSelectorWhitelisted(sel),\n    } as DropcssOptions;\n\n    if (this.opts.pruneSource) {\n      options.didRetain = (sel: string) => this.criticalSelectors.add(sel);\n    }\n\n    let criticalCss: string;\n\n    try {\n      ({ css: criticalCss } = dropcss(options));\n    } catch (e) {\n      this.opts.logger.error('Unable to parse css or html.', this.processId);\n\n      throw e;\n    }\n\n    criticalCss = specialChars.restoreCSSSelectors(criticalCss);\n\n    if (this.opts.minifyCss === true) {\n      const { code } = transformCss({\n        filename,\n        code: Buffer.from(criticalCss),\n        minify: true,\n        sourceMap: false,\n        targets: browserslistToTargets(this.opts.minifyTargets),\n      });\n\n      return {\n        content: code.toString(),\n        size: code.byteLength,\n      };\n    }\n\n    return { content: criticalCss, size: Buffer.byteLength(criticalCss) };\n  }\n\n  private insertStyle(\n    astHTML: htmlParser.ExtendedHTMLElement,\n    css: string,\n    link?: htmlParser.ExtendedHTMLElement\n  ) {\n    const style = htmlParser.extendHTMLElement(\n      new htmlParser.HTMLElement('style', {}, '', null, [-1, -1])\n    );\n\n    style.textContent = css;\n\n    style.$$external = true;\n\n    if (link) {\n      if (\n        this.opts.autoRemoveStyleTags === true ||\n        (this.opts.eventHandlers === 'script' &&\n          this.opts.asyncLoadExternalStylesheets !== false)\n      ) {\n        const id = getStylesheetId();\n\n        style.setAttribute('data-id', id);\n        link.setAttribute('data-id', id);\n      }\n\n      if (\n        this.opts.autoRemoveStyleTags === true &&\n        this.opts.asyncLoadExternalStylesheets === false &&\n        this.opts.eventHandlers === 'attr'\n      ) {\n        let autoRemove = '';\n\n        autoRemove = `document.querySelector('style[data-id=\"'+this.dataset.id+'\"]').remove(),this.onload=null;`;\n        link.setAttribute('onload', autoRemove);\n      }\n\n      link.before(style);\n\n      return;\n    }\n\n    const headTag = astHTML.querySelector('head');\n\n    if (!headTag) {\n      this.opts.logger.warn(\n        'Unable to insert style tag because head tag is missing.',\n        this.processId\n      );\n\n      return;\n    }\n\n    headTag.appendChild(style);\n  }\n\n  private insertPreloadLink(\n    astHTML: htmlParser.ExtendedHTMLElement,\n    link: htmlParser.ExtendedHTMLElement\n  ) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const href = link.getAttribute('href')!;\n\n    if (astHTML.querySelector(`link[rel=\"preload\"][href=\"${href}\"]`)) {\n      this.opts.logger.debug(\n        'Skip adding the preload link as it is already there.',\n        this.processId\n      );\n\n      return;\n    }\n\n    const linkPreload = link.clone() as htmlParser.ExtendedHTMLElement;\n\n    linkPreload.setAttribute('rel', 'preload');\n    linkPreload.setAttribute('as', 'style');\n\n    link.before(linkPreload);\n  }\n\n  private processInternalStylesheet(\n    html: string,\n    style: htmlParser.ExtendedHTMLElement\n  ) {\n    const css = style.rawText.trim();\n    const size = Buffer.byteLength(css);\n\n    // Skip empty stylesheet\n    if (size === 0) return false;\n\n    const criticalCss = this.getCriticalCss(html, css);\n\n    // Skip, no change\n    if (size === criticalCss.size) return false;\n\n    if (criticalCss.size === 0) {\n      style.remove();\n\n      this.opts.logger.info(\n        `Removed internal stylesheet (${formatter.formatToKB(\n          size\n        )}), no critical css rules was found.`,\n        this.processId\n      );\n\n      return true;\n    }\n\n    style.textContent = criticalCss.content;\n\n    this.opts.logger.info(\n      `Reduced internal style to ${formatter.formatToKB(\n        criticalCss.size\n      )} (${formatter.formatToPercent(\n        criticalCss.size,\n        size\n      )} of original ${formatter.formatToKB(size)}).`,\n      this.processId\n    );\n\n    return true;\n  }\n\n  private async processExternalStylesheet(\n    astHTML: htmlParser.ExtendedHTMLElement,\n    html: string,\n    stylesheet: Beastcss.ExternalStylesheet\n  ) {\n    const source = await this.getStylesheetSource(stylesheet.path);\n\n    // Skip not found or empty stylesheet\n    if (!source || source.size === 0) {\n      return false;\n    }\n\n    // is below externalThreshold\n    if (source.size < Number(this.opts.externalThreshold)) {\n      this.insertStyle(astHTML, source.content.toString(), stylesheet.link);\n\n      if (stylesheet.link) {\n        stylesheet.link.remove();\n\n        delete stylesheet.link;\n      }\n\n      this.opts.logger.info(\n        `Inserted all of ${stylesheet.filename} (${formatter.formatToKB(\n          source.size\n        )} was below the threshold of ${formatter.formatToKB(\n          this.opts.externalThreshold\n        )}).`,\n        this.processId\n      );\n\n      return true;\n    }\n\n    const criticalCss = this.getCriticalCss(\n      html,\n      source.content.toString(),\n      stylesheet.filename\n    );\n\n    // Skip, no change\n    if (source.size === criticalCss.size) return false;\n\n    // noscriptFallback option is checked in the method\n    this.insertNoscriptTag(stylesheet.link);\n\n    this.insertStyle(astHTML, criticalCss.content, stylesheet.link);\n\n    if (stylesheet.link) {\n      if (this.opts.preloadExternalStylesheets === true) {\n        this.insertPreloadLink(astHTML, stylesheet.link);\n      }\n\n      if (this.opts.asyncLoadExternalStylesheets !== false) {\n        this.makeLoadingAsync(stylesheet.link);\n      }\n    }\n\n    this.opts.logger.info(\n      `Inserted ${formatter.formatToKB(\n        criticalCss.size\n      )} (${formatter.formatToPercent(\n        criticalCss.size,\n        source.size\n      )} of original ${formatter.formatToKB(source.size)}) of ${\n        stylesheet.filename\n      }.`,\n      this.processId\n    );\n\n    return true;\n  }\n\n  private makeLoadingAsync(link: htmlParser.ExtendedHTMLElement) {\n    const media = link.getAttribute('media') || 'all';\n\n    // @see http://filamentgroup.github.io/loadCSS/test/mediatoggle.html\n    link.setAttribute('media', 'print');\n    link.setAttribute('data-media', media);\n\n    if (this.opts.eventHandlers === 'attr') {\n      let autoRemove = '';\n\n      if (this.opts.autoRemoveStyleTags === true) {\n        autoRemove = `document.querySelector('style[data-id=\"'+this.dataset.id+'\"]').remove(),`;\n      }\n\n      link.setAttribute(\n        'onload',\n        `this.media=this.dataset.media,delete this.dataset.media,${autoRemove}this.onload=null;`\n      );\n    }\n  }\n\n  private moveEventHandlers(astHTML: htmlParser.ExtendedHTMLElement) {\n    if (\n      this.opts.asyncLoadExternalStylesheets === false &&\n      this.opts.autoRemoveStyleTags !== true\n    ) {\n      return;\n    }\n\n    const script = htmlParser.extendHTMLElement(\n      new htmlParser.HTMLElement('script', {}, '', null, [-1, -1])\n    );\n\n    let asyncLoading = '';\n    let autoRemove = '';\n\n    if (this.opts.asyncLoadExternalStylesheets !== false) {\n      asyncLoading = `e.media=e.dataset.media,delete e.dataset.media`;\n\n      if (this.opts.autoRemoveStyleTags) {\n        asyncLoading += ',';\n      }\n    }\n\n    if (this.opts.autoRemoveStyleTags) {\n      autoRemove = `document.querySelector('style[data-id=\"'+e.dataset.id+'\"]').remove()`;\n    }\n\n    script.textContent = `[].forEach.call(document.querySelectorAll('link[rel=\"stylesheet\"][data-id]'),function(e){e.onload=function(){${asyncLoading}${autoRemove};}});`;\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    astHTML.querySelector('link:last-of-type')!.after(script);\n  }\n\n  private insertNoscriptTag(link?: htmlParser.ExtendedHTMLElement) {\n    if (this.opts.noscriptFallback !== true || !link) {\n      return;\n    }\n\n    const noscript = htmlParser.extendHTMLElement(\n      new htmlParser.HTMLElement('noscript', {}, '', null, [-1, -1])\n    );\n\n    const fallbackLink = link.clone();\n\n    noscript.appendChild(fallbackLink);\n\n    link.after(noscript);\n  }\n\n  private async pruneSource(stylesheetPath: string) {\n    const source = await this.getStylesheetSource(stylesheetPath);\n\n    // skip not found stylesheet\n    if (!source) {\n      return false;\n    }\n\n    const nonCriticalCss = this.getCriticalCss(\n      '',\n      source.content.toString(),\n      stylesheetPath,\n      true\n    );\n\n    if (\n      nonCriticalCss.size === 0 ||\n      nonCriticalCss.size < Number(this.opts.externalThreshold)\n    ) {\n      await this.removeExternalStylesheet(stylesheetPath);\n\n      this.opts.logger.info(\n        `Removed external stylesheet ${stylesheetPath} (${formatter.formatToKB(\n          source.size\n        )}).`,\n        this.processId\n      );\n\n      return true;\n    }\n\n    // skip no change\n    if (source.size === nonCriticalCss.size) {\n      return false;\n    }\n\n    await this.updateExternalStylesheet(stylesheetPath, nonCriticalCss.content);\n\n    this.opts.logger.info(\n      `Pruned ${formatter.formatToKB(\n        source.size - nonCriticalCss.size\n      )} (${formatter.formatToPercent(\n        source.size - nonCriticalCss.size,\n        source.size\n      )} of original ${formatter.formatToKB(\n        source.size\n      )}) of external stylesheet ${path.basename(stylesheetPath)}`,\n      this.processId\n    );\n\n    return true;\n  }\n\n  private mergeStylesheets(astHTML: htmlParser.ExtendedHTMLElement) {\n    let styles = astHTML.querySelectorAll('style');\n\n    // skip merging internal stylesheets\n    if (this.opts.internal === false) {\n      styles = styles.filter((style) => style.$$external);\n    }\n\n    if (styles.length === 0) {\n      return;\n    }\n\n    for (let i = 1; i < styles.length; i += 1) {\n      styles[0].textContent += styles[i].rawText;\n\n      Object.entries(styles[i].attributes).forEach(([key, value]) => {\n        const oldValue = styles[0].getAttribute(key);\n\n        styles[0].setAttribute(key, oldValue ? `${oldValue} ${value}` : value);\n      });\n\n      styles[i].remove();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Beastcss {\n  export type ProcessId = string | number | undefined;\n\n  export interface StylesheetSource {\n    content: Buffer;\n    size: number;\n  }\n\n  export interface ExternalStylesheet {\n    path: string;\n    filename: string;\n    link?: htmlParser.ExtendedHTMLElement;\n  }\n\n  export type FSLike = Pick<typeof fs | typeof fs.promises, keyof FSAdapter>;\n\n  export interface FSAdapter {\n    readFile: (path: fs.PathLike) => Promise<Buffer>;\n    writeFile: (file: fs.PathLike, data: string) => Promise<void>;\n    unlink: (path: fs.PathLike) => Promise<void>;\n    readdir: FileSystemAdapter['readdir'];\n    lstat: FileSystemAdapter['lstat'];\n    stat: FileSystemAdapter['stat'];\n  }\n\n  export interface Options {\n    /**\n     * Absolute path location of the CSS files. Set to the current working directory by default.\n     * @default process.cwd()\n     */\n    path: string;\n    /**\n     * Public path to remove when parsing actual CSS resource paths.\n     * @default ''\n     */\n    publicPath: string;\n    /**\n     * Array of Glob for matching other stylesheets to be used while looking for critical CSS.\n     * @default []\n     */\n    additionalStylesheets: string[];\n    /**\n     * The level of logging verbosity.\n     * @default 'info'\n     */\n    logLevel: logging.LogLevel;\n    /**\n     * Provide a custom `Logger`.\n     * @default logging.defaultLogger\n     */\n    logger: logging.Logger;\n    /**\n     * Completely inline external stylesheets below a given size in bytes.\n     * @default 0\n     */\n    externalThreshold: number;\n    /**\n     * Custom file system to read, write and remove external stylesheets.\n     * @default import fs\n     */\n    fs?: FSLike;\n    /**\n     * Exclude matching external stylesheets from processing.\n     */\n    exclude?: ((href: string) => boolean) | RegExp;\n    /**\n     * Process external stylesheets `<link href=\"path/to/external/stylesheet.css\" rel=\"stylesheet\" />`.\n     * @default true\n     */\n    external?: boolean;\n    /**\n     * Process internal stylesheets `<style></style>`.\n     * @default true\n     */\n    internal?: boolean;\n    /**\n     * Minify css with lightningcss.\n     * https://github.com/parcel-bundler/lightningcss\n     * @default false\n     */\n    minifyCss?: boolean;\n    /**\n     * The browser targets passed to lightningcss when minifying css.\n     * @default ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead']\n     */\n    minifyTargets: string[];\n    /**\n     * Remove critical CSS from external stylesheets.\n     * @default false\n     */\n    pruneSource?: boolean;\n    /**\n     * Merge `<style>` tags into a single one.\n     * @default true\n     */\n    merge?: boolean;\n    /**\n     * Remove style tags containing critical css once the corresponding external stylesheet is loaded.\n     * @default false\n     */\n    autoRemoveStyleTags?: boolean;\n    /**\n     * Weither event handlers should be inline inside link tag attribute or a separate script.\n     * Setting it to 'script' is useful for Content Security Policy.\n     * @default \"attr\"\n     */\n    eventHandlers?: 'attr' | 'script';\n    /**\n     * Load external stylesheets asynchronously.\n     * @default true\n     */\n    asyncLoadExternalStylesheets?: boolean;\n    /**\n     * Preload external stylesheets.\n     * @default false\n     */\n    preloadExternalStylesheets?: boolean;\n    /**\n     * Add a `<noscript>` tag as a fallback to loading external stylesheets asynchronously.\n     * @default false\n     */\n    noscriptFallback?: boolean;\n    /**\n     * An array of css selectors to be considered as critical CSS.\n     */\n    whitelist?: (string | RegExp)[];\n    /**\n     * Inline critical `@font-face` rules.\n     * @default false\n     */\n    fontFace?: boolean;\n    /**\n     * Inline critical `@keyframes` rules.\n     * @default true\n     */\n    keyframes?: boolean;\n  }\n}\n\nexport default Beastcss;\n"],"names":["bold","blue","yellow","red","HTMLElement","parse","AsyncLocalStorage","logging.defaultLogger","specialChars.replaceCSSSelectors","fs","htmlParser.parseHTML","specialChars.replaceHTMLClasses","formatter.formatToMs","logging.setVerbosity","promisify","callbackify","path","specialChars.restoreCSSSelectors","transformCss","browserslistToTargets","htmlParser.extendHTMLElement","htmlParser.HTMLElement","formatter.formatToKB","formatter.formatToPercent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AAEZ,SAAwB,eAAkB,GAAA;AACxC,EAAM,MAAA,EAAA,GAAK,MAAM,QAAS,EAAA,CAAA;AAE1B,EAAS,KAAA,IAAA,CAAA,CAAA;AAET,EAAO,OAAA,EAAA,CAAA;AACT;;ACLO,SAAS,mBAAmB,IAAc,EAAA;AAC/C,EAAA,OAAO,IAAK,CAAA,OAAA;AAAA,IACV,wBAAA;AAAA,IACA,CAAC,CACC,KAAA,CAAA,CACG,OAAQ,CAAA,KAAA,EAAO,OAAO,CACtB,CAAA,OAAA,CAAQ,MAAQ,EAAA,OAAO,CACvB,CAAA,OAAA,CAAQ,QAAQ,OAAO,CAAA,CACvB,OAAQ,CAAA,MAAA,EAAQ,OAAO,CAAA,CACvB,QAAQ,MAAQ,EAAA,OAAO,CACvB,CAAA,OAAA,CAAQ,KAAO,EAAA,OAAO,EACtB,OAAQ,CAAA,UAAA,EAAY,OAAO,CAAA,CAC3B,OAAQ,CAAA,UAAA,EAAY,OAAO,CAC3B,CAAA,OAAA,CAAQ,KAAO,EAAA,OAAO,CACtB,CAAA,OAAA,CAAQ,OAAO,OAAO,CAAA,CACtB,OAAQ,CAAA,MAAA,EAAQ,QAAQ,CAAA,CACxB,OAAQ,CAAA,MAAA,EAAQ,QAAQ,CAAA,CACxB,OAAQ,CAAA,MAAA,EAAQ,QAAQ,CAAA;AAAA;AAAA,GAC/B,CAAA;AACF,CAAA;AAKO,SAAS,oBAAoB,GAAa,EAAA;AAC/C,EAAO,OAAA,GAAA,CACJ,QAAQ,OAAS,EAAA,OAAO,EACxB,OAAQ,CAAA,QAAA,EAAU,OAAO,CAAA,CACzB,OAAQ,CAAA,QAAA,EAAU,OAAO,CACzB,CAAA,OAAA,CAAQ,QAAU,EAAA,OAAO,CACzB,CAAA,OAAA,CAAQ,UAAU,OAAO,CAAA,CACzB,OAAQ,CAAA,OAAA,EAAS,OAAO,CAAA,CACxB,QAAQ,OAAS,EAAA,OAAO,CACxB,CAAA,OAAA,CAAQ,OAAS,EAAA,OAAO,EACxB,OAAQ,CAAA,OAAA,EAAS,OAAO,CAAA,CACxB,OAAQ,CAAA,OAAA,EAAS,OAAO,CACxB,CAAA,OAAA,CAAQ,QAAU,EAAA,QAAQ,CAC1B,CAAA,OAAA,CAAQ,UAAU,QAAQ,CAAA,CAC1B,OAAQ,CAAA,QAAA,EAAU,QAAQ,CAAA,CAAA;AAC/B,CAAA;AAKO,SAAS,oBAAoB,GAAa,EAAA;AAC/C,EAAO,OAAA,GAAA,CACJ,QAAQ,SAAW,EAAA,KAAK,EACxB,OAAQ,CAAA,SAAA,EAAW,KAAK,CAAA,CACxB,OAAQ,CAAA,SAAA,EAAW,KAAK,CACxB,CAAA,OAAA,CAAQ,SAAW,EAAA,KAAK,CACxB,CAAA,OAAA,CAAQ,WAAW,KAAK,CAAA,CACxB,OAAQ,CAAA,SAAA,EAAW,KAAK,CAAA,CACxB,QAAQ,SAAW,EAAA,KAAK,CACxB,CAAA,OAAA,CAAQ,SAAW,EAAA,KAAK,EACxB,OAAQ,CAAA,SAAA,EAAW,KAAK,CAAA,CACxB,OAAQ,CAAA,SAAA,EAAW,KAAK,CACxB,CAAA,OAAA,CAAQ,UAAY,EAAA,KAAK,CACzB,CAAA,OAAA,CAAQ,YAAY,KAAK,CAAA,CACzB,OAAQ,CAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAC9B;;ACtCA,MAAM,SAAwB,CAAC,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAQ,SAAS,QAAQ,CAAA,CAAA;AAElE,MAAM,aAAwB,GAAA;AAAA,EACnC,KAAA,CAAM,KAAa,SAA+B,EAAA;AAChD,IAAA,OAAA,CAAQ,MAAM,CAAG,EAAA,SAAA,GAAY,CAAI,CAAA,EAAA,SAAA,CAAA,EAAA,CAAA,GAAgB,KAAK,GAAK,CAAA,CAAA,CAAA,CAAA;AAAA,GAC7D;AAAA,EACA,IAAA,CAAK,KAAa,SAA+B,EAAA;AAC/C,IAAQ,OAAA,CAAA,IAAA,CAAKA,aAAK,CAAAC,aAAA,CAAK,CAAG,EAAA,SAAA,GAAY,IAAI,SAAgB,CAAA,EAAA,CAAA,GAAA,EAAA,CAAA,EAAK,GAAK,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GACxE;AAAA,EACA,IAAA,CAAK,KAAa,SAA+B,EAAA;AAC/C,IAAQ,OAAA,CAAA,IAAA,CAAKC,gBAAO,CAAG,EAAA,SAAA,GAAY,IAAI,SAAgB,CAAA,EAAA,CAAA,GAAA,EAAA,CAAA,EAAK,KAAK,CAAC,CAAA,CAAA;AAAA,GACpE;AAAA,EACA,KAAA,CAAM,KAAa,SAA+B,EAAA;AAChD,IAAQ,OAAA,CAAA,KAAA,CAAMF,aAAK,CAAAG,YAAA,CAAI,CAAG,EAAA,SAAA,GAAY,IAAI,SAAgB,CAAA,EAAA,CAAA,GAAA,EAAA,CAAA,EAAK,GAAK,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GACxE;AACF,CAAA,CAAA;AAKgB,SAAA,YAAA,CAAa,QAAgB,QAA4B,EAAA;AACvE,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAE3C,EAAO,MAAA,CAAA,OAAA,CAAQ,CAAC,IAAA,EAAgB,KAAU,KAAA;AACxC,IAAI,IAAA,KAAA,GAAQ,WAAe,IAAA,IAAA,KAAS,QAAU,EAAA;AAC5C,MAAO,MAAA,CAAA,IAAI,IAAI,MAAM,KAAA,CAAA,CAAA;AAAA,KACvB;AAAA,GACD,CAAA,CAAA;AAED,EAAO,OAAA,MAAA,CAAA;AACT;;ACtDA,MAAM,aAAgB,GAAA,IAAI,IAAK,CAAA,YAAA,CAAa,IAAM,EAAA;AAAA,EAChD,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA,UAAA;AAAA,EACN,qBAAuB,EAAA,CAAA;AACzB,CAAC,CAAA,CAAA;AAED,MAAM,cAAiB,GAAA,IAAI,IAAK,CAAA,YAAA,CAAa,IAAM,EAAA;AAAA,EACjD,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA,aAAA;AAAA,EACN,qBAAuB,EAAA,CAAA;AACzB,CAAC,CAAA,CAAA;AAED,MAAM,mBAAsB,GAAA,IAAI,IAAK,CAAA,YAAA,CAAa,IAAM,EAAA;AAAA,EACtD,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA,SAAA;AAAA,EACN,qBAAuB,EAAA,CAAA;AACzB,CAAC,CAAA,CAAA;AAKM,MAAM,aAAa,CAAC,MAAA,KACzB,aAAc,CAAA,MAAA,CAAO,SAAS,GAAI,CAAA,CAAA;AAKvB,MAAA,UAAA,GAAa,CAAC,MACzB,KAAA,cAAA,CAAe,OAAO,MAAO,CAAA,MAAM,IAAI,GAAO,CAAA,CAAA;AAKnC,MAAA,eAAA,GAAkB,CAAC,OAAiB,EAAA,KAAA,KAC/C,oBAAoB,MAAQ,CAAA,OAAA,GAAU,QAAS,GAAG,CAAA;;ACnBvC,MAAA,iBAAA,GAAoB,CAAC,EAAoB,KAAA;AACpD,EAAM,MAAA,OAAA,GAAmB,MAAO,CAAA,cAAA,CAAe,EAAE,CAAA,CAAA;AAEjD,EAAA,MAAA,CAAO,iBAAiB,OAAS,EAAA;AAAA,IAC/B,MAAQ,EAAA;AAAA,MACN,MAAyB,IAAY,EAAA;AACnC,QAAM,MAAA,GAAA,GAAM,IAAK,CAAA,UAAA,CAAW,UAAW,CAAA,SAAA;AAAA,UACrC,CAAC,UAAgB,KAAU,KAAA,IAAA;AAAA,SAC7B,CAAA;AAEA,QAAA,IAAA,CAAK,UAAW,CAAA,UAAA,CAAW,MAAO,CAAA,GAAA,EAAK,GAAG,IAAI,CAAA,CAAA;AAE9C,QAAA,IAAI,gBAAgBC,0BAAa,EAAA;AAC/B,UAAA,IAAA,CAAK,aAAa,IAAK,CAAA,UAAA,CAAA;AAAA,SACzB;AAEA,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,MACA,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,IAAA;AAAA,KAChB;AAAA,IAEA,KAAO,EAAA;AAAA,MACL,MAAyB,IAAY,EAAA;AACnC,QAAM,MAAA,GAAA,GAAM,IAAK,CAAA,UAAA,CAAW,UAAW,CAAA,SAAA;AAAA,UACrC,CAAC,UAAgB,KAAU,KAAA,IAAA;AAAA,SAC7B,CAAA;AAEA,QAAA,IAAA,CAAK,WAAW,UAAW,CAAA,MAAA,CAAO,GAAM,GAAA,CAAA,EAAG,GAAG,IAAI,CAAA,CAAA;AAElD,QAAA,IAAI,gBAAgBA,0BAAa,EAAA;AAC/B,UAAA,IAAA,CAAK,aAAa,IAAK,CAAA,UAAA,CAAA;AAAA,SACzB;AAEA,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,MACA,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,IAAA;AAAA,KAChB;AAAA,GACD,CAAA,CAAA;AAED,EAAO,OAAA,EAAA,CAAA;AACT,CAAA,CAAA;AAKO,SAAS,UAAU,IAAmC,EAAA;AAC3D,EAAA,MAAM,cAAcC,oBAAM,CAAA,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA,CAAA;AAEjD,EAAA,OAAO,kBAAkB,WAAW,CAAA,CAAA;AACtC;;;;;;;;;;;;;;;;;;ACjDA,MAAM,QAAS,CAAA;AAAA,EAkBb,YAAY,OAAqC,EAAA;AAbjD,IAAU,IAAA,CAAA,uBAAA,uBAA8B,GAGtC,EAAA,CAAA;AAMF,IAAQ,IAAA,CAAA,iBAAA,uBAAwB,GAAY,EAAA,CAAA;AAE5C,IAAQ,IAAA,CAAA,gBAAA,GAAmB,IAAIC,6BAAsC,EAAA,CAAA;AAGnE,IAAA,IAAA,CAAK,IAAO,GAAA,cAAA,CAAA;AAAA,MACV,IAAA,EAAM,QAAQ,GAAI,EAAA;AAAA,MAClB,UAAY,EAAA,EAAA;AAAA,MACZ,uBAAuB,EAAC;AAAA,MACxB,iBAAmB,EAAA,CAAA;AAAA,MACnB,eAAe,EAAC;AAAA,MAChB,aAAe,EAAA,MAAA;AAAA,MACf,QAAQC,aAAQ;AAAA,MAChB,QAAU,EAAA,MAAA;AAAA,KAAA,EACN,WAAW,EAAC,CAAA,CAAA;AAGlB,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IAAM,EAAA;AAC1C,MAAA,IAAA,CAAK,KAAK,KAAQ,GAAA,KAAA,CAAA;AAAA,KACpB;AAEA,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACtC,MAAA,IAAA,CAAK,KAAK,SAAY,GAAA,IAAA,CAAK,KAAK,SAAU,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACrD,QAAA,IAAI,eAAe,MAAQ,EAAA;AACzB,UAAA,OAAO,IAAI,MAAA;AAAA,YACTC,mBAAiC,CAAA,GAAA,CAAI,MAAM,CAAA;AAAA,YAC3C,GAAI,CAAA,KAAA;AAAA,WACN,CAAA;AAAA,SACF;AAEA,QAAO,OAAAA,oBAAiC,GAAG,CAAA,CAAA;AAAA,OAC5C,CAAA,CAAA;AAAA,KACH;AAEA,IAAA,IAAA,CAAK,YAAa,EAAA,CAAA;AAElB,IAAA,IAAA,CAAK,KAAK,QAAS,CAAA,eAAA,CAAgB,IAAK,CAAA,IAAA,CAAK,MAAMC,aAAE,CAAA,CAAA;AAGrD,IAAA,OAAO,KAAK,IAAK,CAAA,EAAA,CAAA;AAAA,GACnB;AAAA,EA5CA,IAAc,SAAY,GAAA;AACxB,IAAO,OAAA,IAAA,CAAK,iBAAiB,QAAS,EAAA,CAAA;AAAA,GACxC;AAAA;AAAA;AAAA;AAAA,EA+CA,MAAa,OAAQ,CAAA,IAAA,EAAc,SAAgC,EAAA;AACjE,IAAA,OAAO,IAAK,CAAA,gBAAA,CAAiB,GAAI,CAAA,SAAA,EAAW,YAAY;AACtD,MAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,MAAA,CAAO,MAAO,EAAA,CAAA;AAEpC,MAAM,MAAA,OAAA,GAAUC,SAAW,CAAU,IAAI,CAAA,CAAA;AAEzC,MAAM,MAAA,WAAA,GAAcC,kBAAa,CAAmB,IAAI,CAAA,CAAA;AAExD,MAAA,MAAM,2BAAsC,EAAC,CAAA;AAE7C,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,KAAa,KAAO,EAAA;AAChC,QAAyB,wBAAA,CAAA,IAAA;AAAA,UACvB,GAAG,OAAA,CACA,gBAAiB,CAAA,OAAO,CACxB,CAAA,GAAA,CAAI,CAAC,KAAA,KAAU,IAAK,CAAA,yBAAA,CAA0B,WAAa,EAAA,KAAK,CAAC,CAAA;AAAA,SACtE,CAAA;AAAA,OACF;AAEA,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,KAAa,KAAO,EAAA;AAChC,QAAA,MAAM,mBAAsB,GAAA,MAAM,IAAK,CAAA,sBAAA,CAAuB,OAAO,CAAA,CAAA;AAErE,QAAyB,wBAAA,CAAA,IAAA;AAAA,UACvB,GAAI,MAAM,OAAQ,CAAA,GAAA;AAAA,YAChB,mBAAoB,CAAA,GAAA;AAAA,cAAI,OAAO,UAC7B,KAAA,IAAA,CAAK,yBAA0B,CAAA,OAAA,EAAS,aAAa,UAAU,CAAA;AAAA,aACjE;AAAA,WACF;AAAA,SACF,CAAA;AAAA,OACF;AAEA,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,aAAA,KAAkB,QAAU,EAAA;AACxC,QAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA,CAAA;AAAA,OAChC;AAEA,MAAA,IAAI,CAAC,wBAAA,CAAyB,QAAS,CAAA,IAAI,CAAG,EAAA;AAC5C,QAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,UACf,wCAAA;AAAA,UACA,SAAA;AAAA,SACF,CAAA;AAEA,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,KAAA,KAAU,KAAO,EAAA;AAC7B,QAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA,CAAA;AAAA,OAC/B;AAEA,MAAM,MAAA,MAAA,GAAS,QAAQ,QAAS,EAAA,CAAA;AAEhC,MAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,MAAA,CAAO,MAAO,EAAA,CAAA;AAElC,MAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,QACf,CAAgB,aAAA,EAAAC,UAAqB,CAAA,GAAA,GAAM,KAAK,CAAA,CAAA,CAAA,CAAA;AAAA,QAChD,SAAA;AAAA,OACF,CAAA;AAEA,MAAO,OAAA,MAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,aAAa,SAAgC,EAAA;AACxD,IAAA,OAAO,IAAK,CAAA,gBAAA,CAAiB,GAAI,CAAA,SAAA,EAAW,YAAY;AACtD,MAAM,MAAA,oBAAA,GAAuB,MAAM,OAAQ,CAAA,GAAA;AAAA,QACzC,CAAC,GAAG,IAAA,CAAK,uBAAwB,CAAA,IAAA,EAAM,CAAE,CAAA,GAAA;AAAA,UAAI,OAAO,cAAA,KAClD,IAAK,CAAA,WAAA,CAAY,cAAc,CAAA;AAAA,SACjC;AAAA,OACF,CAAA;AAEA,MAAA,IAAI,CAAC,oBAAA,CAAqB,QAAS,CAAA,IAAI,CAAG,EAAA;AACxC,QAAA,IAAA,CAAK,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,4BAAA,EAA8B,KAAK,SAAS,CAAA,CAAA;AAAA,OACpE;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA,EAKO,KAAQ,GAAA;AACb,IAAA,IAAA,CAAK,kBAAkB,KAAM,EAAA,CAAA;AAE7B,IAAA,IAAA,CAAK,wBAAwB,KAAM,EAAA,CAAA;AAAA,GACrC;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,QAA6B,EAAA;AAC/C,IAAK,IAAA,CAAA,IAAA,CAAK,SAASC,YAAQ;AAAA,MACzB,KAAK,IAAK,CAAA,MAAA;AAAA,MACV,QAAA,IAAY,KAAK,IAAK,CAAA,QAAA;AAAA,KACxB,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,gBAAkC,GAAA;AACvC,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,aAAA,KAAkB,QAAU,EAAA;AACxC,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAAO,EAAA;AACpD,QAAI,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IAAM,EAAA;AAC1C,UAAO,OAAA,8CAAA,CAAA;AAAA,SACT;AAEA,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IAAM,EAAA;AAC1C,QAAO,OAAA,8CAAA,CAAA;AAAA,OACT;AAEA,MAAO,OAAA,8CAAA,CAAA;AAAA,KACT;AAEA,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IAAM,EAAA;AAC1C,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAAO,EAAA;AACpD,QAAO,OAAA,8CAAA,CAAA;AAAA,OACT;AAEA,MAAO,OAAA,8CAAA,CAAA;AAAA,KACT;AAEA,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAAO,EAAA;AACpD,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,8CAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAiB,gBAAgB,UAA6B,EAAA;AAC5D,IAAO,OAAA;AAAA,MACL,QAAU,EAAA,UAAA,CAAW,QAAS,CAAA,QAAA,GAAW,KAAM,CAAA,WAAW,CACtD,GAAAC,cAAA,CAAU,WAAW,QAAS,CAAA,IAAA,CAAK,UAAU,CAAuB,IACpE,UAAW,CAAA,QAAA;AAAA,MACf,WAAW,UAAW,CAAA,SAAA,CAAU,UAAW,CAAA,KAAA,CAAM,WAAW,CACxD,GAAAA,cAAA;AAAA,QACE,UAAA,CAAW,SAAU,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,UAEtC,UAAW,CAAA,SAAA;AAAA,MACf,MAAQ,EAAA,UAAA,CAAW,MAAO,CAAA,QAAA,GAAW,KAAM,CAAA,WAAW,CAClD,GAAAA,cAAA,CAAU,WAAW,MAAO,CAAA,IAAA,CAAK,UAAU,CAAqB,IAChE,UAAW,CAAA,MAAA;AAAA,MACf,OAAS,EAAA,UAAA,CAAW,OAAQ,CAAA,QAAA,EAAW,CAAA,KAAA,CAAM,WAAW,CAAA,GACnD,UAAW,CAAA,OAAA,CAAQ,IAAK,CAAA,UAAU,CAClC,GAAAC,gBAAA;AAAA,QACC,UAAA,CAAW,OAAQ,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,OACpC;AAAA,MACJ,KAAO,EAAA,UAAA,CAAW,KAAM,CAAA,QAAA,EAAW,CAAA,KAAA,CAAM,WAAW,CAAA,GAChD,UAAW,CAAA,KAAA,CAAM,IAAK,CAAA,UAAU,CAChC,GAAAA,gBAAA;AAAA,QACE,UAAA,CAAW,KAAM,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,OAClC;AAAA,MACJ,IAAM,EAAA,UAAA,CAAW,IAAK,CAAA,QAAA,EAAW,CAAA,KAAA,CAAM,WAAW,CAAA,GAC9C,UAAW,CAAA,IAAA,CAAK,IAAK,CAAA,UAAU,CAC/B,GAAAA,gBAAA;AAAA,QACE,UAAA,CAAW,IAAK,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,OACjC;AAAA,KACN,CAAA;AAAA,GACF;AAAA,EAEA,MAAgB,oBAAoB,cAAwB,EAAA;AAC1D,IAAA,IAAI,IAAK,CAAA,uBAAA,CAAwB,GAAI,CAAA,cAAc,CAAG,EAAA;AACpD,MAAO,OAAA,IAAA,CAAK,uBAAwB,CAAA,GAAA,CAAI,cAAc,CAAA,CAAA;AAAA,KACxD;AAEA,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAI,IAAA;AACF,QAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,EAAA,CAAG,SAAS,cAAc,CAAA,CAAA;AAErD,QAAO,OAAA;AAAA,UACL,OAAA;AAAA,UACA,IAAA,EAAM,MAAO,CAAA,UAAA,CAAW,OAAO,CAAA;AAAA,SACjC,CAAA;AAAA,eACO,CAAP,EAAA;AACA,QAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,UACf,CAAwB,qBAAA,EAAA,cAAA,CAAA,YAAA,CAAA;AAAA,UACxB,IAAK,CAAA,SAAA;AAAA,SACP,CAAA;AAEA,QAAO,OAAA,KAAA,CAAA,CAAA;AAAA,OACT;AAAA,KACC,GAAA,CAAA;AAEH,IAAK,IAAA,CAAA,uBAAA,CAAwB,GAAI,CAAA,cAAA,EAAgB,OAAO,CAAA,CAAA;AAExD,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AAAA,EAEU,kBAAkB,GAAa,EAAA;AACvC,IAAA,MAAM,aAAa,CAAG,EAAA,IAAA,CAAK,KAAK,UAAW,CAAA,OAAA,CAAQ,cAAc,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA;AAEnE,IAAI,IAAA,cAAA,GAAiB,IAAI,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAE,CAAA,OAAA,CAAQ,UAAU,EAAE,CAAA,CAAA;AAEhE,IAAA,IAAI,cAAe,CAAA,OAAA,CAAQ,UAAU,CAAA,KAAM,CAAG,EAAA;AAC5C,MAAA,cAAA,GAAiB,eACd,SAAU,CAAA,UAAA,CAAW,MAAM,CAC3B,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAA;AAAA,KACtB;AAEA,IAAA,OAAOC,eAAK,CAAA,OAAA,CAAQ,IAAK,CAAA,IAAA,CAAK,MAAM,cAAc,CAAA,CAAA;AAAA,GACpD;AAAA,EAEA,MAAgB,wBAA2B,GAAA;AACzC,IAAA,MAAM,EAAE,OAAS,EAAA,QAAA,EAAa,GAAA,MAAM,OAAO,WAAW,CAAA,CAAA;AAEtD,IAAA,MAAM,wBAAuD,EAAC,CAAA;AAE9D,IAAA,MAAM,OAAU,GAAA,MAAM,QAAS,CAAA,IAAA,CAAK,KAAK,qBAAuB,EAAA;AAAA,MAC9D,GAAA,EAAK,KAAK,IAAK,CAAA,IAAA;AAAA,MACf,aAAe,EAAA,IAAA;AAAA,MACf,MAAQ,EAAA,IAAA;AAAA,MACR,cAAgB,EAAA,IAAA;AAAA,MAChB,SAAW,EAAA,IAAA;AAAA,MACX,IAAI,IAAK,CAAA,EAAA;AAAA,KACV,CAAA,CAAA;AAED,IAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACzB,MAAI,IAAA,IAAA,CAAK,UAAW,CAAA,KAAK,CAAG,EAAA;AAC1B,QAAA,IAAA,CAAK,KAAK,MAAO,CAAA,KAAA;AAAA,UACf,CAAmC,gCAAA,EAAA,KAAA,CAAA,EAAA,CAAA;AAAA,UACnC,IAAK,CAAA,SAAA;AAAA,SACP,CAAA;AAEA,QAAA,OAAA;AAAA,OACF;AAEA,MAAA,qBAAA,CAAsB,IAAK,CAAA;AAAA,QACzB,IAAA,EAAM,IAAK,CAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,QAClC,QAAA,EAAUA,eAAK,CAAA,QAAA,CAAS,KAAK,CAAA;AAAA,OAC9B,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAED,IAAO,OAAA,qBAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAgB,wBACd,CAAA,cAAA,EACA,GACA,EAAA;AACA,IAAA,OAAO,IAAK,CAAA,EAAA,CAAG,SAAU,CAAA,cAAA,EAAgB,GAAG,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,MAAgB,yBAAyB,cAAwB,EAAA;AAC/D,IAAI,IAAA;AACF,MAAM,MAAA,IAAA,CAAK,EAAG,CAAA,MAAA,CAAO,cAAc,CAAA,CAAA;AAAA,aAC5B,CAAP,EAAA;AAAA,KAEF;AAAA,GACF;AAAA,EAEU,WAAW,cAAwB,EAAA;AAE3C,IAAA,IACE,eAAe,IAAK,CAAA,cAAc,KAClC,cAAe,CAAA,UAAA,CAAW,IAAI,CAC9B,EAAA;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IACE,IAAA,IAAA,CAAK,KAAK,OAAmB,YAAA,MAAA,IAC7B,KAAK,IAAK,CAAA,OAAA,CAAQ,IAAK,CAAA,cAAc,CACrC,EAAA;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IACE,IAAA,IAAA,CAAK,KAAK,OAAmB,YAAA,QAAA,IAC7B,KAAK,IAAK,CAAA,OAAA,CAAQ,cAAc,CAChC,EAAA;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,OAAO,CAAC,QAAS,CAAA,IAAA,CAAK,eAAe,OAAQ,CAAA,QAAA,EAAU,EAAE,CAAC,CAAA,CAAA;AAAA,GAC5D;AAAA,EAEA,MAAc,uBACZ,OACA,EAAA;AACA,IAAA,MAAM,sBAAqD,EAAC,CAAA;AAC5D,IAAA,MAAM,kBAA4B,EAAC,CAAA;AAEnC,IAAA,OAAA,CAAQ,gBAAiB,CAAA,wBAAwB,CAAE,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACnE,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AACrC,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAEvC,MAAA,IAAI,CAAC,IAAM,EAAA;AACT,QAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,UACf,CAAA,8CAAA,CAAA;AAAA,UACA,IAAK,CAAA,SAAA;AAAA,SACP,CAAA;AAEA,QAAA,OAAA;AAAA,OACF;AAEA,MAAI,IAAA,KAAA,IAAS,UAAU,OAAS,EAAA;AAC9B,QAAA,IAAA,CAAK,KAAK,MAAO,CAAA,KAAA;AAAA,UACf,CAAgC,6BAAA,EAAA,IAAA,CAAA,6BAAA,CAAA;AAAA,UAChC,IAAK,CAAA,SAAA;AAAA,SACP,CAAA;AAEA,QAAA,OAAA;AAAA,OACF;AAEA,MAAI,IAAA,IAAA,CAAK,UAAW,CAAA,IAAI,CAAG,EAAA;AACzB,QAAA,IAAA,CAAK,KAAK,MAAO,CAAA,KAAA;AAAA,UACf,CAAiC,8BAAA,EAAA,IAAA,CAAA,EAAA,CAAA;AAAA,UACjC,IAAK,CAAA,SAAA;AAAA,SACP,CAAA;AAEA,QAAA,OAAA;AAAA,OACF;AAEA,MAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AAElD,MAAA,IAAI,CAAC,eAAA,CAAgB,QAAS,CAAA,cAAc,CAAG,EAAA;AAC7C,QAAA,mBAAA,CAAoB,IAAK,CAAA;AAAA,UACvB,IAAM,EAAA,cAAA;AAAA,UACN,QAAA,EAAUA,eAAK,CAAA,QAAA,CAAS,IAAI,CAAA;AAAA,UAC5B,IAAA;AAAA,SACD,CAAA,CAAA;AAED,QAAA,eAAA,CAAgB,KAAK,cAAc,CAAA,CAAA;AAAA,OACrC;AAAA,KACD,CAAA,CAAA;AAED,IAAA,IAAI,IAAK,CAAA,IAAA,CAAK,qBAAsB,CAAA,MAAA,GAAS,CAAG,EAAA;AAC9C,MAAM,MAAA,qBAAA,GACJ,MAAM,IAAA,CAAK,wBAAyB,EAAA,CAAA;AAEtC,MAAsB,qBAAA,CAAA,OAAA,CAAQ,CAAC,UAAe,KAAA;AAC5C,QAAA,IAAI,CAAC,eAAA,CAAgB,QAAS,CAAA,UAAA,CAAW,IAAI,CAAG,EAAA;AAC9C,UAAA,mBAAA,CAAoB,KAAK,UAAU,CAAA,CAAA;AAEnC,UAAgB,eAAA,CAAA,IAAA,CAAK,WAAW,IAAI,CAAA,CAAA;AAAA,SACtC;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAEA,IAAO,OAAA,mBAAA,CAAA;AAAA,GACT;AAAA,EAEQ,sBAAsB,QAAkB,EAAA;AAC9C,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACtC,MAAO,OAAA,IAAA,CAAK,KAAK,SAAU,CAAA,IAAA;AAAA,QAAK,CAAC,wBAC/B,OAAO,mBAAA,KAAwB,WAC3B,mBAAwB,KAAA,QAAA,GACxB,mBAAoB,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,OACvC,CAAA;AAAA,KACF;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEQ,eACN,IACA,EAAA,GAAA,EACA,QAAW,GAAA,gBAAA,EACX,UAAU,KACV,EAAA;AACA,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,IAAA,CAAK,QAAa,KAAA,IAAA,CAAA;AACxC,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,IAAA,CAAK,SAAc,KAAA,KAAA,CAAA;AAE1C,IAAA,MAAM,OAAU,GAAA;AAAA,MACd,IAAA;AAAA,MACA,GAAA,EAAKR,mBAAa,CAAoB,GAAG,CAAA;AAAA,MACzC,gBAAA,EAAkB,OAAU,GAAA,CAAC,QAAW,GAAA,QAAA;AAAA,MACxC,iBAAA,EAAmB,OAAU,GAAA,CAAC,SAAY,GAAA,SAAA;AAAA,MAC1C,YAAY,CAAC,GAAA,KACX,OACI,GAAA,IAAA,CAAK,kBAAkB,GAAI,CAAA,GAAG,CAAK,IAAA,IAAA,CAAK,sBAAsB,GAAG,CAAA,GACjE,CAAC,IAAA,CAAK,sBAAsB,GAAG,CAAA;AAAA,KACvC,CAAA;AAEA,IAAI,IAAA,IAAA,CAAK,KAAK,WAAa,EAAA;AACzB,MAAA,OAAA,CAAQ,YAAY,CAAC,GAAA,KAAgB,IAAK,CAAA,iBAAA,CAAkB,IAAI,GAAG,CAAA,CAAA;AAAA,KACrE;AAEA,IAAI,IAAA,WAAA,CAAA;AAEJ,IAAI,IAAA;AACF,MAAA,CAAC,EAAE,GAAA,EAAK,WAAY,EAAA,GAAI,QAAQ,OAAO,CAAA,EAAA;AAAA,aAChC,CAAP,EAAA;AACA,MAAA,IAAA,CAAK,IAAK,CAAA,MAAA,CAAO,KAAM,CAAA,8BAAA,EAAgC,KAAK,SAAS,CAAA,CAAA;AAErE,MAAM,MAAA,CAAA,CAAA;AAAA,KACR;AAEA,IAAc,WAAA,GAAAS,oBAAiC,WAAW,CAAA,CAAA;AAE1D,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,SAAA,KAAc,IAAM,EAAA;AAChC,MAAM,MAAA,EAAE,IAAK,EAAA,GAAIC,sBAAa,CAAA;AAAA,QAC5B,QAAA;AAAA,QACA,IAAA,EAAM,MAAO,CAAA,IAAA,CAAK,WAAW,CAAA;AAAA,QAC7B,MAAQ,EAAA,IAAA;AAAA,QACR,SAAW,EAAA,KAAA;AAAA,QACX,OAAS,EAAAC,kCAAA,CAAsB,IAAK,CAAA,IAAA,CAAK,aAAa,CAAA;AAAA,OACvD,CAAA,CAAA;AAED,MAAO,OAAA;AAAA,QACL,OAAA,EAAS,KAAK,QAAS,EAAA;AAAA,QACvB,MAAM,IAAK,CAAA,UAAA;AAAA,OACb,CAAA;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,OAAS,EAAA,WAAA,EAAa,MAAM,MAAO,CAAA,UAAA,CAAW,WAAW,CAAE,EAAA,CAAA;AAAA,GACtE;AAAA,EAEQ,WAAA,CACN,OACA,EAAA,GAAA,EACA,IACA,EAAA;AACA,IAAA,MAAM,QAAQC,iBAAW;AAAA,MACvB,IAAIC,0BAAW,CAAY,OAAS,EAAA,EAAI,EAAA,EAAA,EAAI,IAAM,EAAA,CAAC,CAAI,CAAA,EAAA,CAAA,CAAE,CAAC,CAAA;AAAA,KAC5D,CAAA;AAEA,IAAA,KAAA,CAAM,WAAc,GAAA,GAAA,CAAA;AAEpB,IAAA,KAAA,CAAM,UAAa,GAAA,IAAA,CAAA;AAEnB,IAAA,IAAI,IAAM,EAAA;AACR,MACE,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IACjC,IAAA,IAAA,CAAK,IAAK,CAAA,aAAA,KAAkB,QAC3B,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAC7C,EAAA;AACA,QAAA,MAAM,KAAK,eAAgB,EAAA,CAAA;AAE3B,QAAM,KAAA,CAAA,YAAA,CAAa,WAAW,EAAE,CAAA,CAAA;AAChC,QAAK,IAAA,CAAA,YAAA,CAAa,WAAW,EAAE,CAAA,CAAA;AAAA,OACjC;AAEA,MACE,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IAClC,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAC3C,IAAA,IAAA,CAAK,IAAK,CAAA,aAAA,KAAkB,MAC5B,EAAA;AACA,QAAA,IAAI,UAAa,GAAA,EAAA,CAAA;AAEjB,QAAa,UAAA,GAAA,CAAA,yFAAA,CAAA,CAAA;AACb,QAAK,IAAA,CAAA,YAAA,CAAa,UAAU,UAAU,CAAA,CAAA;AAAA,OACxC;AAEA,MAAA,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAEjB,MAAA,OAAA;AAAA,KACF;AAEA,IAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAE5C,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,QACf,yDAAA;AAAA,QACA,IAAK,CAAA,SAAA;AAAA,OACP,CAAA;AAEA,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,YAAY,KAAK,CAAA,CAAA;AAAA,GAC3B;AAAA,EAEQ,iBAAA,CACN,SACA,IACA,EAAA;AAEA,IAAM,MAAA,IAAA,GAAO,IAAK,CAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AAErC,IAAA,IAAI,OAAQ,CAAA,aAAA,CAAc,CAA6B,0BAAA,EAAA,IAAA,CAAA,EAAA,CAAQ,CAAG,EAAA;AAChE,MAAA,IAAA,CAAK,KAAK,MAAO,CAAA,KAAA;AAAA,QACf,sDAAA;AAAA,QACA,IAAK,CAAA,SAAA;AAAA,OACP,CAAA;AAEA,MAAA,OAAA;AAAA,KACF;AAEA,IAAM,MAAA,WAAA,GAAc,KAAK,KAAM,EAAA,CAAA;AAE/B,IAAY,WAAA,CAAA,YAAA,CAAa,OAAO,SAAS,CAAA,CAAA;AACzC,IAAY,WAAA,CAAA,YAAA,CAAa,MAAM,OAAO,CAAA,CAAA;AAEtC,IAAA,IAAA,CAAK,OAAO,WAAW,CAAA,CAAA;AAAA,GACzB;AAAA,EAEQ,yBAAA,CACN,MACA,KACA,EAAA;AACA,IAAM,MAAA,GAAA,GAAM,KAAM,CAAA,OAAA,CAAQ,IAAK,EAAA,CAAA;AAC/B,IAAM,MAAA,IAAA,GAAO,MAAO,CAAA,UAAA,CAAW,GAAG,CAAA,CAAA;AAGlC,IAAA,IAAI,IAAS,KAAA,CAAA;AAAG,MAAO,OAAA,KAAA,CAAA;AAEvB,IAAA,MAAM,WAAc,GAAA,IAAA,CAAK,cAAe,CAAA,IAAA,EAAM,GAAG,CAAA,CAAA;AAGjD,IAAA,IAAI,SAAS,WAAY,CAAA,IAAA;AAAM,MAAO,OAAA,KAAA,CAAA;AAEtC,IAAI,IAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AAC1B,MAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAEb,MAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,QACf,gCAAgCC,UAAU;AAAA,UACxC,IAAA;AAAA,SACF,CAAA,mCAAA,CAAA;AAAA,QACA,IAAK,CAAA,SAAA;AAAA,OACP,CAAA;AAEA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,KAAA,CAAM,cAAc,WAAY,CAAA,OAAA,CAAA;AAEhC,IAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,MACf,6BAA6BA,UAAU;AAAA,QACrC,WAAY,CAAA,IAAA;AAAA,YACRC,eAAU;AAAA,QACd,WAAY,CAAA,IAAA;AAAA,QACZ,IAAA;AAAA,OACF,CAAA,aAAA,EAAiBD,UAAU,CAAW,IAAI,CAAA,CAAA,EAAA,CAAA;AAAA,MAC1C,IAAK,CAAA,SAAA;AAAA,KACP,CAAA;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAc,yBAAA,CACZ,OACA,EAAA,IAAA,EACA,UACA,EAAA;AACA,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,mBAAA,CAAoB,WAAW,IAAI,CAAA,CAAA;AAG7D,IAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,IAAA,KAAS,CAAG,EAAA;AAChC,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAGA,IAAA,IAAI,OAAO,IAAO,GAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAK,iBAAiB,CAAG,EAAA;AACrD,MAAA,IAAA,CAAK,YAAY,OAAS,EAAA,MAAA,CAAO,QAAQ,QAAS,EAAA,EAAG,WAAW,IAAI,CAAA,CAAA;AAEpE,MAAA,IAAI,WAAW,IAAM,EAAA;AACnB,QAAA,UAAA,CAAW,KAAK,MAAO,EAAA,CAAA;AAEvB,QAAA,OAAO,UAAW,CAAA,IAAA,CAAA;AAAA,OACpB;AAEA,MAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,QACf,CAAA,gBAAA,EAAmB,UAAW,CAAA,QAAA,CAAA,EAAA,EAAaA,UAAU;AAAA,UACnD,MAAO,CAAA,IAAA;AAAA,wCACuBA,UAAU;AAAA,UACxC,KAAK,IAAK,CAAA,iBAAA;AAAA,SACZ,CAAA,EAAA,CAAA;AAAA,QACA,IAAK,CAAA,SAAA;AAAA,OACP,CAAA;AAEA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,MAAM,cAAc,IAAK,CAAA,cAAA;AAAA,MACvB,IAAA;AAAA,MACA,MAAA,CAAO,QAAQ,QAAS,EAAA;AAAA,MACxB,UAAW,CAAA,QAAA;AAAA,KACb,CAAA;AAGA,IAAI,IAAA,MAAA,CAAO,SAAS,WAAY,CAAA,IAAA;AAAM,MAAO,OAAA,KAAA,CAAA;AAG7C,IAAK,IAAA,CAAA,iBAAA,CAAkB,WAAW,IAAI,CAAA,CAAA;AAEtC,IAAA,IAAA,CAAK,WAAY,CAAA,OAAA,EAAS,WAAY,CAAA,OAAA,EAAS,WAAW,IAAI,CAAA,CAAA;AAE9D,IAAA,IAAI,WAAW,IAAM,EAAA;AACnB,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,0BAAA,KAA+B,IAAM,EAAA;AACjD,QAAK,IAAA,CAAA,iBAAA,CAAkB,OAAS,EAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,OACjD;AAEA,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAAO,EAAA;AACpD,QAAK,IAAA,CAAA,gBAAA,CAAiB,WAAW,IAAI,CAAA,CAAA;AAAA,OACvC;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,MACf,YAAYA,UAAU;AAAA,QACpB,WAAY,CAAA,IAAA;AAAA,YACRC,eAAU;AAAA,QACd,WAAY,CAAA,IAAA;AAAA,QACZ,MAAO,CAAA,IAAA;AAAA,uBACQD,UAAU,CAAW,MAAO,CAAA,IAAI,SAC/C,UAAW,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MAEb,IAAK,CAAA,SAAA;AAAA,KACP,CAAA;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEQ,iBAAiB,IAAsC,EAAA;AAC7D,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,YAAa,CAAA,OAAO,CAAK,IAAA,KAAA,CAAA;AAG5C,IAAK,IAAA,CAAA,YAAA,CAAa,SAAS,OAAO,CAAA,CAAA;AAClC,IAAK,IAAA,CAAA,YAAA,CAAa,cAAc,KAAK,CAAA,CAAA;AAErC,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,aAAA,KAAkB,MAAQ,EAAA;AACtC,MAAA,IAAI,UAAa,GAAA,EAAA,CAAA;AAEjB,MAAI,IAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,KAAwB,IAAM,EAAA;AAC1C,QAAa,UAAA,GAAA,CAAA,wEAAA,CAAA,CAAA;AAAA,OACf;AAEA,MAAK,IAAA,CAAA,YAAA;AAAA,QACH,QAAA;AAAA,QACA,CAA2D,wDAAA,EAAA,UAAA,CAAA,iBAAA,CAAA;AAAA,OAC7D,CAAA;AAAA,KACF;AAAA,GACF;AAAA,EAEQ,kBAAkB,OAAyC,EAAA;AACjE,IAAA,IACE,KAAK,IAAK,CAAA,4BAAA,KAAiC,SAC3C,IAAK,CAAA,IAAA,CAAK,wBAAwB,IAClC,EAAA;AACA,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,SAASF,iBAAW;AAAA,MACxB,IAAIC,0BAAW,CAAY,QAAU,EAAA,EAAI,EAAA,EAAA,EAAI,IAAM,EAAA,CAAC,CAAI,CAAA,EAAA,CAAA,CAAE,CAAC,CAAA;AAAA,KAC7D,CAAA;AAEA,IAAA,IAAI,YAAe,GAAA,EAAA,CAAA;AACnB,IAAA,IAAI,UAAa,GAAA,EAAA,CAAA;AAEjB,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,4BAAA,KAAiC,KAAO,EAAA;AACpD,MAAe,YAAA,GAAA,CAAA,8CAAA,CAAA,CAAA;AAEf,MAAI,IAAA,IAAA,CAAK,KAAK,mBAAqB,EAAA;AACjC,QAAgB,YAAA,IAAA,GAAA,CAAA;AAAA,OAClB;AAAA,KACF;AAEA,IAAI,IAAA,IAAA,CAAK,KAAK,mBAAqB,EAAA;AACjC,MAAa,UAAA,GAAA,CAAA,oEAAA,CAAA,CAAA;AAAA,KACf;AAEA,IAAO,MAAA,CAAA,WAAA,GAAc,gHAAgH,YAAe,CAAA,EAAA,UAAA,CAAA,KAAA,CAAA,CAAA;AAGpJ,IAAA,OAAA,CAAQ,aAAc,CAAA,mBAAmB,CAAG,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,GAC1D;AAAA,EAEQ,kBAAkB,IAAuC,EAAA;AAC/D,IAAA,IAAI,IAAK,CAAA,IAAA,CAAK,gBAAqB,KAAA,IAAA,IAAQ,CAAC,IAAM,EAAA;AAChD,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,WAAWD,iBAAW;AAAA,MAC1B,IAAIC,0BAAW,CAAY,UAAY,EAAA,EAAI,EAAA,EAAA,EAAI,IAAM,EAAA,CAAC,CAAI,CAAA,EAAA,CAAA,CAAE,CAAC,CAAA;AAAA,KAC/D,CAAA;AAEA,IAAM,MAAA,YAAA,GAAe,KAAK,KAAM,EAAA,CAAA;AAEhC,IAAA,QAAA,CAAS,YAAY,YAAY,CAAA,CAAA;AAEjC,IAAA,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAA;AAAA,GACrB;AAAA,EAEA,MAAc,YAAY,cAAwB,EAAA;AAChD,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,mBAAA,CAAoB,cAAc,CAAA,CAAA;AAG5D,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,MAAM,iBAAiB,IAAK,CAAA,cAAA;AAAA,MAC1B,EAAA;AAAA,MACA,MAAA,CAAO,QAAQ,QAAS,EAAA;AAAA,MACxB,cAAA;AAAA,MACA,IAAA;AAAA,KACF,CAAA;AAEA,IACE,IAAA,cAAA,CAAe,SAAS,CACxB,IAAA,cAAA,CAAe,OAAO,MAAO,CAAA,IAAA,CAAK,IAAK,CAAA,iBAAiB,CACxD,EAAA;AACA,MAAM,MAAA,IAAA,CAAK,yBAAyB,cAAc,CAAA,CAAA;AAElD,MAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,QACf,CAAA,4BAAA,EAA+B,mBAAmBC,UAAU;AAAA,UAC1D,MAAO,CAAA,IAAA;AAAA,SACT,CAAA,EAAA,CAAA;AAAA,QACA,IAAK,CAAA,SAAA;AAAA,OACP,CAAA;AAEA,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAGA,IAAI,IAAA,MAAA,CAAO,IAAS,KAAA,cAAA,CAAe,IAAM,EAAA;AACvC,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,MAAM,IAAK,CAAA,wBAAA,CAAyB,cAAgB,EAAA,cAAA,CAAe,OAAO,CAAA,CAAA;AAE1E,IAAA,IAAA,CAAK,KAAK,MAAO,CAAA,IAAA;AAAA,MACf,UAAUA,UAAU;AAAA,QAClB,MAAA,CAAO,OAAO,cAAe,CAAA,IAAA;AAAA,YACzBC,eAAU;AAAA,QACd,MAAA,CAAO,OAAO,cAAe,CAAA,IAAA;AAAA,QAC7B,MAAO,CAAA,IAAA;AAAA,uBACQD,UAAU;AAAA,QACzB,MAAO,CAAA,IAAA;AAAA,OACT,CAAA,yBAAA,EAA6BN,eAAK,CAAA,QAAA,CAAS,cAAc,CAAA,CAAA,CAAA;AAAA,MACzD,IAAK,CAAA,SAAA;AAAA,KACP,CAAA;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEQ,iBAAiB,OAAyC,EAAA;AAChE,IAAI,IAAA,MAAA,GAAS,OAAQ,CAAA,gBAAA,CAAiB,OAAO,CAAA,CAAA;AAG7C,IAAI,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,KAAa,KAAO,EAAA;AAChC,MAAA,MAAA,GAAS,MAAO,CAAA,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,UAAU,CAAA,CAAA;AAAA,KACpD;AAEA,IAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,MAAO,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AACzC,MAAA,MAAA,CAAO,CAAC,CAAA,CAAE,WAAe,IAAA,MAAA,CAAO,CAAC,CAAE,CAAA,OAAA,CAAA;AAEnC,MAAO,MAAA,CAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,CAAE,CAAA,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAK,EAAA,KAAK,CAAM,KAAA;AAC7D,QAAA,MAAM,QAAW,GAAA,MAAA,CAAO,CAAC,CAAA,CAAE,aAAa,GAAG,CAAA,CAAA;AAE3C,QAAO,MAAA,CAAA,CAAC,EAAE,YAAa,CAAA,GAAA,EAAK,WAAW,CAAG,EAAA,QAAA,CAAA,CAAA,EAAY,UAAU,KAAK,CAAA,CAAA;AAAA,OACtE,CAAA,CAAA;AAED,MAAO,MAAA,CAAA,CAAC,EAAE,MAAO,EAAA,CAAA;AAAA,KACnB;AAAA,GACF;AACF;;;;"}