{"version":3,"file":"bucket-browser-sdk.mjs","sources":["../src/config.ts","../src/logger.ts","../src/rateLimiter.ts","../src/feature/featureCache.ts","../src/feature/features.ts","../../../node_modules/js-cookie/dist/js.cookie.mjs","../src/feedback/promptStorage.ts","../src/sse.ts","../src/feedback/prompts.ts","../../../node_modules/preact/dist/preact.module.js","../src/ui/constants.ts","../../../node_modules/preact/hooks/dist/hooks.module.js","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/ui/packages/floating-ui-preact-dom/arrow.ts","../src/ui/packages/floating-ui-preact-dom/utils/deepEqual.ts","../src/ui/packages/floating-ui-preact-dom/utils/getDPR.ts","../src/ui/packages/floating-ui-preact-dom/utils/roundByDPR.ts","../src/ui/packages/floating-ui-preact-dom/utils/useLatestRef.ts","../src/ui/packages/floating-ui-preact-dom/useFloating.ts","../src/ui/utils.ts","../src/ui/Dialog.tsx","../src/ui/icons/Close.tsx","../src/feedback/ui/config/defaultTranslations.tsx","../src/feedback/ui/hooks/useTimer.ts","../src/ui/icons/Check.tsx","../src/ui/icons/CheckCircle.tsx","../src/feedback/ui/Button.tsx","../src/ui/icons/Logo.tsx","../src/feedback/ui/Plug.tsx","../src/ui/icons/Dissatisfied.tsx","../src/ui/icons/Neutral.tsx","../src/ui/icons/Satisfied.tsx","../src/ui/icons/VeryDissatisfied.tsx","../src/ui/icons/VerySatisfied.tsx","../src/feedback/ui/StarRating.tsx","../src/feedback/ui/FeedbackForm.tsx","../src/feedback/ui/RadialProgress.tsx","../src/feedback/ui/FeedbackDialog.tsx","../src/feedback/ui/index.ts","../src/feedback/feedback.ts","../src/hooksManager.ts","../src/httpClient.ts","../src/ui/icons/Feature.tsx","../src/toolbar/Switch.tsx","../src/toolbar/Features.tsx","../src/toolbar/Toolbar.tsx","../src/toolbar/index.ts","../src/client.ts"],"sourcesContent":["import { version } from \"../package.json\";\n\nexport const API_BASE_URL = \"https://front.bucket.co\";\nexport const APP_BASE_URL = \"https://app.bucket.co\";\nexport const SSE_REALTIME_BASE_URL = \"https://livemessaging.bucket.co\";\n\nexport const SDK_VERSION_HEADER_NAME = \"bucket-sdk-version\";\n\nexport const SDK_VERSION = `browser-sdk/${version}`;\nexport const FEATURE_EVENTS_PER_MIN = 1;\n","export interface Logger {\n  debug(message: string, ...args: any[]): void;\n  info(message: string, ...args: any[]): void;\n  warn(message: string, ...args: any[]): void;\n  error(message: string, ...args: any[]): void;\n}\n\nexport const quietConsoleLogger = {\n  debug(_: string) {\n    // do nothing\n  },\n  info(_: string) {\n    // do nothing\n  },\n  warn(message: string, ...args: any[]) {\n    console.warn(message, ...args);\n  },\n  error(message: string, ...args: any[]) {\n    console.error(message, ...args);\n  },\n};\n\nexport function loggerWithPrefix(logger: Logger, prefix: string): Logger {\n  return {\n    debug(message: string, ...args: any[]) {\n      logger.debug(`${prefix} ${message}`, ...args);\n    },\n    info(message: string, ...args: any[]) {\n      logger.info(`${prefix} ${message}`, ...args);\n    },\n    warn(message: string, ...args: any[]) {\n      logger.warn(`${prefix} ${message}`, ...args);\n    },\n    error(message: string, ...args: any[]) {\n      logger.error(`${prefix} ${message}`, ...args);\n    },\n  };\n}\n","import { Logger } from \"./logger\";\n\nconst oneMinute = 60 * 1000;\n\nexport default class RateLimiter {\n  private eventsByKey: Record<string, number[]> = {};\n\n  constructor(\n    private eventsPerMinute: number,\n    private logger: Logger,\n  ) {}\n\n  public rateLimited<R>(key: string, func: () => R): R | undefined {\n    const now = Date.now();\n\n    if (!this.eventsByKey[key]) {\n      this.eventsByKey[key] = [];\n    }\n\n    const events = this.eventsByKey[key];\n\n    while (events.length && now - events[0] > oneMinute) {\n      events.shift();\n    }\n\n    const limitExceeded = events.length >= this.eventsPerMinute;\n    if (limitExceeded) {\n      this.logger.debug(\"Rate limit exceeded\", { key });\n      return;\n    }\n\n    events.push(now);\n    return func();\n  }\n}\n","import { FetchedFeatures } from \"./features\";\n\ninterface StorageItem {\n  get(): string | null;\n  set(value: string): void;\n}\n\ninterface cacheEntry {\n  expireAt: number;\n  staleAt: number;\n  features: FetchedFeatures;\n}\n\n// Parse and validate an API feature response\nexport function parseAPIFeaturesResponse(\n  featuresInput: any,\n): FetchedFeatures | undefined {\n  if (!isObject(featuresInput)) {\n    return;\n  }\n\n  const features: FetchedFeatures = {};\n  for (const key in featuresInput) {\n    const feature = featuresInput[key];\n\n    if (\n      typeof feature.isEnabled !== \"boolean\" ||\n      feature.key !== key ||\n      typeof feature.targetingVersion !== \"number\" ||\n      (feature.config && typeof feature.config !== \"object\") ||\n      (feature.missingContextFields &&\n        !Array.isArray(feature.missingContextFields)) ||\n      (feature.ruleEvaluationResults &&\n        !Array.isArray(feature.ruleEvaluationResults))\n    ) {\n      return;\n    }\n\n    features[key] = {\n      isEnabled: feature.isEnabled,\n      targetingVersion: feature.targetingVersion,\n      key,\n      config: feature.config,\n      missingContextFields: feature.missingContextFields,\n      ruleEvaluationResults: feature.ruleEvaluationResults,\n    };\n  }\n\n  return features;\n}\n\nexport interface CacheResult {\n  features: FetchedFeatures;\n  stale: boolean;\n}\n\nexport class FeatureCache {\n  private storage: StorageItem;\n  private readonly staleTimeMs: number;\n  private readonly expireTimeMs: number;\n\n  constructor({\n    storage,\n    staleTimeMs,\n    expireTimeMs,\n  }: {\n    storage: StorageItem;\n    staleTimeMs: number;\n    expireTimeMs: number;\n  }) {\n    this.storage = storage;\n    this.staleTimeMs = staleTimeMs;\n    this.expireTimeMs = expireTimeMs;\n  }\n\n  set(\n    key: string,\n    {\n      features,\n    }: {\n      features: FetchedFeatures;\n    },\n  ) {\n    let cacheData: CacheData = {};\n\n    try {\n      const cachedResponseRaw = this.storage.get();\n      if (cachedResponseRaw) {\n        cacheData = validateCacheData(JSON.parse(cachedResponseRaw)) ?? {};\n      }\n    } catch {\n      // ignore errors\n    }\n\n    cacheData[key] = {\n      expireAt: Date.now() + this.expireTimeMs,\n      staleAt: Date.now() + this.staleTimeMs,\n      features,\n    } satisfies cacheEntry;\n\n    cacheData = Object.fromEntries(\n      Object.entries(cacheData).filter(([_k, v]) => v.expireAt > Date.now()),\n    );\n\n    this.storage.set(JSON.stringify(cacheData));\n\n    return cacheData;\n  }\n\n  get(key: string): CacheResult | undefined {\n    try {\n      const cachedResponseRaw = this.storage.get();\n      if (cachedResponseRaw) {\n        const cachedResponse = validateCacheData(JSON.parse(cachedResponseRaw));\n        if (\n          cachedResponse &&\n          cachedResponse[key] &&\n          cachedResponse[key].expireAt > Date.now()\n        ) {\n          return {\n            features: cachedResponse[key].features,\n            stale: cachedResponse[key].staleAt < Date.now(),\n          };\n        }\n      }\n    } catch {\n      // ignore errors\n    }\n    return;\n  }\n}\n\ntype CacheData = Record<string, cacheEntry>;\nfunction validateCacheData(cacheDataInput: any) {\n  if (!isObject(cacheDataInput)) {\n    return;\n  }\n\n  const cacheData: CacheData = {};\n  for (const key in cacheDataInput) {\n    const cacheEntry = cacheDataInput[key];\n    if (!isObject(cacheEntry)) return;\n\n    if (\n      typeof cacheEntry.expireAt !== \"number\" ||\n      typeof cacheEntry.staleAt !== \"number\" ||\n      (cacheEntry.features && !parseAPIFeaturesResponse(cacheEntry.features))\n    ) {\n      return;\n    }\n\n    cacheData[key] = {\n      expireAt: cacheEntry.expireAt,\n      staleAt: cacheEntry.staleAt,\n      features: cacheEntry.features,\n    };\n  }\n  return cacheData;\n}\n\n// Simple object check.\nexport function isObject(item: any): boolean {\n  return item && typeof item === \"object\" && !Array.isArray(item);\n}\n","import { FEATURE_EVENTS_PER_MIN } from \"../config\";\nimport { HttpClient } from \"../httpClient\";\nimport { Logger, loggerWithPrefix } from \"../logger\";\nimport RateLimiter from \"../rateLimiter\";\n\nimport {\n  FeatureCache,\n  isObject,\n  parseAPIFeaturesResponse,\n} from \"./featureCache\";\n\n/**\n * A feature fetched from the server.\n */\nexport type FetchedFeature = {\n  /**\n   * Feature key.\n   */\n  key: string;\n\n  /**\n   * Result of feature flag evaluation.\n   * Note: does not take local overrides into account.\n   */\n  isEnabled: boolean;\n\n  /**\n   * Version of targeting rules.\n   */\n  targetingVersion?: number;\n\n  /**\n   * Rule evaluation results.\n   */\n  ruleEvaluationResults?: boolean[];\n\n  /**\n   * Missing context fields.\n   */\n  missingContextFields?: string[];\n\n  /**\n   * Optional user-defined dynamic configuration.\n   */\n  config?: {\n    /**\n     * The key of the matched configuration value.\n     */\n    key: string;\n\n    /**\n     * The version of the matched configuration value.\n     */\n    version?: number;\n\n    /**\n     * The optional user-supplied payload data.\n     */\n    payload?: any;\n\n    /**\n     * The rule evaluation results.\n     */\n    ruleEvaluationResults?: boolean[];\n\n    /**\n     * The missing context fields.\n     */\n    missingContextFields?: string[];\n  };\n};\n\nconst FEATURES_UPDATED_EVENT = \"featuresUpdated\";\n\n/**\n * @internal\n */\nexport type FetchedFeatures = Record<string, FetchedFeature | undefined>;\n\nexport type RawFeature = FetchedFeature & {\n  /**\n   * If not null, the result is being overridden locally\n   */\n  isEnabledOverride: boolean | null;\n};\n\nexport type RawFeatures = Record<string, RawFeature>;\n\nexport type FallbackFeatureOverride =\n  | {\n      key: string;\n      payload: any;\n    }\n  | true;\n\ntype Config = {\n  fallbackFeatures: Record<string, FallbackFeatureOverride>;\n  timeoutMs: number;\n  staleWhileRevalidate: boolean;\n  offline: boolean;\n};\n\nexport const DEFAULT_FEATURES_CONFIG: Config = {\n  fallbackFeatures: {},\n  timeoutMs: 5000,\n  staleWhileRevalidate: false,\n  offline: false,\n};\n\nexport function validateFeaturesResponse(response: any) {\n  if (!isObject(response)) {\n    return;\n  }\n\n  if (typeof response.success !== \"boolean\" || !isObject(response.features)) {\n    return;\n  }\n\n  const features = parseAPIFeaturesResponse(response.features);\n\n  if (!features) {\n    return;\n  }\n\n  return {\n    success: response.success,\n    features,\n  };\n}\n\nexport function flattenJSON(obj: Record<string, any>): Record<string, any> {\n  const result: Record<string, any> = {};\n  for (const key in obj) {\n    if (typeof obj[key] === \"object\") {\n      const flat = flattenJSON(obj[key]);\n      for (const flatKey in flat) {\n        result[`${key}.${flatKey}`] = flat[flatKey];\n      }\n    } else if (typeof obj[key] !== \"undefined\") {\n      result[key] = obj[key];\n    }\n  }\n  return result;\n}\n\n/**\n * Event representing checking the feature flag evaluation result\n */\nexport interface CheckEvent {\n  /**\n   * `check-is-enabled` means `isEnabled` was checked, `check-config` means `config` was checked.\n   */\n  action: \"check-is-enabled\" | \"check-config\";\n\n  /**\n   * Feature key.\n   */\n  key: string;\n\n  /**\n   * Result of feature flag or configuration evaluation.\n   * If `action` is `check-is-enabled`, this is the result of the feature flag evaluation and `value` is a boolean.\n   * If `action` is `check-config`, this is the result of the configuration evaluation.\n   */\n  value?: boolean | { key: string; payload: any };\n\n  /**\n   * Version of targeting rules.\n   */\n  version?: number;\n\n  /**\n   * Rule evaluation results.\n   */\n  ruleEvaluationResults?: boolean[];\n\n  /**\n   * Missing context fields.\n   */\n  missingContextFields?: string[];\n}\n\ntype context = {\n  user?: Record<string, any>;\n  company?: Record<string, any>;\n  other?: Record<string, any>;\n};\n\nexport const FEATURES_EXPIRE_MS = 30 * 24 * 60 * 60 * 1000; // expire entirely after 30 days\n\nconst localStorageFetchedFeaturesKey = `__bucket_fetched_features`;\nconst localStorageOverridesKey = `__bucket_overrides`;\n\ntype OverridesFeatures = Record<string, boolean | null>;\n\nfunction setOverridesCache(overrides: OverridesFeatures) {\n  localStorage.setItem(localStorageOverridesKey, JSON.stringify(overrides));\n}\n\nfunction getOverridesCache(): OverridesFeatures {\n  const cachedOverrides = JSON.parse(\n    localStorage.getItem(localStorageOverridesKey) || \"{}\",\n  );\n\n  if (!isObject(cachedOverrides)) {\n    return {};\n  }\n\n  return cachedOverrides;\n}\n\n/**\n * @internal\n */\nexport class FeaturesClient {\n  private cache: FeatureCache;\n  private fetchedFeatures: FetchedFeatures;\n  private featureOverrides: OverridesFeatures = {};\n\n  private features: RawFeatures = {};\n\n  private config: Config;\n  private rateLimiter: RateLimiter;\n  private readonly logger: Logger;\n\n  private eventTarget = new EventTarget();\n  private abortController: AbortController = new AbortController();\n\n  constructor(\n    private httpClient: HttpClient,\n    private context: context,\n    logger: Logger,\n    options?: {\n      fallbackFeatures?: Record<string, FallbackFeatureOverride> | string[];\n      timeoutMs?: number;\n      staleTimeMs?: number;\n      expireTimeMs?: number;\n      cache?: FeatureCache;\n      rateLimiter?: RateLimiter;\n      offline?: boolean;\n    },\n  ) {\n    this.fetchedFeatures = {};\n    this.logger = loggerWithPrefix(logger, \"[Features]\");\n    this.cache = options?.cache\n      ? options.cache\n      : new FeatureCache({\n          storage: {\n            get: () => localStorage.getItem(localStorageFetchedFeaturesKey),\n            set: (value) =>\n              localStorage.setItem(localStorageFetchedFeaturesKey, value),\n          },\n          staleTimeMs: options?.staleTimeMs ?? 0,\n          expireTimeMs: options?.expireTimeMs ?? FEATURES_EXPIRE_MS,\n        });\n\n    let fallbackFeatures: Record<string, FallbackFeatureOverride>;\n\n    if (Array.isArray(options?.fallbackFeatures)) {\n      fallbackFeatures = options.fallbackFeatures.reduce(\n        (acc, key) => {\n          acc[key] = true;\n          return acc;\n        },\n        {} as Record<string, FallbackFeatureOverride>,\n      );\n    } else {\n      fallbackFeatures = options?.fallbackFeatures ?? {};\n    }\n\n    this.config = {\n      ...DEFAULT_FEATURES_CONFIG,\n      ...options,\n      fallbackFeatures,\n    };\n\n    this.rateLimiter =\n      options?.rateLimiter ??\n      new RateLimiter(FEATURE_EVENTS_PER_MIN, this.logger);\n\n    try {\n      const storedFeatureOverrides = getOverridesCache();\n      for (const key in storedFeatureOverrides) {\n        this.featureOverrides[key] = storedFeatureOverrides[key];\n      }\n    } catch (e) {\n      this.logger.warn(\"error getting feature overrides from cache\", e);\n      this.featureOverrides = {};\n    }\n  }\n\n  async initialize() {\n    const features = (await this.maybeFetchFeatures()) || {};\n    this.setFetchedFeatures(features);\n  }\n\n  async setContext(context: context) {\n    this.context = context;\n    await this.initialize();\n  }\n\n  /**\n   * Stop the client.\n   */\n  public stop() {\n    this.abortController.abort();\n  }\n\n  /**\n   * Register a callback to be called when the features are updated.\n   * Features are not guaranteed to have actually changed when the callback is called.\n   *\n   * @param callback this will be called when the features are updated.\n   * @returns a function that can be called to remove the listener\n   */\n  onUpdated(callback: () => void) {\n    this.eventTarget.addEventListener(FEATURES_UPDATED_EVENT, callback, {\n      signal: this.abortController.signal,\n    });\n  }\n\n  getFeatures(): RawFeatures {\n    return this.features;\n  }\n\n  getFetchedFeatures(): FetchedFeatures {\n    return this.fetchedFeatures;\n  }\n\n  public async fetchFeatures(): Promise<FetchedFeatures | undefined> {\n    const params = this.fetchParams();\n    try {\n      const res = await this.httpClient.get({\n        path: \"/features/evaluated\",\n        timeoutMs: this.config.timeoutMs,\n        params,\n      });\n\n      if (!res.ok) {\n        let errorBody = null;\n        try {\n          errorBody = await res.json();\n        } catch {\n          // ignore\n        }\n\n        throw new Error(\n          \"unexpected response code: \" +\n            res.status +\n            \" - \" +\n            JSON.stringify(errorBody),\n        );\n      }\n\n      const typeRes = validateFeaturesResponse(await res.json());\n      if (!typeRes || !typeRes.success) {\n        throw new Error(\"unable to validate response\");\n      }\n\n      return typeRes.features;\n    } catch (e) {\n      this.logger.error(\"error fetching features: \", e);\n      return;\n    }\n  }\n\n  /**\n   * Send a feature \"check\" event.\n   *\n   *\n   * @param checkEvent - The feature to send the event for.\n   * @param cb - Callback to call after the event is sent. Might be skipped if the event was rate limited.\n   */\n  async sendCheckEvent(checkEvent: CheckEvent, cb: () => void) {\n    if (this.config.offline) {\n      return;\n    }\n\n    const rateLimitKey = `check-event:${this.fetchParams().toString()}:${checkEvent.key}:${checkEvent.version}:${checkEvent.value}`;\n    await this.rateLimiter.rateLimited(rateLimitKey, async () => {\n      const payload = {\n        action: checkEvent.action,\n        key: checkEvent.key,\n        targetingVersion: checkEvent.version,\n        evalContext: this.context,\n        evalResult: checkEvent.value,\n        evalRuleResults: checkEvent.ruleEvaluationResults,\n        evalMissingFields: checkEvent.missingContextFields,\n      };\n\n      this.httpClient\n        .post({\n          path: \"features/events\",\n          body: payload,\n        })\n        .catch((e: any) => {\n          this.logger.warn(`failed to send feature check event`, e);\n        });\n\n      this.logger.debug(`sent feature event`, payload);\n      cb();\n    });\n\n    return checkEvent.value;\n  }\n\n  private triggerFeaturesChanged() {\n    const mergedFeatures: RawFeatures = {};\n\n    // merge fetched features with overrides into `this.features`\n    for (const key in this.fetchedFeatures) {\n      const fetchedFeature = this.fetchedFeatures[key];\n      if (!fetchedFeature) continue;\n      const isEnabledOverride = this.featureOverrides[key] ?? null;\n      mergedFeatures[key] = {\n        ...fetchedFeature,\n        isEnabledOverride,\n      };\n    }\n\n    this.features = mergedFeatures;\n\n    this.eventTarget.dispatchEvent(new Event(FEATURES_UPDATED_EVENT));\n  }\n\n  private setFetchedFeatures(features: FetchedFeatures) {\n    this.fetchedFeatures = features;\n    this.triggerFeaturesChanged();\n  }\n\n  private fetchParams() {\n    const flattenedContext = flattenJSON({ context: this.context });\n    const params = new URLSearchParams(flattenedContext);\n    // publishableKey should be part of the cache key\n    params.append(\"publishableKey\", this.httpClient.publishableKey);\n\n    // sort the params to ensure that the URL is the same for the same context\n    params.sort();\n\n    return params;\n  }\n\n  private warnMissingFeatureContextFields(features: FetchedFeatures) {\n    const report: Record<string, string[]> = {};\n    for (const featureKey in features) {\n      const feature = features[featureKey];\n      if (feature?.missingContextFields?.length) {\n        report[feature.key] = feature.missingContextFields;\n      }\n\n      if (feature?.config?.missingContextFields?.length) {\n        report[`${feature.key}.config`] = feature.config.missingContextFields;\n      }\n    }\n\n    if (Object.keys(report).length > 0) {\n      this.rateLimiter.rateLimited(\n        `feature-missing-context-fields:${this.fetchParams().toString()}`,\n        () => {\n          this.logger.warn(\n            `feature/remote config targeting rules might not be correctly evaluated due to missing context fields.`,\n            report,\n          );\n        },\n      );\n    }\n  }\n\n  private async maybeFetchFeatures(): Promise<FetchedFeatures | undefined> {\n    if (this.config.offline) {\n      return;\n    }\n\n    const cacheKey = this.fetchParams().toString();\n    const cachedItem = this.cache.get(cacheKey);\n\n    if (cachedItem) {\n      if (!cachedItem.stale) return cachedItem.features;\n\n      // serve successful stale cache if `staleWhileRevalidate` is enabled\n      if (this.config.staleWhileRevalidate) {\n        // re-fetch in the background, but immediately return last successful value\n        this.fetchFeatures()\n          .then((features) => {\n            if (!features) return;\n\n            this.cache.set(cacheKey, {\n              features,\n            });\n            this.setFetchedFeatures(features);\n          })\n          .catch(() => {\n            // we don't care about the result, we just want to re-fetch\n          });\n        return cachedItem.features;\n      }\n    }\n\n    // if there's no cached item or there is a stale one but `staleWhileRevalidate` is disabled\n    // try fetching a new one\n    const fetchedFeatures = await this.fetchFeatures();\n\n    if (fetchedFeatures) {\n      this.cache.set(cacheKey, {\n        features: fetchedFeatures,\n      });\n\n      this.warnMissingFeatureContextFields(fetchedFeatures);\n      return fetchedFeatures;\n    }\n\n    if (cachedItem) {\n      // fetch failed, return stale cache\n      return cachedItem.features;\n    }\n\n    // fetch failed, nothing cached => return fallbacks\n    return Object.entries(this.config.fallbackFeatures).reduce(\n      (acc, [key, override]) => {\n        acc[key] = {\n          key,\n          isEnabled: !!override,\n          config:\n            typeof override === \"object\" && \"key\" in override\n              ? {\n                  key: override.key,\n                  payload: override.payload,\n                }\n              : undefined,\n        };\n        return acc;\n      },\n      {} as FetchedFeatures,\n    );\n  }\n\n  setFeatureOverride(key: string, isEnabled: boolean | null) {\n    if (!(typeof isEnabled === \"boolean\" || isEnabled === null)) {\n      throw new Error(\"setFeatureOverride: isEnabled must be boolean or null\");\n    }\n\n    if (isEnabled === null) {\n      delete this.featureOverrides[key];\n    } else {\n      this.featureOverrides[key] = isEnabled;\n    }\n    setOverridesCache(this.featureOverrides);\n\n    this.triggerFeaturesChanged();\n  }\n\n  getFeatureOverride(key: string): boolean | null {\n    return this.featureOverrides[key] ?? null;\n  }\n}\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n    for (var key in source) {\n      target[key] = source[key];\n    }\n  }\n  return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n  read: function (value) {\n    if (value[0] === '\"') {\n      value = value.slice(1, -1);\n    }\n    return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n  },\n  write: function (value) {\n    return encodeURIComponent(value).replace(\n      /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n      decodeURIComponent\n    )\n  }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n  function set (name, value, attributes) {\n    if (typeof document === 'undefined') {\n      return\n    }\n\n    attributes = assign({}, defaultAttributes, attributes);\n\n    if (typeof attributes.expires === 'number') {\n      attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n    }\n    if (attributes.expires) {\n      attributes.expires = attributes.expires.toUTCString();\n    }\n\n    name = encodeURIComponent(name)\n      .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n      .replace(/[()]/g, escape);\n\n    var stringifiedAttributes = '';\n    for (var attributeName in attributes) {\n      if (!attributes[attributeName]) {\n        continue\n      }\n\n      stringifiedAttributes += '; ' + attributeName;\n\n      if (attributes[attributeName] === true) {\n        continue\n      }\n\n      // Considers RFC 6265 section 5.2:\n      // ...\n      // 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n      //     character:\n      // Consume the characters of the unparsed-attributes up to,\n      // not including, the first %x3B (\";\") character.\n      // ...\n      stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n    }\n\n    return (document.cookie =\n      name + '=' + converter.write(value, name) + stringifiedAttributes)\n  }\n\n  function get (name) {\n    if (typeof document === 'undefined' || (arguments.length && !name)) {\n      return\n    }\n\n    // To prevent the for loop in the first place assign an empty array\n    // in case there are no cookies at all.\n    var cookies = document.cookie ? document.cookie.split('; ') : [];\n    var jar = {};\n    for (var i = 0; i < cookies.length; i++) {\n      var parts = cookies[i].split('=');\n      var value = parts.slice(1).join('=');\n\n      try {\n        var found = decodeURIComponent(parts[0]);\n        jar[found] = converter.read(value, found);\n\n        if (name === found) {\n          break\n        }\n      } catch (e) {}\n    }\n\n    return name ? jar[name] : jar\n  }\n\n  return Object.create(\n    {\n      set,\n      get,\n      remove: function (name, attributes) {\n        set(\n          name,\n          '',\n          assign({}, attributes, {\n            expires: -1\n          })\n        );\n      },\n      withAttributes: function (attributes) {\n        return init(this.converter, assign({}, this.attributes, attributes))\n      },\n      withConverter: function (converter) {\n        return init(assign({}, this.converter, converter), this.attributes)\n      }\n    },\n    {\n      attributes: { value: Object.freeze(defaultAttributes) },\n      converter: { value: Object.freeze(converter) }\n    }\n  )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","import Cookies from \"js-cookie\";\n\nexport const markPromptMessageCompleted = (\n  userId: string,\n  promptId: string,\n  expiresAt: Date,\n) => {\n  Cookies.set(`bucket-prompt-${userId}`, promptId, {\n    expires: expiresAt,\n    sameSite: \"strict\",\n    secure: true,\n  });\n};\n\nexport const checkPromptMessageCompleted = (\n  userId: string,\n  promptId: string,\n) => {\n  const id = Cookies.get(`bucket-prompt-${userId}`);\n  return id === promptId;\n};\n\nexport const rememberAuthToken = (\n  userId: string,\n  channel: string,\n  token: string,\n  expiresAt: Date,\n) => {\n  Cookies.set(`bucket-token-${userId}`, JSON.stringify({ channel, token }), {\n    expires: expiresAt,\n    sameSite: \"strict\",\n    secure: true,\n  });\n};\n\nexport const getAuthToken = (userId: string) => {\n  const val = Cookies.get(`bucket-token-${userId}`);\n  if (!val) {\n    return undefined;\n  }\n\n  try {\n    const { channel, token } = JSON.parse(val) as {\n      channel: string;\n      token: string;\n    };\n    if (!channel?.length || !token?.length) {\n      return undefined;\n    }\n    return {\n      channel,\n      token,\n    };\n  } catch {\n    return undefined;\n  }\n};\n\nexport const forgetAuthToken = (userId: string) => {\n  Cookies.remove(`bucket-token-${userId}`);\n};\n","import {\n  forgetAuthToken,\n  getAuthToken,\n  rememberAuthToken,\n} from \"./feedback/promptStorage\";\nimport { HttpClient } from \"./httpClient\";\nimport { Logger, loggerWithPrefix } from \"./logger\";\n\ninterface AblyTokenDetails {\n  token: string;\n  expires: number;\n}\n\ninterface AblyTokenRequest {\n  keyName: string;\n}\n\nconst ABLY_TOKEN_ERROR_MIN = 40000;\nconst ABLY_TOKEN_ERROR_MAX = 49999;\n\nexport class AblySSEChannel {\n  private isOpen: boolean = false;\n  private eventSource: EventSource | null = null;\n  private retryInterval: ReturnType<typeof setInterval> | null = null;\n  private logger: Logger;\n\n  constructor(\n    private userId: string,\n    private channel: string,\n    private sseBaseUrl: string,\n    private messageHandler: (message: any) => void,\n    private httpClient: HttpClient,\n    logger: Logger,\n  ) {\n    this.logger = loggerWithPrefix(logger, \"[SSE]\");\n\n    if (!this.sseBaseUrl.endsWith(\"/\")) {\n      this.sseBaseUrl += \"/\";\n    }\n  }\n\n  private async refreshTokenRequest() {\n    const params = new URLSearchParams({ userId: this.userId });\n    const res = await this.httpClient.get({\n      path: `/feedback/prompting-auth`,\n      params,\n    });\n\n    if (res.ok) {\n      const body = await res.json();\n      if (body.success) {\n        delete body.success;\n        const tokenRequest: AblyTokenRequest = body;\n\n        this.logger.debug(\"obtained new token request\", tokenRequest);\n        return tokenRequest;\n      }\n    }\n\n    this.logger.error(\"server did not release a token request\", res);\n    return;\n  }\n\n  private async refreshToken() {\n    const cached = getAuthToken(this.userId);\n    if (cached && cached.channel === this.channel) {\n      this.logger.debug(\"using existing token\", cached.channel, cached.token);\n      return cached.token;\n    }\n\n    const tokenRequest = await this.refreshTokenRequest();\n    if (!tokenRequest) {\n      return;\n    }\n\n    const url = new URL(\n      `keys/${encodeURIComponent(tokenRequest.keyName)}/requestToken`,\n      this.sseBaseUrl,\n    );\n\n    const res = await fetch(url, {\n      method: \"post\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(tokenRequest),\n    });\n\n    if (res.ok) {\n      const details: AblyTokenDetails = await res.json();\n      this.logger.debug(\"obtained new token\", details);\n\n      rememberAuthToken(\n        this.userId,\n        this.channel,\n        details.token,\n        new Date(details.expires),\n      );\n      return details.token;\n    }\n\n    this.logger.error(\"server did not release a token\");\n\n    return;\n  }\n\n  private async onError(e: Event) {\n    if (e instanceof MessageEvent) {\n      let errorCode: number | undefined;\n\n      try {\n        const errorPayload = JSON.parse(e.data);\n        errorCode = errorPayload?.code && Number(errorPayload.code);\n      } catch (error: any) {\n        this.logger.warn(\"received unparsable error message\", error, e);\n      }\n\n      if (\n        errorCode &&\n        errorCode >= ABLY_TOKEN_ERROR_MIN &&\n        errorCode <= ABLY_TOKEN_ERROR_MAX\n      ) {\n        this.logger.warn(\"event source token expired, refresh required\");\n        forgetAuthToken(this.userId);\n      }\n    } else {\n      const connectionState = (e as any)?.target?.readyState;\n\n      if (connectionState === 2) {\n        this.logger.debug(\"event source connection closed\", e);\n      } else if (connectionState === 1) {\n        this.logger.warn(\"event source connection failed to open\", e);\n      } else {\n        this.logger.warn(\"event source unexpected error occurred\", e);\n      }\n    }\n\n    this.disconnect();\n  }\n\n  private onMessage(e: MessageEvent) {\n    let payload: any;\n\n    try {\n      if (e.data) {\n        const message = JSON.parse(e.data);\n        if (message.data) {\n          payload = JSON.parse(message.data);\n        }\n      }\n    } catch (error: any) {\n      this.logger.warn(\"received unparsable message\", error, e);\n      return;\n    }\n\n    if (payload) {\n      this.logger.debug(\"received message\", payload);\n\n      try {\n        this.messageHandler(payload);\n      } catch (error: any) {\n        this.logger.warn(\"failed to handle message\", error, payload);\n      }\n\n      return;\n    }\n\n    this.logger.warn(\"received invalid message\", e);\n  }\n\n  private onOpen(e: Event) {\n    this.logger.debug(\"event source connection opened\", e);\n  }\n\n  public async connect() {\n    if (this.isOpen) {\n      this.logger.warn(\"channel connection already open\");\n      return;\n    }\n\n    this.isOpen = true;\n    try {\n      const token = await this.refreshToken();\n\n      if (!token) return;\n\n      const url = new URL(\"sse\", this.sseBaseUrl);\n      url.searchParams.append(\"v\", \"1.2\");\n      url.searchParams.append(\"accessToken\", token);\n      url.searchParams.append(\"channels\", this.channel);\n      url.searchParams.append(\"rewind\", \"1\");\n\n      this.eventSource = new EventSource(url);\n\n      this.eventSource.addEventListener(\"error\", (e) => this.onError(e));\n      this.eventSource.addEventListener(\"open\", (e) => this.onOpen(e));\n      this.eventSource.addEventListener(\"message\", (m) => this.onMessage(m));\n\n      this.logger.debug(\"channel connection opened\");\n    } finally {\n      this.isOpen = !!this.eventSource;\n    }\n  }\n\n  public disconnect() {\n    if (!this.isOpen) {\n      this.logger.warn(\"channel connection already closed\");\n      return;\n    }\n\n    if (this.eventSource) {\n      this.eventSource.close();\n      this.eventSource = null;\n\n      this.logger.debug(\"channel connection closed\");\n    }\n\n    this.isOpen = false;\n  }\n\n  public open(options?: { retryInterval?: number; retryCount?: number }) {\n    const retryInterval = options?.retryInterval ?? 1000 * 30;\n    const retryCount = options?.retryCount ?? 3;\n    let retriesRemaining = retryCount;\n\n    const tryConnect = async () => {\n      try {\n        await this.connect();\n        retriesRemaining = retryCount;\n      } catch (e) {\n        if (retriesRemaining > 0) {\n          this.logger.warn(\n            `failed to connect, ${retriesRemaining} retries remaining`,\n            e,\n          );\n        } else {\n          this.logger.warn(`failed to connect, no retries remaining`, e);\n        }\n      }\n    };\n\n    void tryConnect();\n\n    this.retryInterval = setInterval(() => {\n      if (!this.isConnected() && this.retryInterval) {\n        if (retriesRemaining <= 0) {\n          clearInterval(this.retryInterval);\n          this.retryInterval = null;\n          return;\n        }\n\n        retriesRemaining--;\n        void tryConnect();\n      }\n    }, retryInterval);\n  }\n\n  public close() {\n    if (this.retryInterval) {\n      clearInterval(this.retryInterval);\n      this.retryInterval = null;\n    }\n\n    this.disconnect();\n  }\n\n  public isActive() {\n    return !!this.retryInterval;\n  }\n\n  public isConnected() {\n    return this.isOpen && !!this.eventSource;\n  }\n}\n\nexport function openAblySSEChannel({\n  userId,\n  channel,\n  callback,\n  httpClient,\n  sseBaseUrl,\n  logger,\n}: {\n  userId: string;\n  channel: string;\n  callback: (req: object) => void;\n  httpClient: HttpClient;\n  logger: Logger;\n  sseBaseUrl: string;\n}) {\n  const sse = new AblySSEChannel(\n    userId,\n    channel,\n    sseBaseUrl,\n    callback,\n    httpClient,\n    logger,\n  );\n\n  sse.open();\n\n  return sse;\n}\n\nexport function closeAblySSEChannel(channel: AblySSEChannel) {\n  channel.close();\n}\n","import { FeedbackPrompt } from \"./feedback\";\nimport {\n  checkPromptMessageCompleted,\n  markPromptMessageCompleted,\n} from \"./promptStorage\";\n\nexport const parsePromptMessage = (\n  message: any,\n): FeedbackPrompt | undefined => {\n  if (\n    typeof message?.question !== \"string\" ||\n    !message.question.length ||\n    typeof message.showAfter !== \"number\" ||\n    typeof message.showBefore !== \"number\" ||\n    typeof message.promptId !== \"string\" ||\n    !message.promptId.length ||\n    typeof message.featureId !== \"string\" ||\n    !message.featureId.length\n  ) {\n    return undefined;\n  } else {\n    return {\n      question: message.question,\n      showAfter: new Date(message.showAfter),\n      showBefore: new Date(message.showBefore),\n      promptId: message.promptId,\n      featureId: message.featureId,\n    };\n  }\n};\n\nexport type FeedbackPromptCompletionHandler = () => void;\nexport type FeedbackPromptDisplayHandler = (\n  userId: string,\n  prompt: FeedbackPrompt,\n  completionHandler: FeedbackPromptCompletionHandler,\n) => void;\n\nexport const processPromptMessage = (\n  userId: string,\n  prompt: FeedbackPrompt,\n  displayHandler: FeedbackPromptDisplayHandler,\n) => {\n  const now = new Date();\n\n  const completionHandler = () => {\n    markPromptMessageCompleted(userId, prompt.promptId, prompt.showBefore);\n  };\n\n  if (checkPromptMessageCompleted(userId, prompt.promptId)) {\n    return false;\n  } else if (now > prompt.showBefore) {\n    return false;\n  } else if (now < prompt.showAfter) {\n    setTimeout(() => {\n      displayHandler(userId, prompt, completionHandler);\n    }, prompt.showAfter.getTime() - now.getTime());\n\n    return true;\n  } else {\n    displayHandler(userId, prompt, completionHandler);\n    return true;\n  }\n};\n","var n,l,u,t,i,o,r,f,e,c,s,a,h={},p=[],v=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,y=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function w(n){var l=n.parentNode;l&&l.removeChild(n)}function _(l,u,t){var i,o,r,f={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return g(l,f,i,o,null)}function g(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function m(){return{current:null}}function k(n){return n.children}function b(n,l){this.props=n,this.context=l}function x(n,l){if(null==l)return n.__?x(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?x(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!P.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||r)(P)}function P(){var n,u,t,o,r,e,c,s;for(i.sort(f);n=i.shift();)n.__d&&(u=i.length,o=void 0,e=(r=(t=n).__v).__e,c=[],s=[],t.__P&&((o=d({},r)).__v=r.__v+1,l.vnode&&l.vnode(o),O(t.__P,o,r,t.__n,t.__P.namespaceURI,32&r.__u?[e]:null,c,null==e?x(r):e,!!(32&r.__u),s),o.__v=r.__v,o.__.__k[o.__i]=o,j(c,o,s),o.__e!=e&&C(o)),i.length>u&&i.sort(f));P.__r=0}function S(n,l,u,t,i,o,r,f,e,c,s){var a,v,y,d,w,_=t&&t.__k||p,g=l.length;for(u.__d=e,$(u,l,_),e=u.__d,a=0;a<g;a++)null!=(y=u.__k[a])&&\"boolean\"!=typeof y&&\"function\"!=typeof y&&(v=-1===y.__i?h:_[y.__i]||h,y.__i=a,O(n,y,v,i,o,r,f,e,c,s),d=y.__e,y.ref&&v.ref!=y.ref&&(v.ref&&N(v.ref,null,y),s.push(y.ref,y.__c||d,y)),null==w&&null!=d&&(w=d),65536&y.__u||v.__k===y.__k?(e&&\"string\"==typeof y.type&&!n.contains(e)&&(e=x(v)),e=I(y,e,n)):\"function\"==typeof y.type&&void 0!==y.__d?e=y.__d:d&&(e=d.nextSibling),y.__d=void 0,y.__u&=-196609);u.__d=e,u.__e=w}function $(n,l,u){var t,i,o,r,f,e=l.length,c=u.length,s=c,a=0;for(n.__k=[],t=0;t<e;t++)r=t+a,null!=(i=n.__k[t]=null==(i=l[t])||\"boolean\"==typeof i||\"function\"==typeof i?null:\"string\"==typeof i||\"number\"==typeof i||\"bigint\"==typeof i||i.constructor==String?g(null,i,null,null,null):y(i)?g(k,{children:i},null,null,null):void 0===i.constructor&&i.__b>0?g(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=L(i,u,r,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,\"function\"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f==r-1?a=f-r:f==r+1?a++:f>r?s>e-r?a+=f-r:a--:f<r&&a++,f!==t+a&&(i.__u|=65536))):(o=u[r])&&null==o.key&&o.__e&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=x(o)),V(o,o,!1),u[r]=null,s--);if(s)for(t=0;t<c;t++)null!=(o=u[t])&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=x(o)),V(o,o))}function I(n,l,u){var t,i;if(\"function\"==typeof n.type){for(t=n.__k,i=0;t&&i<t.length;i++)t[i]&&(t[i].__=n,l=I(t[i],l,u));return l}n.__e!=l&&(u.insertBefore(n.__e,l||null),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8===l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(y(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i=n.key,o=n.type,r=u-1,f=u+1,e=l[u];if(null===e||e&&i==e.key&&o===e.type&&0==(131072&e.__u))return u;if(t>(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f<l.length;){if(r>=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--}if(f<l.length){if((e=l[f])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return f;f++}}return-1}function T(n,l,u){\"-\"===l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||v.test(l)?u:u+\"px\"}function A(n,l,u,t,i){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]===t[l]||T(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/(PointerCapture)$|Capture$/i,\"$1\")),l=l.toLowerCase()in n||\"onFocusOut\"===l||\"onFocusIn\"===l?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=e,n.addEventListener(l,o?s:c,o)):n.removeEventListener(l,o?s:c,o);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!==l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=e++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,o,r,f,e,c,s){var a,h,p,v,w,_,g,m,x,C,M,P,$,I,H,L,T=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[e=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof T)try{if(m=u.props,x=\"prototype\"in T&&T.prototype.render,C=(a=T.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?g=(h=u.__c=t.__c).__=h.__E:(x?u.__c=h=new T(m,M):(u.__c=h=new b(m,M),h.constructor=T,h.render=q),C&&C.sub(h),h.props=m,h.state||(h.state={}),h.context=M,h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),x&&null==h.__s&&(h.__s=h.state),x&&null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=d({},h.__s)),d(h.__s,T.getDerivedStateFromProps(m,h.__s))),v=h.props,w=h.state,h.__v=u,p)x&&null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),x&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(x&&null==T.getDerivedStateFromProps&&m!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(m,M),!h.__e&&(null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(m,h.__s,M)||u.__v===t.__v)){for(u.__v!==t.__v&&(h.props=m,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.forEach(function(n){n&&(n.__=u)}),P=0;P<h._sb.length;P++)h.__h.push(h._sb[P]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(m,h.__s,M),x&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,w,_)})}if(h.context=M,h.props=m,h.__P=n,h.__e=!1,$=l.__r,I=0,x){for(h.state=h.__s,h.__d=!1,$&&$(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,$&&$(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++I<25);h.state=h.__s,null!=h.getChildContext&&(i=d(d({},i),h.getChildContext())),x&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,w)),S(n,y(L=null!=a&&a.type===k&&null==a.key?a.props.children:a)?L:[L],u,t,i,o,r,f,e,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&f.push(h),g&&(h.__E=h.__=null)}catch(n){u.__v=null,c||null!=r?(u.__e=e,u.__u|=c?160:32,r[r.indexOf(e)]=null):(u.__e=t.__e,u.__k=t.__k),l.__e(n,u,t)}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=z(t.__e,u,t,i,o,r,f,c,s);(a=l.diffed)&&a(u)}function j(n,u,t){u.__d=void 0;for(var i=0;i<t.length;i++)N(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function z(l,u,t,i,o,r,f,e,c){var s,a,p,v,d,_,g,m=t.props,k=u.props,b=u.type;if(\"svg\"===b?o=\"http://www.w3.org/2000/svg\":\"math\"===b?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=r)for(s=0;s<r.length;s++)if((d=r[s])&&\"setAttribute\"in d==!!b&&(b?d.localName===b:3===d.nodeType)){l=d,r[s]=null;break}if(null==l){if(null===b)return document.createTextNode(k);l=document.createElementNS(o,b,k.is&&k),r=null,e=!1}if(null===b)m===k||e&&l.data===k||(l.data=k);else{if(r=r&&n.call(l.childNodes),m=t.props||h,!e&&null!=r)for(m={},s=0;s<l.attributes.length;s++)m[(d=l.attributes[s]).name]=d.value;for(s in m)if(d=m[s],\"children\"==s);else if(\"dangerouslySetInnerHTML\"==s)p=d;else if(\"key\"!==s&&!(s in k)){if(\"value\"==s&&\"defaultValue\"in k||\"checked\"==s&&\"defaultChecked\"in k)continue;A(l,s,null,d,o)}for(s in k)d=k[s],\"children\"==s?v=d:\"dangerouslySetInnerHTML\"==s?a=d:\"value\"==s?_=d:\"checked\"==s?g=d:\"key\"===s||e&&\"function\"!=typeof d||m[s]===d||A(l,s,d,m[s],o);if(a)e||p&&(a.__html===p.__html||a.__html===l.innerHTML)||(l.innerHTML=a.__html),u.__k=[];else if(p&&(l.innerHTML=\"\"),S(l,y(v)?v:[v],u,t,i,\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":o,r,f,r?r[0]:t.__k&&x(t,0),e,c),null!=r)for(s=r.length;s--;)null!=r[s]&&w(r[s]);e||(s=\"value\",void 0!==_&&(_!==l[s]||\"progress\"===b&&!_||\"option\"===b&&_!==m[s])&&A(l,s,_,m[s],o),s=\"checked\",void 0!==g&&g!==l[s]&&A(l,s,g,m[s],o))}return l}function N(n,u,t){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,t)}}function V(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!==n.__e||N(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&V(i[o],u,t||\"function\"!=typeof n.type);t||null==n.__e||w(n.__e),n.__c=n.__=n.__e=n.__d=void 0}function q(n,l,u){return this.constructor(n,u)}function B(u,t,i){var o,r,f,e;l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,f=[],e=[],O(t,u=(!o&&i||t).__k=_(k,null,[u]),r||h,h,t.namespaceURI,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,f,!o&&i?i:r?r.__e:t.firstChild,o,e),j(f,u,e)}function D(n,l){B(n,l,D)}function E(l,u,t){var i,o,r,f,e=d({},l.props);for(r in l.type&&l.type.defaultProps&&(f=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=void 0===u[r]&&void 0!==f?f[r]:u[r];return arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),g(l.type,e,i||l.key,o||l.ref,null)}function G(n,l){var u={__c:l=\"__cC\"+a++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=p.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},b.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=d({},this.state),\"function\"==typeof n&&(n=n(d({},u),this.props)),n&&d(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},b.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},b.prototype.render=k,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},P.__r=0,e=0,c=F(!1),s=F(!0),a=0;export{b as Component,k as Fragment,E as cloneElement,G as createContext,_ as createElement,m as createRef,_ as h,D as hydrate,t as isValidElement,l as options,B as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","/**\n * ID of HTML DIV element which contains the feedback dialog\n */\nexport const feedbackContainerId = \"bucket-feedback-dialog-container\";\nexport const toolbarContainerId = \"bucket-toolbar-dialog-container\";\n\n/**\n * These events will be propagated to the feedback dialog\n *\n * @see [https://developer.mozilla.org/en-US/docs/Web/API/Element#events](https://developer.mozilla.org/en-US/docs/Web/API/Element#events)\n */\nexport const propagatedEvents = [\n  \"animationcancel\",\n  \"animationend\",\n  \"animationiteration\",\n  \"animationstart\",\n  \"afterscriptexecute\",\n  \"auxclick\",\n  \"beforescriptexecute\",\n  \"blur\",\n  \"click\",\n  \"compositionend\",\n  \"compositionstart\",\n  \"compositionupdate\",\n  \"contextmenu\",\n  \"copy\",\n  \"cut\",\n  \"dblclick\",\n  \"DOMActivate\",\n  \"DOMMouseScroll\",\n  \"error\",\n  \"focusin\",\n  \"focusout\",\n  \"focus\",\n  \"fullscreenchange\",\n  \"fullscreenerror\",\n  \"gesturechange\",\n  \"gestureend\",\n  \"gesturestart\",\n  \"gotpointercapture\",\n  \"keydown\",\n  \"keypress\",\n  \"keyup\",\n  \"lostpointercapture\",\n  \"mousedown\",\n  \"mouseenter\",\n  \"mouseleave\",\n  \"mousemove\",\n  \"mouseout\",\n  \"mouseover\",\n  \"mouseup\",\n  \"mousewheel\",\n  \"paste\",\n  \"pointercancel\",\n  \"pointerdown\",\n  \"pointerenter\",\n  \"pointerleave\",\n  \"pointermove\",\n  \"pointerout\",\n  \"pointerover\",\n  \"pointerup\",\n  \"scroll\",\n  \"select\",\n  \"touchcancel\",\n  \"touchend\",\n  \"touchmove\",\n  \"touchstart\",\n  \"transitioncancel\",\n  \"transitionend\",\n  \"transitionrun\",\n  \"transitionstart\",\n  \"wheel\",\n];\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n  start: 'end',\n  end: 'start'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n  return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n  const lr = ['left', 'right'];\n  const rl = ['right', 'left'];\n  const tb = ['top', 'bottom'];\n  const bt = ['bottom', 'top'];\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rl : lr;\n      return isStart ? lr : rl;\n    case 'left':\n    case 'right':\n      return isStart ? tb : bt;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...padding\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  switch (getAlignment(placement)) {\n    case 'start':\n      coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n    case 'end':\n      coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n  }\n  return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const validMiddleware = middleware.filter(Boolean);\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let middlewareData = {};\n  let resetCount = 0;\n  for (let i = 0; i < validMiddleware.length; i++) {\n    const {\n      name,\n      fn\n    } = validMiddleware[i];\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData = {\n      ...middlewareData,\n      [name]: {\n        ...middlewareData[name],\n        ...data\n      }\n    };\n    if (reset && resetCount <= 50) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const min$1 = minPadding;\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(min$1, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          // Try next placement and re-run the lifecycle.\n          return {\n            data: {\n              index: nextIndex,\n              overflows: overflowsData\n            },\n            reset: {\n              placement: nextPlacement\n            }\n          };\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            const width = right - left;\n            const height = bottom - top;\n            return {\n              top,\n              bottom,\n              left,\n              right,\n              width,\n              height,\n              x: left,\n              y: top\n            };\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          const left = minLeft;\n          const right = maxRight;\n          const width = right - left;\n          const height = bottom - top;\n          return {\n            top,\n            bottom,\n            left,\n            right,\n            width,\n            height,\n            x: left,\n            y: top\n          };\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: 0,\n    crossAxis: 0,\n    alignmentAxis: null,\n    ...rawValue\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(getSide(placement));\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      if (checkMainAxis) {\n        const minSide = mainAxis === 'y' ? 'top' : 'left';\n        const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n        const min = mainAxisCoord + overflow[minSide];\n        const max = mainAxisCoord - overflow[maxSide];\n        mainAxisCoord = clamp(min, mainAxisCoord, max);\n      }\n      if (checkCrossAxis) {\n        const minSide = crossAxis === 'y' ? 'top' : 'left';\n        const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n        const min = crossAxisCoord + overflow[minSide];\n        const max = crossAxisCoord - overflow[maxSide];\n        crossAxisCoord = clamp(min, crossAxisCoord, max);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: 0,\n        crossAxis: 0,\n        ...rawOffset\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = ['top', 'left'].includes(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const noShift = !state.middlewareData.shift;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if (isYAxis) {\n        availableWidth = alignment || noShift ? min(overflowAvailableWidth, maximumClippingWidth) : maximumClippingWidth;\n      } else {\n        availableHeight = alignment || noShift ? min(overflowAvailableHeight, maximumClippingHeight) : maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        const xMin = max(overflow.left, 0);\n        const xMax = max(overflow.right, 0);\n        const yMin = max(overflow.top, 0);\n        const yMax = max(overflow.bottom, 0);\n        if (isYAxis) {\n          availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n        } else {\n          availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  // Browsers without `ShadowRoot` support.\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n  return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n  return [':popover-open', ':modal'].some(selector => {\n    try {\n      return element.matches(selector);\n    } catch (e) {\n      return false;\n    }\n  });\n}\nfunction isContainingBlock(elementOrCss) {\n  const webkit = isWebKit();\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n  return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], win.frameElement && traverseIframes ? getOverflowAncestors(win.frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n    return false;\n  }\n  return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement) {\n    const win = getWindow(domElement);\n    const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = currentWin.frameElement;\n    while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = currentWin.frameElement;\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isHTMLElement(offsetParent)) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n  };\n}\n\nfunction getClientRects(element) {\n  return Array.from(element.getClientRects());\n}\n\nfunction getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n  const html = getDocumentElement(element);\n  const scroll = getNodeScroll(element);\n  const body = element.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\nfunction getViewportRect(element, strategy) {\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    const visualViewportBased = isWebKit();\n    if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      ...clippingAncestor,\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y\n    };\n  }\n  return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n  const parentNode = getParentNode(element);\n  if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n    return false;\n  }\n  return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let currentContainingBlockComputedStyle = null;\n  const elementIsFixed = getComputedStyle(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null;\n    }\n    const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstClippingAncestor = clippingAncestors[0];\n  const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n  const x = rect.left + scroll.scrollLeft - offsets.x;\n  const y = rect.top + scroll.scrollTop - offsets.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  return element.offsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = element.getBoundingClientRect();\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped, the ratio is 0. Throttle the refresh\n          // to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  refresh(true);\n  return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update, {\n      passive: true\n    });\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    resizeObserver.observe(floating);\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = {\n    platform,\n    ...options\n  };\n  const platformWithCache = {\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import type { Middleware, Padding } from \"@floating-ui/core\";\nimport { arrow as arrowCore, MiddlewareState } from \"@floating-ui/dom\";\nimport { RefObject } from \"preact\";\n\nexport interface Options {\n  /**\n   * The arrow element to be positioned.\n   * @default undefined\n   */\n  element: RefObject<Element | null> | Element | null;\n  /**\n   * The padding between the arrow element and the floating element edges.\n   * Useful when the floating element has rounded corners.\n   * @default 0\n   */\n  padding?: Padding;\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nexport const arrow = (\n  options: Options | ((state: MiddlewareState) => Options),\n): Middleware => {\n  function isRef(value: unknown): value is RefObject<unknown> {\n    return {}.hasOwnProperty.call(value, \"current\");\n  }\n\n  return {\n    name: \"arrow\",\n    options,\n    fn(state) {\n      const { element, padding } =\n        typeof options === \"function\" ? options(state) : options;\n\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrowCore({ element: element.current, padding }).fn(state);\n        }\n\n        return {};\n      } else if (element) {\n        return arrowCore({ element, padding }).fn(state);\n      }\n\n      return {};\n    },\n  };\n};\n","// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nexport function deepEqual(a: any, b: any) {\n  if (a === b) {\n    return true;\n  }\n\n  if (typeof a !== typeof b) {\n    return false;\n  }\n\n  if (typeof a === \"function\" && a.toString() === b.toString()) {\n    return true;\n  }\n\n  let length, i, keys;\n\n  if (a && b && typeof a == \"object\") {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0; ) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n\n    for (i = length; i-- !== 0; ) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n\n    for (i = length; i-- !== 0; ) {\n      const key = keys[i];\n      if (key === \"_owner\" && a.$$typeof) {\n        continue;\n      }\n\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return a !== a && b !== b;\n}\n","export function getDPR(element: Element): number {\n  if (typeof window === \"undefined\") {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n","import { getDPR } from \"./getDPR\";\n\nexport function roundByDPR(element: Element, value: number) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n","import { useLayoutEffect, useRef } from \"preact/hooks\";\n\nexport function useLatestRef<T>(value: T) {\n  const ref = useRef(value);\n  useLayoutEffect(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n","import { computePosition } from \"@floating-ui/dom\";\nimport {\n  useCallback,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"preact/hooks\";\n\nimport { deepEqual } from \"./utils/deepEqual\";\nimport { getDPR } from \"./utils/getDPR\";\nimport { roundByDPR } from \"./utils/roundByDPR\";\nimport { useLatestRef } from \"./utils/useLatestRef\";\nimport type {\n  ComputePositionConfig,\n  ReferenceType,\n  UseFloatingData,\n  UseFloatingOptions,\n  UseFloatingReturn,\n} from \"./types\";\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/react\n */\nexport function useFloating<RT extends ReferenceType = ReferenceType>(\n  options: UseFloatingOptions = {},\n): UseFloatingReturn<RT> {\n  const {\n    placement = \"bottom\",\n    strategy = \"absolute\",\n    middleware = [],\n    platform,\n    elements: { reference: externalReference, floating: externalFloating } = {},\n    transform = true,\n    whileElementsMounted,\n    open,\n  } = options;\n\n  const [data, setData] = useState<UseFloatingData>({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false,\n  });\n\n  const [latestMiddleware, setLatestMiddleware] = useState(middleware);\n\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n\n  const [_reference, _setReference] = useState<RT | null>(null);\n  const [_floating, _setFloating] = useState<HTMLElement | null>(null);\n\n  const setReference = useCallback(\n    (node: RT | null) => {\n      if (node != referenceRef.current) {\n        referenceRef.current = node;\n        _setReference(node);\n      }\n    },\n    [_setReference],\n  );\n\n  const setFloating = useCallback(\n    (node: HTMLElement | null) => {\n      if (node !== floatingRef.current) {\n        floatingRef.current = node;\n        _setFloating(node);\n      }\n    },\n    [_setFloating],\n  );\n\n  const referenceEl = (externalReference || _reference) as RT | null;\n  const floatingEl = externalFloating || _floating;\n\n  const referenceRef = useRef<RT | null>(null);\n  const floatingRef = useRef<HTMLElement | null>(null);\n  const dataRef = useRef(data);\n\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n\n  const update = useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n\n    const config: ComputePositionConfig = {\n      placement,\n      strategy,\n      middleware: latestMiddleware,\n    };\n\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n\n    /*eslint-disable-next-line @typescript-eslint/no-floating-promises*/\n    computePosition(referenceRef.current, floatingRef.current, config).then(\n      (positionData) => {\n        const fullData = { ...positionData, isPositioned: true };\n        if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n          dataRef.current = fullData;\n          setData(fullData);\n        }\n      },\n    );\n  }, [latestMiddleware, placement, strategy, platformRef]);\n\n  useLayoutEffect(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData((positionData) => ({ ...positionData, isPositioned: false }));\n    }\n  }, [open]);\n\n  const isMountedRef = useRef(false);\n  useLayoutEffect(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n\n  useLayoutEffect(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      } else {\n        return update();\n      }\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef]);\n\n  const refs = useMemo(\n    () => ({\n      reference: referenceRef,\n      floating: floatingRef,\n      setReference,\n      setFloating,\n    }),\n    [setReference, setFloating],\n  );\n\n  const elements = useMemo(\n    () => ({ reference: referenceEl, floating: floatingEl }),\n    [referenceEl, floatingEl],\n  );\n\n  const floatingStyles = useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0,\n    };\n\n    if (!elements.floating) {\n      return initialStyles;\n    }\n\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: `translate(${x}px, ${y}px)`,\n        ...(getDPR(elements.floating) >= 1.5 && { willChange: \"transform\" }),\n      };\n    }\n\n    return {\n      position: strategy,\n      left: x,\n      top: y,\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n\n  return useMemo(\n    () => ({\n      ...data,\n      update,\n      refs,\n      elements,\n      floatingStyles,\n    }),\n    [data, update, refs, elements, floatingStyles],\n  );\n}\n","import { propagatedEvents } from \"./constants\";\nimport { Offset } from \"./types\";\n\nfunction stopPropagation(e: Event) {\n  e.stopPropagation();\n}\n\nexport function attachContainer(containerId: string) {\n  let container = document.querySelector(`#${containerId}`);\n\n  if (!container) {\n    container = document.createElement(\"div\");\n    container.attachShadow({ mode: \"open\" });\n    (container as HTMLElement).style.all = \"initial\";\n    container.id = containerId;\n    document.body.appendChild(container);\n\n    for (const event of propagatedEvents) {\n      container.addEventListener(event, stopPropagation, { passive: true });\n    }\n  }\n\n  return container.shadowRoot!;\n}\n\nfunction parseOffset(offsetInput?: Offset[\"x\"] | Offset[\"y\"]) {\n  if (offsetInput === undefined) return \"1rem\";\n  if (typeof offsetInput === \"number\") return offsetInput + \"px\";\n\n  return offsetInput;\n}\n\nexport function parseUnanchoredPosition(position: {\n  offset?: Offset;\n  placement: string;\n}) {\n  const offsetY = parseOffset(position.offset?.y);\n  const offsetX = parseOffset(position.offset?.x);\n\n  switch (position.placement) {\n    case \"top-left\":\n      return {\n        top: offsetY,\n        left: offsetX,\n      };\n    case \"top-right\":\n      return {\n        top: offsetY,\n        right: offsetX,\n      };\n    case \"bottom-left\":\n      return {\n        bottom: offsetY,\n        left: offsetX,\n      };\n    case \"bottom-right\":\n      return {\n        bottom: offsetY,\n        right: offsetX,\n      };\n    default:\n      console.error(\"[Bucket]\", \"Invalid placement\", position.placement);\n      return parseUnanchoredPosition({ placement: \"bottom-right\" });\n  }\n}\n","import { MiddlewareData, Placement } from \"@floating-ui/dom\";\nimport { Fragment, FunctionComponent, h, Ref } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport {\n  arrow,\n  autoUpdate,\n  flip,\n  offset,\n  shift,\n  useFloating,\n} from \"./packages/floating-ui-preact-dom\";\nimport styles from \"./Dialog.css?inline\";\nimport { Position } from \"./types\";\nimport { parseUnanchoredPosition } from \"./utils\";\n\ntype CssPosition = Partial<\n  Record<\"top\" | \"left\" | \"right\" | \"bottom\", number | string>\n>;\n\nexport interface OpenDialogOptions {\n  /**\n   * Control the placement and behavior of the dialog.\n   */\n  position: Position;\n\n  strategy?: \"fixed\" | \"absolute\";\n\n  isOpen: boolean;\n  close: () => void;\n  onDismiss?: () => void;\n\n  containerId: string;\n\n  showArrow?: boolean;\n\n  children?: preact.ComponentChildren;\n}\n\nexport function useDialog({\n  onClose,\n  onOpen,\n  initialValue = false,\n}: {\n  onClose?: () => void;\n  onOpen?: () => void;\n  initialValue?: boolean;\n} = {}) {\n  const [isOpen, setIsOpen] = useState<boolean>(initialValue);\n\n  const open = useCallback(() => {\n    setIsOpen(true);\n    onOpen?.();\n  }, [onOpen]);\n  const close = useCallback(() => {\n    setIsOpen(false);\n    onClose?.();\n  }, [onClose]);\n  const toggle = useCallback(() => {\n    if (isOpen) onClose?.();\n    else onOpen?.();\n    setIsOpen((prev) => !prev);\n  }, [isOpen, onClose, onOpen]);\n\n  return {\n    isOpen,\n    open,\n    close,\n    toggle,\n  };\n}\n\nexport const Dialog: FunctionComponent<OpenDialogOptions> = ({\n  position,\n  isOpen,\n  close,\n  onDismiss,\n  containerId,\n  strategy,\n  children,\n  showArrow = true,\n}) => {\n  const arrowRef = useRef<HTMLDivElement>(null);\n  const dialogRef = useRef<HTMLDialogElement>(null);\n\n  const anchor = position.type === \"POPOVER\" ? position.anchor : null;\n  const placement =\n    position.type === \"POPOVER\" ? position.placement : undefined;\n\n  const {\n    refs,\n    floatingStyles,\n    middlewareData,\n    placement: actualPlacement,\n  } = useFloating({\n    elements: {\n      reference: anchor,\n    },\n    strategy,\n    transform: false,\n    placement,\n    whileElementsMounted: autoUpdate,\n    middleware: [\n      flip({\n        padding: 10,\n        mainAxis: true,\n        crossAxis: true,\n      }),\n      shift(),\n      offset(8),\n      arrow({\n        element: arrowRef,\n      }),\n    ],\n  });\n\n  let unanchoredPosition: CssPosition = {};\n  if (position.type === \"DIALOG\") {\n    unanchoredPosition = parseUnanchoredPosition(position);\n  }\n\n  const dismiss = useCallback(() => {\n    close();\n    onDismiss?.();\n  }, [close, onDismiss]);\n\n  useEffect(() => {\n    // Only enable 'quick dismiss' for popovers\n    if (position.type === \"MODAL\" || position.type === \"DIALOG\") return;\n\n    const escapeHandler = (e: KeyboardEvent) => {\n      if (e.key == \"Escape\") {\n        dismiss();\n      }\n    };\n\n    const clickOutsideHandler = (e: MouseEvent) => {\n      if (\n        !(e.target instanceof Element) ||\n        !e.target.closest(`#${containerId}`)\n      ) {\n        dismiss();\n      }\n    };\n\n    const observer = new MutationObserver((mutations) => {\n      if (position.anchor === null) return;\n\n      mutations.forEach((mutation) => {\n        const removedNodes = Array.from(mutation.removedNodes);\n        const hasBeenRemoved = removedNodes.some((node) => {\n          return node === position.anchor || node.contains(position.anchor);\n        });\n\n        if (hasBeenRemoved) {\n          close();\n        }\n      });\n    });\n\n    window.addEventListener(\"mousedown\", clickOutsideHandler);\n    window.addEventListener(\"keydown\", escapeHandler);\n    observer.observe(document.body, {\n      subtree: true,\n      childList: true,\n    });\n\n    return () => {\n      window.removeEventListener(\"mousedown\", clickOutsideHandler);\n      window.removeEventListener(\"keydown\", escapeHandler);\n      observer.disconnect();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- anchor only exists in popover\n  }, [position.type, close, (position as any).anchor, dismiss, containerId]);\n\n  function setDiagRef(node: HTMLDialogElement | null) {\n    refs.setFloating(node);\n    dialogRef.current = node;\n  }\n\n  useEffect(() => {\n    if (!dialogRef.current) return;\n    if (isOpen && !dialogRef.current.hasAttribute(\"open\")) {\n      dialogRef.current[position.type === \"MODAL\" ? \"showModal\" : \"show\"]();\n    }\n    if (!isOpen && dialogRef.current.hasAttribute(\"open\")) {\n      dialogRef.current.close();\n    }\n  }, [dialogRef, isOpen, position.type]);\n\n  const classes = [\n    \"dialog\",\n    position.type === \"MODAL\"\n      ? \"modal\"\n      : position.type === \"POPOVER\"\n        ? \"anchored\"\n        : `unanchored unanchored-${position.placement}`,\n    actualPlacement,\n  ].join(\" \");\n\n  return (\n    <>\n      <style dangerouslySetInnerHTML={{ __html: styles }} />\n      <dialog\n        ref={setDiagRef}\n        class={classes}\n        style={anchor ? floatingStyles : unanchoredPosition}\n      >\n        {children && <Fragment>{children}</Fragment>}\n\n        {anchor && showArrow && (\n          <DialogArrow\n            arrowData={middlewareData?.arrow}\n            arrowRef={arrowRef}\n            placement={actualPlacement}\n          />\n        )}\n      </dialog>\n    </>\n  );\n};\n\nfunction DialogArrow({\n  arrowData,\n  arrowRef,\n  placement,\n}: {\n  arrowData: MiddlewareData[\"arrow\"];\n  arrowRef: Ref<HTMLDivElement>;\n  placement: Placement;\n}) {\n  const { x: arrowX, y: arrowY } = arrowData ?? {};\n\n  const staticSide =\n    {\n      top: \"bottom\",\n      right: \"left\",\n      bottom: \"top\",\n      left: \"right\",\n    }[placement.split(\"-\")[0]] || \"bottom\";\n\n  const arrowStyles = {\n    left: arrowX != null ? `${arrowX}px` : \"\",\n    top: arrowY != null ? `${arrowY}px` : \"\",\n    right: \"\",\n    bottom: \"\",\n    [staticSide]: \"-4px\",\n  };\n  return (\n    <div\n      ref={arrowRef}\n      class={[\"arrow\", placement].join(\" \")}\n      style={arrowStyles}\n    />\n  );\n}\n\nexport function DialogHeader({\n  children,\n  innerRef,\n}: {\n  children: preact.ComponentChildren;\n  innerRef?: Ref<HTMLElement>;\n}) {\n  return (\n    <header ref={innerRef} class=\"dialog-header\">\n      {children}\n    </header>\n  );\n}\n\nexport function DialogContent({\n  children,\n  innerRef,\n}: {\n  children: preact.ComponentChildren;\n  innerRef?: Ref<HTMLDivElement>;\n}) {\n  return (\n    <div ref={innerRef} class=\"dialog-content\">\n      {children}\n    </div>\n  );\n}\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Close: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12.0007 10.5865L16.9504 5.63672L18.3646 7.05093L13.4149 12.0007L18.3646 16.9504L16.9504 18.3646L12.0007 13.4149L7.05093 18.3646L5.63672 16.9504L10.5865 12.0007L5.63672 7.05093L7.05093 5.63672L12.0007 10.5865Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FeedbackTranslations } from \"../types\";\n/**\n * {@includeCode ./defaultTranslations.tsx}\n */\nexport const DEFAULT_TRANSLATIONS: FeedbackTranslations = {\n  DefaultQuestionLabel: \"How satisfied are you with this feature?\",\n  QuestionPlaceholder: \"Write a comment\",\n  ScoreStatusDescription: \"Pick a score and leave a comment\",\n  ScoreStatusLoading: \"Saving score, please wait...\",\n  ScoreStatusReceived: \"Score has been received!\",\n  ScoreVeryDissatisfiedLabel: \"Very dissatisfied (1/5)\",\n  ScoreDissatisfiedLabel: \"Dissatisfied (2/5)\",\n  ScoreNeutralLabel: \"Neutral (3/5)\",\n  ScoreSatisfiedLabel: \"Satisfied (4/5)\",\n  ScoreVerySatisfiedLabel: \"Very satisfied (5/5)\",\n  SuccessMessage: \"Feedback received, thank you!\",\n  SendButton: \"Send feedback\",\n};\n","import { useCallback, useEffect, useState } from \"preact/hooks\";\n\nexport const useTimer = ({\n  initialDuration,\n  enabled,\n  onEnd,\n}: {\n  initialDuration: number;\n  enabled: boolean;\n  onEnd: () => void;\n}): {\n  duration: number;\n  elapsedFraction: number;\n  startTime: number;\n  endTime: number;\n  stopped: boolean;\n  startWithDuration: (duration: number) => void;\n  stop: () => void;\n} => {\n  const [stopped, setStopped] = useState(!enabled);\n  const [duration, setDuration] = useState(initialDuration);\n  const [startTime, setStartTime] = useState(Date.now());\n  const [currentTime, setCurrentTime] = useState(Date.now());\n\n  useEffect(() => {\n    if (stopped) return;\n\n    const t = setInterval(() => {\n      setCurrentTime(Date.now());\n\n      if (Date.now() >= startTime + duration) {\n        clearTimeout(t);\n        setStopped(true);\n        onEnd();\n      }\n    }, 25);\n\n    return () => {\n      clearTimeout(t);\n    };\n  }, [duration, onEnd, startTime, stopped]);\n\n  const stop = useCallback(() => {\n    setStopped(true);\n  }, []);\n\n  const startWithDuration = useCallback((nextDuration: number) => {\n    setStartTime(Date.now());\n    setDuration(nextDuration);\n    setStopped(false);\n  }, []);\n\n  const endTime = startTime + duration;\n  const elapsedMs = stopped ? 0 : currentTime - startTime;\n  const elapsedFraction = elapsedMs / duration;\n\n  return {\n    duration,\n    elapsedFraction,\n    startTime,\n    endTime,\n    stopped,\n    startWithDuration,\n    stop,\n  };\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Check: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"m10 15.17l9.193-9.191l1.414 1.414l-10.606 10.606l-6.364-6.364l1.414-1.414l4.95 4.95Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const CheckCircle: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 24C5.3724 24 0 18.6276 0 12C0 5.3724 5.3724 0 12 0C18.6276 0 24 5.3724 24 12C24 18.6276 18.6276 24 12 24ZM10.8036 16.8L19.2876 8.3148L17.5908 6.618L10.8036 13.4064L7.4088 10.0116L5.712 11.7084L10.8036 16.8Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport type ButtonProps = h.JSX.HTMLAttributes<HTMLButtonElement> & {\n  variant?: \"primary\" | \"secondary\";\n};\n\nexport const Button: FunctionComponent<ButtonProps> = ({\n  variant = \"primary\",\n  children,\n  ...rest\n}) => {\n  const classes = [\"button\", variant].join(\" \");\n\n  return (\n    <button class={classes} {...rest}>\n      {children}\n    </button>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Logo: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props = { height: \"10px\", width: \"10px\" },\n) => (\n  <svg\n    viewBox=\"0 0 300 316\"\n    width=\"10px\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      clipRule=\"evenodd\"\n      d=\"M149.608 33.1691C114.541 33.1691 88.1957 34.0727 68.6978 35.2674C45.9877 36.6589 31.2447 53.6165 32.7413 77.1477C33.9788 96.6049 36.0938 122.855 39.6451 157.89C44.0755 201.599 48.0467 231.615 51.1923 251.815C53.8983 269.193 66.5685 280.724 83.8252 281.651C99.4409 282.49 120.822 283.137 149.608 283.137C178.991 283.137 200.659 282.463 216.355 281.599C232.793 280.694 244.886 269.593 247.467 252.738C249.007 242.679 250.794 230.104 252.816 214.471C254.076 204.729 255.427 193.799 256.866 181.551C257.741 174.108 258.648 166.178 259.588 157.731C263.785 119.994 266.075 92.6244 267.274 72.9772C268.564 51.838 255.492 36.9197 234.632 35.5304C214.779 34.208 187.208 33.1691 149.608 33.1691ZM66.7035 2.65939C86.9741 1.41736 113.994 0.5 149.608 0.5C187.792 0.5 216.098 1.55452 236.8 2.93336C275.829 5.53288 302.222 36.1432 299.852 74.9692C298.613 95.2768 296.268 123.202 292.026 161.346C287.025 206.312 282.898 236.995 279.729 257.688C274.896 289.249 250.57 312.434 218.147 314.218C201.752 315.121 179.476 315.806 149.608 315.806C120.346 315.806 98.3726 315.149 82.0761 314.273C49.1273 312.503 23.9794 289.192 18.9427 256.846C15.6873 235.941 11.6471 205.329 7.17277 161.187C3.58873 125.829 1.43655 99.164 0.168272 79.2232C-2.42412 38.4637 25.1723 5.20409 66.7035 2.65939Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n    <path\n      clipRule=\"evenodd\"\n      d=\"M150.869 165.962C150.29 165.209 149.718 164.45 149.156 163.684C144.318 157.097 140.113 150.016 136.63 142.531C132.143 132.889 136.224 124.122 143.367 120.398C151.531 116.142 162.346 120.398 166.226 128.738C169.442 135.653 173.494 142.1 178.25 147.949C193.08 166.186 214.765 178.615 239.375 181.302C242.678 181.662 246.035 181.848 249.434 181.848C251.936 181.848 254.415 181.747 256.866 181.551C260.357 181.848 256.071 214.471 252.816 214.471C251.692 214.501 250.565 214.517 249.434 214.517C245.891 214.517 242.383 214.368 238.915 214.078C203.102 211.075 171.603 192.885 150.869 165.962Z\"\n      fill=\"currentColor\"\n      fillRule=\"evenodd\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nimport { Logo } from \"../../ui/icons/Logo\";\n\nexport const Plug: FunctionComponent = () => {\n  return (\n    <footer class=\"plug\">\n      <a href=\"https://bucket.co\" rel=\"noreferrer\" target=\"_blank\">\n        Powered by <Logo height=\"10px\" width=\"10px\" /> Bucket\n      </a>\n    </footer>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Dissatisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M12 15C13.1835 15 14.2712 15.4113 15.1279 16.0991C15.4665 16.3709 15.4398 16.8738 15.1187 17.166C14.8962 17.3685 14.5788 17.4225 14.2915 17.3332C13.605 17.1198 12.8259 17 12 17C11.1741 17 10.3949 17.1205 9.70841 17.3331C9.42116 17.422 9.104 17.3677 8.88161 17.1653C8.56025 16.8728 8.53318 16.3695 8.87206 16.0976C9.2087 15.8274 9.57986 15.6014 9.97666 15.426C10.6139 15.1442 11.3032 14.9991 12 15ZM8.5 10C8.89783 10 9.27936 10.158 9.56066 10.4393C9.84197 10.7206 10 11.1022 10 11.5C10 11.8978 9.84197 12.2794 9.56066 12.5607C9.27936 12.842 8.89783 13 8.5 13C8.10218 13 7.72065 12.842 7.43934 12.5607C7.15804 12.2794 7 11.8978 7 11.5C7 11.1022 7.15804 10.7206 7.43934 10.4393C7.72065 10.158 8.10218 10 8.5 10ZM15.5 10C15.8978 10 16.2794 10.158 16.5607 10.4393C16.842 10.7206 17 11.1022 17 11.5C17 11.8978 16.842 12.2794 16.5607 12.5607C16.2794 12.842 15.8978 13 15.5 13C15.1022 13 14.7206 12.842 14.4393 12.5607C14.158 12.2794 14 11.8978 14 11.5C14 11.1022 14.158 10.7206 14.4393 10.4393C14.7206 10.158 15.1022 10 15.5 10Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Neutral: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20ZM8 15C8 14.4477 8.44771 14 9 14H15C15.5523 14 16 14.4477 16 15V15C16 15.5523 15.5523 16 15 16H9C8.44771 16 8 15.5523 8 15V15ZM8 11C7.60217 11 7.22064 10.842 6.93934 10.5607C6.65803 10.2794 6.5 9.89782 6.5 9.5C6.5 9.10217 6.65803 8.72064 6.93934 8.43934C7.22064 8.15803 7.60217 8 8 8C8.39782 8 8.77935 8.15803 9.06066 8.43934C9.34196 8.72064 9.5 9.10217 9.5 9.5C9.5 9.89782 9.34196 10.2794 9.06066 10.5607C8.77935 10.842 8.39782 11 8 11ZM16 11C15.6022 11 15.2206 10.842 14.9393 10.5607C14.658 10.2794 14.5 9.89782 14.5 9.5C14.5 9.10217 14.658 8.72064 14.9393 8.43934C15.2206 8.15803 15.6022 8 16 8C16.3978 8 16.7794 8.15803 17.0607 8.43934C17.342 8.72064 17.5 9.10217 17.5 9.5C17.5 9.89782 17.342 10.2794 17.0607 10.5607C16.7794 10.842 16.3978 11 16 11Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Satisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20ZM8 11C7.60217 11 7.22064 10.842 6.93934 10.5607C6.65803 10.2794 6.5 9.89782 6.5 9.5C6.5 9.10217 6.65803 8.72064 6.93934 8.43934C7.22064 8.15803 7.60217 8 8 8C8.39782 8 8.77935 8.15803 9.06066 8.43934C9.34196 8.72064 9.5 9.10217 9.5 9.5C9.5 9.89782 9.34196 10.2794 9.06066 10.5607C8.77935 10.842 8.39782 11 8 11ZM16 11C15.6022 11 15.2206 10.842 14.9393 10.5607C14.658 10.2794 14.5 9.89782 14.5 9.5C14.5 9.10217 14.658 8.72064 14.9393 8.43934C15.2206 8.15803 15.6022 8 16 8C16.3978 8 16.7794 8.15803 17.0607 8.43934C17.342 8.72064 17.5 9.10217 17.5 9.5C17.5 9.89782 17.342 10.2794 17.0607 10.5607C16.7794 10.842 16.3978 11 16 11Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M7.79862 15.4322C8.85269 16.5065 10.4964 17.4971 11.9993 17.4971C13.5011 17.4971 15.1701 16.5079 16.2097 15.4351C16.5083 15.1269 16.4581 14.6416 16.1408 14.3528C15.9042 14.1375 15.5656 14.0777 15.2972 14.2517C14.5161 14.7578 13.4271 15.7002 11.9993 15.7002C10.5688 15.7002 9.47831 14.7549 8.69694 14.2486C8.43116 14.0764 8.09564 14.1353 7.86141 14.3485C7.5435 14.6378 7.49757 15.1254 7.79862 15.4322Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const VeryDissatisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22ZM12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20ZM8 17C7.44771 17 6.98992 16.5479 7.09965 16.0066C7.29346 15.0506 7.76447 14.1645 8.46447 13.4645C9.40215 12.5268 10.6739 12 12 12C13.3261 12 14.5979 12.5268 15.5355 13.4645C16.2355 14.1645 16.7065 15.0506 16.9003 16.0066C17.0101 16.5479 16.5523 17 16 17V17C15.4477 17 15.0156 16.5403 14.8349 16.0184C14.6877 15.5934 14.4454 15.2028 14.1213 14.8787C13.5587 14.3161 12.7956 14 12 14C11.2043 14 10.4413 14.3161 9.87868 14.8787C9.55459 15.2028 9.31232 15.5934 9.16513 16.0184C8.98442 16.5403 8.55228 17 8 17V17ZM8 11C7.60217 11 7.22064 10.842 6.93934 10.5607C6.65803 10.2794 6.5 9.89782 6.5 9.5C6.5 9.10217 6.65803 8.72064 6.93934 8.43934C7.22064 8.15803 7.60217 8 8 8C8.39782 8 8.77935 8.15803 9.06066 8.43934C9.34196 8.72064 9.5 9.10217 9.5 9.5C9.5 9.89782 9.34196 10.2794 9.06066 10.5607C8.77935 10.842 8.39782 11 8 11ZM16 11C15.6022 11 15.2206 10.842 14.9393 10.5607C14.658 10.2794 14.5 9.89782 14.5 9.5C14.5 9.10217 14.658 8.72064 14.9393 8.43934C15.2206 8.15803 15.6022 8 16 8C16.3978 8 16.7794 8.15803 17.0607 8.43934C17.342 8.72064 17.5 9.10217 17.5 9.5C17.5 9.89782 17.342 10.2794 17.0607 10.5607C16.7794 10.842 16.3978 11 16 11Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { FunctionComponent, h } from \"preact\";\n\nexport const VerySatisfied: FunctionComponent<\n  h.JSX.SVGAttributes<SVGSVGElement>\n> = (props) => (\n  <svg\n    fill=\"none\"\n    height=\"22\"\n    viewBox=\"0 0 24 24\"\n    width=\"22\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M12 2C17.523 2 22 6.477 22 12C22 17.523 17.523 22 12 22C6.477 22 2 17.523 2 12C2 6.477 6.477 2 12 2ZM12 4C9.87827 4 7.84344 4.84285 6.34315 6.34315C4.84285 7.84344 4 9.87827 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84344 19.1571 9.87827 20 12 20C14.1217 20 16.1566 19.1571 17.6569 17.6569C19.1571 16.1566 20 14.1217 20 12C20 9.87827 19.1571 7.84344 17.6569 6.34315C16.1566 4.84285 14.1217 4 12 4ZM12 12C14 12 15.667 12.333 17 13C17 14.3261 16.4732 15.5979 15.5355 16.5355C14.5979 17.4732 13.3261 18 12 18C10.6739 18 9.40215 17.4732 8.46447 16.5355C7.52678 15.5979 7 14.3261 7 13C8.333 12.333 10 12 12 12ZM8.5 7C9.07633 6.99988 9.63499 7.19889 10.0815 7.56335C10.5279 7.9278 10.8347 8.43532 10.95 9H6.05C6.16526 8.43532 6.47209 7.9278 6.91855 7.56335C7.36501 7.19889 7.92367 6.99988 8.5 7ZM15.5 7C16.0763 6.99988 16.635 7.19889 17.0814 7.56335C17.5279 7.9278 17.8347 8.43532 17.95 9H13.05C13.1653 8.43532 13.4721 7.9278 13.9185 7.56335C14.365 7.19889 14.9237 6.99988 15.5 7Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { Fragment, FunctionComponent, h } from \"preact\";\nimport { useRef } from \"preact/hooks\";\n\nimport { Dissatisfied } from \"../../ui/icons/Dissatisfied\";\nimport { Neutral } from \"../../ui/icons/Neutral\";\nimport { Satisfied } from \"../../ui/icons/Satisfied\";\nimport { VeryDissatisfied } from \"../../ui/icons/VeryDissatisfied\";\nimport { VerySatisfied } from \"../../ui/icons/VerySatisfied\";\nimport {\n  arrow,\n  offset,\n  useFloating,\n} from \"../../ui/packages/floating-ui-preact-dom\";\n\nimport { FeedbackTranslations } from \"./types\";\n\nconst scores = [\n  {\n    color: \"var(--bucket-feedback-dialog-rating-1-color, #dd6b20)\",\n    bg: \"var(--bucket-feedback-dialog-rating-1-background-color, #fbd38d)\",\n    icon: <VeryDissatisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreVeryDissatisfiedLabel,\n    value: 1,\n  },\n  {\n    color: \"var(--bucket-feedback-dialog-rating-2-color, #ed8936)\",\n    bg: \"var(--bucket-feedback-dialog-rating-2-background-color, #feebc8)\",\n    icon: <Dissatisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreDissatisfiedLabel,\n    value: 2,\n  },\n  {\n    color: \"var(--bucket-feedback-dialog-rating-3-color, #787c91)\",\n    bg: \"var(--bucket-feedback-dialog-rating-3-background-color, #e9e9ed)\",\n    icon: <Neutral />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreNeutralLabel,\n    value: 3,\n  },\n  {\n    color: \"var(--bucket-feedback-dialog-rating-4-color, #48bb78)\",\n    bg: \"var(--bucket-feedback-dialog-rating-4-background-color, #c6f6d5)\",\n    icon: <Satisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreSatisfiedLabel,\n    value: 4,\n  },\n  {\n    color: \"var(--bucket-feedback-dialog-rating-5-color, #38a169)\",\n    bg: \"var(--bucket-feedback-dialog-rating-5-background-color, #9ae6b4)\",\n    icon: <VerySatisfied />,\n    getLabel: (t: FeedbackTranslations) => t.ScoreVerySatisfiedLabel,\n    value: 5,\n  },\n] as const;\n\ntype ScoreNumber = (typeof scores)[number];\n\nexport type StarRatingProps = {\n  name: string;\n  selectedValue?: number;\n  onChange?: h.JSX.GenericEventHandler<HTMLInputElement>;\n  t: FeedbackTranslations;\n};\n\nexport const StarRating: FunctionComponent<StarRatingProps> = ({\n  t,\n  name,\n  selectedValue,\n  onChange,\n}) => {\n  return (\n    <div class=\"star-rating\">\n      <style>\n        {scores.map(\n          ({ bg, color }, index) => `\n            .star-rating-icons > input:nth-of-type(${\n              index + 1\n            }):checked + .button {\n              border-color: ${color};\n            }\n\n            .star-rating-icons > input:nth-of-type(${\n              index + 1\n            }):checked + .button > div {\n              background-color: ${bg};\n            }\n\n            .star-rating-icons > input:nth-of-type(${\n              index + 1\n            }):checked ~ input:nth-of-type(${index + 2}) + .button {\n              border-left-color: ${color};\n            }\n          `,\n        )}\n      </style>\n      <div class=\"star-rating-icons\">\n        {scores.map((score) => (\n          <Score\n            key={score.value}\n            isSelected={score.value === selectedValue}\n            name={name}\n            score={score}\n            t={t}\n            onChange={onChange}\n          />\n        ))}\n      </div>\n    </div>\n  );\n};\n\nconst Score = ({\n  isSelected,\n  name,\n  onChange,\n  score,\n  t,\n}: {\n  isSelected: boolean;\n  name: string;\n  onChange?: h.JSX.GenericEventHandler<HTMLInputElement>;\n  score: ScoreNumber;\n  t: FeedbackTranslations;\n}) => {\n  const arrowRef = useRef<HTMLDivElement>(null);\n  const { refs, floatingStyles, middlewareData } = useFloating({\n    placement: \"top\",\n    middleware: [\n      offset(4),\n      arrow({\n        element: arrowRef,\n      }),\n    ],\n  });\n\n  return (\n    <>\n      <input\n        defaultChecked={isSelected}\n        id={`bucket-feedback-score-${score.value}`}\n        name={name}\n        type=\"radio\"\n        value={score.value}\n        onChange={onChange}\n      />\n      <label\n        ref={refs.setReference}\n        aria-label={score.getLabel(t)}\n        class=\"button\"\n        for={`bucket-feedback-score-${score.value}`}\n        style={{ color: score.color }}\n      >\n        <div\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            width: \"100%\",\n            height: \"100%\",\n            opacity: 0.2, // TODO: fix overflow\n            zIndex: 1,\n          }}\n        />\n        <span style={{ zIndex: 2, display: \"flex\", alignItems: \"center\" }}>\n          {score.icon}\n        </span>\n      </label>\n      <div ref={refs.setFloating} class=\"button-tooltip\" style={floatingStyles}>\n        {score.getLabel(t)}\n        <div\n          ref={arrowRef}\n          class=\"button-tooltip-arrow\"\n          style={{\n            left:\n              middlewareData.arrow?.x != null\n                ? `${middlewareData.arrow.x}px`\n                : \"\",\n            top:\n              middlewareData.arrow?.y != null\n                ? `${middlewareData.arrow.y}px`\n                : \"\",\n          }}\n        />\n      </div>\n    </>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport { Check } from \"../../ui/icons/Check\";\nimport { CheckCircle } from \"../../ui/icons/CheckCircle\";\n\nimport { Button } from \"./Button\";\nimport { Plug } from \"./Plug\";\nimport { StarRating } from \"./StarRating\";\nimport {\n  FeedbackScoreSubmission,\n  FeedbackSubmission,\n  FeedbackTranslations,\n} from \"./types\";\n\nconst ANIMATION_SPEED = 400;\n\nfunction getFeedbackDataFromForm(el: HTMLFormElement) {\n  const formData = new FormData(el);\n  return {\n    score: Number(formData.get(\"score\")?.toString()),\n    comment: (formData.get(\"comment\")?.toString() || \"\").trim(),\n  };\n}\n\ntype FeedbackFormProps = {\n  t: FeedbackTranslations;\n  question: string;\n  scoreState: \"idle\" | \"submitting\" | \"submitted\";\n  openWithCommentVisible: boolean;\n  onInteraction: () => void;\n  onSubmit: (\n    data: Omit<FeedbackSubmission, \"feebackId\">,\n  ) => Promise<void> | void;\n  onScoreSubmit: (\n    score: Omit<FeedbackScoreSubmission, \"feebackId\">,\n  ) => Promise<void> | void;\n};\n\nexport const FeedbackForm: FunctionComponent<FeedbackFormProps> = ({\n  question,\n  scoreState,\n  openWithCommentVisible,\n  onInteraction,\n  onSubmit,\n  onScoreSubmit,\n  t,\n}) => {\n  const [hasRating, setHasRating] = useState(false);\n  const [status, setStatus] = useState<\"idle\" | \"submitting\" | \"submitted\">(\n    \"idle\",\n  );\n  const [error, setError] = useState<string>();\n  const [showForm, setShowForm] = useState(true);\n\n  const handleSubmit: h.JSX.GenericEventHandler<HTMLFormElement> = async (\n    e,\n  ) => {\n    e.preventDefault();\n    const data: FeedbackSubmission = {\n      ...getFeedbackDataFromForm(e.target as HTMLFormElement),\n      question,\n    };\n    if (!data.score) return;\n    setError(\"\");\n    try {\n      setStatus(\"submitting\");\n      await onSubmit(data);\n      setStatus(\"submitted\");\n    } catch (err) {\n      setStatus(\"idle\");\n      if (err instanceof Error) {\n        setError(err.message);\n      } else if (typeof err === \"string\") {\n        setError(err);\n      } else {\n        setError(\"Couldn't submit feedback. Please try again.\");\n      }\n    }\n  };\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const formRef = useRef<HTMLFormElement>(null);\n  const headerRef = useRef<HTMLDivElement>(null);\n  const expandedContentRef = useRef<HTMLDivElement>(null);\n  const submittedRef = useRef<HTMLDivElement>(null);\n\n  const transitionToDefault = useCallback(() => {\n    if (containerRef.current === null) return;\n    if (headerRef.current === null) return;\n    if (expandedContentRef.current === null) return;\n\n    containerRef.current.style.maxHeight = `${headerRef.current.clientHeight}px`;\n\n    expandedContentRef.current.style.position = \"absolute\";\n    expandedContentRef.current.style.opacity = \"0\";\n    expandedContentRef.current.style.pointerEvents = \"none\";\n  }, [containerRef, headerRef, expandedContentRef]);\n\n  const transitionToExpanded = useCallback(() => {\n    if (containerRef.current === null) return;\n    if (headerRef.current === null) return;\n    if (expandedContentRef.current === null) return;\n\n    containerRef.current.style.maxHeight = `${\n      headerRef.current.clientHeight + // Header height\n      expandedContentRef.current.clientHeight + // Comment + Button Height\n      10 // Gap height\n    }px`;\n\n    expandedContentRef.current.style.position = \"relative\";\n    expandedContentRef.current.style.opacity = \"1\";\n    expandedContentRef.current.style.pointerEvents = \"all\";\n  }, [containerRef, headerRef, expandedContentRef]);\n\n  const transitionToSuccess = useCallback(() => {\n    if (containerRef.current === null) return;\n    if (formRef.current === null) return;\n    if (submittedRef.current === null) return;\n\n    formRef.current.style.opacity = \"0\";\n    formRef.current.style.pointerEvents = \"none\";\n    containerRef.current.style.maxHeight = `${submittedRef.current.clientHeight}px`;\n\n    // Fade in \"submitted\" step once container has resized\n    setTimeout(() => {\n      submittedRef.current!.style.position = \"relative\";\n      submittedRef.current!.style.opacity = \"1\";\n      submittedRef.current!.style.pointerEvents = \"all\";\n      setShowForm(false);\n    }, ANIMATION_SPEED + 10);\n  }, [formRef, containerRef, submittedRef]);\n\n  useEffect(() => {\n    if (status === \"submitted\") {\n      transitionToSuccess();\n    } else if (openWithCommentVisible || hasRating) {\n      transitionToExpanded();\n    } else {\n      transitionToDefault();\n    }\n  }, [\n    transitionToDefault,\n    transitionToExpanded,\n    transitionToSuccess,\n    openWithCommentVisible,\n    hasRating,\n    status,\n  ]);\n\n  return (\n    <div ref={containerRef} class=\"container\">\n      <div ref={submittedRef} class=\"submitted\">\n        <div class=\"submitted-check\">\n          <CheckCircle height={24} width={24} />\n        </div>\n        <p class=\"text\">{t.SuccessMessage}</p>\n        <Plug />\n      </div>\n      {showForm && (\n        <form\n          ref={formRef}\n          class=\"form\"\n          method=\"dialog\"\n          style={{ opacity: 1 }}\n          onClick={onInteraction}\n          onFocus={onInteraction}\n          onFocusCapture={onInteraction}\n          onSubmit={handleSubmit}\n        >\n          <div\n            ref={headerRef}\n            aria-labelledby=\"bucket-feedback-score-label\"\n            class=\"form-control\"\n            role=\"group\"\n          >\n            <div class=\"title\" id=\"bucket-feedback-score-label\">\n              {question}\n            </div>\n            <StarRating\n              name=\"score\"\n              t={t}\n              onChange={async (e) => {\n                setHasRating(true);\n                await onScoreSubmit({\n                  question,\n                  score: Number(e.currentTarget.value),\n                });\n              }}\n            />\n\n            <ScoreStatus scoreState={scoreState} t={t} />\n          </div>\n\n          <div ref={expandedContentRef} class=\"form-expanded-content\">\n            <div class=\"form-control\">\n              <textarea\n                class=\"textarea\"\n                id=\"bucket-feedback-comment-label\"\n                name=\"comment\"\n                placeholder={t.QuestionPlaceholder}\n                rows={4}\n              />\n            </div>\n\n            {error && <p class=\"error\">{error}</p>}\n\n            <Button\n              disabled={\n                !hasRating ||\n                status === \"submitting\" ||\n                scoreState === \"submitting\"\n              }\n              type=\"submit\"\n            >\n              {t.SendButton}\n            </Button>\n\n            <Plug />\n          </div>\n        </form>\n      )}\n    </div>\n  );\n};\n\nconst ScoreStatus: FunctionComponent<{\n  t: FeedbackTranslations;\n  scoreState: \"idle\" | \"submitting\" | \"submitted\";\n}> = ({ t, scoreState }) => {\n  // Keep track of whether we can show a loading indication - only if 400ms have\n  // elapsed without the score request finishing.\n  const [loadingTimeElapsed, setLoadingTimeElapsed] = useState(false);\n\n  // Keep track of whether we can fall back to the idle/loading states - once\n  // it's been submit once it won't, to prevent flashing.\n  const [hasBeenSubmitted, setHasBeenSubmitted] = useState(false);\n\n  useEffect(() => {\n    if (scoreState === \"idle\") {\n      setLoadingTimeElapsed(false);\n      return;\n    }\n\n    if (scoreState === \"submitted\") {\n      setLoadingTimeElapsed(false);\n      setHasBeenSubmitted(true);\n      return;\n    }\n\n    const timer = setTimeout(() => {\n      setLoadingTimeElapsed(true);\n    }, 400);\n\n    return () => clearTimeout(timer);\n  }, [scoreState]);\n\n  const showIdle =\n    scoreState === \"idle\" ||\n    (scoreState === \"submitting\" && !hasBeenSubmitted && !loadingTimeElapsed);\n  const showLoading =\n    scoreState !== \"submitted\" && !hasBeenSubmitted && loadingTimeElapsed;\n  const showSubmitted = scoreState === \"submitted\" || hasBeenSubmitted;\n\n  return (\n    <div class=\"score-status-container\">\n      <span class=\"score-status\" style={{ opacity: showIdle ? 1 : 0 }}>\n        {t.ScoreStatusDescription}\n      </span>\n\n      <div class=\"score-status\" style={{ opacity: showLoading ? 1 : 0 }}>\n        {t.ScoreStatusLoading}\n      </div>\n\n      <span class=\"score-status\" style={{ opacity: showSubmitted ? 1 : 0 }}>\n        <Check height={14} style={{ marginRight: 3 }} width={14} />{\" \"}\n        {t.ScoreStatusReceived}\n      </span>\n    </div>\n  );\n};\n","import { FunctionComponent, h } from \"preact\";\n\nexport const RadialProgress: FunctionComponent<{\n  diameter: number;\n  progress: number;\n}> = ({ diameter, progress }) => {\n  const stroke = 2;\n  const radius = diameter / 2 - stroke;\n  const circumference = 2 * Math.PI * radius;\n  const filled = circumference * progress;\n\n  return (\n    <svg class=\"radial-progress\" height={diameter} width={diameter}>\n      <circle\n        cx={radius + stroke}\n        cy={radius + stroke}\n        fill=\"transparent\"\n        r={radius}\n        stroke-dasharray={circumference}\n        stroke-dashoffset={filled}\n        stroke-width={stroke}\n        transform={`rotate(-90) translate(-${radius * 2 + stroke * 2} 0)`}\n      />\n    </svg>\n  );\n};\n","import { Fragment, FunctionComponent, h } from \"preact\";\nimport { useCallback, useState } from \"preact/hooks\";\n\nimport { feedbackContainerId } from \"../../ui/constants\";\nimport { Dialog, useDialog } from \"../../ui/Dialog\";\nimport { Close } from \"../../ui/icons/Close\";\n\nimport { DEFAULT_TRANSLATIONS } from \"./config/defaultTranslations\";\nimport { useTimer } from \"./hooks/useTimer\";\nimport { FeedbackForm } from \"./FeedbackForm\";\nimport styles from \"./index.css?inline\";\nimport { RadialProgress } from \"./RadialProgress\";\nimport {\n  FeedbackScoreSubmission,\n  FeedbackSubmission,\n  OpenFeedbackFormOptions,\n  WithRequired,\n} from \"./types\";\n\nexport type FeedbackDialogProps = WithRequired<\n  OpenFeedbackFormOptions,\n  \"onSubmit\" | \"position\"\n>;\n\nconst INACTIVE_DURATION_MS = 20 * 1000;\nconst SUCCESS_DURATION_MS = 3 * 1000;\n\nexport const FeedbackDialog: FunctionComponent<FeedbackDialogProps> = ({\n  key,\n  title = DEFAULT_TRANSLATIONS.DefaultQuestionLabel,\n  position,\n  translations = DEFAULT_TRANSLATIONS,\n  openWithCommentVisible = false,\n  onClose,\n  onDismiss,\n  onSubmit,\n  onScoreSubmit,\n}) => {\n  const [feedbackId, setFeedbackId] = useState<string | undefined>(undefined);\n  const [scoreState, setScoreState] = useState<\n    \"idle\" | \"submitting\" | \"submitted\"\n  >(\"idle\");\n\n  const { isOpen, close } = useDialog({ onClose, initialValue: true });\n\n  const autoClose = useTimer({\n    enabled: position.type === \"DIALOG\",\n    initialDuration: INACTIVE_DURATION_MS,\n    onEnd: close,\n  });\n\n  const submit = useCallback(\n    async (data: Omit<FeedbackSubmission, \"feedbackId\">) => {\n      await onSubmit({ ...data, feedbackId });\n      autoClose.startWithDuration(SUCCESS_DURATION_MS);\n    },\n    [autoClose, feedbackId, onSubmit],\n  );\n\n  const submitScore = useCallback(\n    async (data: Omit<FeedbackScoreSubmission, \"feedbackId\">) => {\n      if (onScoreSubmit !== undefined) {\n        setScoreState(\"submitting\");\n\n        const res = await onScoreSubmit({ ...data, feedbackId });\n        setFeedbackId(res.feedbackId);\n        setScoreState(\"submitted\");\n      }\n    },\n    [feedbackId, onScoreSubmit],\n  );\n  const dismiss = useCallback(() => {\n    autoClose.stop();\n    close();\n    onDismiss?.();\n  }, [autoClose, close, onDismiss]);\n\n  return (\n    <>\n      <style dangerouslySetInnerHTML={{ __html: styles }} />\n      <Dialog\n        key={key}\n        close={close}\n        containerId={feedbackContainerId}\n        isOpen={isOpen}\n        position={position}\n        onDismiss={onDismiss}\n      >\n        <>\n          <FeedbackForm\n            key={key}\n            openWithCommentVisible={openWithCommentVisible}\n            question={title}\n            scoreState={scoreState}\n            t={{ ...DEFAULT_TRANSLATIONS, ...translations }}\n            onInteraction={autoClose.stop}\n            onScoreSubmit={submitScore}\n            onSubmit={submit}\n          />\n\n          <button class=\"close\" onClick={dismiss}>\n            {!autoClose.stopped && autoClose.elapsedFraction > 0 && (\n              <RadialProgress\n                diameter={28}\n                progress={1.0 - autoClose.elapsedFraction}\n              />\n            )}\n            <Close />\n          </button>\n        </>\n      </Dialog>\n    </>\n  );\n};\n","import { h, render } from \"preact\";\n\nimport { feedbackContainerId, propagatedEvents } from \"../../ui/constants\";\nimport { Position } from \"../../ui/types\";\n\nimport { FeedbackDialog } from \"./FeedbackDialog\";\nimport { OpenFeedbackFormOptions } from \"./types\";\n\nexport const DEFAULT_POSITION: Position = {\n  type: \"DIALOG\",\n  placement: \"bottom-right\",\n};\n\nfunction stopPropagation(e: Event) {\n  e.stopPropagation();\n}\n\nfunction attachDialogContainer() {\n  let container = document.querySelector(`#${feedbackContainerId}`);\n\n  if (!container) {\n    container = document.createElement(\"div\");\n    container.attachShadow({ mode: \"open\" });\n    (container as HTMLElement).style.all = \"initial\";\n    container.id = feedbackContainerId;\n    document.body.appendChild(container);\n\n    for (const event of propagatedEvents) {\n      container.addEventListener(event, stopPropagation, { passive: true });\n    }\n  }\n\n  return container.shadowRoot!;\n}\n\n// this is a counter that increases every time the feedback form is opened\n// and since it's passed as a key to the FeedbackDialog component,\n// it forces a re-render on every form open\nlet openInstances = 0;\n\nexport function openFeedbackForm(options: OpenFeedbackFormOptions): void {\n  const shadowRoot = attachDialogContainer();\n  const position = options.position || DEFAULT_POSITION;\n\n  if (position.type === \"POPOVER\") {\n    if (!position.anchor) {\n      console.warn(\n        \"[Bucket]\",\n        \"Unable to open popover. Anchor must be a defined DOM-element\",\n      );\n      return;\n    }\n\n    if (!document.body.contains(position.anchor)) {\n      console.warn(\n        \"[Bucket]\",\n        \"Unable to open popover. Anchor must be an attached DOM-element\",\n      );\n      return;\n    }\n  }\n\n  openInstances++;\n\n  render(\n    h(FeedbackDialog, { ...options, position, key: openInstances.toString() }),\n    shadowRoot,\n  );\n}\n","import { HttpClient } from \"../httpClient\";\nimport { Logger } from \"../logger\";\nimport { AblySSEChannel, openAblySSEChannel } from \"../sse\";\nimport { Position } from \"../ui/types\";\n\nimport {\n  FeedbackSubmission,\n  FeedbackTranslations,\n  OpenFeedbackFormOptions,\n} from \"./ui/types\";\nimport {\n  FeedbackPromptCompletionHandler,\n  parsePromptMessage,\n  processPromptMessage,\n} from \"./prompts\";\nimport { getAuthToken } from \"./promptStorage\";\nimport * as feedbackLib from \"./ui\";\nimport { DEFAULT_POSITION } from \"./ui\";\n\nexport type Key = string;\n\nexport type FeedbackOptions = {\n  /**\n   * Enables automatic feedback prompting if it's set up in Bucket\n   */\n  enableAutoFeedback?: boolean;\n\n  /**\n   *\n   */\n  autoFeedbackHandler?: FeedbackPromptHandler;\n\n  /**\n   * With these options you can override the look of the feedback prompt\n   */\n  ui?: {\n    /**\n     * Control the placement and behavior of the feedback form.\n     */\n    position?: Position;\n\n    /**\n     * Add your own custom translations for the feedback form.\n     * Undefined translation keys fall back to english defaults.\n     */\n    translations?: Partial<FeedbackTranslations>;\n  };\n};\n\nexport type RequestFeedbackData = Omit<\n  OpenFeedbackFormOptions,\n  \"key\" | \"onSubmit\"\n> & {\n  /**\n   * Company ID from your own application.\n   */\n  companyId?: string;\n\n  /**\n   * Allows you to handle a copy of the already submitted\n   * feedback.\n   *\n   * This can be used for side effects, such as storing a\n   * copy of the feedback in your own application or CRM.\n   *\n   * @param {Object} data\n   */\n  onAfterSubmit?: (data: FeedbackSubmission) => void;\n\n  /**\n   * Bucket feature key.\n   */\n  featureKey: string;\n};\n\nexport type RequestFeedbackOptions = RequestFeedbackData & {\n  /**\n   * User ID from your own application.\n   */\n  userId: string;\n};\n\nexport type UnassignedFeedback = {\n  /**\n   * Bucket feature key.\n   */\n  featureKey: string;\n\n  /**\n   * Bucket feedback ID\n   */\n  feedbackId?: string;\n\n  /**\n   * The question that was presented to the user.\n   */\n  question?: string;\n\n  /**\n   * The original question.\n   * This only needs to be populated if the feedback was submitted through the automated feedback surveys channel.\n   */\n  promptedQuestion?: string;\n\n  /**\n   * Customer satisfaction score.\n   */\n  score?: number;\n\n  /**\n   * User supplied comment about your feature.\n   */\n  comment?: string;\n\n  /**\n   * Bucket feedback prompt ID.\n   *\n   * This only exists if the feedback was submitted\n   * as part of an automated prompt from Bucket.\n   *\n   * Used for internal state management of automated\n   * feedback.\n   */\n  promptId?: string;\n\n  /**\n   * Source of the feedback, depending on how the user was asked\n   * - `prompt` - Feedback submitted by way of an automated feedback survey (prompted)\n   * - `widget` - Feedback submitted via `requestFeedback`\n   * - `sdk` - Feedback submitted via `feedback`\n   */\n  source?: \"prompt\" | \"sdk\" | \"widget\";\n};\n\nexport type Feedback = UnassignedFeedback & {\n  /**\n   * User ID from your own application.\n   */\n  userId?: string;\n\n  /**\n   * Company ID from your own application.\n   */\n  companyId?: string;\n};\n\nexport type FeedbackPrompt = {\n  /**\n   * Specific question user was asked\n   */\n  question: string;\n\n  /**\n   * Feedback prompt should appear only after this time\n   */\n  showAfter: Date;\n\n  /**\n   * Feedback prompt will not be shown after this time\n   */\n  showBefore: Date;\n\n  /**\n   * Id of the prompt\n   */\n  promptId: string;\n\n  /**\n   * Feature ID from Bucket\n   */\n  featureId: string;\n};\n\nexport type FeedbackPromptReply = {\n  question: string;\n  companyId?: string;\n  score?: number;\n  comment?: string;\n};\n\nexport type FeedbackPromptReplyHandler = <T extends FeedbackPromptReply | null>(\n  reply: T,\n) => T extends null ? Promise<void> : Promise<{ feedbackId: string }>;\n\nexport type FeedbackPromptHandlerOpenFeedbackFormOptions = Omit<\n  RequestFeedbackOptions,\n  \"featureId\" | \"featureKey\" | \"userId\" | \"companyId\" | \"onClose\" | \"onDismiss\"\n>;\n\nexport type FeedbackPromptHandlerCallbacks = {\n  reply: FeedbackPromptReplyHandler;\n  openFeedbackForm: (\n    options: FeedbackPromptHandlerOpenFeedbackFormOptions,\n  ) => void;\n};\n\nexport type FeedbackPromptHandler = (\n  prompt: FeedbackPrompt,\n  handlers: FeedbackPromptHandlerCallbacks,\n) => void;\n\nexport const createDefaultFeedbackPromptHandler = (\n  options: FeedbackPromptHandlerOpenFeedbackFormOptions = {},\n): FeedbackPromptHandler => {\n  return (_prompt: FeedbackPrompt, handlers) => {\n    handlers.openFeedbackForm(options);\n  };\n};\nexport const DEFAULT_FEEDBACK_CONFIG = {\n  promptHandler: createDefaultFeedbackPromptHandler(),\n  feedbackPosition: DEFAULT_POSITION,\n  translations: {},\n  autoFeedbackEnabled: true,\n};\n\n// Payload can include featureId or featureKey, but the public API only exposes featureKey\n// We use featureId internally because prompting is based on featureId\ntype FeedbackPayload = Omit<Feedback, \"featureKey\"> & {\n  featureId?: string;\n  featureKey?: string;\n};\n\nexport async function feedback(\n  httpClient: HttpClient,\n  logger: Logger,\n  payload: FeedbackPayload,\n) {\n  if (!payload.score && !payload.comment) {\n    logger.error(\n      \"`feedback` call ignored, either `score` or `comment` must be provided\",\n    );\n    return;\n  }\n\n  if (!payload.userId) {\n    logger.error(\"`feedback` call ignored, no `userId` provided\");\n    return;\n  }\n\n  const featureId = \"featureId\" in payload ? payload.featureId : undefined;\n  const featureKey = \"featureKey\" in payload ? payload.featureKey : undefined;\n\n  if (!featureId && !featureKey) {\n    logger.error(\n      \"`feedback` call ignored. Neither `featureId` nor `featureKey` have been provided\",\n    );\n    return;\n  }\n\n  // set default source to sdk\n  const feedbackPayload = {\n    ...payload,\n    featureKey: undefined,\n    source: payload.source ?? \"sdk\",\n    featureId,\n    key: featureKey,\n  };\n\n  const res = await httpClient.post({\n    path: `/feedback`,\n    body: feedbackPayload,\n  });\n\n  logger.debug(`sent feedback`, res);\n  return res;\n}\n\nexport class AutoFeedback {\n  private initialized = false;\n  private sseChannel: AblySSEChannel | null = null;\n\n  constructor(\n    private sseBaseUrl: string,\n    private logger: Logger,\n    private httpClient: HttpClient,\n    private feedbackPromptHandler: FeedbackPromptHandler = createDefaultFeedbackPromptHandler(),\n    private userId: string,\n    private position: Position = DEFAULT_POSITION,\n    private feedbackTranslations: Partial<FeedbackTranslations> = {},\n  ) {}\n\n  /**\n   * Start receiving automated feedback surveys.\n   */\n  async initialize() {\n    if (this.initialized) {\n      this.logger.error(\"auto. feedback client already initialized\");\n      return;\n    }\n    this.initialized = true;\n\n    const channel = await this.getChannel();\n    if (!channel) return;\n\n    try {\n      this.logger.debug(`auto. feedback enabled`, channel);\n      this.sseChannel = openAblySSEChannel({\n        userId: this.userId,\n        channel,\n        httpClient: this.httpClient,\n        callback: (message) =>\n          this.handleFeedbackPromptRequest(this.userId, message),\n        logger: this.logger,\n        sseBaseUrl: this.sseBaseUrl,\n      });\n      this.logger.debug(`auto. feedback connection established`);\n    } catch (e) {\n      this.logger.error(`error initializing auto. feedback client`, e);\n    }\n  }\n\n  private async getChannel() {\n    const existingAuth = getAuthToken(this.userId);\n    const channel = existingAuth?.channel;\n\n    if (channel) {\n      return channel;\n    }\n\n    try {\n      if (!channel) {\n        const res = await this.httpClient.post({\n          path: `/feedback/prompting-init`,\n          body: {\n            userId: this.userId,\n          },\n        });\n\n        this.logger.debug(`auto. feedback status sent`, res);\n        if (res.ok) {\n          const body: { success: boolean; channel?: string } = await res.json();\n          if (body.success && body.channel) {\n            return body.channel;\n          }\n        }\n      }\n    } catch (e) {\n      this.logger.error(`error initializing auto. feedback`, e);\n      return;\n    }\n    return;\n  }\n\n  handleFeedbackPromptRequest(userId: string, message: any) {\n    const parsed = parsePromptMessage(message);\n    if (!parsed) {\n      this.logger.error(`invalid feedback prompt message received`, message);\n    } else {\n      if (\n        !processPromptMessage(userId, parsed, async (u, m, cb) => {\n          await this.feedbackPromptEvent({\n            promptId: parsed.promptId,\n            featureId: parsed.featureId,\n            promptedQuestion: parsed.question,\n            event: \"received\",\n            userId,\n          });\n          await this.triggerFeedbackPrompt(u, m, cb);\n        })\n      ) {\n        this.logger.info(\n          `feedback prompt not shown, it was either expired or already processed`,\n          message,\n        );\n      }\n    }\n  }\n\n  stop() {\n    if (this.sseChannel) {\n      this.sseChannel.close();\n      this.sseChannel = null;\n    }\n  }\n\n  async triggerFeedbackPrompt(\n    userId: string,\n    message: FeedbackPrompt,\n    completionHandler: FeedbackPromptCompletionHandler,\n  ) {\n    let feedbackId: string | undefined = undefined;\n\n    await this.feedbackPromptEvent({\n      promptId: message.promptId,\n      featureId: message.featureId,\n      promptedQuestion: message.question,\n      event: \"shown\",\n      userId,\n    });\n\n    const replyCallback: FeedbackPromptReplyHandler = async (reply) => {\n      if (!reply) {\n        await this.feedbackPromptEvent({\n          promptId: message.promptId,\n          featureId: message.featureId,\n          event: \"dismissed\",\n          userId,\n          promptedQuestion: message.question,\n        });\n\n        completionHandler();\n        return;\n      }\n\n      const feedbackPayload = {\n        feedbackId: feedbackId,\n        featureId: message.featureId,\n        userId,\n        companyId: reply.companyId,\n        score: reply.score,\n        comment: reply.comment,\n        promptId: message.promptId,\n        question: reply.question,\n        promptedQuestion: message.question,\n        source: \"prompt\",\n      } satisfies FeedbackPayload;\n\n      const response = await feedback(\n        this.httpClient,\n        this.logger,\n        feedbackPayload,\n      );\n\n      completionHandler();\n\n      if (response && response.ok) {\n        return await response?.json();\n      }\n      return;\n    };\n\n    const handlers: FeedbackPromptHandlerCallbacks = {\n      reply: replyCallback,\n      openFeedbackForm: (options) => {\n        feedbackLib.openFeedbackForm({\n          key: message.featureId,\n          title: message.question,\n          onScoreSubmit: async (data) => {\n            const res = await replyCallback(data);\n            feedbackId = res.feedbackId;\n            return { feedbackId: res.feedbackId };\n          },\n          onSubmit: async (data) => {\n            await replyCallback(data);\n            options.onAfterSubmit?.(data);\n          },\n          onDismiss: () => replyCallback(null),\n          position: this.position,\n          translations: this.feedbackTranslations,\n          ...options,\n        });\n      },\n    };\n\n    this.feedbackPromptHandler(message, handlers);\n  }\n\n  async feedbackPromptEvent(args: {\n    event: \"received\" | \"shown\" | \"dismissed\";\n    featureId: string;\n    promptId: string;\n    promptedQuestion: string;\n    userId: string;\n  }) {\n    const payload = {\n      action: args.event,\n      featureId: args.featureId,\n      promptId: args.promptId,\n      userId: args.userId,\n      promptedQuestion: args.promptedQuestion,\n    };\n\n    const res = await this.httpClient.post({\n      path: `/feedback/prompt-events`,\n      body: payload,\n    });\n    this.logger.debug(`sent prompt event`, res);\n    return res;\n  }\n}\n","import { CheckEvent, RawFeatures } from \"./feature/features\";\nimport { CompanyContext, UserContext } from \"./context\";\n\nexport interface HookArgs {\n  /**\n   * Deprecated: Use `check` instead.\n   * @deprecated\n   */\n  configCheck: CheckEvent;\n  /**\n   * Deprecated: Use `check` instead.\n   * @deprecated\n   */\n  enabledCheck: CheckEvent;\n  check: CheckEvent;\n  featuresUpdated: RawFeatures;\n  user: UserContext;\n  company: CompanyContext;\n  track: TrackEvent;\n}\n\nexport type TrackEvent = {\n  user: UserContext;\n  company?: CompanyContext;\n  eventName: string;\n  attributes?: Record<string, any> | null;\n};\n\n/**\n * Hooks manager.\n * @internal\n */\nexport class HooksManager {\n  private hooks: {\n    enabledCheck: ((arg0: CheckEvent) => void)[];\n    configCheck: ((arg0: CheckEvent) => void)[];\n    check: ((arg0: CheckEvent) => void)[];\n    featuresUpdated: ((arg0: RawFeatures) => void)[];\n    user: ((arg0: UserContext) => void)[];\n    company: ((arg0: CompanyContext) => void)[];\n    track: ((arg0: TrackEvent) => void)[];\n  } = {\n    enabledCheck: [],\n    configCheck: [],\n    check: [],\n    featuresUpdated: [],\n    user: [],\n    company: [],\n    track: [],\n  };\n\n  addHook<THookType extends keyof HookArgs>(\n    event: THookType,\n    cb: (arg0: HookArgs[THookType]) => void,\n  ): () => void {\n    (this.hooks[event] as any[]).push(cb);\n    return () => {\n      this.removeHook(event, cb);\n    };\n  }\n\n  removeHook<THookType extends keyof HookArgs>(\n    event: THookType,\n    cb: (arg0: HookArgs[THookType]) => void,\n  ): void {\n    this.hooks[event] = this.hooks[event].filter((hook) => hook !== cb) as any;\n  }\n\n  trigger<THookType extends keyof HookArgs>(\n    event: THookType,\n    arg: HookArgs[THookType],\n  ): void {\n    this.hooks[event].forEach((hook) => hook(arg as any));\n  }\n}\n","import { API_BASE_URL, SDK_VERSION, SDK_VERSION_HEADER_NAME } from \"./config\";\n\nexport interface HttpClientOptions {\n  baseUrl?: string;\n  sdkVersion?: string;\n  credentials?: RequestCredentials;\n}\n\nexport class HttpClient {\n  private readonly baseUrl: string;\n  private readonly sdkVersion: string;\n\n  private readonly fetchOptions: RequestInit;\n\n  constructor(\n    public publishableKey: string,\n    opts: HttpClientOptions = {},\n  ) {\n    this.baseUrl = opts.baseUrl ?? API_BASE_URL;\n\n    // Ensure baseUrl ends with a trailing slash so subsequent\n    // path concatenation works as expected\n    if (!this.baseUrl.endsWith(\"/\")) {\n      this.baseUrl += \"/\";\n    }\n    this.sdkVersion = opts.sdkVersion ?? SDK_VERSION;\n    this.fetchOptions = { credentials: opts.credentials };\n  }\n\n  getUrl(path: string): URL {\n    // see tests for examples\n    if (path.startsWith(\"/\")) {\n      path = path.slice(1);\n    }\n    return new URL(path, this.baseUrl);\n  }\n\n  async get({\n    path,\n    params,\n    timeoutMs,\n  }: {\n    path: string;\n    params?: URLSearchParams;\n    timeoutMs?: number;\n  }): ReturnType<typeof fetch> {\n    if (!params) {\n      params = new URLSearchParams();\n    }\n    params.set(SDK_VERSION_HEADER_NAME, this.sdkVersion);\n    params.set(\"publishableKey\", this.publishableKey);\n\n    const url = this.getUrl(path);\n    url.search = params.toString();\n\n    if (timeoutMs === undefined) {\n      return fetch(url, this.fetchOptions);\n    }\n\n    const controller = new AbortController();\n    const id = setTimeout(() => controller.abort(), timeoutMs);\n\n    const res = await fetch(url, {\n      ...this.fetchOptions,\n      signal: controller.signal,\n    });\n    clearTimeout(id);\n\n    return res;\n  }\n\n  async post({\n    path,\n    body,\n  }: {\n    host?: string;\n    path: string;\n    body: any;\n  }): ReturnType<typeof fetch> {\n    return fetch(this.getUrl(path), {\n      ...this.fetchOptions,\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        [SDK_VERSION_HEADER_NAME]: this.sdkVersion,\n        Authorization: `Bearer ${this.publishableKey}`,\n      },\n      body: JSON.stringify(body),\n    });\n  }\n}\n","import { FunctionComponent, h } from \"preact\";\n\nexport const Feature: FunctionComponent<h.JSX.SVGAttributes<SVGSVGElement>> = (\n  props,\n) => (\n  <svg\n    fill=\"none\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    width=\"24\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M10.7474 1.72518C11.5222 1.2766 12.4778 1.27661 13.2526 1.72518L20.2526 5.77782C21.0246 6.22479 21.5 7.04929 21.5 7.94138V16.0586C21.5 16.9507 21.0246 17.7752 20.2526 18.2222L13.2526 22.2748C12.4778 22.7234 11.5222 22.7234 10.7474 22.2748L3.74741 18.2222C2.97537 17.7752 2.5 16.9507 2.5 16.0586V7.94138C2.5 7.04929 2.97537 6.22479 3.74741 5.77782L10.7474 1.72518ZM5.49388 7.0777L12.0001 10.8444L18.5062 7.07774L12 3.311L5.49388 7.0777ZM4.5 8.81329V16.3469L11.0001 20.1101V12.5765L4.5 8.81329ZM13.0001 20.11L19.5 16.3469V8.81337L13.0001 12.5765V20.11Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n);\n","import { Fragment, h } from \"preact\";\n\ninterface SwitchProps extends h.JSX.HTMLAttributes<HTMLInputElement> {\n  checked: boolean;\n  width?: number;\n  height?: number;\n}\n\nconst gutter = 1;\n\nexport function Switch({\n  checked,\n  width = 24,\n  height = 14,\n  ...props\n}: SwitchProps) {\n  return (\n    <>\n      <label class=\"switch\" data-enabled={checked}>\n        <input\n          checked={checked}\n          class=\"switch-input\"\n          name=\"enabled\"\n          type=\"checkbox\"\n          {...props}\n        />\n        <div\n          class=\"switch-track\"\n          style={{\n            width: `${width}px`,\n            height: `${height}px`,\n            borderRadius: `${height}px`,\n          }}\n        >\n          <div\n            class=\"switch-dot\"\n            style={{\n              width: `${height - gutter * 2}px`,\n              height: `${height - gutter * 2}px`,\n              transform: checked\n                ? `translateX(${width - (height - gutter * 2) - gutter}px)`\n                : `translateX(${gutter}px)`,\n              top: `${gutter}px`,\n            }}\n          />\n        </div>\n      </label>\n    </>\n  );\n}\n","import { h } from \"preact\";\nimport { useEffect, useState } from \"preact/hooks\";\n\nimport { Feature } from \"../ui/icons/Feature\";\n\nimport { Switch } from \"./Switch\";\nimport { FeatureItem } from \"./Toolbar\";\n\nexport function FeaturesTable({\n  features,\n  searchQuery,\n  appBaseUrl,\n  isOpen,\n  setIsEnabledOverride,\n}: {\n  features: FeatureItem[];\n  searchQuery: string | null;\n  appBaseUrl: string;\n  isOpen: boolean;\n  setIsEnabledOverride: (key: string, isEnabled: boolean | null) => void;\n}) {\n  const hasFeatures = features.length > 0;\n  const hasShownFeatures = features.some((feature) =>\n    feature.key\n      .toLocaleLowerCase()\n      .includes(searchQuery?.toLocaleLowerCase() ?? \"\"),\n  );\n\n  // List features that match the search query first then alphabetically\n  const searchedFeatures =\n    searchQuery === null\n      ? features\n      : [...features].sort((a, b) => {\n          const aMatches = a.key.includes(searchQuery);\n          const bMatches = b.key.includes(searchQuery);\n\n          // If both match or both don't match, sort alphabetically\n          if (aMatches === bMatches) {\n            return a.key.localeCompare(b.key);\n          }\n\n          // Otherwise, matching features come first\n          return aMatches ? -1 : 1;\n        });\n\n  return (\n    <table class=\"features-table\" style={{ \"--n\": searchedFeatures.length }}>\n      <tbody>\n        {(!hasFeatures || !hasShownFeatures) && (\n          <tr>\n            <td class=\"feature-empty-cell\" colSpan={3}>\n              No features{\" \"}\n              {!hasShownFeatures ? `matching \"${searchQuery} \"` : \"\"}\n              found\n            </td>\n          </tr>\n        )}\n        {searchedFeatures.map((feature, index) => (\n          <FeatureRow\n            key={feature.key}\n            appBaseUrl={appBaseUrl}\n            feature={feature}\n            index={index}\n            isNotVisible={\n              searchQuery !== null &&\n              !feature.key\n                .toLocaleLowerCase()\n                .includes(searchQuery.toLocaleLowerCase())\n            }\n            isOpen={isOpen}\n            setEnabledOverride={(override) =>\n              setIsEnabledOverride(feature.key, override)\n            }\n          />\n        ))}\n      </tbody>\n    </table>\n  );\n}\n\nfunction FeatureRow({\n  setEnabledOverride,\n  appBaseUrl,\n  feature,\n  isOpen,\n  index,\n  isNotVisible,\n}: {\n  feature: FeatureItem;\n  appBaseUrl: string;\n  setEnabledOverride: (isEnabled: boolean | null) => void;\n  isOpen: boolean;\n  index: number;\n  isNotVisible: boolean;\n}) {\n  const [showOnOpen, setShowOnOpen] = useState(isOpen);\n  useEffect(() => {\n    setShowOnOpen(isOpen);\n  }, [isOpen]);\n  return (\n    <tr\n      key={feature.key}\n      class={[\n        \"feature-row\",\n        showOnOpen ? \"show-on-open\" : undefined,\n        isNotVisible ? \"not-visible\" : undefined,\n      ].join(\" \")}\n      style={{ \"--i\": index }}\n    >\n      <td class=\"feature-name-cell\">\n        <Feature class=\"feature-icon\" />\n        <a\n          class=\"feature-link\"\n          href={`${appBaseUrl}/env-current/features/by-key/${feature.key}`}\n          rel=\"noreferrer\"\n          tabIndex={index + 1}\n          target=\"_blank\"\n        >\n          {feature.key}\n        </a>\n      </td>\n      <td class=\"feature-reset-cell\">\n        {feature.localOverride !== null ? (\n          <Reset setEnabledOverride={setEnabledOverride} tabIndex={index + 1} />\n        ) : null}\n      </td>\n      <td class=\"feature-switch-cell\">\n        <Switch\n          checked={feature.localOverride ?? feature.isEnabled}\n          tabIndex={index + 1}\n          onChange={(e) => {\n            const isChecked = e.currentTarget.checked;\n            const isOverridden = isChecked !== feature.isEnabled;\n            setEnabledOverride(isOverridden ? isChecked : null);\n          }}\n        />\n      </td>\n    </tr>\n  );\n}\n\nexport function FeatureSearch({\n  onSearch,\n}: {\n  onSearch: (val: string) => void;\n}) {\n  return (\n    <input\n      class=\"search-input\"\n      placeholder=\"Search features\"\n      tabIndex={0}\n      type=\"search\"\n      autoFocus\n      onInput={(s) => onSearch(s.currentTarget.value)}\n    />\n  );\n}\n\nfunction Reset({\n  setEnabledOverride,\n  ...props\n}: {\n  setEnabledOverride: (isEnabled: boolean | null) => void;\n} & h.JSX.HTMLAttributes<HTMLAnchorElement>) {\n  return (\n    <a\n      class=\"reset\"\n      href=\"\"\n      onClick={(e) => {\n        e.preventDefault();\n        setEnabledOverride(null);\n      }}\n      {...props}\n    >\n      reset\n    </a>\n  );\n}\n","import { h } from \"preact\";\nimport {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"preact/hooks\";\n\nimport { BucketClient } from \"../client\";\nimport { toolbarContainerId } from \"../ui/constants\";\nimport { Dialog, DialogContent, DialogHeader, useDialog } from \"../ui/Dialog\";\nimport { Logo } from \"../ui/icons/Logo\";\nimport { ToolbarPosition } from \"../ui/types\";\nimport { parseUnanchoredPosition } from \"../ui/utils\";\n\nimport { FeatureSearch, FeaturesTable } from \"./Features\";\nimport styles from \"./index.css?inline\";\n\nexport type FeatureItem = {\n  key: string;\n  localOverride: boolean | null;\n  isEnabled: boolean;\n};\n\ntype Feature = {\n  key: string;\n  isEnabled: boolean;\n  localOverride: boolean | null;\n};\n\nexport default function Toolbar({\n  bucketClient,\n  position,\n}: {\n  bucketClient: BucketClient;\n  position: ToolbarPosition;\n}) {\n  const toggleToolbarRef = useRef<HTMLDivElement>(null);\n  const dialogContentRef = useRef<HTMLDivElement>(null);\n  const [features, setFeatures] = useState<Feature[]>([]);\n\n  const updateFeatures = useCallback(() => {\n    const rawFeatures = bucketClient.getFeatures();\n    setFeatures(\n      Object.values(rawFeatures)\n        .filter((f) => f !== undefined)\n        .map(\n          (feature) =>\n            ({\n              key: feature.key,\n              localOverride: feature.isEnabledOverride,\n              isEnabled: feature.isEnabled,\n            }) satisfies FeatureItem,\n        ),\n    );\n  }, [bucketClient]);\n\n  const hasAnyOverrides = useMemo(() => {\n    return features.some((f) => f.localOverride !== null);\n  }, [features]);\n\n  useEffect(() => {\n    updateFeatures();\n    bucketClient.on(\"featuresUpdated\", updateFeatures);\n  }, [bucketClient, updateFeatures]);\n\n  const [search, setSearch] = useState<string | null>(null);\n  const onSearch = (val: string) => {\n    setSearch(val === \"\" ? null : val);\n    dialogContentRef.current?.scrollTo({ top: 0 });\n  };\n\n  const sortedFeatures = [...features].sort((a, b) =>\n    a.key.localeCompare(b.key),\n  );\n\n  const appBaseUrl = bucketClient.getConfig().appBaseUrl;\n\n  const { isOpen, close, toggle } = useDialog();\n\n  return (\n    <div class=\"toolbar\">\n      <style dangerouslySetInnerHTML={{ __html: styles }} />\n      <ToolbarToggle\n        hasAnyOverrides={hasAnyOverrides}\n        innerRef={toggleToolbarRef}\n        isOpen={isOpen}\n        position={position}\n        onClick={toggle}\n      />\n      <Dialog\n        close={close}\n        containerId={toolbarContainerId}\n        isOpen={isOpen}\n        position={{\n          type: \"POPOVER\",\n          anchor: toggleToolbarRef.current,\n          placement: \"top-start\",\n        }}\n        showArrow={false}\n        strategy=\"fixed\"\n      >\n        <DialogHeader>\n          <FeatureSearch onSearch={onSearch} />\n        </DialogHeader>\n        <DialogContent innerRef={dialogContentRef}>\n          <FeaturesTable\n            appBaseUrl={appBaseUrl}\n            features={sortedFeatures}\n            isOpen={isOpen}\n            searchQuery={search}\n            setIsEnabledOverride={(key, isEnabled) =>\n              bucketClient.getFeature(key).setIsEnabledOverride(isEnabled)\n            }\n          />\n        </DialogContent>\n      </Dialog>\n    </div>\n  );\n}\n\nfunction ToolbarToggle({\n  isOpen,\n  position,\n  onClick,\n  innerRef,\n  hasAnyOverrides,\n}: {\n  isOpen: boolean;\n  position: ToolbarPosition;\n  onClick: () => void;\n  innerRef: React.RefObject<HTMLDivElement>;\n  hasAnyOverrides: boolean;\n  children?: preact.VNode;\n}) {\n  const offsets = parseUnanchoredPosition(position);\n\n  const toggleClasses = [\"toolbar-toggle\", isOpen ? \"open\" : undefined].join(\n    \" \",\n  );\n\n  const indicatorClasses = [\n    \"override-indicator\",\n    hasAnyOverrides ? \"show\" : undefined,\n  ].join(\" \");\n\n  return (\n    <div ref={innerRef} class={toggleClasses} style={offsets} onClick={onClick}>\n      <div class={indicatorClasses} />\n      <Logo height=\"13px\" width=\"13px\" />\n    </div>\n  );\n}\n","import { h, render } from \"preact\";\n\nimport { BucketClient } from \"../client\";\nimport { toolbarContainerId } from \"../ui/constants\";\nimport { ToolbarPosition } from \"../ui/types\";\nimport { attachContainer } from \"../ui/utils\";\n\nimport Toolbar from \"./Toolbar\";\n\ntype showToolbarToggleOptions = {\n  bucketClient: BucketClient;\n  position?: ToolbarPosition;\n};\n\nexport const DEFAULT_PLACEMENT = \"bottom-right\" as const;\n\nexport function showToolbarToggle(options: showToolbarToggleOptions) {\n  const shadowRoot = attachContainer(toolbarContainerId);\n  const position: ToolbarPosition = options.position ?? {\n    placement: DEFAULT_PLACEMENT,\n  };\n\n  render(h(Toolbar, { ...options, position }), shadowRoot);\n}\n","import {\n  CheckEvent,\n  FallbackFeatureOverride,\n  FeaturesClient,\n  RawFeatures,\n} from \"./feature/features\";\nimport {\n  AutoFeedback,\n  Feedback,\n  feedback,\n  FeedbackOptions,\n  RequestFeedbackData,\n  RequestFeedbackOptions,\n} from \"./feedback/feedback\";\nimport * as feedbackLib from \"./feedback/ui\";\nimport { ToolbarPosition } from \"./ui/types\";\nimport { API_BASE_URL, APP_BASE_URL, SSE_REALTIME_BASE_URL } from \"./config\";\nimport { BucketContext, CompanyContext, UserContext } from \"./context\";\nimport { HookArgs, HooksManager } from \"./hooksManager\";\nimport { HttpClient } from \"./httpClient\";\nimport { Logger, loggerWithPrefix, quietConsoleLogger } from \"./logger\";\nimport { showToolbarToggle } from \"./toolbar\";\n\nconst isMobile = typeof window !== \"undefined\" && window.innerWidth < 768;\nconst isNode = typeof document === \"undefined\"; // deno supports \"window\" but not \"document\" according to https://remix.run/docs/en/main/guides/gotchas\n\n/**\n * (Internal) User context.\n *\n * @internal\n */\nexport type User = {\n  /**\n   * Identifier of the user.\n   */\n  userId: string;\n\n  /**\n   * User attributes.\n   */\n  attributes?: {\n    /**\n     * Name of the user.\n     */\n    name?: string;\n\n    /**\n     * Email of the user.\n     */\n    email?: string;\n\n    /**\n     * Avatar URL of the user.\n     */\n    avatar?: string;\n\n    /**\n     * Custom attributes of the user.\n     */\n    [key: string]: any;\n  };\n\n  /**\n   * Custom context of the user.\n   */\n  context?: PayloadContext;\n};\n\n/**\n * (Internal) Company context.\n *\n * @internal\n */\nexport type Company = {\n  /**\n   * User identifier.\n   */\n  userId: string;\n\n  /**\n   * Company identifier.\n   */\n  companyId: string;\n\n  /**\n   * Company attributes.\n   */\n  attributes?: {\n    /**\n     * Name of the company.\n     */\n    name?: string;\n\n    /**\n     * Custom attributes of the company.\n     */\n    [key: string]: any;\n  };\n\n  context?: PayloadContext;\n};\n\n/**\n * Tracked event.\n */\nexport type TrackedEvent = {\n  /**\n   * Event name.\n   */\n  event: string;\n\n  /**\n   * User identifier.\n   */\n  userId: string;\n\n  /**\n   * Company identifier.\n   */\n  companyId?: string;\n\n  /**\n   * Event attributes.\n   */\n  attributes?: Record<string, any>;\n\n  /**\n   * Custom context of the event.\n   */\n  context?: PayloadContext;\n};\n\n/**\n * (Internal) Custom context of the event.\n *\n * @internal\n */\nexport type PayloadContext = {\n  /**\n   * Whether the company and user associated with the event are active.\n   */\n  active?: boolean;\n};\n\n/**\n * BucketClient configuration.\n */\nexport interface Config {\n  /**\n   * Base URL of Bucket servers.\n   */\n  apiBaseUrl: string;\n\n  /**\n   * Base URL of the Bucket web app.\n   */\n  appBaseUrl: string;\n\n  /**\n   * Base URL of Bucket servers for SSE connections used by AutoFeedback.\n   */\n  sseBaseUrl: string;\n\n  /**\n   * Whether to enable tracking.\n   */\n  enableTracking: boolean;\n\n  /**\n   * Whether to enable offline mode.\n   */\n  offline: boolean;\n}\n\n/**\n * Toolbar options.\n */\nexport type ToolbarOptions =\n  | boolean\n  | {\n      show?: boolean;\n      position?: ToolbarPosition;\n    };\n\n/**\n * Feature definitions.\n */\nexport type FeatureDefinitions = Readonly<Array<string>>;\n\n/**\n * BucketClient initialization options.\n */\nexport type InitOptions = {\n  /**\n   * Publishable key for authentication\n   */\n  publishableKey: string;\n\n  /**\n   * User related context. If you provide `id` Bucket will enrich the evaluation context with\n   * user attributes on Bucket servers.\n   */\n  user?: UserContext;\n\n  /**\n   * Company related context. If you provide `id` Bucket will enrich the evaluation context with\n   * company attributes on Bucket servers.\n   */\n  company?: CompanyContext;\n\n  /**\n   * Context not related to users or companies\n   */\n  otherContext?: Record<string, any>;\n\n  /**\n   * You can provide a logger to see the logs of the network calls.\n   * This is undefined by default.\n   * For debugging purposes you can just set the browser console to this property:\n   * ```javascript\n   * options.logger = window.console;\n   * ```\n   */\n  logger?: Logger;\n\n  /**\n   * Base URL of Bucket servers. You can override this to use your mocked server.\n   */\n  apiBaseUrl?: string;\n\n  /**\n   * Base URL of the Bucket web app. Links open ín this app by default.\n   */\n  appBaseUrl?: string;\n\n  /**\n   * Whether to enable offline mode. Defaults to `false`.\n   */\n  offline?: boolean;\n\n  /**\n   * Feature keys for which `isEnabled` should fallback to true\n   * if SDK fails to fetch features from Bucket servers. If a record\n   * is supplied instead of array, the values of each key represent the\n   * configuration values and `isEnabled` is assume `true`.\n   */\n  fallbackFeatures?: string[] | Record<string, FallbackFeatureOverride>;\n\n  /**\n   * Timeout in milliseconds when fetching features\n   */\n  timeoutMs?: number;\n\n  /**\n   * If set to true stale features will be returned while refetching features\n   */\n  staleWhileRevalidate?: boolean;\n\n  /**\n   * If set, features will be cached between page loads for this duration\n   */\n  expireTimeMs?: number;\n\n  /**\n   * Stale features will be returned if staleWhileRevalidate is true if no new features can be fetched\n   */\n  staleTimeMs?: number;\n\n  /**\n   * When proxying requests, you may want to include credentials like cookies\n   * so you can authorize the request in the proxy.\n   * This option controls the `credentials` option of the fetch API.\n   */\n  credentials?: \"include\" | \"same-origin\" | \"omit\";\n\n  /**\n   * Base URL of Bucket servers for SSE connections used by AutoFeedback.\n   */\n  sseBaseUrl?: string;\n\n  /**\n   * AutoFeedback specific configuration\n   */\n  feedback?: FeedbackOptions;\n\n  /**\n   * Version of the SDK\n   */\n  sdkVersion?: string;\n\n  /**\n   * Whether to enable tracking. Defaults to `true`.\n   */\n  enableTracking?: boolean;\n\n  /**\n   * Toolbar configuration\n   */\n  toolbar?: ToolbarOptions;\n};\n\nconst defaultConfig: Config = {\n  apiBaseUrl: API_BASE_URL,\n  appBaseUrl: APP_BASE_URL,\n  sseBaseUrl: SSE_REALTIME_BASE_URL,\n  enableTracking: true,\n  offline: false,\n};\n\n/**\n * A remotely managed configuration value for a feature.\n */\nexport type FeatureRemoteConfig =\n  | {\n      /**\n       * The key of the matched configuration value.\n       */\n      key: string;\n\n      /**\n       * The optional user-supplied payload data.\n       */\n      payload: any;\n    }\n  | { key: undefined; payload: undefined };\n\n/**\n * Represents a feature.\n */\nexport interface Feature {\n  /**\n   * Result of feature flag evaluation.\n   * Note: Does not take local overrides into account.\n   */\n  isEnabled: boolean;\n\n  /*\n   * Optional user-defined configuration.\n   */\n  config: FeatureRemoteConfig;\n\n  /**\n   * Function to send analytics events for this feature.\n   */\n  track: () => Promise<Response | undefined>;\n\n  /**\n   * Function to request feedback for this feature.\n   */\n  requestFeedback: (\n    options: Omit<RequestFeedbackData, \"featureKey\" | \"featureId\">,\n  ) => void;\n\n  /**\n   * The current override status of isEnabled for the feature.\n   */\n  isEnabledOverride: boolean | null;\n\n  /**\n   * Set the override status for isEnabled for the feature.\n   * Set to `null` to remove the override.\n   */\n  setIsEnabledOverride(isEnabled: boolean | null): void;\n}\n\nfunction shouldShowToolbar(opts: InitOptions) {\n  const toolbarOpts = opts.toolbar;\n  if (typeof toolbarOpts === \"boolean\") return toolbarOpts;\n  if (typeof toolbarOpts?.show === \"boolean\") return toolbarOpts.show;\n\n  return window?.location?.hostname === \"localhost\";\n}\n\n/**\n * BucketClient lets you interact with the Bucket API.\n */\nexport class BucketClient {\n  private readonly publishableKey: string;\n  private readonly context: BucketContext;\n  private config: Config;\n  private requestFeedbackOptions: Partial<RequestFeedbackOptions>;\n  private readonly httpClient: HttpClient;\n\n  private readonly autoFeedback: AutoFeedback | undefined;\n  private autoFeedbackInit: Promise<void> | undefined;\n  private readonly featuresClient: FeaturesClient;\n\n  public readonly logger: Logger;\n\n  private readonly hooks: HooksManager;\n\n  /**\n   * Create a new BucketClient instance.\n   */\n  constructor(opts: InitOptions) {\n    this.publishableKey = opts.publishableKey;\n    this.logger =\n      opts?.logger ?? loggerWithPrefix(quietConsoleLogger, \"[Bucket]\");\n    this.context = {\n      user: opts?.user?.id ? opts.user : undefined,\n      company: opts?.company?.id ? opts.company : undefined,\n      otherContext: opts?.otherContext,\n    };\n\n    this.config = {\n      apiBaseUrl: opts?.apiBaseUrl ?? defaultConfig.apiBaseUrl,\n      appBaseUrl: opts?.appBaseUrl ?? defaultConfig.appBaseUrl,\n      sseBaseUrl: opts?.sseBaseUrl ?? defaultConfig.sseBaseUrl,\n      enableTracking: opts?.enableTracking ?? defaultConfig.enableTracking,\n      offline: opts?.offline ?? defaultConfig.offline,\n    };\n\n    this.requestFeedbackOptions = {\n      position: opts?.feedback?.ui?.position,\n      translations: opts?.feedback?.ui?.translations,\n    };\n\n    this.httpClient = new HttpClient(this.publishableKey, {\n      baseUrl: this.config.apiBaseUrl,\n      sdkVersion: opts?.sdkVersion,\n      credentials: opts?.credentials,\n    });\n\n    this.featuresClient = new FeaturesClient(\n      this.httpClient,\n      // API expects `other` and we have `otherContext`.\n      {\n        user: this.context.user,\n        company: this.context.company,\n        other: this.context.otherContext,\n      },\n      this.logger,\n      {\n        expireTimeMs: opts.expireTimeMs,\n        staleTimeMs: opts.staleTimeMs,\n        fallbackFeatures: opts.fallbackFeatures,\n        timeoutMs: opts.timeoutMs,\n        offline: this.config.offline,\n      },\n    );\n\n    if (\n      !this.config.offline &&\n      this.context?.user &&\n      !isNode && // do not prompt on server-side\n      opts?.feedback?.enableAutoFeedback !== false // default to on\n    ) {\n      if (isMobile) {\n        this.logger.warn(\n          \"Feedback prompting is not supported on mobile devices\",\n        );\n      } else {\n        this.autoFeedback = new AutoFeedback(\n          this.config.sseBaseUrl,\n          this.logger,\n          this.httpClient,\n          opts?.feedback?.autoFeedbackHandler,\n          String(this.context.user?.id),\n          opts?.feedback?.ui?.position,\n          opts?.feedback?.ui?.translations,\n        );\n      }\n    }\n\n    if (shouldShowToolbar(opts)) {\n      this.logger.info(\"opening toolbar toggler\");\n      showToolbarToggle({\n        bucketClient: this,\n        position:\n          typeof opts.toolbar === \"object\" ? opts.toolbar.position : undefined,\n      });\n    }\n\n    // Register hooks\n    this.hooks = new HooksManager();\n    this.featuresClient.onUpdated(() => {\n      this.hooks.trigger(\"featuresUpdated\", this.featuresClient.getFeatures());\n    });\n  }\n\n  /**\n   * Initialize the Bucket SDK.\n   *\n   * Must be called before calling other SDK methods.\n   */\n  async initialize() {\n    const start = Date.now();\n    if (this.autoFeedback) {\n      // do not block on automated feedback surveys initialization\n      this.autoFeedbackInit = this.autoFeedback.initialize().catch((e) => {\n        this.logger.error(\"error initializing automated feedback surveys\", e);\n      });\n    }\n\n    await this.featuresClient.initialize();\n    if (this.context.user && this.config.enableTracking) {\n      this.user().catch((e) => {\n        this.logger.error(\"error sending user\", e);\n      });\n    }\n\n    if (this.context.company && this.config.enableTracking) {\n      this.company().catch((e) => {\n        this.logger.error(\"error sending company\", e);\n      });\n    }\n\n    this.logger.info(\n      \"Bucket initialized in \" +\n        Math.round(Date.now() - start) +\n        \"ms\" +\n        (this.config.offline ? \" (offline mode)\" : \"\"),\n    );\n  }\n\n  /**\n   * Add an event listener\n   *\n   * @param type Type of events to listen for\n   * @param handler The function to call when the event is triggered.\n   * @returns A function to remove the hook.\n   */\n  on<THookType extends keyof HookArgs>(\n    type: THookType,\n    handler: (args0: HookArgs[THookType]) => void,\n  ) {\n    return this.hooks.addHook(type, handler);\n  }\n\n  /**\n   * Remove an event listener\n   *\n   * @param type Type of event to remove.\n   * @param handler The same function that was passed to `on`.\n   *\n   * @returns A function to remove the hook.\n   */\n  off<THookType extends keyof HookArgs>(\n    type: THookType,\n    handler: (args0: HookArgs[THookType]) => void,\n  ) {\n    this.hooks.removeHook(type, handler);\n  }\n\n  /**\n   * Get the current configuration.\n   */\n  getConfig() {\n    return this.config;\n  }\n\n  /**\n   * Update the user context.\n   * Performs a shallow merge with the existing user context.\n   * Attempting to update the user ID will log a warning and be ignored.\n   *\n   * @param user\n   */\n  async updateUser(user: { [key: string]: string | number | undefined }) {\n    if (user.id && user.id !== this.context.user?.id) {\n      this.logger.warn(\n        \"ignoring attempt to update the user ID. Re-initialize the BucketClient with a new user ID instead.\",\n      );\n      return;\n    }\n\n    this.context.user = {\n      ...this.context.user,\n      ...user,\n      id: user.id ?? this.context.user?.id,\n    };\n    void this.user();\n    await this.featuresClient.setContext(this.context);\n  }\n\n  /**\n   * Update the company context.\n   * Performs a shallow merge with the existing company context.\n   * Attempting to update the company ID will log a warning and be ignored.\n   *\n   * @param company The company details.\n   */\n  async updateCompany(company: { [key: string]: string | number | undefined }) {\n    if (company.id && company.id !== this.context.company?.id) {\n      this.logger.warn(\n        \"ignoring attempt to update the company ID. Re-initialize the BucketClient with a new company ID instead.\",\n      );\n      return;\n    }\n    this.context.company = {\n      ...this.context.company,\n      ...company,\n      id: company.id ?? this.context.company?.id,\n    };\n    void this.company();\n    await this.featuresClient.setContext(this.context);\n  }\n\n  /**\n   * Update the company context.\n   * Performs a shallow merge with the existing company context.\n   * Updates to the company ID will be ignored.\n   *\n   * @param otherContext Additional context.\n   */\n  async updateOtherContext(otherContext: {\n    [key: string]: string | number | undefined;\n  }) {\n    this.context.otherContext = {\n      ...this.context.otherContext,\n      ...otherContext,\n    };\n    await this.featuresClient.setContext(this.context);\n  }\n\n  /**\n   * Track an event in Bucket.\n   *\n   * @param eventName The name of the event.\n   * @param attributes Any attributes you want to attach to the event.\n   */\n  async track(eventName: string, attributes?: Record<string, any> | null) {\n    if (!this.context.user) {\n      this.logger.warn(\"'track' call ignored. No user context provided\");\n      return;\n    }\n    if (!this.config.enableTracking) {\n      this.logger.warn(\"'track' call ignored. 'enableTracking' is false\");\n      return;\n    }\n\n    if (this.config.offline) {\n      return;\n    }\n\n    const payload: TrackedEvent = {\n      userId: String(this.context.user.id),\n      event: eventName,\n    };\n    if (attributes) payload.attributes = attributes;\n    if (this.context.company?.id)\n      payload.companyId = String(this.context.company?.id);\n\n    const res = await this.httpClient.post({ path: `/event`, body: payload });\n    this.logger.debug(`sent event`, res);\n\n    this.hooks.trigger(\"track\", {\n      eventName,\n      attributes,\n      user: this.context.user,\n      company: this.context.company,\n    });\n    return res;\n  }\n\n  /**\n   * Submit user feedback to Bucket. Must include either `score` or `comment`, or both.\n   *\n   * @param payload The feedback details to submit.\n   * @returns The server response.\n   */\n  async feedback(payload: Feedback) {\n    if (this.config.offline) {\n      return;\n    }\n\n    const userId =\n      payload.userId ||\n      (this.context.user?.id ? String(this.context.user?.id) : undefined);\n\n    const companyId =\n      payload.companyId ||\n      (this.context.company?.id ? String(this.context.company?.id) : undefined);\n\n    return await feedback(this.httpClient, this.logger, {\n      userId,\n      companyId,\n      ...payload,\n    });\n  }\n\n  /**\n   * Display the Bucket feedback form UI programmatically.\n   *\n   * This can be used to collect feedback from users in Bucket in cases where Automated Feedback Surveys isn't appropriate.\n   *\n   * @param options\n   */\n  requestFeedback(options: RequestFeedbackData) {\n    if (!this.context.user?.id) {\n      this.logger.error(\n        \"`requestFeedback` call ignored. No `user` context provided at initialization\",\n      );\n      return;\n    }\n\n    if (!options.featureKey) {\n      this.logger.error(\n        \"`requestFeedback` call ignored. No `featureKey` provided\",\n      );\n      return;\n    }\n\n    const feedbackData = {\n      featureKey: options.featureKey,\n      companyId:\n        options.companyId ||\n        (this.context.company?.id\n          ? String(this.context.company?.id)\n          : undefined),\n      source: \"widget\" as const,\n    } satisfies Feedback;\n\n    // Wait a tick before opening the feedback form,\n    // to prevent the same click from closing it.\n    setTimeout(() => {\n      feedbackLib.openFeedbackForm({\n        key: options.featureKey,\n        title: options.title,\n        position: options.position || this.requestFeedbackOptions.position,\n        translations:\n          options.translations || this.requestFeedbackOptions.translations,\n        openWithCommentVisible: options.openWithCommentVisible,\n        onClose: options.onClose,\n        onDismiss: options.onDismiss,\n        onScoreSubmit: async (data) => {\n          const res = await this.feedback({\n            ...feedbackData,\n            ...data,\n          });\n\n          if (res) {\n            const json = await res.json();\n            return { feedbackId: json.feedbackId };\n          }\n          return { feedbackId: undefined };\n        },\n        onSubmit: async (data) => {\n          // Default onSubmit handler\n          await this.feedback({\n            ...feedbackData,\n            ...data,\n          });\n\n          options.onAfterSubmit?.(data);\n        },\n      });\n    }, 1);\n  }\n\n  /**\n   * Returns a map of enabled features.\n   * Accessing a feature will *not* send a check event\n   * and `isEnabled` does not take any feature overrides\n   * into account.\n   *\n   * @returns Map of features.\n   */\n  getFeatures(): RawFeatures {\n    return this.featuresClient.getFeatures();\n  }\n\n  /**\n   * Return a feature. Accessing `isEnabled` or `config` will automatically send a `check` event.\n   * @returns A feature.\n   */\n  getFeature(key: string): Feature {\n    const f = this.getFeatures()[key];\n\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n    const value = f?.isEnabledOverride ?? f?.isEnabled ?? false;\n    const config = f?.config\n      ? {\n          key: f.config.key,\n          payload: f.config.payload,\n        }\n      : { key: undefined, payload: undefined };\n\n    return {\n      get isEnabled() {\n        self\n          .sendCheckEvent({\n            action: \"check-is-enabled\",\n            key,\n            version: f?.targetingVersion,\n            ruleEvaluationResults: f?.ruleEvaluationResults,\n            missingContextFields: f?.missingContextFields,\n            value,\n          })\n          .catch(() => {\n            // ignore\n          });\n        return value;\n      },\n      get config() {\n        self\n          .sendCheckEvent({\n            action: \"check-config\",\n            key,\n            version: f?.config?.version,\n            ruleEvaluationResults: f?.config?.ruleEvaluationResults,\n            missingContextFields: f?.config?.missingContextFields,\n            value: f?.config && {\n              key: f.config.key,\n              payload: f.config.payload,\n            },\n          })\n          .catch(() => {\n            // ignore\n          });\n\n        return config;\n      },\n      track: () => this.track(key),\n      requestFeedback: (\n        options: Omit<RequestFeedbackData, \"featureKey\" | \"featureId\">,\n      ) => {\n        this.requestFeedback({\n          featureKey: key,\n          ...options,\n        });\n      },\n      isEnabledOverride: this.featuresClient.getFeatureOverride(key),\n      setIsEnabledOverride(isEnabled: boolean | null) {\n        self.featuresClient.setFeatureOverride(key, isEnabled);\n      },\n    };\n  }\n\n  private sendCheckEvent(checkEvent: CheckEvent) {\n    return this.featuresClient.sendCheckEvent(checkEvent, () => {\n      this.hooks.trigger(\n        checkEvent.action == \"check-config\" ? \"configCheck\" : \"enabledCheck\",\n        checkEvent,\n      );\n      this.hooks.trigger(\"check\", checkEvent);\n    });\n  }\n\n  /**\n   * Stop the SDK.\n   * This will stop any automated feedback surveys.\n   *\n   **/\n  async stop() {\n    if (this.autoFeedback) {\n      // ensure fully initialized before stopping\n      await this.autoFeedbackInit;\n      this.autoFeedback.stop();\n    }\n\n    this.featuresClient.stop();\n  }\n\n  /**\n   * Send attributes to Bucket for the current user\n   */\n  private async user() {\n    if (!this.context.user) {\n      this.logger.warn(\n        \"`user` call ignored. No user context provided at initialization\",\n      );\n      return;\n    }\n\n    if (this.config.offline) {\n      return;\n    }\n\n    const { id, ...attributes } = this.context.user;\n    const payload: User = {\n      userId: String(id),\n      attributes,\n    };\n    const res = await this.httpClient.post({ path: `/user`, body: payload });\n    this.logger.debug(`sent user`, res);\n\n    this.hooks.trigger(\"user\", this.context.user);\n    return res;\n  }\n\n  /**\n   * Send attributes to Bucket for the current company.\n   */\n  private async company() {\n    if (!this.context.user) {\n      this.logger.warn(\n        \"`company` call ignored. No user context provided at initialization\",\n      );\n      return;\n    }\n\n    if (!this.context.company) {\n      this.logger.warn(\n        \"`company` call ignored. No company context provided at initialization\",\n      );\n      return;\n    }\n\n    if (this.config.offline) {\n      return;\n    }\n\n    const { id, ...attributes } = this.context.company;\n    const payload: Company = {\n      userId: String(this.context.user.id),\n      companyId: String(id),\n      attributes,\n    };\n\n    const res = await this.httpClient.post({ path: `/company`, body: payload });\n    this.logger.debug(`sent company`, res);\n    this.hooks.trigger(\"company\", this.context.company);\n    return res;\n  }\n}\n"],"names":["API_BASE_URL","APP_BASE_URL","SSE_REALTIME_BASE_URL","SDK_VERSION_HEADER_NAME","SDK_VERSION","version","FEATURE_EVENTS_PER_MIN","quietConsoleLogger","_","message","args","loggerWithPrefix","logger","prefix","oneMinute","RateLimiter","eventsPerMinute","key","func","now","events","parseAPIFeaturesResponse","featuresInput","isObject","features","feature","FeatureCache","storage","staleTimeMs","expireTimeMs","cacheData","cachedResponseRaw","validateCacheData","_k","v","cachedResponse","cacheDataInput","cacheEntry","item","FEATURES_UPDATED_EVENT","DEFAULT_FEATURES_CONFIG","validateFeaturesResponse","response","flattenJSON","obj","result","flat","flatKey","FEATURES_EXPIRE_MS","localStorageFetchedFeaturesKey","localStorageOverridesKey","setOverridesCache","overrides","getOverridesCache","cachedOverrides","FeaturesClient","httpClient","context","options","value","fallbackFeatures","acc","storedFeatureOverrides","e","callback","params","res","errorBody","typeRes","checkEvent","cb","rateLimitKey","payload","mergedFeatures","fetchedFeature","isEnabledOverride","flattenedContext","report","featureKey","_a","_c","_b","cacheKey","cachedItem","fetchedFeatures","override","isEnabled","assign","target","i","source","defaultConverter","init","converter","defaultAttributes","set","name","attributes","stringifiedAttributes","attributeName","get","cookies","jar","parts","found","api","markPromptMessageCompleted","userId","promptId","expiresAt","Cookies","checkPromptMessageCompleted","rememberAuthToken","channel","token","getAuthToken","val","forgetAuthToken","ABLY_TOKEN_ERROR_MIN","ABLY_TOKEN_ERROR_MAX","AblySSEChannel","sseBaseUrl","messageHandler","body","tokenRequest","cached","url","details","errorCode","errorPayload","error","connectionState","m","retryInterval","retryCount","retriesRemaining","tryConnect","openAblySSEChannel","sse","parsePromptMessage","processPromptMessage","prompt","displayHandler","completionHandler","n","l","u","o","r","f","c","s","h","p","y","d","w","t","g","k","b","x","C","M","P","O","j","S","a","$","N","I","L","V","T","A","F","H","q","z","B","feedbackContainerId","toolbarContainerId","propagatedEvents","D","min","max","round","floor","createCoords","oppositeSideMap","oppositeAlignmentMap","clamp","start","end","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","getSideList","side","isStart","lr","rl","tb","bt","getOppositeAxisPlacements","flipAlignment","direction","list","expandPaddingObject","padding","getPaddingObject","rectToClientRect","rect","width","height","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","config","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","fn","nextX","nextY","data","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","element","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","offset","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","_overflowsData$filter2","currentSideAxis","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","selector","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","getCssDimensions","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","left","top","convertOffsetParentRelativeRectToViewportRelativeRect","documentElement","topLayer","scroll","offsets","isOffsetParentAnElement","offsetRect","getClientRects","getWindowScrollBarX","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","el","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","isStaticPositioned","getTrueOffsetParent","polyfill","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","observeMove","onMove","io","timeoutId","root","cleanup","_io","refresh","skip","threshold","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","entries","ratio","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","isRef","arrowCore","deepEqual","keys","getDPR","roundByDPR","dpr","useLatestRef","ref","useRef","useLayoutEffect","useFloating","externalReference","externalFloating","transform","whileElementsMounted","open","setData","useState","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","useCallback","referenceRef","setFloating","floatingRef","floatingEl","dataRef","whileElementsMountedRef","platformRef","positionData","fullData","isMountedRef","refs","useMemo","floatingStyles","initialStyles","stopPropagation","attachContainer","containerId","container","event","parseOffset","offsetInput","parseUnanchoredPosition","position","offsetY","offsetX","useDialog","onClose","onOpen","initialValue","isOpen","setIsOpen","close","toggle","prev","Dialog","onDismiss","children","showArrow","arrowRef","dialogRef","anchor","actualPlacement","unanchoredPosition","dismiss","useEffect","escapeHandler","clickOutsideHandler","observer","mutations","mutation","setDiagRef","classes","Fragment","styles","DialogArrow","arrowData","arrowX","arrowY","staticSide","arrowStyles","DialogHeader","innerRef","DialogContent","Close","props","DEFAULT_TRANSLATIONS","useTimer","initialDuration","enabled","onEnd","stopped","setStopped","duration","setDuration","startTime","setStartTime","currentTime","setCurrentTime","stop","startWithDuration","nextDuration","endTime","elapsedFraction","Check","CheckCircle","Button","variant","rest","Logo","Plug","Dissatisfied","Neutral","Satisfied","VeryDissatisfied","VerySatisfied","scores","StarRating","selectedValue","onChange","bg","color","index","score","Score","isSelected","ANIMATION_SPEED","getFeedbackDataFromForm","formData","FeedbackForm","question","scoreState","openWithCommentVisible","onInteraction","onSubmit","onScoreSubmit","hasRating","setHasRating","status","setStatus","setError","showForm","setShowForm","handleSubmit","err","containerRef","formRef","headerRef","expandedContentRef","submittedRef","transitionToDefault","transitionToExpanded","transitionToSuccess","ScoreStatus","loadingTimeElapsed","setLoadingTimeElapsed","hasBeenSubmitted","setHasBeenSubmitted","timer","showIdle","showLoading","showSubmitted","RadialProgress","diameter","progress","radius","circumference","filled","INACTIVE_DURATION_MS","SUCCESS_DURATION_MS","FeedbackDialog","title","translations","feedbackId","setFeedbackId","setScoreState","autoClose","submit","submitScore","DEFAULT_POSITION","attachDialogContainer","openInstances","openFeedbackForm","shadowRoot","render","createDefaultFeedbackPromptHandler","_prompt","handlers","feedback","featureId","feedbackPayload","AutoFeedback","feedbackPromptHandler","feedbackTranslations","existingAuth","parsed","replyCallback","reply","feedbackLib.openFeedbackForm","HooksManager","hook","arg","HttpClient","publishableKey","opts","path","timeoutMs","controller","id","Feature","gutter","Switch","checked","FeaturesTable","searchQuery","appBaseUrl","setIsEnabledOverride","hasFeatures","hasShownFeatures","searchedFeatures","aMatches","bMatches","FeatureRow","setEnabledOverride","isNotVisible","showOnOpen","setShowOnOpen","Reset","isChecked","isOverridden","FeatureSearch","onSearch","Toolbar","bucketClient","toggleToolbarRef","dialogContentRef","setFeatures","updateFeatures","rawFeatures","hasAnyOverrides","search","setSearch","sortedFeatures","ToolbarToggle","onClick","toggleClasses","indicatorClasses","DEFAULT_PLACEMENT","showToolbarToggle","isMobile","defaultConfig","shouldShowToolbar","toolbarOpts","BucketClient","_d","_f","_e","_g","_h","_i","_j","_l","_n","_m","type","handler","user","company","otherContext","eventName","companyId","feedbackData","self"],"mappings":"oBAEaA,KAAe,2BACfC,KAAe,yBACfC,KAAwB,mCAExBC,KAA0B,sBAE1BC,KAAc,eAAeC,EAAO,IACpCC,KAAyB,GCFzBC,KAAqB;AAAA,EAChC,MAAMC,GAAW;AAAA,EAEjB;AAAA,EACA,KAAKA,GAAW;AAAA,EAEhB;AAAA,EACA,KAAKC,MAAoBC,GAAa;AAC5B,YAAA,KAAKD,GAAS,GAAGC,CAAI;AAAA,EAC/B;AAAA,EACA,MAAMD,MAAoBC,GAAa;AAC7B,YAAA,MAAMD,GAAS,GAAGC,CAAI;AAAA,EAChC;AACF;AAEgB,SAAAC,GAAiBC,GAAgBC,GAAwB;AAChE,SAAA;AAAA,IACL,MAAMJ,MAAoBC,GAAa;AACrC,MAAAE,EAAO,MAAM,GAAGC,CAAM,IAAIJ,CAAO,IAAI,GAAGC,CAAI;AAAA,IAC9C;AAAA,IACA,KAAKD,MAAoBC,GAAa;AACpC,MAAAE,EAAO,KAAK,GAAGC,CAAM,IAAIJ,CAAO,IAAI,GAAGC,CAAI;AAAA,IAC7C;AAAA,IACA,KAAKD,MAAoBC,GAAa;AACpC,MAAAE,EAAO,KAAK,GAAGC,CAAM,IAAIJ,CAAO,IAAI,GAAGC,CAAI;AAAA,IAC7C;AAAA,IACA,MAAMD,MAAoBC,GAAa;AACrC,MAAAE,EAAO,MAAM,GAAGC,CAAM,IAAIJ,CAAO,IAAI,GAAGC,CAAI;AAAA,IAC9C;AAAA,EAAA;AAEJ;ACnCA,MAAMI,KAAY,KAAK;AAEvB,MAAqBC,GAAY;AAAA,EAG/B,YACUC,GACAJ,GACR;AAFQ,SAAA,kBAAAI,GACA,KAAA,SAAAJ,GAJV,KAAQ,cAAwC;EAK7C;AAAA,EAEI,YAAeK,GAAaC,GAA8B;AACzD,UAAAC,IAAM,KAAK;AAEjB,IAAK,KAAK,YAAYF,CAAG,MAClB,KAAA,YAAYA,CAAG,IAAI;AAGpB,UAAAG,IAAS,KAAK,YAAYH,CAAG;AAEnC,WAAOG,EAAO,UAAUD,IAAMC,EAAO,CAAC,IAAIN;AACxC,MAAAM,EAAO,MAAM;AAIf,QADsBA,EAAO,UAAU,KAAK,iBACzB;AACjB,WAAK,OAAO,MAAM,uBAAuB,EAAE,KAAAH,EAAK,CAAA;AAChD;AAAA,IACF;AAEA,WAAAG,EAAO,KAAKD,CAAG,GACRD,EAAK;AAAA,EACd;AACF;ACpBO,SAASG,GACdC,GAC6B;AACzB,MAAA,CAACC,GAASD,CAAa;AACzB;AAGF,QAAME,IAA4B,CAAA;AAClC,aAAWP,KAAOK,GAAe;AACzB,UAAAG,IAAUH,EAAcL,CAAG;AAEjC,QACE,OAAOQ,EAAQ,aAAc,aAC7BA,EAAQ,QAAQR,KAChB,OAAOQ,EAAQ,oBAAqB,YACnCA,EAAQ,UAAU,OAAOA,EAAQ,UAAW,YAC5CA,EAAQ,wBACP,CAAC,MAAM,QAAQA,EAAQ,oBAAoB,KAC5CA,EAAQ,yBACP,CAAC,MAAM,QAAQA,EAAQ,qBAAqB;AAE9C;AAGF,IAAAD,EAASP,CAAG,IAAI;AAAA,MACd,WAAWQ,EAAQ;AAAA,MACnB,kBAAkBA,EAAQ;AAAA,MAC1B,KAAAR;AAAA,MACA,QAAQQ,EAAQ;AAAA,MAChB,sBAAsBA,EAAQ;AAAA,MAC9B,uBAAuBA,EAAQ;AAAA,IAAA;AAAA,EAEnC;AAEO,SAAAD;AACT;AAOO,MAAME,GAAa;AAAA,EAKxB,YAAY;AAAA,IACV,SAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,GAKC;AACD,SAAK,UAAUF,GACf,KAAK,cAAcC,GACnB,KAAK,eAAeC;AAAA,EACtB;AAAA,EAEA,IACEZ,GACA;AAAA,IACE,UAAAO;AAAA,EAAA,GAIF;AACA,QAAIM,IAAuB,CAAA;AAEvB,QAAA;AACI,YAAAC,IAAoB,KAAK,QAAQ,IAAI;AAC3C,MAAIA,MACFD,IAAYE,GAAkB,KAAK,MAAMD,CAAiB,CAAC,KAAK;IAClE,QACM;AAAA,IAER;AAEA,WAAAD,EAAUb,CAAG,IAAI;AAAA,MACf,UAAU,KAAK,IAAI,IAAI,KAAK;AAAA,MAC5B,SAAS,KAAK,IAAI,IAAI,KAAK;AAAA,MAC3B,UAAAO;AAAA,IAAA,GAGFM,IAAY,OAAO;AAAA,MACjB,OAAO,QAAQA,CAAS,EAAE,OAAO,CAAC,CAACG,GAAIC,CAAC,MAAMA,EAAE,WAAW,KAAK,KAAK;AAAA,IAAA,GAGvE,KAAK,QAAQ,IAAI,KAAK,UAAUJ,CAAS,CAAC,GAEnCA;AAAA,EACT;AAAA,EAEA,IAAIb,GAAsC;AACpC,QAAA;AACI,YAAAc,IAAoB,KAAK,QAAQ,IAAI;AAC3C,UAAIA,GAAmB;AACrB,cAAMI,IAAiBH,GAAkB,KAAK,MAAMD,CAAiB,CAAC;AAEpE,YAAAI,KACAA,EAAelB,CAAG,KAClBkB,EAAelB,CAAG,EAAE,WAAW,KAAK;AAE7B,iBAAA;AAAA,YACL,UAAUkB,EAAelB,CAAG,EAAE;AAAA,YAC9B,OAAOkB,EAAelB,CAAG,EAAE,UAAU,KAAK,IAAI;AAAA,UAAA;AAAA,MAGpD;AAAA,IAAA,QACM;AAAA,IAER;AAAA,EAEF;AACF;AAGA,SAASe,GAAkBI,GAAqB;AAC1C,MAAA,CAACb,GAASa,CAAc;AAC1B;AAGF,QAAMN,IAAuB,CAAA;AAC7B,aAAWb,KAAOmB,GAAgB;AAC1B,UAAAC,IAAaD,EAAenB,CAAG;AAGrC,QAFI,CAACM,GAASc,CAAU,KAGtB,OAAOA,EAAW,YAAa,YAC/B,OAAOA,EAAW,WAAY,YAC7BA,EAAW,YAAY,CAAChB,GAAyBgB,EAAW,QAAQ;AAErE;AAGF,IAAAP,EAAUb,CAAG,IAAI;AAAA,MACf,UAAUoB,EAAW;AAAA,MACrB,SAASA,EAAW;AAAA,MACpB,UAAUA,EAAW;AAAA,IAAA;AAAA,EAEzB;AACO,SAAAP;AACT;AAGO,SAASP,GAASe,GAAoB;AAC3C,SAAOA,KAAQ,OAAOA,KAAS,YAAY,CAAC,MAAM,QAAQA,CAAI;AAChE;AC3FA,MAAMC,KAAyB,mBA8BlBC,KAAkC;AAAA,EAC7C,kBAAkB,CAAC;AAAA,EACnB,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,SAAS;AACX;AAEO,SAASC,GAAyBC,GAAe;AAKlD,MAJA,CAACnB,GAASmB,CAAQ,KAIlB,OAAOA,EAAS,WAAY,aAAa,CAACnB,GAASmB,EAAS,QAAQ;AACtE;AAGI,QAAAlB,IAAWH,GAAyBqB,EAAS,QAAQ;AAE3D,MAAKlB;AAIE,WAAA;AAAA,MACL,SAASkB,EAAS;AAAA,MAClB,UAAAlB;AAAA,IAAA;AAEJ;AAEO,SAASmB,GAAYC,GAA+C;AACzE,QAAMC,IAA8B,CAAA;AACpC,aAAW5B,KAAO2B;AAChB,QAAI,OAAOA,EAAI3B,CAAG,KAAM,UAAU;AAChC,YAAM6B,IAAOH,GAAYC,EAAI3B,CAAG,CAAC;AACjC,iBAAW8B,KAAWD;AACpB,QAAAD,EAAO,GAAG5B,CAAG,IAAI8B,CAAO,EAAE,IAAID,EAAKC,CAAO;AAAA,IAEnC,MAAA,CAAA,OAAOH,EAAI3B,CAAG,IAAM,QACtB4B,EAAA5B,CAAG,IAAI2B,EAAI3B,CAAG;AAGlB,SAAA4B;AACT;AA6CO,MAAMG,KAAqB,KAAK,KAAK,KAAK,KAAK,KAEhDC,KAAiC,6BACjCC,KAA2B;AAIjC,SAASC,GAAkBC,GAA8B;AACvD,eAAa,QAAQF,IAA0B,KAAK,UAAUE,CAAS,CAAC;AAC1E;AAEA,SAASC,KAAuC;AAC9C,QAAMC,IAAkB,KAAK;AAAA,IAC3B,aAAa,QAAQJ,EAAwB,KAAK;AAAA,EAAA;AAGhD,SAAC3B,GAAS+B,CAAe,IAItBA,IAHE;AAIX;AAKO,MAAMC,GAAe;AAAA,EAc1B,YACUC,GACAC,GACR7C,GACA8C,GASA;AAZQ,SAAA,aAAAF,GACA,KAAA,UAAAC,GAbV,KAAQ,mBAAsC,IAE9C,KAAQ,WAAwB,IAMxB,KAAA,cAAc,IAAI,eAClB,KAAA,kBAAmC,IAAI,mBAgB7C,KAAK,kBAAkB,IAClB,KAAA,SAAS9C,GAAiBC,GAAQ,YAAY,GACnD,KAAK,QAAQ8C,KAAA,QAAAA,EAAS,QAClBA,EAAQ,QACR,IAAIhC,GAAa;AAAA,MACf,SAAS;AAAA,QACP,KAAK,MAAM,aAAa,QAAQuB,EAA8B;AAAA,QAC9D,KAAK,CAACU,MACJ,aAAa,QAAQV,IAAgCU,CAAK;AAAA,MAC9D;AAAA,MACA,cAAaD,KAAA,gBAAAA,EAAS,gBAAe;AAAA,MACrC,eAAcA,KAAA,gBAAAA,EAAS,iBAAgBV;AAAA,IAAA,CACxC;AAED,QAAAY;AAEJ,IAAI,MAAM,QAAQF,KAAA,gBAAAA,EAAS,gBAAgB,IACzCE,IAAmBF,EAAQ,iBAAiB;AAAA,MAC1C,CAACG,GAAK5C,OACJ4C,EAAI5C,CAAG,IAAI,IACJ4C;AAAA,MAET,CAAC;AAAA,IAAA,IAGgBD,KAAAF,KAAA,gBAAAA,EAAS,qBAAoB,IAGlD,KAAK,SAAS;AAAA,MACZ,GAAGlB;AAAA,MACH,GAAGkB;AAAA,MACH,kBAAAE;AAAA,IAAA,GAGF,KAAK,eACHF,KAAA,gBAAAA,EAAS,gBACT,IAAI3C,GAAYT,IAAwB,KAAK,MAAM;AAEjD,QAAA;AACF,YAAMwD,IAAyBT;AAC/B,iBAAWpC,KAAO6C;AAChB,aAAK,iBAAiB7C,CAAG,IAAI6C,EAAuB7C,CAAG;AAAA,aAElD8C,GAAG;AACL,WAAA,OAAO,KAAK,8CAA8CA,CAAC,GAChE,KAAK,mBAAmB;IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,aAAa;AACjB,UAAMvC,IAAY,MAAM,KAAK,mBAAA,KAAyB,CAAA;AACtD,SAAK,mBAAmBA,CAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,WAAWiC,GAAkB;AACjC,SAAK,UAAUA,GACf,MAAM,KAAK;EACb;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO;AACZ,SAAK,gBAAgB;EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAUO,GAAsB;AACzB,SAAA,YAAY,iBAAiBzB,IAAwByB,GAAU;AAAA,MAClE,QAAQ,KAAK,gBAAgB;AAAA,IAAA,CAC9B;AAAA,EACH;AAAA,EAEA,cAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,qBAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,gBAAsD;AAC3D,UAAAC,IAAS,KAAK;AAChB,QAAA;AACF,YAAMC,IAAM,MAAM,KAAK,WAAW,IAAI;AAAA,QACpC,MAAM;AAAA,QACN,WAAW,KAAK,OAAO;AAAA,QACvB,QAAAD;AAAA,MAAA,CACD;AAEG,UAAA,CAACC,EAAI,IAAI;AACX,YAAIC,IAAY;AACZ,YAAA;AACU,UAAAA,IAAA,MAAMD,EAAI;QAAK,QACrB;AAAA,QAER;AAEA,cAAM,IAAI;AAAA,UACR,+BACEA,EAAI,SACJ,QACA,KAAK,UAAUC,CAAS;AAAA,QAAA;AAAA,MAE9B;AAEA,YAAMC,IAAU3B,GAAyB,MAAMyB,EAAI,KAAM,CAAA;AACzD,UAAI,CAACE,KAAW,CAACA,EAAQ;AACjB,cAAA,IAAI,MAAM,6BAA6B;AAG/C,aAAOA,EAAQ;AAAA,aACRL,GAAG;AACL,WAAA,OAAO,MAAM,6BAA6BA,CAAC;AAChD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAeM,GAAwBC,GAAgB;AACvD,QAAA,KAAK,OAAO;AACd;AAGF,UAAMC,IAAe,eAAe,KAAK,cAAc,SAAS,CAAC,IAAIF,EAAW,GAAG,IAAIA,EAAW,OAAO,IAAIA,EAAW,KAAK;AAC7H,iBAAM,KAAK,YAAY,YAAYE,GAAc,YAAY;AAC3D,YAAMC,IAAU;AAAA,QACd,QAAQH,EAAW;AAAA,QACnB,KAAKA,EAAW;AAAA,QAChB,kBAAkBA,EAAW;AAAA,QAC7B,aAAa,KAAK;AAAA,QAClB,YAAYA,EAAW;AAAA,QACvB,iBAAiBA,EAAW;AAAA,QAC5B,mBAAmBA,EAAW;AAAA,MAAA;AAGhC,WAAK,WACF,KAAK;AAAA,QACJ,MAAM;AAAA,QACN,MAAMG;AAAA,MAAA,CACP,EACA,MAAM,CAACT,MAAW;AACZ,aAAA,OAAO,KAAK,sCAAsCA,CAAC;AAAA,MAAA,CACzD,GAEE,KAAA,OAAO,MAAM,sBAAsBS,CAAO,GAC5CF;IAAA,CACJ,GAEMD,EAAW;AAAA,EACpB;AAAA,EAEQ,yBAAyB;AAC/B,UAAMI,IAA8B,CAAA;AAGzB,eAAAxD,KAAO,KAAK,iBAAiB;AAChC,YAAAyD,IAAiB,KAAK,gBAAgBzD,CAAG;AAC/C,UAAI,CAACyD,EAAgB;AACrB,YAAMC,IAAoB,KAAK,iBAAiB1D,CAAG,KAAK;AACxD,MAAAwD,EAAexD,CAAG,IAAI;AAAA,QACpB,GAAGyD;AAAA,QACH,mBAAAC;AAAA,MAAA;AAAA,IAEJ;AAEA,SAAK,WAAWF,GAEhB,KAAK,YAAY,cAAc,IAAI,MAAMlC,EAAsB,CAAC;AAAA,EAClE;AAAA,EAEQ,mBAAmBf,GAA2B;AACpD,SAAK,kBAAkBA,GACvB,KAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,cAAc;AACpB,UAAMoD,IAAmBjC,GAAY,EAAE,SAAS,KAAK,SAAS,GACxDsB,IAAS,IAAI,gBAAgBW,CAAgB;AAEnD,WAAAX,EAAO,OAAO,kBAAkB,KAAK,WAAW,cAAc,GAG9DA,EAAO,KAAK,GAELA;AAAA,EACT;AAAA,EAEQ,gCAAgCzC,GAA2B;;AACjE,UAAMqD,IAAmC,CAAA;AACzC,eAAWC,KAActD,GAAU;AAC3B,YAAAC,IAAUD,EAASsD,CAAU;AAC/B,OAAAC,IAAAtD,KAAA,gBAAAA,EAAS,yBAAT,QAAAsD,EAA+B,WAC1BF,EAAApD,EAAQ,GAAG,IAAIA,EAAQ,wBAG5BuD,KAAAC,IAAAxD,KAAA,gBAAAA,EAAS,WAAT,gBAAAwD,EAAiB,yBAAjB,QAAAD,EAAuC,WACzCH,EAAO,GAAGpD,EAAQ,GAAG,SAAS,IAAIA,EAAQ,OAAO;AAAA,IAErD;AAEA,IAAI,OAAO,KAAKoD,CAAM,EAAE,SAAS,KAC/B,KAAK,YAAY;AAAA,MACf,kCAAkC,KAAK,YAAY,EAAE,SAAU,CAAA;AAAA,MAC/D,MAAM;AACJ,aAAK,OAAO;AAAA,UACV;AAAA,UACAA;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EAGN;AAAA,EAEA,MAAc,qBAA2D;AACnE,QAAA,KAAK,OAAO;AACd;AAGF,UAAMK,IAAW,KAAK,YAAY,EAAE,SAAS,GACvCC,IAAa,KAAK,MAAM,IAAID,CAAQ;AAE1C,QAAIC,GAAY;AACd,UAAI,CAACA,EAAW,MAAO,QAAOA,EAAW;AAGrC,UAAA,KAAK,OAAO;AAEd,oBAAK,cAAc,EAChB,KAAK,CAAC3D,MAAa;AAClB,UAAKA,MAEA,KAAA,MAAM,IAAI0D,GAAU;AAAA,YACvB,UAAA1D;AAAA,UAAA,CACD,GACD,KAAK,mBAAmBA,CAAQ;AAAA,QAAA,CACjC,EACA,MAAM,MAAM;AAAA,QAAA,CAEZ,GACI2D,EAAW;AAAA,IAEtB;AAIM,UAAAC,IAAkB,MAAM,KAAK;AAEnC,WAAIA,KACG,KAAA,MAAM,IAAIF,GAAU;AAAA,MACvB,UAAUE;AAAA,IAAA,CACX,GAED,KAAK,gCAAgCA,CAAe,GAC7CA,KAGLD,IAEKA,EAAW,WAIb,OAAO,QAAQ,KAAK,OAAO,gBAAgB,EAAE;AAAA,MAClD,CAACtB,GAAK,CAAC5C,GAAKoE,CAAQ,OAClBxB,EAAI5C,CAAG,IAAI;AAAA,QACT,KAAAA;AAAA,QACA,WAAW,CAAC,CAACoE;AAAA,QACb,QACE,OAAOA,KAAa,YAAY,SAASA,IACrC;AAAA,UACE,KAAKA,EAAS;AAAA,UACd,SAASA,EAAS;AAAA,QAEpB,IAAA;AAAA,MAAA,GAEDxB;AAAA,MAET,CAAC;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,mBAAmB5C,GAAaqE,GAA2B;AACzD,QAAI,EAAE,OAAOA,KAAc,aAAaA,MAAc;AAC9C,YAAA,IAAI,MAAM,uDAAuD;AAGzE,IAAIA,MAAc,OACT,OAAA,KAAK,iBAAiBrE,CAAG,IAE3B,KAAA,iBAAiBA,CAAG,IAAIqE,GAE/BnC,GAAkB,KAAK,gBAAgB,GAEvC,KAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEA,mBAAmBlC,GAA6B;AACvC,WAAA,KAAK,iBAAiBA,CAAG,KAAK;AAAA,EACvC;AACF;AC1iBA;AAEA,SAASsE,GAAQC,GAAQ;AACvB,WAASC,IAAI,GAAGA,IAAI,UAAU,QAAQA,KAAK;AACzC,QAAIC,IAAS,UAAUD,CAAC;AACxB,aAASxE,KAAOyE;AACd,MAAAF,EAAOvE,CAAG,IAAIyE,EAAOzE,CAAG;AAAA,EAE3B;AACD,SAAOuE;AACT;AAIA,IAAIG,KAAmB;AAAA,EACrB,MAAM,SAAUhC,GAAO;AACrB,WAAIA,EAAM,CAAC,MAAM,QACfA,IAAQA,EAAM,MAAM,GAAG,EAAE,IAEpBA,EAAM,QAAQ,oBAAoB,kBAAkB;AAAA,EAC5D;AAAA,EACD,OAAO,SAAUA,GAAO;AACtB,WAAO,mBAAmBA,CAAK,EAAE;AAAA,MAC/B;AAAA,MACA;AAAA,IACD;AAAA,EACF;AACH;AAKA,SAASiC,GAAMC,GAAWC,GAAmB;AAC3C,WAASC,EAAKC,GAAMrC,GAAOsC,GAAY;AACrC,QAAI,SAAO,WAAa,MAIxB;AAAA,MAAAA,IAAaV,GAAO,CAAA,GAAIO,GAAmBG,CAAU,GAEjD,OAAOA,EAAW,WAAY,aAChCA,EAAW,UAAU,IAAI,KAAK,KAAK,IAAG,IAAKA,EAAW,UAAU,KAAK,IAEnEA,EAAW,YACbA,EAAW,UAAUA,EAAW,QAAQ,YAAW,IAGrDD,IAAO,mBAAmBA,CAAI,EAC3B,QAAQ,wBAAwB,kBAAkB,EAClD,QAAQ,SAAS,MAAM;AAE1B,UAAIE,IAAwB;AAC5B,eAASC,KAAiBF;AACxB,QAAKA,EAAWE,CAAa,MAI7BD,KAAyB,OAAOC,GAE5BF,EAAWE,CAAa,MAAM,OAWlCD,KAAyB,MAAMD,EAAWE,CAAa,EAAE,MAAM,GAAG,EAAE,CAAC;AAGvE,aAAQ,SAAS,SACfH,IAAO,MAAMH,EAAU,MAAMlC,GAAOqC,CAAI,IAAIE;AAAA;AAAA,EAC/C;AAED,WAASE,EAAKJ,GAAM;AAClB,QAAI,SAAO,WAAa,OAAgB,UAAU,UAAU,CAACA,IAQ7D;AAAA,eAFIK,IAAU,SAAS,SAAS,SAAS,OAAO,MAAM,IAAI,IAAI,IAC1DC,IAAM,CAAA,GACDb,IAAI,GAAGA,IAAIY,EAAQ,QAAQZ,KAAK;AACvC,YAAIc,IAAQF,EAAQZ,CAAC,EAAE,MAAM,GAAG,GAC5B9B,IAAQ4C,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAEnC,YAAI;AACF,cAAIC,IAAQ,mBAAmBD,EAAM,CAAC,CAAC;AAGvC,cAFAD,EAAIE,CAAK,IAAIX,EAAU,KAAKlC,GAAO6C,CAAK,GAEpCR,MAASQ;AACX;AAAA,QAEV,QAAkB;AAAA,QAAE;AAAA,MACf;AAED,aAAOR,IAAOM,EAAIN,CAAI,IAAIM;AAAA;AAAA,EAC3B;AAED,SAAO,OAAO;AAAA,IACZ;AAAA,MACE,KAAAP;AAAA,MACA,KAAAK;AAAA,MACA,QAAQ,SAAUJ,GAAMC,GAAY;AAClC,QAAAF;AAAA,UACEC;AAAA,UACA;AAAA,UACAT,GAAO,CAAE,GAAEU,GAAY;AAAA,YACrB,SAAS;AAAA,UACrB,CAAW;AAAA,QACX;AAAA,MACO;AAAA,MACD,gBAAgB,SAAUA,GAAY;AACpC,eAAOL,GAAK,KAAK,WAAWL,GAAO,CAAA,GAAI,KAAK,YAAYU,CAAU,CAAC;AAAA,MACpE;AAAA,MACD,eAAe,SAAUJ,GAAW;AAClC,eAAOD,GAAKL,GAAO,IAAI,KAAK,WAAWM,CAAS,GAAG,KAAK,UAAU;AAAA,MACnE;AAAA,IACF;AAAA,IACD;AAAA,MACE,YAAY,EAAE,OAAO,OAAO,OAAOC,CAAiB,EAAG;AAAA,MACvD,WAAW,EAAE,OAAO,OAAO,OAAOD,CAAS,EAAG;AAAA,IAC/C;AAAA,EACF;AACH;AAEA,IAAIY,KAAMb,GAAKD,IAAkB,EAAE,MAAM,IAAG,CAAE;AChIvC,MAAMe,KAA6B,CACxCC,GACAC,GACAC,MACG;AACHC,EAAAA,GAAQ,IAAI,iBAAiBH,CAAM,IAAIC,GAAU;AAAA,IAC/C,SAASC;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AACH,GAEaE,KAA8B,CACzCJ,GACAC,MAEWE,GAAQ,IAAI,iBAAiBH,CAAM,EAAE,MAClCC,GAGHI,KAAoB,CAC/BL,GACAM,GACAC,GACAL,MACG;AACKC,EAAAA,GAAA,IAAI,gBAAgBH,CAAM,IAAI,KAAK,UAAU,EAAE,SAAAM,GAAS,OAAAC,EAAO,CAAA,GAAG;AAAA,IACxE,SAASL;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,EAAA,CACT;AACH,GAEaM,KAAe,CAACR,MAAmB;AAC9C,QAAMS,IAAMN,GAAQ,IAAI,gBAAgBH,CAAM,EAAE;AAChD,MAAKS;AAID,QAAA;AACF,YAAM,EAAE,SAAAH,GAAS,OAAAC,EAAA,IAAU,KAAK,MAAME,CAAG;AAIzC,aAAI,EAACH,KAAA,QAAAA,EAAS,WAAU,EAACC,KAAA,QAAAA,EAAO,UACvB,SAEF;AAAA,QACL,SAAAD;AAAA,QACA,OAAAC;AAAA,MAAA;AAAA,IACF,QACM;AACC;AAAA,IACT;AACF,GAEaG,KAAkB,CAACV,MAAmB;AACzCG,EAAAA,GAAA,OAAO,gBAAgBH,CAAM,EAAE;AACzC,GC3CMW,KAAuB,KACvBC,KAAuB;AAEtB,MAAMC,GAAe;AAAA,EAM1B,YACUb,GACAM,GACAQ,GACAC,GACAlE,GACR5C,GACA;AANQ,SAAA,SAAA+F,GACA,KAAA,UAAAM,GACA,KAAA,aAAAQ,GACA,KAAA,iBAAAC,GACA,KAAA,aAAAlE,GAVV,KAAQ,SAAkB,IAC1B,KAAQ,cAAkC,MAC1C,KAAQ,gBAAuD,MAWxD,KAAA,SAAS7C,GAAiBC,GAAQ,OAAO,GAEzC,KAAK,WAAW,SAAS,GAAG,MAC/B,KAAK,cAAc;AAAA,EAEvB;AAAA,EAEA,MAAc,sBAAsB;AAClC,UAAMqD,IAAS,IAAI,gBAAgB,EAAE,QAAQ,KAAK,QAAQ,GACpDC,IAAM,MAAM,KAAK,WAAW,IAAI;AAAA,MACpC,MAAM;AAAA,MACN,QAAAD;AAAA,IAAA,CACD;AAED,QAAIC,EAAI,IAAI;AACJ,YAAAyD,IAAO,MAAMzD,EAAI;AACvB,UAAIyD,EAAK,SAAS;AAChB,eAAOA,EAAK;AACZ,cAAMC,IAAiCD;AAElC,oBAAA,OAAO,MAAM,8BAA8BC,CAAY,GACrDA;AAAA,MACT;AAAA,IACF;AAEK,SAAA,OAAO,MAAM,0CAA0C1D,CAAG;AAAA,EAEjE;AAAA,EAEA,MAAc,eAAe;AACrB,UAAA2D,IAASV,GAAa,KAAK,MAAM;AACvC,QAAIU,KAAUA,EAAO,YAAY,KAAK;AACpC,kBAAK,OAAO,MAAM,wBAAwBA,EAAO,SAASA,EAAO,KAAK,GAC/DA,EAAO;AAGV,UAAAD,IAAe,MAAM,KAAK;AAChC,QAAI,CAACA;AACH;AAGF,UAAME,IAAM,IAAI;AAAA,MACd,QAAQ,mBAAmBF,EAAa,OAAO,CAAC;AAAA,MAChD,KAAK;AAAA,IAAA,GAGD1D,IAAM,MAAM,MAAM4D,GAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAUF,CAAY;AAAA,IAAA,CAClC;AAED,QAAI1D,EAAI,IAAI;AACJ,YAAA6D,IAA4B,MAAM7D,EAAI;AACvC,kBAAA,OAAO,MAAM,sBAAsB6D,CAAO,GAE/Cf;AAAA,QACE,KAAK;AAAA,QACL,KAAK;AAAA,QACLe,EAAQ;AAAA,QACR,IAAI,KAAKA,EAAQ,OAAO;AAAA,MAAA,GAEnBA,EAAQ;AAAA,IACjB;AAEK,SAAA,OAAO,MAAM,gCAAgC;AAAA,EAGpD;AAAA,EAEA,MAAc,QAAQ,GAAU;;AAC9B,QAAI,aAAa,cAAc;AACzB,UAAAC;AAEA,UAAA;AACF,cAAMC,IAAe,KAAK,MAAM,EAAE,IAAI;AACtC,QAAAD,KAAYC,KAAA,gBAAAA,EAAc,SAAQ,OAAOA,EAAa,IAAI;AAAA,eACnDC,GAAY;AACnB,aAAK,OAAO,KAAK,qCAAqCA,GAAO,CAAC;AAAA,MAChE;AAEA,MACEF,KACAA,KAAaV,MACbU,KAAaT,OAER,KAAA,OAAO,KAAK,8CAA8C,GAC/DF,GAAgB,KAAK,MAAM;AAAA,IAC7B,OACK;AACC,YAAAc,KAAmBpD,IAAA,uBAAW,WAAX,gBAAAA,EAAmB;AAE5C,MAAIoD,MAAoB,IACjB,KAAA,OAAO,MAAM,kCAAkC,CAAC,IAC5CA,MAAoB,IACxB,KAAA,OAAO,KAAK,0CAA0C,CAAC,IAEvD,KAAA,OAAO,KAAK,0CAA0C,CAAC;AAAA,IAEhE;AAEA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,UAAU,GAAiB;AAC7B,QAAA3D;AAEA,QAAA;AACF,UAAI,EAAE,MAAM;AACV,cAAM/D,IAAU,KAAK,MAAM,EAAE,IAAI;AACjC,QAAIA,EAAQ,SACA+D,IAAA,KAAK,MAAM/D,EAAQ,IAAI;AAAA,MAErC;AAAA,aACOyH,GAAY;AACnB,WAAK,OAAO,KAAK,+BAA+BA,GAAO,CAAC;AACxD;AAAA,IACF;AAEA,QAAI1D,GAAS;AACN,WAAA,OAAO,MAAM,oBAAoBA,CAAO;AAEzC,UAAA;AACF,aAAK,eAAeA,CAAO;AAAA,eACpB0D,GAAY;AACnB,aAAK,OAAO,KAAK,4BAA4BA,GAAO1D,CAAO;AAAA,MAC7D;AAEA;AAAA,IACF;AAEK,SAAA,OAAO,KAAK,4BAA4B,CAAC;AAAA,EAChD;AAAA,EAEQ,OAAO,GAAU;AAClB,SAAA,OAAO,MAAM,kCAAkC,CAAC;AAAA,EACvD;AAAA,EAEA,MAAa,UAAU;AACrB,QAAI,KAAK,QAAQ;AACV,WAAA,OAAO,KAAK,iCAAiC;AAClD;AAAA,IACF;AAEA,SAAK,SAAS;AACV,QAAA;AACI,YAAA0C,IAAQ,MAAM,KAAK;AAEzB,UAAI,CAACA,EAAO;AAEZ,YAAMY,IAAM,IAAI,IAAI,OAAO,KAAK,UAAU;AACtC,MAAAA,EAAA,aAAa,OAAO,KAAK,KAAK,GAC9BA,EAAA,aAAa,OAAO,eAAeZ,CAAK,GAC5CY,EAAI,aAAa,OAAO,YAAY,KAAK,OAAO,GAC5CA,EAAA,aAAa,OAAO,UAAU,GAAG,GAEhC,KAAA,cAAc,IAAI,YAAYA,CAAG,GAEjC,KAAA,YAAY,iBAAiB,SAAS,CAAC/D,MAAM,KAAK,QAAQA,CAAC,CAAC,GAC5D,KAAA,YAAY,iBAAiB,QAAQ,CAACA,MAAM,KAAK,OAAOA,CAAC,CAAC,GAC1D,KAAA,YAAY,iBAAiB,WAAW,CAACqE,MAAM,KAAK,UAAUA,CAAC,CAAC,GAEhE,KAAA,OAAO,MAAM,2BAA2B;AAAA,IAAA,UAC7C;AACK,WAAA,SAAS,CAAC,CAAC,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,aAAa;AACd,QAAA,CAAC,KAAK,QAAQ;AACX,WAAA,OAAO,KAAK,mCAAmC;AACpD;AAAA,IACF;AAEA,IAAI,KAAK,gBACP,KAAK,YAAY,SACjB,KAAK,cAAc,MAEd,KAAA,OAAO,MAAM,2BAA2B,IAG/C,KAAK,SAAS;AAAA,EAChB;AAAA,EAEO,KAAK1E,GAA2D;AAC/D,UAAA2E,KAAgB3E,KAAA,gBAAAA,EAAS,kBAAiB,KAC1C4E,KAAa5E,KAAA,gBAAAA,EAAS,eAAc;AAC1C,QAAI6E,IAAmBD;AAEvB,UAAME,IAAa,YAAY;AACzB,UAAA;AACF,cAAM,KAAK,WACQD,IAAAD;AAAA,eACZvE,GAAG;AACV,QAAIwE,IAAmB,IACrB,KAAK,OAAO;AAAA,UACV,sBAAsBA,CAAgB;AAAA,UACtCxE;AAAA,QAAA,IAGG,KAAA,OAAO,KAAK,2CAA2CA,CAAC;AAAA,MAEjE;AAAA,IAAA;AAGF,IAAKyE,EAAW,GAEX,KAAA,gBAAgB,YAAY,MAAM;AACrC,UAAI,CAAC,KAAK,iBAAiB,KAAK,eAAe;AAC7C,YAAID,KAAoB,GAAG;AACzB,wBAAc,KAAK,aAAa,GAChC,KAAK,gBAAgB;AACrB;AAAA,QACF;AAEA,QAAAA,KACKC,EAAW;AAAA,MAClB;AAAA,OACCH,CAAa;AAAA,EAClB;AAAA,EAEO,QAAQ;AACb,IAAI,KAAK,kBACP,cAAc,KAAK,aAAa,GAChC,KAAK,gBAAgB,OAGvB,KAAK,WAAW;AAAA,EAClB;AAAA,EAEO,WAAW;AACT,WAAA,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA,EAEO,cAAc;AACnB,WAAO,KAAK,UAAU,CAAC,CAAC,KAAK;AAAA,EAC/B;AACF;AAEO,SAASI,GAAmB;AAAA,EACjC,QAAA9B;AAAA,EACA,SAAAM;AAAA,EACA,UAAAjD;AAAA,EACA,YAAAR;AAAA,EACA,YAAAiE;AAAA,EACA,QAAA7G;AACF,GAOG;AACD,QAAM8H,IAAM,IAAIlB;AAAA,IACdb;AAAA,IACAM;AAAA,IACAQ;AAAA,IACAzD;AAAA,IACAR;AAAA,IACA5C;AAAA,EAAA;AAGF,SAAA8H,EAAI,KAAK,GAEFA;AACT;ACxSa,MAAAC,KAAqB,CAChClI,MAC+B;AAC/B,MACE,UAAOA,KAAA,gBAAAA,EAAS,aAAa,YAC7B,CAACA,EAAQ,SAAS,UAClB,OAAOA,EAAQ,aAAc,YAC7B,OAAOA,EAAQ,cAAe,YAC9B,OAAOA,EAAQ,YAAa,YAC5B,CAACA,EAAQ,SAAS,UAClB,OAAOA,EAAQ,aAAc,YAC7B,CAACA,EAAQ,UAAU;AAIZ,WAAA;AAAA,MACL,UAAUA,EAAQ;AAAA,MAClB,WAAW,IAAI,KAAKA,EAAQ,SAAS;AAAA,MACrC,YAAY,IAAI,KAAKA,EAAQ,UAAU;AAAA,MACvC,UAAUA,EAAQ;AAAA,MAClB,WAAWA,EAAQ;AAAA,IAAA;AAGzB,GASamI,KAAuB,CAClCjC,GACAkC,GACAC,MACG;AACG,QAAA3H,wBAAU,QAEV4H,IAAoB,MAAM;AAC9B,IAAArC,GAA2BC,GAAQkC,EAAO,UAAUA,EAAO,UAAU;AAAA,EAAA;AAGvE,SAAI9B,GAA4BJ,GAAQkC,EAAO,QAAQ,KAE5C1H,IAAM0H,EAAO,aADf,KAGE1H,IAAM0H,EAAO,aACtB,WAAW,MAAM;AACA,IAAAC,EAAAnC,GAAQkC,GAAQE,CAAiB;AAAA,EAAA,GAC/CF,EAAO,UAAU,QAAY,IAAA1H,EAAI,SAAS,GAEtC,OAEQ2H,EAAAnC,GAAQkC,GAAQE,CAAiB,GACzC;AAEX;AC/DG,IAACC,IAAEC,GAAEC,IAAIzD,GAAE0D,IAAEC,IAAEC,IAAEtF,IAAEuF,IAAEC,IAAIC,KAAE,CAAA,GAAGC,KAAE,CAAE,GAACvH,KAAE,qEAAoEwH,KAAE,MAAM;AAAQ,SAASC,EAAEX,GAAEC,GAAE;AAAC,WAAQC,KAAKD,EAAE,CAAAD,EAAEE,CAAC,IAAED,EAAEC,CAAC;AAAE,SAAOF;AAAC;AAAC,SAASY,GAAEZ,GAAE;AAAC,MAAIC,IAAED,EAAE;AAAW,EAAAC,KAAGA,EAAE,YAAYD,CAAC;AAAC;AAAC,SAASxI,EAAEyI,GAAEC,GAAEW,GAAE;AAAC,MAAIpE,GAAE,GAAE2D,GAAEC,IAAE;AAAG,OAAID,KAAKF,EAAE,CAAOE,KAAP,QAAS3D,IAAEyD,EAAEE,CAAC,IAASA,KAAP,QAAS,IAAEF,EAAEE,CAAC,IAAEC,EAAED,CAAC,IAAEF,EAAEE,CAAC;AAAE,MAAG,UAAU,SAAO,MAAIC,EAAE,WAAS,UAAU,SAAO,IAAEL,GAAE,KAAK,WAAU,CAAC,IAAEa,IAAe,OAAOZ,KAAnB,cAA4BA,EAAE,gBAAR,KAAqB,MAAIG,KAAKH,EAAE,aAAa,CAASI,EAAED,CAAC,MAAZ,WAAgBC,EAAED,CAAC,IAAEH,EAAE,aAAaG,CAAC;AAAG,SAAOU,GAAEb,GAAEI,GAAE5D,GAAE,GAAE,IAAI;AAAC;AAAC,SAASqE,GAAEd,GAAEa,GAAEpE,GAAE0D,GAAEC,GAAE;AAAC,MAAIC,IAAE,EAAC,MAAKL,GAAE,OAAMa,GAAE,KAAIpE,GAAE,KAAI0D,GAAE,KAAI,MAAK,IAAG,MAAK,KAAI,GAAE,KAAI,MAAK,KAAI,QAAO,KAAI,MAAK,aAAY,QAAO,KAAUC,KAAE,EAAEF,IAAI,KAAI,IAAG,KAAI,EAAC;AAAE,SAAaE,KAAN,QAAeH,EAAE,SAAR,QAAeA,EAAE,MAAMI,CAAC,GAAEA;AAAC;AAAmC,SAASU,EAAEf,GAAE;AAAC,SAAOA,EAAE;AAAQ;AAAC,SAASgB,GAAEhB,GAAEC,GAAE;AAAC,OAAK,QAAMD,GAAE,KAAK,UAAQC;AAAC;AAAC,SAASgB,GAAEjB,GAAEC,GAAE;AAAC,MAASA,KAAN,KAAQ,QAAOD,EAAE,KAAGiB,GAAEjB,EAAE,IAAGA,EAAE,MAAI,CAAC,IAAE;AAAK,WAAQE,GAAED,IAAED,EAAE,IAAI,QAAOC,IAAI,MAAUC,IAAEF,EAAE,IAAIC,CAAC,MAAhB,QAA0BC,EAAE,OAAR,KAAY,QAAOA,EAAE;AAAI,SAAkB,OAAOF,EAAE,QAArB,aAA0BiB,GAAEjB,CAAC,IAAE;AAAI;AAAC,SAASkB,GAAElB,GAAE;AAAC,MAAIC,GAAEC;AAAE,OAAUF,IAAEA,EAAE,OAAX,QAAsBA,EAAE,OAAR,MAAY;AAAC,SAAIA,EAAE,MAAIA,EAAE,IAAI,OAAK,MAAKC,IAAE,GAAEA,IAAED,EAAE,IAAI,QAAOC,IAAI,MAAUC,IAAEF,EAAE,IAAIC,CAAC,MAAhB,QAA0BC,EAAE,OAAR,MAAY;AAAC,MAAAF,EAAE,MAAIA,EAAE,IAAI,OAAKE,EAAE;AAAI;AAAA,IAAK;AAAC,WAAOgB,GAAElB,CAAC;AAAA,EAAC;AAAC;AAAC,SAASmB,GAAEnB,GAAE;AAAC,GAAC,CAACA,EAAE,QAAMA,EAAE,MAAI,OAAKvD,EAAE,KAAKuD,CAAC,KAAG,CAACoB,GAAE,SAAOjB,OAAIF,EAAE,wBAAsBE,KAAEF,EAAE,sBAAoBG,IAAGgB,EAAC;AAAC;AAAC,SAASA,KAAG;AAAC,MAAIpB,GAAEE,GAAEW,GAAEV,GAAEC,GAAErF,GAAEuF,GAAEC;AAAE,OAAI9D,EAAE,KAAK4D,EAAC,GAAEL,IAAEvD,EAAE,UAAS,CAAAuD,EAAE,QAAME,IAAEzD,EAAE,QAAO0D,IAAE,QAAOpF,KAAGqF,KAAGS,IAAEb,GAAG,KAAK,KAAIM,IAAE,CAAA,GAAGC,IAAE,CAAE,GAACM,EAAE,SAAOV,IAAEQ,EAAE,CAAA,GAAGP,CAAC,GAAG,MAAIA,EAAE,MAAI,GAAEH,EAAE,SAAOA,EAAE,MAAME,CAAC,GAAEkB,GAAER,EAAE,KAAIV,GAAEC,GAAES,EAAE,KAAIA,EAAE,IAAI,cAAa,KAAGT,EAAE,MAAI,CAACrF,CAAC,IAAE,MAAKuF,GAAQvF,KAAEkG,GAAEb,CAAC,GAAI,CAAC,EAAE,KAAGA,EAAE,MAAKG,CAAC,GAAEJ,EAAE,MAAIC,EAAE,KAAID,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAEA,GAAEmB,GAAEhB,GAAEH,GAAEI,CAAC,GAAEJ,EAAE,OAAKpF,KAAGmG,GAAEf,CAAC,IAAG1D,EAAE,SAAOyD,KAAGzD,EAAE,KAAK4D,EAAC;AAAG,EAAAe,GAAE,MAAI;AAAC;AAAC,SAASG,GAAEvB,GAAEC,GAAEC,GAAEW,GAAEpE,GAAE0D,GAAEC,GAAEC,GAAEtF,GAAEuF,GAAEC,GAAE;AAAC,MAAIiB,GAAEtI,GAAEwH,GAAEC,GAAEC,GAAEpJ,IAAEqJ,KAAGA,EAAE,OAAKJ,IAAEK,IAAEb,EAAE;AAAO,OAAIC,EAAE,MAAInF,GAAE0G,GAAEvB,GAAED,GAAEzI,CAAC,GAAEuD,IAAEmF,EAAE,KAAIsB,IAAE,GAAEA,IAAEV,GAAEU,IAAI,EAAOd,IAAER,EAAE,IAAIsB,CAAC,MAAhB,QAA+B,OAAOd,KAAlB,aAAiC,OAAOA,KAAnB,eAAuBxH,IAAOwH,EAAE,QAAP,KAAWF,KAAEhJ,EAAEkJ,EAAE,GAAG,KAAGF,IAAEE,EAAE,MAAIc,GAAEH,GAAErB,GAAEU,GAAExH,GAAEuD,GAAE0D,GAAEC,GAAEC,GAAEtF,GAAEuF,GAAEC,CAAC,GAAEI,IAAED,EAAE,KAAIA,EAAE,OAAKxH,EAAE,OAAKwH,EAAE,QAAMxH,EAAE,OAAKwI,GAAExI,EAAE,KAAI,MAAKwH,CAAC,GAAEH,EAAE,KAAKG,EAAE,KAAIA,EAAE,OAAKC,GAAED,CAAC,IAASE,KAAN,QAAeD,KAAN,SAAUC,IAAED,IAAG,QAAMD,EAAE,OAAKxH,EAAE,QAAMwH,EAAE,OAAK3F,KAAa,OAAO2F,EAAE,QAAnB,YAAyB,CAACV,EAAE,SAASjF,CAAC,MAAIA,IAAEkG,GAAE/H,CAAC,IAAG6B,IAAE4G,GAAEjB,GAAE3F,GAAEiF,CAAC,KAAe,OAAOU,EAAE,QAArB,cAAoCA,EAAE,QAAX,SAAe3F,IAAE2F,EAAE,MAAIC,MAAI5F,IAAE4F,EAAE,cAAaD,EAAE,MAAI,QAAOA,EAAE,OAAK;AAAS,EAAAR,EAAE,MAAInF,GAAEmF,EAAE,MAAIU;AAAC;AAAC,SAASa,GAAEzB,GAAEC,GAAEC,GAAE;AAAC,MAAIW,GAAEpE,GAAE0D,GAAEC,GAAEC,GAAEtF,IAAEkF,EAAE,QAAOK,IAAEJ,EAAE,QAAOK,IAAED,GAAEkB,IAAE;AAAE,OAAIxB,EAAE,MAAI,IAAGa,IAAE,GAAEA,IAAE9F,GAAE8F,IAAI,CAAAT,IAAES,IAAEW,IAAS/E,IAAEuD,EAAE,IAAIa,CAAC,KAASpE,IAAEwD,EAAEY,CAAC,MAAZ,QAA2B,OAAOpE,KAAlB,aAAiC,OAAOA,KAAnB,aAAqB,OAAe,OAAOA,KAAjB,YAA8B,OAAOA,KAAjB,YAA8B,OAAOA,KAAjB,YAAoBA,EAAE,eAAa,SAAOqE,GAAE,MAAKrE,GAAE,MAAK,MAAK,IAAI,IAAEiE,GAAEjE,CAAC,IAAEqE,GAAEC,GAAE,EAAC,UAAStE,EAAC,GAAE,MAAK,MAAK,IAAI,IAAWA,EAAE,gBAAX,UAAwBA,EAAE,MAAI,IAAEqE,GAAErE,EAAE,MAAKA,EAAE,OAAMA,EAAE,KAAIA,EAAE,MAAIA,EAAE,MAAI,MAAKA,EAAE,GAAG,IAAEA,MAAjT,QAAqTA,EAAE,KAAGuD,GAAEvD,EAAE,MAAIuD,EAAE,MAAI,GAAEK,IAAEuB,GAAEnF,GAAEyD,GAAEE,GAAEG,CAAC,GAAE9D,EAAE,MAAI4D,GAAEF,IAAE,MAAUE,MAAL,OAASE,MAAKJ,IAAED,EAAEG,CAAC,OAAKF,EAAE,OAAK,UAAeA,KAAN,QAAgBA,EAAE,QAAT,QAAkBE,KAAJ,MAAOmB,KAAgB,OAAO/E,EAAE,QAArB,eAA4BA,EAAE,OAAK,UAAQ4D,MAAID,MAAIC,KAAGD,IAAE,IAAEoB,IAAEnB,IAAED,IAAEC,KAAGD,IAAE,IAAEoB,MAAInB,IAAED,IAAEG,IAAExF,IAAEqF,IAAEoB,KAAGnB,IAAED,IAAEoB,MAAInB,IAAED,KAAGoB,KAAInB,MAAIQ,IAAEW,MAAI/E,EAAE,OAAK,YAAU0D,IAAED,EAAEE,CAAC,MAAUD,EAAE,OAAR,QAAaA,EAAE,OAAS,WAAOA,EAAE,SAAOA,EAAE,OAAKH,EAAE,QAAMA,EAAE,MAAIiB,GAAEd,CAAC,IAAG0B,GAAE1B,GAAEA,GAAE,EAAE,GAAED,EAAEE,CAAC,IAAE,MAAKG;AAAK,MAAGA,EAAE,MAAIM,IAAE,GAAEA,IAAEP,GAAEO,IAAI,EAAOV,IAAED,EAAEW,CAAC,MAAZ,QAAoB,WAAOV,EAAE,SAAOA,EAAE,OAAKH,EAAE,QAAMA,EAAE,MAAIiB,GAAEd,CAAC,IAAG0B,GAAE1B,GAAEA,CAAC;AAAE;AAAC,SAASwB,GAAE3B,GAAEC,GAAEC,GAAE;AAAC,MAAIW,GAAEpE;AAAE,MAAe,OAAOuD,EAAE,QAArB,YAA0B;AAAC,SAAIa,IAAEb,EAAE,KAAIvD,IAAE,GAAEoE,KAAGpE,IAAEoE,EAAE,QAAOpE,IAAI,CAAAoE,EAAEpE,CAAC,MAAIoE,EAAEpE,CAAC,EAAE,KAAGuD,GAAEC,IAAE0B,GAAEd,EAAEpE,CAAC,GAAEwD,GAAEC,CAAC;AAAG,WAAOD;AAAA,EAAC;AAAC,EAAAD,EAAE,OAAKC,MAAIC,EAAE,aAAaF,EAAE,KAAIC,KAAG,IAAI,GAAEA,IAAED,EAAE;AAAK;AAAG,IAAAC,IAAEA,KAAGA,EAAE;AAAA,SAAwBA,KAAN,QAAaA,EAAE,aAAN;AAAgB,SAAOA;AAAC;AAA6G,SAAS2B,GAAE5B,GAAEC,GAAEC,GAAEW,GAAE;AAAC,MAAIpE,IAAEuD,EAAE,KAAIG,IAAEH,EAAE,MAAKI,IAAEF,IAAE,GAAEG,IAAEH,IAAE,GAAEnF,IAAEkF,EAAEC,CAAC;AAAE,MAAUnF,MAAP,QAAUA,KAAG0B,KAAG1B,EAAE,OAAKoF,MAAIpF,EAAE,QAAU,WAAOA,EAAE,KAAK,QAAOmF;AAAE,MAAGW,KAAS9F,KAAN,QAAa,WAAOA,EAAE,OAAK,IAAE,GAAG,QAAKqF,KAAG,KAAGC,IAAEJ,EAAE,UAAQ;AAAC,QAAGG,KAAG,GAAE;AAAC,WAAIrF,IAAEkF,EAAEG,CAAC,MAAQ,WAAOrF,EAAE,QAAM0B,KAAG1B,EAAE,OAAKoF,MAAIpF,EAAE,KAAK,QAAOqF;AAAE,MAAAA;AAAA,IAAG;AAAC,QAAGC,IAAEJ,EAAE,QAAO;AAAC,WAAIlF,IAAEkF,EAAEI,CAAC,MAAQ,WAAOtF,EAAE,QAAM0B,KAAG1B,EAAE,OAAKoF,MAAIpF,EAAE,KAAK,QAAOsF;AAAE,MAAAA;AAAA,IAAG;AAAA,EAAC;AAAC,SAAM;AAAE;AAAC,SAASyB,GAAE9B,GAAEC,GAAEC,GAAE;AAAC,EAAMD,EAAE,CAAC,MAAT,MAAWD,EAAE,YAAYC,GAAQC,KAAE,EAAI,IAAEF,EAAEC,CAAC,IAAQC,KAAN,OAAQ,KAAa,OAAOA,KAAjB,YAAoBhH,GAAE,KAAK+G,CAAC,IAAEC,IAAEA,IAAE;AAAI;AAAC,SAAS6B,GAAE/B,GAAEC,GAAEC,GAAEW,GAAEpE,GAAE;AAAC,MAAI0D;AAAE,EAAAH,EAAE,KAAaC,MAAV,QAAY,KAAa,OAAOC,KAAjB,SAAmB,CAAAF,EAAE,MAAM,UAAQE;AAAA,OAAM;AAAC,QAAa,OAAOW,KAAjB,aAAqBb,EAAE,MAAM,UAAQa,IAAE,KAAIA,EAAE,MAAIZ,KAAKY,EAAE,CAAAX,KAAGD,KAAKC,KAAG4B,GAAE9B,EAAE,OAAMC,GAAE,EAAE;AAAE,QAAGC,EAAE,MAAID,KAAKC,EAAE,CAAAW,KAAGX,EAAED,CAAC,MAAIY,EAAEZ,CAAC,KAAG6B,GAAE9B,EAAE,OAAMC,GAAEC,EAAED,CAAC,CAAC;AAAA,EAAC;AAAA,WAAeA,EAAE,CAAC,MAAT,OAAkBA,EAAE,CAAC,MAAT,IAAW,CAAAE,IAAEF,OAAKA,IAAEA,EAAE,QAAQ,+BAA8B,IAAI,IAAGA,IAAEA,EAAE,iBAAgBD,KAAkBC,MAAf,gBAAgCA,MAAd,cAAgBA,EAAE,cAAc,MAAM,CAAC,IAAEA,EAAE,MAAM,CAAC,GAAED,EAAE,MAAIA,EAAE,IAAE,CAAA,IAAIA,EAAE,EAAEC,IAAEE,CAAC,IAAED,GAAEA,IAAEW,IAAEX,EAAE,IAAEW,EAAE,KAAGX,EAAE,IAAEnF,IAAEiF,EAAE,iBAAiBC,GAAEE,IAAEI,KAAED,IAAEH,CAAC,KAAGH,EAAE,oBAAoBC,GAAEE,IAAEI,KAAED,IAAEH,CAAC;AAAA,OAAM;AAAC,QAAiC1D,KAA9B,6BAAgC,CAAAwD,IAAEA,EAAE,QAAQ,eAAc,GAAG,EAAE,QAAQ,UAAS,GAAG;AAAA,aAAmBA,KAAT,WAAsBA,KAAV,YAAqBA,KAAR,UAAmBA,KAAR,UAAmBA,KAAR,UAAuBA,KAAZ,cAA2BA,KAAZ,cAA0BA,KAAX,aAAyBA,KAAX,aAAsBA,KAAR,UAAsBA,KAAX,aAAcA,KAAKD,EAAE,KAAG;AAAC,MAAAA,EAAEC,CAAC,IAAQC,KAAE;AAAK,YAAMF;AAAA,IAAC,QAAS;AAAA;AAAE,IAAY,OAAOE,KAAnB,eAA6BA,KAAN,QAAcA,MAAL,MAAcD,EAAE,CAAC,MAAT,MAAWD,EAAE,gBAAgBC,CAAC,IAAED,EAAE,aAAaC,GAAaA,KAAX,aAAiBC,KAAH,IAAK,KAAGA,CAAC;AAAA,EAAE;AAAC;AAAC,SAAS8B,GAAEhC,GAAE;AAAC,SAAO,SAASE,GAAE;AAAC,QAAG,KAAK,GAAE;AAAC,UAAIW,IAAE,KAAK,EAAEX,EAAE,OAAKF,CAAC;AAAE,UAASE,EAAE,KAAR,KAAU,CAAAA,EAAE,IAAEnF;AAAAA,eAAYmF,EAAE,IAAEW,EAAE,EAAE;AAAO,aAAOA,EAAEZ,EAAE,QAAMA,EAAE,MAAMC,CAAC,IAAEA,CAAC;AAAA,IAAC;AAAA,EAAC;AAAC;AAAC,SAASmB,GAAErB,GAAEE,GAAEW,GAAEpE,GAAE,GAAE2D,GAAEC,GAAEtF,GAAEuF,GAAEC,GAAE;AAAC,MAAIiB,GAAEhB,GAAEC,GAAEvH,GAAE0H,GAAE,GAAEE,GAAE1B,GAAE6B,GAAEC,GAAEC,GAAEC,GAAEK,GAAEE,GAAEM,GAAEL,GAAEE,IAAE5B,EAAE;AAAK,MAAYA,EAAE,gBAAX,OAAuB,QAAO;AAAK,QAAIW,EAAE,QAAMP,IAAE,CAAC,EAAE,KAAGO,EAAE,MAAKT,IAAE,CAACrF,IAAEmF,EAAE,MAAIW,EAAE,GAAG,KAAIW,IAAEvB,EAAE,QAAMuB,EAAEtB,CAAC;AAAE,EAAAF,EAAE,KAAe,OAAO8B,KAAnB,WAAqB,KAAG;AAAC,QAAG1C,IAAEc,EAAE,OAAMe,IAAE,eAAca,KAAGA,EAAE,UAAU,QAAOZ,KAAGM,IAAEM,EAAE,gBAAcrF,EAAE+E,EAAE,GAAG,GAAEL,IAAEK,IAAEN,IAAEA,EAAE,MAAM,QAAMM,EAAE,KAAG/E,GAAEoE,EAAE,MAAIC,KAAGN,IAAEN,EAAE,MAAIW,EAAE,KAAK,KAAGL,EAAE,OAAKS,IAAEf,EAAE,MAAIM,IAAE,IAAIsB,EAAE1C,GAAE+B,CAAC,KAAGjB,EAAE,MAAIM,IAAE,IAAIQ,GAAE5B,GAAE+B,CAAC,GAAEX,EAAE,cAAYsB,GAAEtB,EAAE,SAAO0B,KAAGhB,KAAGA,EAAE,IAAIV,CAAC,GAAEA,EAAE,QAAMpB,GAAEoB,EAAE,UAAQA,EAAE,QAAM,CAAE,IAAEA,EAAE,UAAQW,GAAEX,EAAE,MAAI/D,GAAEgE,IAAED,EAAE,MAAI,IAAGA,EAAE,MAAI,CAAA,GAAGA,EAAE,MAAI,KAAIS,KAAST,EAAE,OAAR,SAAcA,EAAE,MAAIA,EAAE,QAAOS,KAASa,EAAE,4BAAR,SAAmCtB,EAAE,OAAKA,EAAE,UAAQA,EAAE,MAAIG,EAAE,CAAA,GAAGH,EAAE,GAAG,IAAGG,EAAEH,EAAE,KAAIsB,EAAE,yBAAyB1C,GAAEoB,EAAE,GAAG,CAAC,IAAGtH,IAAEsH,EAAE,OAAMI,IAAEJ,EAAE,OAAMA,EAAE,MAAIN,GAAEO,EAAE,CAAAQ,KAASa,EAAE,4BAAR,QAAwCtB,EAAE,sBAAR,QAA4BA,EAAE,sBAAqBS,KAAST,EAAE,qBAAR,QAA2BA,EAAE,IAAI,KAAKA,EAAE,iBAAiB;AAAA,SAAM;AAAC,UAAGS,KAASa,EAAE,4BAAR,QAAkC1C,MAAIlG,KAASsH,EAAE,6BAAR,QAAmCA,EAAE,0BAA0BpB,GAAE+B,CAAC,GAAE,CAACX,EAAE,QAAYA,EAAE,yBAAR,QAAoCA,EAAE,sBAAsBpB,GAAEoB,EAAE,KAAIW,CAAC,MAAtC,MAAyCjB,EAAE,QAAMW,EAAE,MAAK;AAAC,aAAIX,EAAE,QAAMW,EAAE,QAAML,EAAE,QAAMpB,GAAEoB,EAAE,QAAMA,EAAE,KAAIA,EAAE,MAAI,KAAIN,EAAE,MAAIW,EAAE,KAAIX,EAAE,MAAIW,EAAE,KAAIX,EAAE,IAAI,QAAQ,SAASF,GAAE;AAAC,UAAAA,MAAIA,EAAE,KAAGE;AAAA,QAAE,CAAC,GAAEkB,IAAE,GAAEA,IAAEZ,EAAE,IAAI,QAAOY,IAAI,CAAAZ,EAAE,IAAI,KAAKA,EAAE,IAAIY,CAAC,CAAC;AAAE,QAAAZ,EAAE,MAAI,CAAE,GAACA,EAAE,IAAI,UAAQH,EAAE,KAAKG,CAAC;AAAE,cAAMR;AAAA,MAAC;AAAC,MAAMQ,EAAE,uBAAR,QAA6BA,EAAE,oBAAoBpB,GAAEoB,EAAE,KAAIW,CAAC,GAAEF,KAAST,EAAE,sBAAR,QAA4BA,EAAE,IAAI,KAAK,WAAU;AAAC,QAAAA,EAAE,mBAAmBtH,GAAE0H,GAAE,CAAC;AAAA,MAAC,CAAC;AAAA,IAAC;AAAC,QAAGJ,EAAE,UAAQW,GAAEX,EAAE,QAAMpB,GAAEoB,EAAE,MAAIR,GAAEQ,EAAE,MAAI,IAAGiB,IAAExB,EAAE,KAAI0B,IAAE,GAAEV,GAAE;AAAC,WAAIT,EAAE,QAAMA,EAAE,KAAIA,EAAE,MAAI,IAAGiB,KAAGA,EAAEvB,CAAC,GAAEsB,IAAEhB,EAAE,OAAOA,EAAE,OAAMA,EAAE,OAAMA,EAAE,OAAO,GAAEyB,IAAE,GAAEA,IAAEzB,EAAE,IAAI,QAAOyB,IAAI,CAAAzB,EAAE,IAAI,KAAKA,EAAE,IAAIyB,CAAC,CAAC;AAAE,MAAAzB,EAAE,MAAI,CAAE;AAAA,IAAA,MAAM;AAAG,MAAAA,EAAE,MAAI,IAAGiB,KAAGA,EAAEvB,CAAC,GAAEsB,IAAEhB,EAAE,OAAOA,EAAE,OAAMA,EAAE,OAAMA,EAAE,OAAO,GAAEA,EAAE,QAAMA,EAAE;AAAA,WAAUA,EAAE,OAAK,EAAEmB,IAAE;AAAI,IAAAnB,EAAE,QAAMA,EAAE,KAAUA,EAAE,mBAAR,SAA0B/D,IAAEkE,EAAEA,EAAE,CAAA,GAAGlE,CAAC,GAAE+D,EAAE,iBAAiB,IAAGS,KAAG,CAACR,KAASD,EAAE,2BAAR,SAAkC,IAAEA,EAAE,wBAAwBtH,GAAE0H,CAAC,IAAGW,GAAEvB,GAAEU,GAAEkB,IAAQJ,KAAN,QAASA,EAAE,SAAOT,KAASS,EAAE,OAAR,OAAYA,EAAE,MAAM,WAASA,CAAC,IAAEI,IAAE,CAACA,CAAC,GAAE1B,GAAEW,GAAEpE,GAAE,GAAE2D,GAAEC,GAAEtF,GAAEuF,GAAEC,CAAC,GAAEC,EAAE,OAAKN,EAAE,KAAIA,EAAE,OAAK,MAAKM,EAAE,IAAI,UAAQH,EAAE,KAAKG,CAAC,GAAEM,MAAIN,EAAE,MAAIA,EAAE,KAAG;AAAA,EAAK,SAAOR,GAAE;AAAC,IAAAE,EAAE,MAAI,MAAKI,KAASF,KAAN,QAASF,EAAE,MAAInF,GAAEmF,EAAE,OAAKI,IAAE,MAAI,IAAGF,EAAEA,EAAE,QAAQrF,CAAC,CAAC,IAAE,SAAOmF,EAAE,MAAIW,EAAE,KAAIX,EAAE,MAAIW,EAAE,MAAKZ,EAAE,IAAID,GAAEE,GAAEW,CAAC;AAAA,EAAC;AAAA,MAAM,CAAMT,KAAN,QAASF,EAAE,QAAMW,EAAE,OAAKX,EAAE,MAAIW,EAAE,KAAIX,EAAE,MAAIW,EAAE,OAAKX,EAAE,MAAIiC,GAAEtB,EAAE,KAAIX,GAAEW,GAAEpE,GAAE,GAAE2D,GAAEC,GAAEC,GAAEC,CAAC;AAAE,GAACiB,IAAEvB,EAAE,WAASuB,EAAEtB,CAAC;AAAC;AAAC,SAASoB,GAAEtB,GAAEE,GAAEW,GAAE;AAAC,EAAAX,EAAE,MAAI;AAAO,WAAQzD,IAAE,GAAEA,IAAEoE,EAAE,QAAOpE,IAAI,CAAAiF,GAAEb,EAAEpE,CAAC,GAAEoE,EAAE,EAAEpE,CAAC,GAAEoE,EAAE,EAAEpE,CAAC,CAAC;AAAEwD,EAAAA,EAAE,OAAKA,EAAE,IAAIC,GAAEF,CAAC,GAAEA,EAAE,KAAK,SAASE,GAAE;AAAC,QAAG;AAAC,MAAAF,IAAEE,EAAE,KAAIA,EAAE,MAAI,CAAA,GAAGF,EAAE,KAAK,SAASA,GAAE;AAAC,QAAAA,EAAE,KAAKE,CAAC;AAAA,MAAC,CAAC;AAAA,IAAC,SAAOF,GAAE;AAACC,MAAAA,EAAE,IAAID,GAAEE,EAAE,GAAG;AAAA,IAAC;AAAA,EAAC,CAAC;AAAC;AAAC,SAASiC,GAAElC,GAAEC,GAAEW,GAAEpE,GAAE,GAAE2D,GAAEC,GAAEtF,GAAEuF,GAAE;AAAC,MAAIC,GAAEiB,GAAEf,GAAEvH,GAAE,GAAE1B,GAAEsJ,GAAE1B,IAAEyB,EAAE,OAAME,IAAEb,EAAE,OAAMc,IAAEd,EAAE;AAAK,MAAWc,MAAR,QAAU,IAAE,+BAAsCA,MAAT,SAAW,IAAE,uCAAqC,MAAI,IAAE,iCAAsCZ,KAAN;AAAQ,SAAIG,IAAE,GAAEA,IAAEH,EAAE,QAAOG,IAAI,MAAI,IAAEH,EAAEG,CAAC,MAAI,kBAAiB,KAAG,CAAC,CAACS,MAAIA,IAAE,EAAE,cAAYA,IAAM,EAAE,aAAN,IAAgB;AAAC,MAAAf,IAAE,GAAEG,EAAEG,CAAC,IAAE;AAAK;AAAA,IAAK;AAAA;AAAC,MAASN,KAAN,MAAQ;AAAC,QAAUe,MAAP,KAAS,QAAO,SAAS,eAAeD,CAAC;AAAE,IAAAd,IAAE,SAAS,gBAAgB,GAAEe,GAAED,EAAE,MAAIA,CAAC,GAAEX,IAAE,MAAKrF,IAAE;AAAA,EAAE;AAAC,MAAUiG,MAAP,KAAS,CAAA5B,MAAI2B,KAAGhG,KAAGkF,EAAE,SAAOc,MAAId,EAAE,OAAKc;AAAA,OAAO;AAAC,QAAGX,IAAEA,KAAGJ,GAAE,KAAKC,EAAE,UAAU,GAAEb,IAAEyB,EAAE,SAAOL,IAAE,CAACzF,KAASqF,KAAN,KAAQ,MAAIhB,IAAE,CAAE,GAACmB,IAAE,GAAEA,IAAEN,EAAE,WAAW,QAAOM,IAAI,CAAAnB,GAAG,IAAEa,EAAE,WAAWM,CAAC,GAAG,IAAI,IAAE,EAAE;AAAM,SAAIA,KAAKnB,EAAE,KAAG,IAAEA,EAAEmB,CAAC,GAAcA,KAAZ;AAAoB,UAA8BA,KAA3B,0BAA6B,CAAAE,IAAE;AAAA,eAAkBF,MAAR,SAAW,EAAEA,KAAKQ,IAAG;AAAC,YAAYR,KAAT,WAAY,kBAAiBQ,KAAcR,KAAX,aAAc,oBAAmBQ,EAAE;AAASgB,QAAAA,GAAE9B,GAAEM,GAAE,MAAK,GAAE,CAAC;AAAA,MAAC;AAAA;AAAC,SAAIA,KAAKQ,EAAE,KAAEA,EAAER,CAAC,GAAcA,KAAZ,aAAcrH,IAAE,IAA6BqH,KAA3B,4BAA6BiB,IAAE,IAAWjB,KAAT,UAAW/I,IAAE,IAAa+I,KAAX,YAAaO,IAAE,IAAUP,MAAR,SAAWxF,KAAe,OAAO,KAAnB,cAAsBqE,EAAEmB,CAAC,MAAI,KAAGwB,GAAE9B,GAAEM,GAAE,GAAEnB,EAAEmB,CAAC,GAAE,CAAC;AAAE,QAAGiB,EAAE,CAAAzG,KAAG0F,MAAIe,EAAE,WAASf,EAAE,UAAQe,EAAE,WAASvB,EAAE,eAAaA,EAAE,YAAUuB,EAAE,SAAQtB,EAAE,MAAI,CAAA;AAAA,aAAWO,MAAIR,EAAE,YAAU,KAAIsB,GAAEtB,GAAES,GAAExH,CAAC,IAAEA,IAAE,CAACA,CAAC,GAAEgH,GAAEW,GAAEpE,GAAoBuE,MAAlB,kBAAoB,iCAA+B,GAAEZ,GAAEC,GAAED,IAAEA,EAAE,CAAC,IAAES,EAAE,OAAKI,GAAEJ,GAAE,CAAC,GAAE9F,GAAEuF,CAAC,GAAQF,KAAN,KAAQ,MAAIG,IAAEH,EAAE,QAAOG,MAAK,CAAMH,EAAEG,CAAC,KAAT,QAAYK,GAAER,EAAEG,CAAC,CAAC;AAAE,IAAAxF,MAAIwF,IAAE,SAAiB/I,MAAT,WAAaA,MAAIyI,EAAEM,CAAC,KAAgBS,MAAb,cAAgB,CAACxJ,KAAcwJ,MAAX,YAAcxJ,MAAI4H,EAAEmB,CAAC,MAAIwB,GAAE9B,GAAEM,GAAE/I,GAAE4H,EAAEmB,CAAC,GAAE,CAAC,GAAEA,IAAE,WAAmBO,MAAT,UAAYA,MAAIb,EAAEM,CAAC,KAAGwB,GAAE9B,GAAEM,GAAEO,GAAE1B,EAAEmB,CAAC,GAAE,CAAC;AAAA,EAAE;AAAC,SAAON;AAAC;AAAC,SAASyB,GAAE1B,GAAEE,GAAEW,GAAE;AAAC,MAAG;AAAC,IAAY,OAAOb,KAAnB,aAAqBA,EAAEE,CAAC,IAAEF,EAAE,UAAQE;AAAA,EAAC,SAAOF,GAAE;AAACC,IAAAA,EAAE,IAAID,GAAEa,CAAC;AAAA,EAAC;AAAC;AAAC,SAASgB,GAAE7B,GAAEE,GAAEW,GAAE;AAAC,MAAIpE,GAAE;AAAE,MAAGwD,EAAE,WAASA,EAAE,QAAQD,CAAC,IAAGvD,IAAEuD,EAAE,SAAOvD,EAAE,WAASA,EAAE,YAAUuD,EAAE,OAAK0B,GAAEjF,GAAE,MAAKyD,CAAC,KAAUzD,IAAEuD,EAAE,QAAX,MAAgB;AAAC,QAAGvD,EAAE,qBAAqB,KAAG;AAAC,MAAAA,EAAE,qBAAsB;AAAA,IAAA,SAAOuD,GAAE;AAACC,MAAAA,EAAE,IAAID,GAAEE,CAAC;AAAA,IAAC;AAAC,IAAAzD,EAAE,OAAKA,EAAE,MAAI;AAAA,EAAI;AAAC,MAAGA,IAAEuD,EAAE,IAAI,MAAI,IAAE,GAAE,IAAEvD,EAAE,QAAO,IAAI,CAAAA,EAAE,CAAC,KAAGoF,GAAEpF,EAAE,CAAC,GAAEyD,GAAEW,KAAe,OAAOb,EAAE,QAArB,UAAyB;AAAE,EAAAa,KAASb,EAAE,OAAR,QAAaY,GAAEZ,EAAE,GAAG,GAAEA,EAAE,MAAIA,EAAE,KAAGA,EAAE,MAAIA,EAAE,MAAI;AAAM;AAAC,SAASkC,GAAElC,GAAEC,GAAEC,GAAE;AAAC,SAAO,KAAK,YAAYF,GAAEE,CAAC;AAAC;AAAC,SAASkC,GAAElC,GAAEW,GAAEpE,GAAE;AAAC,MAAI0D,GAAEC,GAAEC,GAAEtF;AAAEkF,EAAAA,EAAE,MAAIA,EAAE,GAAGC,GAAEW,CAAC,GAAET,KAAGD,IAAc,OAAO1D,KAAnB,cAAsB,OAAeoE,EAAE,KAAIR,IAAE,CAAA,GAAGtF,IAAE,CAAE,GAACsG,GAAER,GAAEX,KAAG,CAACC,KAAG1D,KAAGoE,GAAG,MAAIrJ,EAAEuJ,GAAE,MAAK,CAACb,CAAC,CAAC,GAAEE,KAAGI,IAAEA,IAAEK,EAAE,cAAa,CAACV,KAAG1D,IAAE,CAACA,CAAC,IAAE2D,IAAE,OAAKS,EAAE,aAAWb,GAAE,KAAKa,EAAE,UAAU,IAAE,MAAKR,GAAE,CAACF,KAAG1D,IAAEA,IAAE2D,IAAEA,EAAE,MAAIS,EAAE,YAAWV,GAAEpF,CAAC,GAAEuG,GAAEjB,GAAEH,GAAEnF,CAAC;AAAC;AAAi3BiF,KAAES,GAAE,OAAMR,IAAE,EAAC,KAAI,SAASD,GAAEC,GAAEC,GAAEW,GAAE;AAAC,WAAQpE,GAAE0D,GAAEC,GAAEH,IAAEA,EAAE,KAAI,MAAIxD,IAAEwD,EAAE,QAAM,CAACxD,EAAE,GAAG,KAAG;AAAC,SAAI0D,IAAE1D,EAAE,gBAAoB0D,EAAE,4BAAR,SAAmC1D,EAAE,SAAS0D,EAAE,yBAAyBH,CAAC,CAAC,GAAEI,IAAE3D,EAAE,MAAWA,EAAE,qBAAR,SAA4BA,EAAE,kBAAkBuD,GAAEa,KAAG,CAAE,CAAA,GAAET,IAAE3D,EAAE,MAAK2D,EAAE,QAAO3D,EAAE,MAAIA;AAAA,EAAC,SAAOwD,GAAE;AAAC,IAAAD,IAAEC;AAAA,EAAC;AAAC,QAAMD;AAAC,EAAC,GAAEE,KAAE,GAAqDc,GAAE,UAAU,WAAS,SAAShB,GAAEC,GAAE;AAAC,MAAIC;AAAE,EAAAA,IAAQ,KAAK,OAAX,QAAgB,KAAK,QAAM,KAAK,QAAM,KAAK,MAAI,KAAK,MAAIS,EAAE,IAAG,KAAK,KAAK,GAAc,OAAOX,KAAnB,eAAuBA,IAAEA,EAAEW,EAAE,IAAGT,CAAC,GAAE,KAAK,KAAK,IAAGF,KAAGW,EAAET,GAAEF,CAAC,GAAQA,KAAN,QAAS,KAAK,QAAMC,KAAG,KAAK,IAAI,KAAKA,CAAC,GAAEkB,GAAE,IAAI;AAAE,GAAEH,GAAE,UAAU,cAAY,SAAShB,GAAE;AAAC,OAAK,QAAM,KAAK,MAAI,IAAGA,KAAG,KAAK,IAAI,KAAKA,CAAC,GAAEmB,GAAE,IAAI;AAAE,GAAEH,GAAE,UAAU,SAAOD,GAAEtE,IAAE,CAAE,GAAC2D,KAAc,OAAO,WAAnB,aAA2B,QAAQ,UAAU,KAAK,KAAK,QAAQ,QAAS,CAAA,IAAE,YAAWC,KAAE,SAASL,GAAEC,GAAE;AAAC,SAAOD,EAAE,IAAI,MAAIC,EAAE,IAAI;AAAG,GAAEmB,GAAE,MAAI,GAAErG,KAAE,GAAEuF,KAAE0B,GAAE,EAAE,GAAEzB,KAAEyB,GAAE,EAAE;ACGn9V,MAAMK,KAAsB,oCACtBC,KAAqB,mCAOrBC,KAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;ACxEiC,IAAI1B,IAAET,GAAEF,IAAEzD,IAAE0D,KAAE,GAAEE,KAAE,CAAA,GAAGC,IAAEN,GAAEjF,KAAEuF,EAAE,KAAIkB,KAAElB,EAAE,KAAIpH,KAAEoH,EAAE,QAAOL,KAAEK,EAAE,KAAIlB,KAAEkB,EAAE,SAAQC,KAAED,EAAE;AAAG,SAASK,GAAEX,GAAEa,GAAE;AAAC,EAAAP,EAAE,OAAKA,EAAE,IAAIF,GAAEJ,GAAEG,MAAGU,CAAC,GAAEV,KAAE;AAAE,MAAID,IAAEE,EAAE,QAAMA,EAAE,MAAI,EAAC,IAAG,CAAA,GAAG,KAAI,GAAE;AAAG,SAAOJ,KAAGE,EAAE,GAAG,UAAQA,EAAE,GAAG,KAAK,CAAE,CAAA,GAAEA,EAAE,GAAGF,CAAC;AAAC;AAAC,SAASQ,EAAER,GAAE;AAAC,SAAOG,KAAE,GAAEM,GAAE+B,IAAExC,CAAC;AAAC;AAAC,SAASS,GAAET,GAAEE,GAAEzD,GAAE;AAAC,MAAI0D,IAAEQ,GAAEE,MAAI,CAAC;AAAE,MAAGV,EAAE,IAAEH,GAAE,CAACG,EAAE,QAAMA,EAAE,KAAG,CAAQqC,GAAE,QAAOtC,CAAC,GAAE,SAASF,GAAE;AAAC,QAAIa,IAAEV,EAAE,MAAIA,EAAE,IAAI,CAAC,IAAEA,EAAE,GAAG,CAAC,GAAEC,IAAED,EAAE,EAAEU,GAAEb,CAAC;AAAE,IAAAa,MAAIT,MAAID,EAAE,MAAI,CAACC,GAAED,EAAE,GAAG,CAAC,CAAC,GAAEA,EAAE,IAAI,SAAS,CAAE,CAAA;AAAA,EAAE,CAAC,GAAEA,EAAE,MAAIC,GAAE,CAACA,EAAE,IAAG;AAAC,QAAIC,IAAE,SAASL,GAAEa,GAAET,GAAE;AAAC,UAAG,CAACD,EAAE,IAAI,IAAI,QAAM;AAAG,UAAID,IAAEC,EAAE,IAAI,IAAI,GAAG,OAAO,SAASH,GAAE;AAAC,eAAM,CAAC,CAACA,EAAE;AAAA,MAAG,CAAC;AAAE,UAAGE,EAAE,MAAM,SAASF,GAAE;AAAC,eAAM,CAACA,EAAE;AAAA,MAAG,CAAC,EAAE,QAAM,CAACM,KAAGA,EAAE,KAAK,MAAKN,GAAEa,GAAET,CAAC;AAAE,UAAI3D,IAAE;AAAG,aAAOyD,EAAE,QAAQ,SAASF,GAAE;AAAC,YAAGA,EAAE,KAAI;AAAC,cAAIa,IAAEb,EAAE,GAAG,CAAC;AAAE,UAAAA,EAAE,KAAGA,EAAE,KAAIA,EAAE,MAAI,QAAOa,MAAIb,EAAE,GAAG,CAAC,MAAIvD,IAAE;AAAA,QAAG;AAAA,MAAC,CAAC,GAAE,EAAE,CAACA,KAAG0D,EAAE,IAAI,UAAQH,OAAK,CAACM,KAAGA,EAAE,KAAK,MAAKN,GAAEa,GAAET,CAAC;AAAA,IAAE;AAAE,IAAAA,EAAE,IAAE;AAAG,QAAIE,IAAEF,EAAE,uBAAsBrF,IAAEqF,EAAE;AAAoB,IAAAA,EAAE,sBAAoB,SAASJ,GAAEa,GAAET,GAAE;AAAC,UAAG,KAAK,KAAI;AAAC,YAAIF,IAAEI;AAAE,QAAAA,IAAE,QAAOD,EAAEL,GAAEa,GAAET,CAAC,GAAEE,IAAEJ;AAAA,MAAC;AAAC,MAAAnF,KAAGA,EAAE,KAAK,MAAKiF,GAAEa,GAAET,CAAC;AAAA,IAAC,GAAEA,EAAE,wBAAsBC;AAAA,EAAC;AAAC,SAAOF,EAAE,OAAKA,EAAE;AAAE;AAAC,SAASO,GAAEV,GAAEE,GAAE;AAAC,MAAIzD,IAAEkE,GAAEE,MAAI,CAAC;AAAE,GAACP,EAAE,OAAKY,GAAEzE,EAAE,KAAIyD,CAAC,MAAIzD,EAAE,KAAGuD,GAAEvD,EAAE,IAAEyD,GAAEE,EAAE,IAAI,IAAI,KAAK3D,CAAC;AAAE;AAAC,SAASjF,GAAEwI,GAAEE,GAAE;AAAC,MAAIzD,IAAEkE,GAAEE,MAAI,CAAC;AAAE,GAACP,EAAE,OAAKY,GAAEzE,EAAE,KAAIyD,CAAC,MAAIzD,EAAE,KAAGuD,GAAEvD,EAAE,IAAEyD,GAAEE,EAAE,IAAI,KAAK3D,CAAC;AAAE;AAAC,SAASsF,EAAE/B,GAAE;AAAC,SAAOG,KAAE,GAAE2B,EAAE,WAAU;AAAC,WAAM,EAAC,SAAQ9B,EAAC;AAAA,EAAC,GAAE,CAAA,CAAE;AAAC;AAAsL,SAAS8B,EAAE9B,GAAEI,GAAE;AAAC,MAAIF,IAAES,GAAEE,MAAI,CAAC;AAAE,SAAOK,GAAEhB,EAAE,KAAIE,CAAC,MAAIF,EAAE,KAAGF,EAAG,GAACE,EAAE,MAAIE,GAAEF,EAAE,MAAIF,IAAGE,EAAE;AAAE;AAAC,SAASgC,EAAElC,GAAEa,GAAE;AAAC,SAAOV,KAAE,GAAE2B,EAAE,WAAU;AAAC,WAAO9B;AAAA,EAAC,GAAEa,CAAC;AAAC;AAAgf,SAASS,KAAG;AAAC,WAAQtB,GAAEA,IAAEK,GAAE,MAAO,IAAE,KAAGL,EAAE,OAAKA,EAAE,IAAI,KAAG;AAAC,IAAAA,EAAE,IAAI,IAAI,QAAQmC,EAAC,GAAEnC,EAAE,IAAI,IAAI,QAAQoC,EAAC,GAAEpC,EAAE,IAAI,MAAI,CAAE;AAAA,EAAA,SAAOa,GAAE;AAAC,IAAAb,EAAE,IAAI,MAAI,CAAE,GAACM,EAAE,IAAIO,GAAEb,EAAE,GAAG;AAAA,EAAC;AAAC;AAACM,EAAE,MAAI,SAASN,GAAE;AAAC,EAAAI,IAAE,MAAKrF,MAAGA,GAAEiF,CAAC;AAAC,GAAEM,EAAE,KAAG,SAASN,GAAEa,GAAE;AAAC,EAAAb,KAAGa,EAAE,OAAKA,EAAE,IAAI,QAAMb,EAAE,MAAIa,EAAE,IAAI,MAAKN,MAAGA,GAAEP,GAAEa,CAAC;AAAC,GAAEP,EAAE,MAAI,SAASN,GAAE;AAAC,EAAAwB,MAAGA,GAAExB,CAAC,GAAEa,KAAE;AAAE,MAAIpE,KAAG2D,IAAEJ,EAAE,KAAK;AAAI,EAAAvD,MAAIyD,OAAIE,KAAG3D,EAAE,MAAI,CAAA,GAAG2D,EAAE,MAAI,CAAA,GAAG3D,EAAE,GAAG,QAAQ,SAAS,GAAE;AAAC,MAAE,QAAM,EAAE,KAAG,EAAE,MAAK,EAAE,IAAE,EAAE,MAAI;AAAA,EAAM,CAAC,MAAIA,EAAE,IAAI,QAAQ0F,EAAC,GAAE1F,EAAE,IAAI,QAAQ2F,EAAC,GAAE3F,EAAE,MAAI,IAAGoE,KAAE,KAAIX,KAAEE;AAAC,GAAEE,EAAE,SAAO,SAASN,GAAE;AAAC,EAAA9G,MAAGA,GAAE8G,CAAC;AAAE,MAAIa,IAAEb,EAAE;AAAI,EAAAa,KAAGA,EAAE,QAAMA,EAAE,IAAI,IAAI,WAAaR,GAAE,KAAKQ,CAAC,MAAZ,KAAepE,OAAI6D,EAAE,2BAAyB7D,KAAE6D,EAAE,0BAAwBM,IAAGU,EAAC,IAAGT,EAAE,IAAI,GAAG,QAAQ,SAAS,GAAE;AAAC,MAAE,MAAI,EAAE,MAAI,EAAE,IAAG,EAAE,IAAE;AAAA,EAAM,CAAC,IAAGX,KAAEE,IAAE;AAAI,GAAEE,EAAE,MAAI,SAASN,GAAEa,GAAE;AAAC,EAAAA,EAAE,KAAK,SAAS,GAAE;AAAC,QAAG;AAAC,QAAE,IAAI,QAAQsB,EAAC,GAAE,EAAE,MAAI,EAAE,IAAI,OAAO,SAASnC,GAAE;AAAC,eAAM,CAACA,EAAE,MAAIoC,GAAEpC,CAAC;AAAA,MAAC,CAAC;AAAA,IAAC,SAAO,GAAE;AAAC,MAAAa,EAAE,KAAK,SAASb,GAAE;AAAC,QAAAA,EAAE,QAAMA,EAAE,MAAI,CAAA;AAAA,MAAG,CAAC,GAAEa,IAAE,IAAGP,EAAE,IAAI,GAAE,EAAE,GAAG;AAAA,IAAC;AAAA,EAAC,CAAC,GAAEL,MAAGA,GAAED,GAAEa,CAAC;AAAC,GAAEP,EAAE,UAAQ,SAASN,GAAE;AAAC,EAAAZ,MAAGA,GAAEY,CAAC;AAAE,MAAIa,GAAET,IAAEJ,EAAE;AAAI,EAAAI,KAAGA,EAAE,QAAMA,EAAE,IAAI,GAAG,QAAQ,SAASJ,GAAE;AAAC,QAAG;AAAC,MAAAmC,GAAEnC,CAAC;AAAA,IAAC,SAAOA,GAAE;AAAC,MAAAa,IAAEb;AAAA,IAAC;AAAA,EAAC,CAAC,GAAEI,EAAE,MAAI,QAAOS,KAAGP,EAAE,IAAIO,GAAET,EAAE,GAAG;AAAE;AAAE,IAAIW,KAAc,OAAO,yBAAnB;AAAyC,SAASH,GAAEZ,GAAE;AAAC,MAAIa,GAAET,IAAE,WAAU;AAAC,iBAAaF,CAAC,GAAEa,MAAG,qBAAqBF,CAAC,GAAE,WAAWb,CAAC;AAAA,EAAC,GAAEE,IAAE,WAAWE,GAAE,GAAG;AAAE,EAAAW,OAAIF,IAAE,sBAAsBT,CAAC;AAAE;AAAC,SAAS+B,GAAEnC,GAAE;AAAC,MAAIa,IAAET,GAAEF,IAAEF,EAAE;AAAI,EAAY,OAAOE,KAAnB,eAAuBF,EAAE,MAAI,QAAOE,MAAKE,IAAES;AAAC;AAAC,SAASuB,GAAEpC,GAAE;AAAC,MAAIa,IAAET;AAAE,EAAAJ,EAAE,MAAIA,EAAE,GAAI,GAACI,IAAES;AAAC;AAAC,SAASK,GAAElB,GAAEa,GAAE;AAAC,SAAM,CAACb,KAAGA,EAAE,WAASa,EAAE,UAAQA,EAAE,KAAK,SAASA,GAAE,GAAE;AAAC,WAAOA,MAAIb,EAAE,CAAC;AAAA,EAAC,CAAC;AAAC;AAAC,SAASwC,GAAExC,GAAEa,GAAE;AAAC,SAAkB,OAAOA,KAAnB,aAAqBA,EAAEb,CAAC,IAAEa;AAAC;ACQr5G,MAAM4B,KAAM,KAAK,KACXC,KAAM,KAAK,KACXC,KAAQ,KAAK,OACbC,KAAQ,KAAK,OACbC,IAAe,CAAA3J,OAAM;AAAA,EACzB,GAAGA;AAAA,EACH,GAAGA;AACL,IACM4J,KAAkB;AAAA,EACtB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP,GACMC,KAAuB;AAAA,EAC3B,OAAO;AAAA,EACP,KAAK;AACP;AACA,SAASC,GAAMC,GAAOtI,GAAOuI,GAAK;AAChC,SAAOR,GAAIO,GAAOR,GAAI9H,GAAOuI,CAAG,CAAC;AACnC;AACA,SAASC,GAASxI,GAAOyI,GAAO;AAC9B,SAAO,OAAOzI,KAAU,aAAaA,EAAMyI,CAAK,IAAIzI;AACtD;AACA,SAAS0I,GAAQC,GAAW;AAC1B,SAAOA,EAAU,MAAM,GAAG,EAAE,CAAC;AAC/B;AACA,SAASC,GAAaD,GAAW;AAC/B,SAAOA,EAAU,MAAM,GAAG,EAAE,CAAC;AAC/B;AACA,SAASE,GAAgBC,GAAM;AAC7B,SAAOA,MAAS,MAAM,MAAM;AAC9B;AACA,SAASC,GAAcD,GAAM;AAC3B,SAAOA,MAAS,MAAM,WAAW;AACnC;AACA,SAASE,GAAYL,GAAW;AAC9B,SAAO,CAAC,OAAO,QAAQ,EAAE,SAASD,GAAQC,CAAS,CAAC,IAAI,MAAM;AAChE;AACA,SAASM,GAAiBN,GAAW;AACnC,SAAOE,GAAgBG,GAAYL,CAAS,CAAC;AAC/C;AACA,SAASO,GAAkBP,GAAWQ,GAAOC,GAAK;AAChD,EAAIA,MAAQ,WACVA,IAAM;AAER,QAAMC,IAAYT,GAAaD,CAAS,GAClCW,IAAgBL,GAAiBN,CAAS,GAC1CY,IAASR,GAAcO,CAAa;AAC1C,MAAIE,IAAoBF,MAAkB,MAAMD,OAAeD,IAAM,QAAQ,WAAW,UAAU,SAASC,MAAc,UAAU,WAAW;AAC9I,SAAIF,EAAM,UAAUI,CAAM,IAAIJ,EAAM,SAASI,CAAM,MACjDC,IAAoBC,GAAqBD,CAAiB,IAErD,CAACA,GAAmBC,GAAqBD,CAAiB,CAAC;AACpE;AACA,SAASE,GAAsBf,GAAW;AACxC,QAAMgB,IAAoBF,GAAqBd,CAAS;AACxD,SAAO,CAACiB,GAA8BjB,CAAS,GAAGgB,GAAmBC,GAA8BD,CAAiB,CAAC;AACvH;AACA,SAASC,GAA8BjB,GAAW;AAChD,SAAOA,EAAU,QAAQ,cAAc,CAAAU,MAAajB,GAAqBiB,CAAS,CAAC;AACrF;AACA,SAASQ,GAAYC,GAAMC,GAASX,GAAK;AACvC,QAAMY,IAAK,CAAC,QAAQ,OAAO,GACrBC,IAAK,CAAC,SAAS,MAAM,GACrBC,IAAK,CAAC,OAAO,QAAQ,GACrBC,IAAK,CAAC,UAAU,KAAK;AAC3B,UAAQL,GAAI;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AACH,aAAIV,IAAYW,IAAUE,IAAKD,IACxBD,IAAUC,IAAKC;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AACH,aAAOF,IAAUG,IAAKC;AAAA,IACxB;AACE,aAAO;EACV;AACH;AACA,SAASC,GAA0BzB,GAAW0B,GAAeC,GAAWlB,GAAK;AAC3E,QAAMC,IAAYT,GAAaD,CAAS;AACxC,MAAI4B,IAAOV,GAAYnB,GAAQC,CAAS,GAAG2B,MAAc,SAASlB,CAAG;AACrE,SAAIC,MACFkB,IAAOA,EAAK,IAAI,CAAAT,MAAQA,IAAO,MAAMT,CAAS,GAC1CgB,MACFE,IAAOA,EAAK,OAAOA,EAAK,IAAIX,EAA6B,CAAC,KAGvDW;AACT;AACA,SAASd,GAAqBd,GAAW;AACvC,SAAOA,EAAU,QAAQ,0BAA0B,CAAAmB,MAAQ3B,GAAgB2B,CAAI,CAAC;AAClF;AACA,SAASU,GAAoBC,GAAS;AACpC,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,GAAGA;AAAA,EACP;AACA;AACA,SAASC,GAAiBD,GAAS;AACjC,SAAO,OAAOA,KAAY,WAAWD,GAAoBC,CAAO,IAAI;AAAA,IAClE,KAAKA;AAAA,IACL,OAAOA;AAAA,IACP,QAAQA;AAAA,IACR,MAAMA;AAAA,EACV;AACA;AACA,SAASE,GAAiBC,GAAM;AAC9B,QAAM;AAAA,IACJ,GAAAtE;AAAA,IACA,GAAAP;AAAA,IACA,OAAA8E;AAAA,IACA,QAAAC;AAAA,EACD,IAAGF;AACJ,SAAO;AAAA,IACL,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,KAAK/E;AAAA,IACL,MAAMO;AAAA,IACN,OAAOA,IAAIuE;AAAA,IACX,QAAQ9E,IAAI+E;AAAA,IACZ,GAAAxE;AAAA,IACA,GAAAP;AAAA,EACJ;AACA;ACpIA,SAASgF,GAA2BC,GAAMrC,GAAWS,GAAK;AACxD,MAAI;AAAA,IACF,WAAA6B;AAAA,IACA,UAAAC;AAAA,EACD,IAAGF;AACJ,QAAMG,IAAWnC,GAAYL,CAAS,GAChCW,IAAgBL,GAAiBN,CAAS,GAC1CyC,IAAcrC,GAAcO,CAAa,GACzCQ,IAAOpB,GAAQC,CAAS,GACxB0C,IAAaF,MAAa,KAC1BG,IAAUL,EAAU,IAAIA,EAAU,QAAQ,IAAIC,EAAS,QAAQ,GAC/DK,IAAUN,EAAU,IAAIA,EAAU,SAAS,IAAIC,EAAS,SAAS,GACjEM,IAAcP,EAAUG,CAAW,IAAI,IAAIF,EAASE,CAAW,IAAI;AACzE,MAAIK;AACJ,UAAQ3B,GAAI;AAAA,IACV,KAAK;AACH,MAAA2B,IAAS;AAAA,QACP,GAAGH;AAAA,QACH,GAAGL,EAAU,IAAIC,EAAS;AAAA,MAClC;AACM;AAAA,IACF,KAAK;AACH,MAAAO,IAAS;AAAA,QACP,GAAGH;AAAA,QACH,GAAGL,EAAU,IAAIA,EAAU;AAAA,MACnC;AACM;AAAA,IACF,KAAK;AACH,MAAAQ,IAAS;AAAA,QACP,GAAGR,EAAU,IAAIA,EAAU;AAAA,QAC3B,GAAGM;AAAA,MACX;AACM;AAAA,IACF,KAAK;AACH,MAAAE,IAAS;AAAA,QACP,GAAGR,EAAU,IAAIC,EAAS;AAAA,QAC1B,GAAGK;AAAA,MACX;AACM;AAAA,IACF;AACE,MAAAE,IAAS;AAAA,QACP,GAAGR,EAAU;AAAA,QACb,GAAGA,EAAU;AAAA,MACrB;AAAA,EACG;AACD,UAAQrC,GAAaD,CAAS,GAAC;AAAA,IAC7B,KAAK;AACH,MAAA8C,EAAOnC,CAAa,KAAKkC,KAAepC,KAAOiC,IAAa,KAAK;AACjE;AAAA,IACF,KAAK;AACH,MAAAI,EAAOnC,CAAa,KAAKkC,KAAepC,KAAOiC,IAAa,KAAK;AACjE;AAAA,EACH;AACD,SAAOI;AACT;AASA,MAAMC,KAAkB,OAAOT,GAAWC,GAAUS,MAAW;AAC7D,QAAM;AAAA,IACJ,WAAAhD,IAAY;AAAA,IACZ,UAAAiD,IAAW;AAAA,IACX,YAAAC,IAAa,CAAE;AAAA,IACf,UAAAC;AAAA,EACD,IAAGH,GACEI,IAAkBF,EAAW,OAAO,OAAO,GAC3CzC,IAAM,OAAO0C,EAAS,SAAS,OAAO,SAASA,EAAS,MAAMZ,CAAQ;AAC5E,MAAI/B,IAAQ,MAAM2C,EAAS,gBAAgB;AAAA,IACzC,WAAAb;AAAA,IACA,UAAAC;AAAA,IACA,UAAAU;AAAA,EACJ,CAAG,GACG;AAAA,IACF,GAAAtF;AAAA,IACA,GAAAP;AAAA,EACD,IAAGgF,GAA2B5B,GAAOR,GAAWS,CAAG,GAChD4C,IAAoBrD,GACpBsD,IAAiB,CAAA,GACjBC,IAAa;AACjB,WAASpK,IAAI,GAAGA,IAAIiK,EAAgB,QAAQjK,KAAK;AAC/C,UAAM;AAAA,MACJ,MAAAO;AAAA,MACA,IAAA8J;AAAA,IACN,IAAQJ,EAAgBjK,CAAC,GACf;AAAA,MACJ,GAAGsK;AAAA,MACH,GAAGC;AAAA,MACH,MAAAC;AAAA,MACA,OAAAC;AAAA,IACD,IAAG,MAAMJ,EAAG;AAAA,MACX,GAAA7F;AAAA,MACA,GAAAP;AAAA,MACA,kBAAkB4C;AAAA,MAClB,WAAWqD;AAAA,MACX,UAAAJ;AAAA,MACA,gBAAAK;AAAA,MACA,OAAA9C;AAAA,MACA,UAAA2C;AAAA,MACA,UAAU;AAAA,QACR,WAAAb;AAAA,QACA,UAAAC;AAAA,MACD;AAAA,IACP,CAAK;AACD,IAAA5E,IAAI8F,KAAwB9F,GAC5BP,IAAIsG,KAAwBtG,GAC5BkG,IAAiB;AAAA,MACf,GAAGA;AAAA,MACH,CAAC5J,CAAI,GAAG;AAAA,QACN,GAAG4J,EAAe5J,CAAI;AAAA,QACtB,GAAGiK;AAAA,MACJ;AAAA,IACP,GACQC,KAASL,KAAc,OACzBA,KACI,OAAOK,KAAU,aACfA,EAAM,cACRP,IAAoBO,EAAM,YAExBA,EAAM,UACRpD,IAAQoD,EAAM,UAAU,KAAO,MAAMT,EAAS,gBAAgB;AAAA,MAC5D,WAAAb;AAAA,MACA,UAAAC;AAAA,MACA,UAAAU;AAAA,IACZ,CAAW,IAAIW,EAAM,QAEZ;AAAA,MACC,GAAAjG;AAAA,MACA,GAAAP;AAAA,IACD,IAAGgF,GAA2B5B,GAAO6C,GAAmB5C,CAAG,IAE9DtH,IAAI;AAAA,EAEP;AACD,SAAO;AAAA,IACL,GAAAwE;AAAA,IACA,GAAAP;AAAA,IACA,WAAWiG;AAAA,IACX,UAAAJ;AAAA,IACA,gBAAAK;AAAA,EACJ;AACA;AAUA,eAAeO,GAAeC,GAAO1M,GAAS;AAC5C,MAAI2M;AACJ,EAAI3M,MAAY,WACdA,IAAU,CAAA;AAEZ,QAAM;AAAA,IACJ,GAAAuG;AAAA,IACA,GAAAP;AAAA,IACA,UAAA+F;AAAA,IACA,OAAA3C;AAAA,IACA,UAAAwD;AAAA,IACA,UAAAf;AAAA,EACD,IAAGa,GACE;AAAA,IACJ,UAAAG,IAAW;AAAA,IACX,cAAAC,IAAe;AAAA,IACf,gBAAAC,IAAiB;AAAA,IACjB,aAAAC,IAAc;AAAA,IACd,SAAAtC,IAAU;AAAA,EACd,IAAMjC,GAASzI,GAAS0M,CAAK,GACrBO,IAAgBtC,GAAiBD,CAAO,GAExCwC,IAAUN,EAASI,IADND,MAAmB,aAAa,cAAc,aACbA,CAAc,GAC5DI,IAAqBvC,GAAiB,MAAMmB,EAAS,gBAAgB;AAAA,IACzE,UAAWY,IAAwB,OAAOZ,EAAS,aAAa,OAAO,SAASA,EAAS,UAAUmB,CAAO,OAAO,QAAOP,IAAgCO,IAAUA,EAAQ,kBAAmB,OAAOnB,EAAS,sBAAsB,OAAO,SAASA,EAAS,mBAAmBa,EAAS,QAAQ;AAAA,IAChS,UAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAjB;AAAA,EACD,CAAA,CAAC,GACIhB,IAAOkC,MAAmB,aAAa;AAAA,IAC3C,GAAAxG;AAAA,IACA,GAAAP;AAAA,IACA,OAAOoD,EAAM,SAAS;AAAA,IACtB,QAAQA,EAAM,SAAS;AAAA,EAC3B,IAAMA,EAAM,WACJgE,IAAe,OAAOrB,EAAS,mBAAmB,OAAO,SAASA,EAAS,gBAAgBa,EAAS,QAAQ,IAC5GS,IAAe,OAAOtB,EAAS,aAAa,OAAO,SAASA,EAAS,UAAUqB,CAAY,KAAO,OAAOrB,EAAS,YAAY,OAAO,SAASA,EAAS,SAASqB,CAAY,MAAO;AAAA,IACvL,GAAG;AAAA,IACH,GAAG;AAAA,EACP,IAAM;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,EACP,GACQE,IAAoB1C,GAAiBmB,EAAS,wDAAwD,MAAMA,EAAS,sDAAsD;AAAA,IAC/K,UAAAa;AAAA,IACA,MAAA/B;AAAA,IACA,cAAAuC;AAAA,IACA,UAAAvB;AAAA,EACJ,CAAG,IAAIhB,CAAI;AACT,SAAO;AAAA,IACL,MAAMsC,EAAmB,MAAMG,EAAkB,MAAML,EAAc,OAAOI,EAAY;AAAA,IACxF,SAASC,EAAkB,SAASH,EAAmB,SAASF,EAAc,UAAUI,EAAY;AAAA,IACpG,OAAOF,EAAmB,OAAOG,EAAkB,OAAOL,EAAc,QAAQI,EAAY;AAAA,IAC5F,QAAQC,EAAkB,QAAQH,EAAmB,QAAQF,EAAc,SAASI,EAAY;AAAA,EACpG;AACA;AAOA,MAAME,KAAQ,CAAAvN,OAAY;AAAA,EACxB,MAAM;AAAA,EACN,SAAAA;AAAA,EACA,MAAM,GAAG0M,GAAO;AACd,UAAM;AAAA,MACJ,GAAAnG;AAAA,MACA,GAAAP;AAAA,MACA,WAAA4C;AAAA,MACA,OAAAQ;AAAA,MACA,UAAA2C;AAAA,MACA,UAAAa;AAAA,MACA,gBAAAV;AAAA,IACD,IAAGQ,GAEE;AAAA,MACJ,SAAAQ;AAAA,MACA,SAAAxC,IAAU;AAAA,IACX,IAAGjC,GAASzI,GAAS0M,CAAK,KAAK,CAAA;AAChC,QAAIQ,KAAW;AACb,aAAO;AAET,UAAMD,IAAgBtC,GAAiBD,CAAO,GACxCgB,IAAS;AAAA,MACb,GAAAnF;AAAA,MACA,GAAAP;AAAA,IACN,GACU+C,IAAOG,GAAiBN,CAAS,GACjCY,IAASR,GAAcD,CAAI,GAC3ByE,IAAkB,MAAMzB,EAAS,cAAcmB,CAAO,GACtDO,IAAU1E,MAAS,KACnB2E,IAAUD,IAAU,QAAQ,QAC5BE,IAAUF,IAAU,WAAW,SAC/BG,IAAaH,IAAU,iBAAiB,eACxCI,IAAUzE,EAAM,UAAUI,CAAM,IAAIJ,EAAM,UAAUL,CAAI,IAAI2C,EAAO3C,CAAI,IAAIK,EAAM,SAASI,CAAM,GAChGsE,IAAYpC,EAAO3C,CAAI,IAAIK,EAAM,UAAUL,CAAI,GAC/CgF,IAAoB,OAAOhC,EAAS,mBAAmB,OAAO,SAASA,EAAS,gBAAgBmB,CAAO;AAC7G,QAAIc,IAAaD,IAAoBA,EAAkBH,CAAU,IAAI;AAGrE,KAAI,CAACI,KAAc,CAAE,OAAOjC,EAAS,aAAa,OAAO,SAASA,EAAS,UAAUgC,CAAiB,QACpGC,IAAapB,EAAS,SAASgB,CAAU,KAAKxE,EAAM,SAASI,CAAM;AAErE,UAAMyE,IAAoBJ,IAAU,IAAIC,IAAY,GAI9CI,IAAyBF,IAAa,IAAIR,EAAgBhE,CAAM,IAAI,IAAI,GACxE2E,IAAapG,GAAIkF,EAAcS,CAAO,GAAGQ,CAAsB,GAC/DE,IAAarG,GAAIkF,EAAcU,CAAO,GAAGO,CAAsB,GAI/DG,IAAQF,GACRnG,IAAMgG,IAAaR,EAAgBhE,CAAM,IAAI4E,GAC7CE,IAASN,IAAa,IAAIR,EAAgBhE,CAAM,IAAI,IAAIyE,GACxDM,IAASjG,GAAM+F,GAAOC,GAAQtG,CAAG,GAMjCwG,IAAkB,CAACtC,EAAe,SAASrD,GAAaD,CAAS,KAAK,QAAQ0F,MAAWC,KAAUnF,EAAM,UAAUI,CAAM,IAAI,KAAK8E,IAASD,IAAQF,IAAaC,KAAcZ,EAAgBhE,CAAM,IAAI,IAAI,GAC5MiF,IAAkBD,IAAkBF,IAASD,IAAQC,IAASD,IAAQC,IAAStG,IAAM;AAC3F,WAAO;AAAA,MACL,CAACe,CAAI,GAAG2C,EAAO3C,CAAI,IAAI0F;AAAA,MACvB,MAAM;AAAA,QACJ,CAAC1F,CAAI,GAAGwF;AAAA,QACR,cAAcD,IAASC,IAASE;AAAA,QAChC,GAAID,KAAmB;AAAA,UACrB,iBAAAC;AAAA,QACV;AAAA,MACO;AAAA,MACD,OAAOD;AAAA,IACb;AAAA,EACG;AACH,IA+GME,KAAO,SAAU1O,GAAS;AAC9B,SAAIA,MAAY,WACdA,IAAU,CAAA,IAEL;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,MAAM,GAAG0M,GAAO;AACd,UAAIiC,GAAuBC;AAC3B,YAAM;AAAA,QACJ,WAAAhG;AAAA,QACA,gBAAAsD;AAAA,QACA,OAAA9C;AAAA,QACA,kBAAAyF;AAAA,QACA,UAAA9C;AAAA,QACA,UAAAa;AAAA,MACD,IAAGF,GACE;AAAA,QACJ,UAAUoC,IAAgB;AAAA,QAC1B,WAAWC,IAAiB;AAAA,QAC5B,oBAAoBC;AAAA,QACpB,kBAAAC,IAAmB;AAAA,QACnB,2BAAAC,IAA4B;AAAA,QAC5B,eAAA5E,IAAgB;AAAA,QAChB,GAAG6E;AAAA,MACX,IAAU1G,GAASzI,GAAS0M,CAAK;AAM3B,WAAKiC,IAAwBzC,EAAe,UAAU,QAAQyC,EAAsB;AAClF,eAAO;AAET,YAAM5E,IAAOpB,GAAQC,CAAS,GACxBwG,IAAkBnG,GAAY4F,CAAgB,GAC9CQ,IAAkB1G,GAAQkG,CAAgB,MAAMA,GAChDxF,IAAM,OAAO0C,EAAS,SAAS,OAAO,SAASA,EAAS,MAAMa,EAAS,QAAQ,IAC/E0C,IAAqBN,MAAgCK,KAAmB,CAAC/E,IAAgB,CAACZ,GAAqBmF,CAAgB,CAAC,IAAIlF,GAAsBkF,CAAgB,IAC1KU,IAA+BL,MAA8B;AACnE,MAAI,CAACF,KAA+BO,KAClCD,EAAmB,KAAK,GAAGjF,GAA0BwE,GAAkBvE,GAAe4E,GAA2B7F,CAAG,CAAC;AAEvH,YAAMmG,IAAa,CAACX,GAAkB,GAAGS,CAAkB,GACrDG,IAAW,MAAMhD,GAAeC,GAAOyC,CAAqB,GAC5DO,IAAY,CAAA;AAClB,UAAIC,MAAkBf,IAAuB1C,EAAe,SAAS,OAAO,SAAS0C,EAAqB,cAAc,CAAA;AAIxH,UAHIE,KACFY,EAAU,KAAKD,EAAS1F,CAAI,CAAC,GAE3BgF,GAAgB;AAClB,cAAMa,IAAQzG,GAAkBP,GAAWQ,GAAOC,CAAG;AACrD,QAAAqG,EAAU,KAAKD,EAASG,EAAM,CAAC,CAAC,GAAGH,EAASG,EAAM,CAAC,CAAC,CAAC;AAAA,MACtD;AAOD,UANAD,IAAgB,CAAC,GAAGA,GAAe;AAAA,QACjC,WAAA/G;AAAA,QACA,WAAA8G;AAAA,MACR,CAAO,GAGG,CAACA,EAAU,MAAM,CAAA3F,MAAQA,KAAQ,CAAC,GAAG;AACvC,YAAI8F,GAAuBC;AAC3B,cAAMC,OAAeF,IAAwB3D,EAAe,SAAS,OAAO,SAAS2D,EAAsB,UAAU,KAAK,GACpHG,IAAgBR,EAAWO,CAAS;AAC1C,YAAIC;AAEF,iBAAO;AAAA,YACL,MAAM;AAAA,cACJ,OAAOD;AAAA,cACP,WAAWJ;AAAA,YACZ;AAAA,YACD,OAAO;AAAA,cACL,WAAWK;AAAA,YACZ;AAAA,UACb;AAKQ,YAAIC,KAAkBH,IAAwBH,EAAc,OAAO,CAAA1J,MAAKA,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAACa,GAAGR,MAAMQ,EAAE,UAAU,CAAC,IAAIR,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,MAAM,OAAO,SAASwJ,EAAsB;AAG1L,YAAI,CAACG;AACH,kBAAQhB,GAAgB;AAAA,YACtB,KAAK,WACH;AACE,kBAAIiB;AACJ,oBAAMtH,KAAasH,IAAyBP,EAAc,OAAO,CAAA1J,MAAK;AACpE,oBAAIsJ,GAA8B;AAChC,wBAAMY,IAAkBlH,GAAYhD,EAAE,SAAS;AAC/C,yBAAOkK,MAAoBf;AAAA;AAAA,kBAG3Be,MAAoB;AAAA,gBACrB;AACD,uBAAO;AAAA,cACzB,CAAiB,EAAE,IAAI,CAAAlK,MAAK,CAACA,EAAE,WAAWA,EAAE,UAAU,OAAO,CAAAwJ,MAAYA,IAAW,CAAC,EAAE,OAAO,CAACtP,GAAKsP,OAAatP,IAAMsP,IAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC3I,GAAGR,MAAMQ,EAAE,CAAC,IAAIR,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,OAAO,SAAS4J,EAAuB,CAAC;AACjM,cAAItH,MACFqH,IAAiBrH;AAEnB;AAAA,YACD;AAAA,YACH,KAAK;AACH,cAAAqH,IAAiBpB;AACjB;AAAA,UACH;AAEH,YAAIjG,MAAcqH;AAChB,iBAAO;AAAA,YACL,OAAO;AAAA,cACL,WAAWA;AAAA,YACZ;AAAA,UACb;AAAA,MAEO;AACD,aAAO;IACR;AAAA,EACL;AACA;AA6MA,eAAeG,GAAqB1D,GAAO1M,GAAS;AAClD,QAAM;AAAA,IACJ,WAAA4I;AAAA,IACA,UAAAmD;AAAA,IACA,UAAAa;AAAA,EACD,IAAGF,GACErD,IAAM,OAAO0C,EAAS,SAAS,OAAO,SAASA,EAAS,MAAMa,EAAS,QAAQ,IAC/E7C,IAAOpB,GAAQC,CAAS,GACxBU,IAAYT,GAAaD,CAAS,GAClC0C,IAAarC,GAAYL,CAAS,MAAM,KACxCyH,IAAgB,CAAC,QAAQ,KAAK,EAAE,SAAStG,CAAI,IAAI,KAAK,GACtDuG,IAAiBjH,KAAOiC,IAAa,KAAK,GAC1CiF,IAAW9H,GAASzI,GAAS0M,CAAK;AAGxC,MAAI;AAAA,IACF,UAAA8D;AAAA,IACA,WAAAC;AAAA,IACA,eAAAlH;AAAA,EACJ,IAAM,OAAOgH,KAAa,WAAW;AAAA,IACjC,UAAUA;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,EACnB,IAAM;AAAA,IACF,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,GAAGA;AAAA,EACP;AACE,SAAIjH,KAAa,OAAOC,KAAkB,aACxCkH,IAAYnH,MAAc,QAAQC,IAAgB,KAAKA,IAElD+B,IAAa;AAAA,IAClB,GAAGmF,IAAYH;AAAA,IACf,GAAGE,IAAWH;AAAA,EAClB,IAAM;AAAA,IACF,GAAGG,IAAWH;AAAA,IACd,GAAGI,IAAYH;AAAA,EACnB;AACA;AASA,MAAM/B,KAAS,SAAUvO,GAAS;AAChC,SAAIA,MAAY,WACdA,IAAU,IAEL;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,MAAM,GAAG0M,GAAO;AACd,UAAIgE,GAAuB/B;AAC3B,YAAM;AAAA,QACJ,GAAApI;AAAA,QACA,GAAAP;AAAA,QACA,WAAA4C;AAAA,QACA,gBAAAsD;AAAA,MACD,IAAGQ,GACEiE,IAAa,MAAMP,GAAqB1D,GAAO1M,CAAO;AAI5D,aAAI4I,QAAgB8H,IAAwBxE,EAAe,WAAW,OAAO,SAASwE,EAAsB,eAAe/B,IAAwBzC,EAAe,UAAU,QAAQyC,EAAsB,kBACjM,KAEF;AAAA,QACL,GAAGpI,IAAIoK,EAAW;AAAA,QAClB,GAAG3K,IAAI2K,EAAW;AAAA,QAClB,MAAM;AAAA,UACJ,GAAGA;AAAA,UACH,WAAA/H;AAAA,QACD;AAAA,MACT;AAAA,IACK;AAAA,EACL;AACA,GAOMgI,KAAQ,SAAU5Q,GAAS;AAC/B,SAAIA,MAAY,WACdA,IAAU,CAAA,IAEL;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,MAAM,GAAG0M,GAAO;AACd,YAAM;AAAA,QACJ,GAAAnG;AAAA,QACA,GAAAP;AAAA,QACA,WAAA4C;AAAA,MACD,IAAG8D,GACE;AAAA,QACJ,UAAUoC,IAAgB;AAAA,QAC1B,WAAWC,IAAiB;AAAA,QAC5B,SAAA8B,IAAU;AAAA,UACR,IAAI,CAAA5F,MAAQ;AACV,gBAAI;AAAA,cACF,GAAA1E;AAAA,cACA;AAAA,YACD,IAAG0E;AACJ,mBAAO;AAAA,cACL,GAAA1E;AAAA,cACA;AAAA,YACd;AAAA,UACW;AAAA,QACF;AAAA,QACD,GAAG4I;AAAA,MACX,IAAU1G,GAASzI,GAAS0M,CAAK,GACrBhB,IAAS;AAAA,QACb,GAAAnF;AAAA,QACA,GAAAP;AAAA,MACR,GACYyJ,IAAW,MAAMhD,GAAeC,GAAOyC,CAAqB,GAC5DsB,IAAYxH,GAAYN,GAAQC,CAAS,CAAC,GAC1C4H,IAAW1H,GAAgB2H,CAAS;AAC1C,UAAIK,IAAgBpF,EAAO8E,CAAQ,GAC/BO,IAAiBrF,EAAO+E,CAAS;AACrC,UAAI3B,GAAe;AACjB,cAAMkC,IAAUR,MAAa,MAAM,QAAQ,QACrCS,IAAUT,MAAa,MAAM,WAAW,SACxCzI,IAAM+I,IAAgBrB,EAASuB,CAAO,GACtChJ,IAAM8I,IAAgBrB,EAASwB,CAAO;AAC5C,QAAAH,IAAgBxI,GAAMP,GAAK+I,GAAe9I,CAAG;AAAA,MAC9C;AACD,UAAI+G,GAAgB;AAClB,cAAMiC,IAAUP,MAAc,MAAM,QAAQ,QACtCQ,IAAUR,MAAc,MAAM,WAAW,SACzC1I,IAAMgJ,IAAiBtB,EAASuB,CAAO,GACvChJ,IAAM+I,IAAiBtB,EAASwB,CAAO;AAC7C,QAAAF,IAAiBzI,GAAMP,GAAKgJ,GAAgB/I,CAAG;AAAA,MAChD;AACD,YAAMkJ,IAAgBL,EAAQ,GAAG;AAAA,QAC/B,GAAGnE;AAAA,QACH,CAAC8D,CAAQ,GAAGM;AAAA,QACZ,CAACL,CAAS,GAAGM;AAAA,MACrB,CAAO;AACD,aAAO;AAAA,QACL,GAAGG;AAAA,QACH,MAAM;AAAA,UACJ,GAAGA,EAAc,IAAI3K;AAAA,UACrB,GAAG2K,EAAc,IAAIlL;AAAA,QACtB;AAAA,MACT;AAAA,IACK;AAAA,EACL;AACA;ACn3BA,SAASmL,GAAYC,GAAM;AACzB,SAAIC,GAAOD,CAAI,KACLA,EAAK,YAAY,IAAI,YAAW,IAKnC;AACT;AACA,SAASE,EAAUF,GAAM;AACvB,MAAIG;AACJ,UAAQH,KAAQ,SAASG,IAAsBH,EAAK,kBAAkB,OAAO,SAASG,EAAoB,gBAAgB;AAC5H;AACA,SAASC,EAAmBJ,GAAM;AAChC,MAAInG;AACJ,UAAQA,KAAQoG,GAAOD,CAAI,IAAIA,EAAK,gBAAgBA,EAAK,aAAa,OAAO,aAAa,OAAO,SAASnG,EAAK;AACjH;AACA,SAASoG,GAAOpR,GAAO;AACrB,SAAOA,aAAiB,QAAQA,aAAiBqR,EAAUrR,CAAK,EAAE;AACpE;AACA,SAASwR,EAAUxR,GAAO;AACxB,SAAOA,aAAiB,WAAWA,aAAiBqR,EAAUrR,CAAK,EAAE;AACvE;AACA,SAASyR,EAAczR,GAAO;AAC5B,SAAOA,aAAiB,eAAeA,aAAiBqR,EAAUrR,CAAK,EAAE;AAC3E;AACA,SAAS0R,GAAa1R,GAAO;AAE3B,SAAI,OAAO,aAAe,MACjB,KAEFA,aAAiB,cAAcA,aAAiBqR,EAAUrR,CAAK,EAAE;AAC1E;AACA,SAAS2R,GAAkB1E,GAAS;AAClC,QAAM;AAAA,IACJ,UAAAuC;AAAA,IACA,WAAAoC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,EACJ,IAAMC,EAAiB9E,CAAO;AAC5B,SAAO,kCAAkC,KAAKuC,IAAWqC,IAAYD,CAAS,KAAK,CAAC,CAAC,UAAU,UAAU,EAAE,SAASE,CAAO;AAC7H;AACA,SAASE,GAAe/E,GAAS;AAC/B,SAAO,CAAC,SAAS,MAAM,IAAI,EAAE,SAASiE,GAAYjE,CAAO,CAAC;AAC5D;AACA,SAASgF,GAAWhF,GAAS;AAC3B,SAAO,CAAC,iBAAiB,QAAQ,EAAE,KAAK,CAAAiF,MAAY;AAClD,QAAI;AACF,aAAOjF,EAAQ,QAAQiF,CAAQ;AAAA,IAChC,QAAW;AACV,aAAO;AAAA,IACR;AAAA,EACL,CAAG;AACH;AACA,SAASC,GAAkBC,GAAc;AACvC,QAAMC,IAASC,MACTC,IAAMf,EAAUY,CAAY,IAAIL,EAAiBK,CAAY,IAAIA;AAGvE,SAAOG,EAAI,cAAc,UAAUA,EAAI,gBAAgB,WAAWA,EAAI,gBAAgBA,EAAI,kBAAkB,WAAW,OAAU,CAACF,MAAWE,EAAI,iBAAiBA,EAAI,mBAAmB,SAAS,OAAU,CAACF,MAAWE,EAAI,SAASA,EAAI,WAAW,SAAS,OAAU,CAAC,aAAa,eAAe,QAAQ,EAAE,KAAK,CAAAvS,OAAUuS,EAAI,cAAc,IAAI,SAASvS,CAAK,CAAC,KAAK,CAAC,SAAS,UAAU,UAAU,SAAS,EAAE,KAAK,CAAAA,OAAUuS,EAAI,WAAW,IAAI,SAASvS,CAAK,CAAC;AACnc;AACA,SAASwS,GAAmBvF,GAAS;AACnC,MAAIwF,IAAcC,EAAczF,CAAO;AACvC,SAAOwE,EAAcgB,CAAW,KAAK,CAACE,GAAsBF,CAAW,KAAG;AACxE,QAAIN,GAAkBM,CAAW;AAC/B,aAAOA;AACF,QAAIR,GAAWQ,CAAW;AAC/B,aAAO;AAET,IAAAA,IAAcC,EAAcD,CAAW;AAAA,EACxC;AACD,SAAO;AACT;AACA,SAASH,KAAW;AAClB,SAAI,OAAO,MAAQ,OAAe,CAAC,IAAI,WAAiB,KACjD,IAAI,SAAS,2BAA2B,MAAM;AACvD;AACA,SAASK,GAAsBxB,GAAM;AACnC,SAAO,CAAC,QAAQ,QAAQ,WAAW,EAAE,SAASD,GAAYC,CAAI,CAAC;AACjE;AACA,SAASY,EAAiB9E,GAAS;AACjC,SAAOoE,EAAUpE,CAAO,EAAE,iBAAiBA,CAAO;AACpD;AACA,SAAS2F,GAAc3F,GAAS;AAC9B,SAAIuE,EAAUvE,CAAO,IACZ;AAAA,IACL,YAAYA,EAAQ;AAAA,IACpB,WAAWA,EAAQ;AAAA,EACzB,IAES;AAAA,IACL,YAAYA,EAAQ;AAAA,IACpB,WAAWA,EAAQ;AAAA,EACvB;AACA;AACA,SAASyF,EAAcvB,GAAM;AAC3B,MAAID,GAAYC,CAAI,MAAM;AACxB,WAAOA;AAET,QAAMjS;AAAA;AAAA,IAENiS,EAAK;AAAA,IAELA,EAAK;AAAA,IAELO,GAAaP,CAAI,KAAKA,EAAK;AAAA,IAE3BI,EAAmBJ,CAAI;AAAA;AACvB,SAAOO,GAAaxS,CAAM,IAAIA,EAAO,OAAOA;AAC9C;AACA,SAAS2T,GAA2B1B,GAAM;AACxC,QAAM2B,IAAaJ,EAAcvB,CAAI;AACrC,SAAIwB,GAAsBG,CAAU,IAC3B3B,EAAK,gBAAgBA,EAAK,cAAc,OAAOA,EAAK,OAEzDM,EAAcqB,CAAU,KAAKnB,GAAkBmB,CAAU,IACpDA,IAEFD,GAA2BC,CAAU;AAC9C;AACA,SAASC,GAAqB5B,GAAM5G,GAAMyI,GAAiB;AACzD,MAAIC;AACJ,EAAI1I,MAAS,WACXA,IAAO,CAAA,IAELyI,MAAoB,WACtBA,IAAkB;AAEpB,QAAME,IAAqBL,GAA2B1B,CAAI,GACpDgC,IAASD,QAAyBD,IAAuB9B,EAAK,kBAAkB,OAAO,SAAS8B,EAAqB,OACrHG,IAAM/B,EAAU6B,CAAkB;AACxC,SAAIC,IACK5I,EAAK,OAAO6I,GAAKA,EAAI,kBAAkB,CAAE,GAAEzB,GAAkBuB,CAAkB,IAAIA,IAAqB,IAAIE,EAAI,gBAAgBJ,IAAkBD,GAAqBK,EAAI,YAAY,IAAI,CAAA,CAAE,IAE/L7I,EAAK,OAAO2I,GAAoBH,GAAqBG,GAAoB,CAAE,GAAEF,CAAe,CAAC;AACtG;AClIA,SAASK,GAAiBpG,GAAS;AACjC,QAAMsF,IAAMR,EAAiB9E,CAAO;AAGpC,MAAIpC,IAAQ,WAAW0H,EAAI,KAAK,KAAK,GACjCzH,IAAS,WAAWyH,EAAI,MAAM,KAAK;AACvC,QAAMe,IAAY7B,EAAcxE,CAAO,GACjCsG,IAAcD,IAAYrG,EAAQ,cAAcpC,GAChD2I,IAAeF,IAAYrG,EAAQ,eAAenC,GAClD2I,IAAiBzL,GAAM6C,CAAK,MAAM0I,KAAevL,GAAM8C,CAAM,MAAM0I;AACzE,SAAIC,MACF5I,IAAQ0I,GACRzI,IAAS0I,IAEJ;AAAA,IACL,OAAA3I;AAAA,IACA,QAAAC;AAAA,IACA,GAAG2I;AAAA,EACP;AACA;AAEA,SAASC,GAAczG,GAAS;AAC9B,SAAQuE,EAAUvE,CAAO,IAA6BA,IAAzBA,EAAQ;AACvC;AAEA,SAAS0G,GAAS1G,GAAS;AACzB,QAAM2G,IAAaF,GAAczG,CAAO;AACxC,MAAI,CAACwE,EAAcmC,CAAU;AAC3B,WAAO1L,EAAa,CAAC;AAEvB,QAAM0C,IAAOgJ,EAAW,yBAClB;AAAA,IACJ,OAAA/I;AAAA,IACA,QAAAC;AAAA,IACA,GAAAhE;AAAA,EACJ,IAAMuM,GAAiBO,CAAU;AAC/B,MAAItN,KAAKQ,IAAIkB,GAAM4C,EAAK,KAAK,IAAIA,EAAK,SAASC,GAC3C9E,KAAKe,IAAIkB,GAAM4C,EAAK,MAAM,IAAIA,EAAK,UAAUE;AAIjD,UAAI,CAACxE,KAAK,CAAC,OAAO,SAASA,CAAC,OAC1BA,IAAI,KAEF,CAACP,KAAK,CAAC,OAAO,SAASA,CAAC,OAC1BA,IAAI,IAEC;AAAA,IACL,GAAAO;AAAA,IACA,GAAAP;AAAA,EACJ;AACA;AAEA,MAAM8N,KAAyB,gBAAA3L,EAAa,CAAC;AAC7C,SAAS4L,GAAiB7G,GAAS;AACjC,QAAMmG,IAAM/B,EAAUpE,CAAO;AAC7B,SAAI,CAACqF,GAAQ,KAAM,CAACc,EAAI,iBACfS,KAEF;AAAA,IACL,GAAGT,EAAI,eAAe;AAAA,IACtB,GAAGA,EAAI,eAAe;AAAA,EAC1B;AACA;AACA,SAASW,GAAuB9G,GAAS+G,GAASC,GAAsB;AAItE,SAHID,MAAY,WACdA,IAAU,KAER,CAACC,KAAwBD,KAAWC,MAAyB5C,EAAUpE,CAAO,IACzE,KAEF+G;AACT;AAEA,SAASE,GAAsBjH,GAASkH,GAAcC,GAAiBjH,GAAc;AACnF,EAAIgH,MAAiB,WACnBA,IAAe,KAEbC,MAAoB,WACtBA,IAAkB;AAEpB,QAAMC,IAAapH,EAAQ,yBACrB2G,IAAaF,GAAczG,CAAO;AACxC,MAAIqH,IAAQpM,EAAa,CAAC;AAC1B,EAAIiM,MACEhH,IACEqE,EAAUrE,CAAY,MACxBmH,IAAQX,GAASxG,CAAY,KAG/BmH,IAAQX,GAAS1G,CAAO;AAG5B,QAAMsH,IAAgBR,GAAuBH,GAAYQ,GAAiBjH,CAAY,IAAI2G,GAAiBF,CAAU,IAAI1L,EAAa,CAAC;AACvI,MAAI5B,KAAK+N,EAAW,OAAOE,EAAc,KAAKD,EAAM,GAChDvO,KAAKsO,EAAW,MAAME,EAAc,KAAKD,EAAM,GAC/CzJ,IAAQwJ,EAAW,QAAQC,EAAM,GACjCxJ,IAASuJ,EAAW,SAASC,EAAM;AACvC,MAAIV,GAAY;AACd,UAAMR,IAAM/B,EAAUuC,CAAU,GAC1BY,IAAYrH,KAAgBqE,EAAUrE,CAAY,IAAIkE,EAAUlE,CAAY,IAAIA;AACtF,QAAIsH,IAAarB,GACbsB,IAAgBD,EAAW;AAC/B,WAAOC,KAAiBvH,KAAgBqH,MAAcC,KAAY;AAChE,YAAME,IAAchB,GAASe,CAAa,GACpCE,IAAaF,EAAc,yBAC3BnC,IAAMR,EAAiB2C,CAAa,GACpCG,IAAOD,EAAW,QAAQF,EAAc,aAAa,WAAWnC,EAAI,WAAW,KAAKoC,EAAY,GAChGG,IAAMF,EAAW,OAAOF,EAAc,YAAY,WAAWnC,EAAI,UAAU,KAAKoC,EAAY;AAClG,MAAArO,KAAKqO,EAAY,GACjB5O,KAAK4O,EAAY,GACjB9J,KAAS8J,EAAY,GACrB7J,KAAU6J,EAAY,GACtBrO,KAAKuO,GACL9O,KAAK+O,GACLL,IAAapD,EAAUqD,CAAa,GACpCA,IAAgBD,EAAW;AAAA,IAC5B;AAAA,EACF;AACD,SAAO9J,GAAiB;AAAA,IACtB,OAAAE;AAAA,IACA,QAAAC;AAAA,IACA,GAAAxE;AAAA,IACA,GAAAP;AAAA,EACJ,CAAG;AACH;AAEA,SAASgP,GAAsD/J,GAAM;AACnE,MAAI;AAAA,IACF,UAAA2B;AAAA,IACA,MAAA/B;AAAA,IACA,cAAAuC;AAAA,IACA,UAAAvB;AAAA,EACD,IAAGZ;AACJ,QAAMgJ,IAAUpI,MAAa,SACvBoJ,IAAkBzD,EAAmBpE,CAAY,GACjD8H,IAAWtI,IAAWsF,GAAWtF,EAAS,QAAQ,IAAI;AAC5D,MAAIQ,MAAiB6H,KAAmBC,KAAYjB;AAClD,WAAOpJ;AAET,MAAIsK,IAAS;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACf,GACMZ,IAAQpM,EAAa,CAAC;AAC1B,QAAMiN,IAAUjN,EAAa,CAAC,GACxBkN,IAA0B3D,EAActE,CAAY;AAC1D,OAAIiI,KAA2B,CAACA,KAA2B,CAACpB,QACtD9C,GAAY/D,CAAY,MAAM,UAAUwE,GAAkBqD,CAAe,OAC3EE,IAAStC,GAAczF,CAAY,IAEjCsE,EAActE,CAAY,IAAG;AAC/B,UAAMkI,IAAanB,GAAsB/G,CAAY;AACrD,IAAAmH,IAAQX,GAASxG,CAAY,GAC7BgI,EAAQ,IAAIE,EAAW,IAAIlI,EAAa,YACxCgI,EAAQ,IAAIE,EAAW,IAAIlI,EAAa;AAAA,EACzC;AAEH,SAAO;AAAA,IACL,OAAOvC,EAAK,QAAQ0J,EAAM;AAAA,IAC1B,QAAQ1J,EAAK,SAAS0J,EAAM;AAAA,IAC5B,GAAG1J,EAAK,IAAI0J,EAAM,IAAIY,EAAO,aAAaZ,EAAM,IAAIa,EAAQ;AAAA,IAC5D,GAAGvK,EAAK,IAAI0J,EAAM,IAAIY,EAAO,YAAYZ,EAAM,IAAIa,EAAQ;AAAA,EAC/D;AACA;AAEA,SAASG,GAAerI,GAAS;AAC/B,SAAO,MAAM,KAAKA,EAAQ,eAAgB,CAAA;AAC5C;AAEA,SAASsI,GAAoBtI,GAAS;AAGpC,SAAOiH,GAAsB3C,EAAmBtE,CAAO,CAAC,EAAE,OAAO2F,GAAc3F,CAAO,EAAE;AAC1F;AAIA,SAASuI,GAAgBvI,GAAS;AAChC,QAAMwI,IAAOlE,EAAmBtE,CAAO,GACjCiI,IAAStC,GAAc3F,CAAO,GAC9BjJ,IAAOiJ,EAAQ,cAAc,MAC7BpC,IAAQ9C,GAAI0N,EAAK,aAAaA,EAAK,aAAazR,EAAK,aAAaA,EAAK,WAAW,GAClF8G,IAAS/C,GAAI0N,EAAK,cAAcA,EAAK,cAAczR,EAAK,cAAcA,EAAK,YAAY;AAC7F,MAAIsC,IAAI,CAAC4O,EAAO,aAAaK,GAAoBtI,CAAO;AACxD,QAAMlH,IAAI,CAACmP,EAAO;AAClB,SAAInD,EAAiB/N,CAAI,EAAE,cAAc,UACvCsC,KAAKyB,GAAI0N,EAAK,aAAazR,EAAK,WAAW,IAAI6G,IAE1C;AAAA,IACL,OAAAA;AAAA,IACA,QAAAC;AAAA,IACA,GAAAxE;AAAA,IACA,GAAAP;AAAA,EACJ;AACA;AAEA,SAAS2P,GAAgBzI,GAASrB,GAAU;AAC1C,QAAMwH,IAAM/B,EAAUpE,CAAO,GACvBwI,IAAOlE,EAAmBtE,CAAO,GACjC0I,IAAiBvC,EAAI;AAC3B,MAAIvI,IAAQ4K,EAAK,aACb3K,IAAS2K,EAAK,cACdnP,IAAI,GACJP,IAAI;AACR,MAAI4P,GAAgB;AAClB,IAAA9K,IAAQ8K,EAAe,OACvB7K,IAAS6K,EAAe;AACxB,UAAMC,IAAsBtD;AAC5B,KAAI,CAACsD,KAAuBA,KAAuBhK,MAAa,aAC9DtF,IAAIqP,EAAe,YACnB5P,IAAI4P,EAAe;AAAA,EAEtB;AACD,SAAO;AAAA,IACL,OAAA9K;AAAA,IACA,QAAAC;AAAA,IACA,GAAAxE;AAAA,IACA,GAAAP;AAAA,EACJ;AACA;AAGA,SAAS8P,GAA2B5I,GAASrB,GAAU;AACrD,QAAMyI,IAAaH,GAAsBjH,GAAS,IAAMrB,MAAa,OAAO,GACtEkJ,IAAMT,EAAW,MAAMpH,EAAQ,WAC/B4H,IAAOR,EAAW,OAAOpH,EAAQ,YACjCqH,IAAQ7C,EAAcxE,CAAO,IAAI0G,GAAS1G,CAAO,IAAI/E,EAAa,CAAC,GACnE2C,IAAQoC,EAAQ,cAAcqH,EAAM,GACpCxJ,IAASmC,EAAQ,eAAeqH,EAAM,GACtChO,IAAIuO,IAAOP,EAAM,GACjBvO,IAAI+O,IAAMR,EAAM;AACtB,SAAO;AAAA,IACL,OAAAzJ;AAAA,IACA,QAAAC;AAAA,IACA,GAAAxE;AAAA,IACA,GAAAP;AAAA,EACJ;AACA;AACA,SAAS+P,GAAkC7I,GAAS8I,GAAkBnK,GAAU;AAC9E,MAAIhB;AACJ,MAAImL,MAAqB;AACvB,IAAAnL,IAAO8K,GAAgBzI,GAASrB,CAAQ;AAAA,WAC/BmK,MAAqB;AAC9B,IAAAnL,IAAO4K,GAAgBjE,EAAmBtE,CAAO,CAAC;AAAA,WACzCuE,EAAUuE,CAAgB;AACnC,IAAAnL,IAAOiL,GAA2BE,GAAkBnK,CAAQ;AAAA,OACvD;AACL,UAAM2I,IAAgBT,GAAiB7G,CAAO;AAC9C,IAAArC,IAAO;AAAA,MACL,GAAGmL;AAAA,MACH,GAAGA,EAAiB,IAAIxB,EAAc;AAAA,MACtC,GAAGwB,EAAiB,IAAIxB,EAAc;AAAA,IAC5C;AAAA,EACG;AACD,SAAO5J,GAAiBC,CAAI;AAC9B;AACA,SAASoL,GAAyB/I,GAASgJ,GAAU;AACnD,QAAMnD,IAAaJ,EAAczF,CAAO;AACxC,SAAI6F,MAAemD,KAAY,CAACzE,EAAUsB,CAAU,KAAKH,GAAsBG,CAAU,IAChF,KAEFf,EAAiBe,CAAU,EAAE,aAAa,WAAWkD,GAAyBlD,GAAYmD,CAAQ;AAC3G;AAKA,SAASC,GAA4BjJ,GAASkJ,GAAO;AACnD,QAAMC,IAAeD,EAAM,IAAIlJ,CAAO;AACtC,MAAImJ;AACF,WAAOA;AAET,MAAIlX,IAAS6T,GAAqB9F,GAAS,CAAA,GAAI,EAAK,EAAE,OAAO,CAAAoJ,MAAM7E,EAAU6E,CAAE,KAAKnF,GAAYmF,CAAE,MAAM,MAAM,GAC1GC,IAAsC;AAC1C,QAAMC,IAAiBxE,EAAiB9E,CAAO,EAAE,aAAa;AAC9D,MAAIwF,IAAc8D,IAAiB7D,EAAczF,CAAO,IAAIA;AAG5D,SAAOuE,EAAUiB,CAAW,KAAK,CAACE,GAAsBF,CAAW,KAAG;AACpE,UAAM+D,IAAgBzE,EAAiBU,CAAW,GAC5CgE,IAA0BtE,GAAkBM,CAAW;AAC7D,IAAI,CAACgE,KAA2BD,EAAc,aAAa,YACzDF,IAAsC,QAEVC,IAAiB,CAACE,KAA2B,CAACH,IAAsC,CAACG,KAA2BD,EAAc,aAAa,YAAY,CAAC,CAACF,KAAuC,CAAC,YAAY,OAAO,EAAE,SAASA,EAAoC,QAAQ,KAAK3E,GAAkBc,CAAW,KAAK,CAACgE,KAA2BT,GAAyB/I,GAASwF,CAAW,KAGvZvT,IAASA,EAAO,OAAO,CAAAwX,MAAYA,MAAajE,CAAW,IAG3D6D,IAAsCE,GAExC/D,IAAcC,EAAcD,CAAW;AAAA,EACxC;AACD,SAAA0D,EAAM,IAAIlJ,GAAS/N,CAAM,GAClBA;AACT;AAIA,SAASyX,GAAgB3L,GAAM;AAC7B,MAAI;AAAA,IACF,SAAAiC;AAAA,IACA,UAAAL;AAAA,IACA,cAAAC;AAAA,IACA,UAAAjB;AAAA,EACD,IAAGZ;AAEJ,QAAM4L,IAAoB,CAAC,GADMhK,MAAa,sBAAsBqF,GAAWhF,CAAO,IAAI,CAAE,IAAGiJ,GAA4BjJ,GAAS,KAAK,EAAE,IAAI,CAAA,EAAG,OAAOL,CAAQ,GACzGC,CAAY,GAC9DgK,IAAwBD,EAAkB,CAAC,GAC3CE,IAAeF,EAAkB,OAAO,CAACG,GAAShB,MAAqB;AAC3E,UAAMnL,IAAOkL,GAAkC7I,GAAS8I,GAAkBnK,CAAQ;AAClF,WAAAmL,EAAQ,MAAMhP,GAAI6C,EAAK,KAAKmM,EAAQ,GAAG,GACvCA,EAAQ,QAAQjP,GAAI8C,EAAK,OAAOmM,EAAQ,KAAK,GAC7CA,EAAQ,SAASjP,GAAI8C,EAAK,QAAQmM,EAAQ,MAAM,GAChDA,EAAQ,OAAOhP,GAAI6C,EAAK,MAAMmM,EAAQ,IAAI,GACnCA;AAAA,EACR,GAAEjB,GAAkC7I,GAAS4J,GAAuBjL,CAAQ,CAAC;AAC9E,SAAO;AAAA,IACL,OAAOkL,EAAa,QAAQA,EAAa;AAAA,IACzC,QAAQA,EAAa,SAASA,EAAa;AAAA,IAC3C,GAAGA,EAAa;AAAA,IAChB,GAAGA,EAAa;AAAA,EACpB;AACA;AAEA,SAASE,GAAc/J,GAAS;AAC9B,QAAM;AAAA,IACJ,OAAApC;AAAA,IACA,QAAAC;AAAA,EACJ,IAAMuI,GAAiBpG,CAAO;AAC5B,SAAO;AAAA,IACL,OAAApC;AAAA,IACA,QAAAC;AAAA,EACJ;AACA;AAEA,SAASmM,GAA8BhK,GAASE,GAAcvB,GAAU;AACtE,QAAMwJ,IAA0B3D,EAActE,CAAY,GACpD6H,IAAkBzD,EAAmBpE,CAAY,GACjD6G,IAAUpI,MAAa,SACvBhB,IAAOsJ,GAAsBjH,GAAS,IAAM+G,GAAS7G,CAAY;AACvE,MAAI+H,IAAS;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACf;AACE,QAAMC,IAAUjN,EAAa,CAAC;AAC9B,MAAIkN,KAA2B,CAACA,KAA2B,CAACpB;AAI1D,SAHI9C,GAAY/D,CAAY,MAAM,UAAUwE,GAAkBqD,CAAe,OAC3EE,IAAStC,GAAczF,CAAY,IAEjCiI,GAAyB;AAC3B,YAAMC,IAAanB,GAAsB/G,GAAc,IAAM6G,GAAS7G,CAAY;AAClF,MAAAgI,EAAQ,IAAIE,EAAW,IAAIlI,EAAa,YACxCgI,EAAQ,IAAIE,EAAW,IAAIlI,EAAa;AAAA,IACzC,MAAM,CAAI6H,MACTG,EAAQ,IAAII,GAAoBP,CAAe;AAGnD,QAAM1O,IAAIsE,EAAK,OAAOsK,EAAO,aAAaC,EAAQ,GAC5CpP,IAAI6E,EAAK,MAAMsK,EAAO,YAAYC,EAAQ;AAChD,SAAO;AAAA,IACL,GAAA7O;AAAA,IACA,GAAAP;AAAA,IACA,OAAO6E,EAAK;AAAA,IACZ,QAAQA,EAAK;AAAA,EACjB;AACA;AAEA,SAASsM,GAAmBjK,GAAS;AACnC,SAAO8E,EAAiB9E,CAAO,EAAE,aAAa;AAChD;AAEA,SAASkK,GAAoBlK,GAASmK,GAAU;AAC9C,SAAI,CAAC3F,EAAcxE,CAAO,KAAK8E,EAAiB9E,CAAO,EAAE,aAAa,UAC7D,OAELmK,IACKA,EAASnK,CAAO,IAElBA,EAAQ;AACjB;AAIA,SAASoK,GAAgBpK,GAASmK,GAAU;AAC1C,QAAMhE,IAAM/B,EAAUpE,CAAO;AAC7B,MAAIgF,GAAWhF,CAAO;AACpB,WAAOmG;AAET,MAAI,CAAC3B,EAAcxE,CAAO,GAAG;AAC3B,QAAIqK,IAAkB5E,EAAczF,CAAO;AAC3C,WAAOqK,KAAmB,CAAC3E,GAAsB2E,CAAe,KAAG;AACjE,UAAI9F,EAAU8F,CAAe,KAAK,CAACJ,GAAmBI,CAAe;AACnE,eAAOA;AAET,MAAAA,IAAkB5E,EAAc4E,CAAe;AAAA,IAChD;AACD,WAAOlE;AAAA,EACR;AACD,MAAIjG,IAAegK,GAAoBlK,GAASmK,CAAQ;AACxD,SAAOjK,KAAgB6E,GAAe7E,CAAY,KAAK+J,GAAmB/J,CAAY;AACpF,IAAAA,IAAegK,GAAoBhK,GAAciK,CAAQ;AAE3D,SAAIjK,KAAgBwF,GAAsBxF,CAAY,KAAK+J,GAAmB/J,CAAY,KAAK,CAACgF,GAAkBhF,CAAY,IACrHiG,IAEFjG,KAAgBqF,GAAmBvF,CAAO,KAAKmG;AACxD;AAEA,MAAMmE,KAAkB,eAAgBjL,GAAM;AAC5C,QAAMkL,IAAoB,KAAK,mBAAmBH,IAC5CI,IAAkB,KAAK,eACvBC,IAAqB,MAAMD,EAAgBnL,EAAK,QAAQ;AAC9D,SAAO;AAAA,IACL,WAAW2K,GAA8B3K,EAAK,WAAW,MAAMkL,EAAkBlL,EAAK,QAAQ,GAAGA,EAAK,QAAQ;AAAA,IAC9G,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAOoL,EAAmB;AAAA,MAC1B,QAAQA,EAAmB;AAAA,IAC5B;AAAA,EACL;AACA;AAEA,SAASC,GAAM1K,GAAS;AACtB,SAAO8E,EAAiB9E,CAAO,EAAE,cAAc;AACjD;AAEA,MAAMnB,KAAW;AAAA,EACf,uDAAAiJ;AAAA,EACA,oBAAAxD;AAAA,EACA,iBAAAoF;AAAA,EACA,iBAAAU;AAAA,EACA,iBAAAE;AAAA,EACA,gBAAAjC;AAAA,EACA,eAAA0B;AAAA,EACA,UAAArD;AAAA,EACA,WAAAnC;AAAA,EACA,OAAAmG;AACF;AAGA,SAASC,GAAY3K,GAAS4K,GAAQ;AACpC,MAAIC,IAAK,MACLC;AACJ,QAAMC,IAAOzG,EAAmBtE,CAAO;AACvC,WAASgL,IAAU;AACjB,QAAIC;AACJ,iBAAaH,CAAS,IACrBG,IAAMJ,MAAO,QAAQI,EAAI,WAAU,GACpCJ,IAAK;AAAA,EACN;AACD,WAASK,EAAQC,GAAMC,GAAW;AAChC,IAAID,MAAS,WACXA,IAAO,KAELC,MAAc,WAChBA,IAAY,IAEdJ;AACA,UAAM;AAAA,MACJ,MAAApD;AAAA,MACA,KAAAC;AAAA,MACA,OAAAjK;AAAA,MACA,QAAAC;AAAA,IACN,IAAQmC,EAAQ;AAIZ,QAHKmL,KACHP,KAEE,CAAChN,KAAS,CAACC;AACb;AAEF,UAAMwN,IAAWrQ,GAAM6M,CAAG,GACpByD,IAAatQ,GAAM+P,EAAK,eAAenD,IAAOhK,EAAM,GACpD2N,IAAcvQ,GAAM+P,EAAK,gBAAgBlD,IAAMhK,EAAO,GACtD2N,IAAYxQ,GAAM4M,CAAI,GAEtB9U,IAAU;AAAA,MACd,YAFiB,CAACuY,IAAW,QAAQ,CAACC,IAAa,QAAQ,CAACC,IAAc,QAAQ,CAACC,IAAY;AAAA,MAG/F,WAAW1Q,GAAI,GAAGD,GAAI,GAAGuQ,CAAS,CAAC,KAAK;AAAA,IAC9C;AACI,QAAIK,IAAgB;AACpB,aAASC,EAAcC,GAAS;AAC9B,YAAMC,IAAQD,EAAQ,CAAC,EAAE;AACzB,UAAIC,MAAUR,GAAW;AACvB,YAAI,CAACK;AACH,iBAAOP,EAAO;AAEhB,QAAKU,IAOHV,EAAQ,IAAOU,CAAK,IAJpBd,IAAY,WAAW,MAAM;AAC3B,UAAAI,EAAQ,IAAO,IAAI;AAAA,QACpB,GAAE,GAAI;AAAA,MAIV;AACD,MAAAO,IAAgB;AAAA,IACjB;AAID,QAAI;AACF,MAAAZ,IAAK,IAAI,qBAAqBa,GAAe;AAAA,QAC3C,GAAG5Y;AAAA;AAAA,QAEH,MAAMiY,EAAK;AAAA,MACnB,CAAO;AAAA,IACF,QAAW;AACV,MAAAF,IAAK,IAAI,qBAAqBa,GAAe5Y,CAAO;AAAA,IACrD;AACD,IAAA+X,EAAG,QAAQ7K,CAAO;AAAA,EACnB;AACD,SAAAkL,EAAQ,EAAI,GACLF;AACT;AAUA,SAASa,GAAW7N,GAAWC,GAAU6N,GAAQhZ,GAAS;AACxD,EAAIA,MAAY,WACdA,IAAU,CAAA;AAEZ,QAAM;AAAA,IACJ,gBAAAiZ,IAAiB;AAAA,IACjB,gBAAAC,IAAiB;AAAA,IACjB,eAAAC,IAAgB,OAAO,kBAAmB;AAAA,IAC1C,aAAAC,IAAc,OAAO,wBAAyB;AAAA,IAC9C,gBAAAC,IAAiB;AAAA,EAClB,IAAGrZ,GACEsZ,IAAc3F,GAAczI,CAAS,GACrCqO,IAAYN,KAAkBC,IAAiB,CAAC,GAAII,IAActG,GAAqBsG,CAAW,IAAI,CAAA,GAAK,GAAGtG,GAAqB7H,CAAQ,CAAC,IAAI,CAAA;AACtJ,EAAAoO,EAAU,QAAQ,CAAA5C,MAAY;AAC5B,IAAAsC,KAAkBtC,EAAS,iBAAiB,UAAUqC,GAAQ;AAAA,MAC5D,SAAS;AAAA,IACf,CAAK,GACDE,KAAkBvC,EAAS,iBAAiB,UAAUqC,CAAM;AAAA,EAChE,CAAG;AACD,QAAMQ,IAAYF,KAAeF,IAAcvB,GAAYyB,GAAaN,CAAM,IAAI;AAClF,MAAIS,IAAiB,IACjBC,IAAiB;AACrB,EAAIP,MACFO,IAAiB,IAAI,eAAe,CAAAzO,MAAQ;AAC1C,QAAI,CAAC0O,CAAU,IAAI1O;AACnB,IAAI0O,KAAcA,EAAW,WAAWL,KAAeI,MAGrDA,EAAe,UAAUvO,CAAQ,GACjC,qBAAqBsO,CAAc,GACnCA,IAAiB,sBAAsB,MAAM;AAC3C,UAAIG;AACJ,OAACA,IAAkBF,MAAmB,QAAQE,EAAgB,QAAQzO,CAAQ;AAAA,IACxF,CAAS,IAEH6N;EACN,CAAK,GACGM,KAAe,CAACD,KAClBK,EAAe,QAAQJ,CAAW,GAEpCI,EAAe,QAAQvO,CAAQ;AAEjC,MAAI0O,GACAC,IAAcT,IAAiBlF,GAAsBjJ,CAAS,IAAI;AACtE,EAAImO,KACFU;AAEF,WAASA,IAAY;AACnB,UAAMC,IAAc7F,GAAsBjJ,CAAS;AACnD,IAAI4O,MAAgBE,EAAY,MAAMF,EAAY,KAAKE,EAAY,MAAMF,EAAY,KAAKE,EAAY,UAAUF,EAAY,SAASE,EAAY,WAAWF,EAAY,WACtKd,KAEFc,IAAcE,GACdH,IAAU,sBAAsBE,CAAS;AAAA,EAC1C;AACD,SAAAf,KACO,MAAM;AACX,QAAIiB;AACJ,IAAAV,EAAU,QAAQ,CAAA5C,MAAY;AAC5B,MAAAsC,KAAkBtC,EAAS,oBAAoB,UAAUqC,CAAM,GAC/DE,KAAkBvC,EAAS,oBAAoB,UAAUqC,CAAM;AAAA,IACrE,CAAK,GACDQ,KAAa,QAAQA,MACpBS,IAAmBP,MAAmB,QAAQO,EAAiB,WAAU,GAC1EP,IAAiB,MACbL,KACF,qBAAqBQ,CAAO;AAAA,EAElC;AACA;AAmBA,MAAMtL,KAAS2L,IAeTtJ,KAAQuJ,IAQRzL,KAAO0L,IAsBP7M,KAAQ8M,IAkBR1O,KAAkB,CAACT,GAAWC,GAAUnL,MAAY;AAIxD,QAAMoW,IAAQ,oBAAI,OACZkE,IAAgB;AAAA,IACpB,UAAAvO;AAAA,IACA,GAAG/L;AAAA,EACP,GACQua,IAAoB;AAAA,IACxB,GAAGD,EAAc;AAAA,IACjB,IAAIlE;AAAA,EACR;AACE,SAAOoE,GAAkBtP,GAAWC,GAAU;AAAA,IAC5C,GAAGmP;AAAA,IACH,UAAUC;AAAA,EACd,CAAG;AACH,GCrqBahN,KAAQ,CACnBvN,MACe;AACf,WAASya,EAAMxa,GAA6C;AAC1D,WAAO,CAAC,EAAE,eAAe,KAAKA,GAAO,SAAS;AAAA,EAChD;AAEO,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAAD;AAAA,IACA,GAAG0M,GAAO;AACF,YAAA,EAAE,SAAAQ,GAAS,SAAAxC,EAAQ,IACvB,OAAO1K,KAAY,aAAaA,EAAQ0M,CAAK,IAAI1M;AAE/C,aAAAkN,KAAWuN,EAAMvN,CAAO,IACtBA,EAAQ,WAAW,OACdwN,GAAU,EAAE,SAASxN,EAAQ,SAAS,SAAAxC,GAAS,EAAE,GAAGgC,CAAK,IAG3D,KACEQ,IACFwN,GAAU,EAAE,SAAAxN,GAAS,SAAAxC,EAAS,CAAA,EAAE,GAAGgC,CAAK,IAG1C;IACT;AAAA,EAAA;AAEJ;ACjDgB,SAAAiO,GAAU7T,GAAQR,GAAQ;AACxC,MAAIQ,MAAMR;AACD,WAAA;AAGL,MAAA,OAAOQ,KAAM,OAAOR;AACf,WAAA;AAGL,MAAA,OAAOQ,KAAM,cAAcA,EAAE,eAAeR,EAAE;AACzC,WAAA;AAGT,MAAIkD,GAAQzH,GAAG6Y;AAEf,MAAI9T,KAAKR,KAAK,OAAOQ,KAAK,UAAU;AAC9B,QAAA,MAAM,QAAQA,CAAC,GAAG;AAEhB,UADJ0C,IAAS1C,EAAE,QACP0C,KAAUlD,EAAE,OAAe,QAAA;AAC1B,WAAAvE,IAAIyH,GAAQzH,QAAQ;AACnB,YAAA,CAAC4Y,GAAU7T,EAAE/E,CAAC,GAAGuE,EAAEvE,CAAC,CAAC;AAChB,iBAAA;AAIJ,aAAA;AAAA,IACT;AAIA,QAFO6Y,IAAA,OAAO,KAAK9T,CAAC,GACpB0C,IAASoR,EAAK,QACVpR,MAAW,OAAO,KAAKlD,CAAC,EAAE;AACrB,aAAA;AAGJ,SAAAvE,IAAIyH,GAAQzH,QAAQ;AACnB,UAAA,CAAC,CAAG,EAAA,eAAe,KAAKuE,GAAGsU,EAAK7Y,CAAC,CAAC;AAC7B,eAAA;AAIN,SAAAA,IAAIyH,GAAQzH,QAAQ,KAAK;AACtB,YAAAxE,IAAMqd,EAAK7Y,CAAC;AACd,UAAA,EAAAxE,MAAQ,YAAYuJ,EAAE,aAItB,CAAC6T,GAAU7T,EAAEvJ,CAAG,GAAG+I,EAAE/I,CAAG,CAAC;AACpB,eAAA;AAAA,IAEX;AAEO,WAAA;AAAA,EACT;AAEO,SAAAuJ,MAAMA,KAAKR,MAAMA;AAC1B;ACzDO,SAASuU,GAAO3N,GAA0B;AAC3C,SAAA,OAAO,SAAW,MACb,KAEGA,EAAQ,cAAc,eAAe,QACtC,oBAAoB;AACjC;ACJgB,SAAA4N,GAAW5N,GAAkBjN,GAAe;AACpD,QAAA8a,IAAMF,GAAO3N,CAAO;AAC1B,SAAO,KAAK,MAAMjN,IAAQ8a,CAAG,IAAIA;AACnC;ACHO,SAASC,GAAgB/a,GAAU;AAClC,QAAAgb,IAAMC,EAAOjb,CAAK;AACxBkb,SAAAA,GAAgB,MAAM;AACpB,IAAAF,EAAI,UAAUhb;AAAA,EAAA,CACf,GACMgb;AACT;ACiBgB,SAAAG,GACdpb,IAA8B,IACP;AACjB,QAAA;AAAA,IACJ,WAAA4I,IAAY;AAAA,IACZ,UAAAiD,IAAW;AAAA,IACX,YAAAC,IAAa,CAAC;AAAA,IACd,UAAAC;AAAA,IACA,UAAU,EAAE,WAAWsP,GAAmB,UAAUC,MAAqB,CAAC;AAAA,IAC1E,WAAAC,IAAY;AAAA,IACZ,sBAAAC;AAAA,IACA,MAAAC;AAAA,EACE,IAAAzb,GAEE,CAACuM,GAAMmP,CAAO,IAAIC,EAA0B;AAAA,IAChD,GAAG;AAAA,IACH,GAAG;AAAA,IACH,UAAA9P;AAAA,IACA,WAAAjD;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB,cAAc;AAAA,EAAA,CACf,GAEK,CAACgT,GAAkBC,CAAmB,IAAIF,EAAS7P,CAAU;AAEnE,EAAK6O,GAAUiB,GAAkB9P,CAAU,KACzC+P,EAAoB/P,CAAU;AAGhC,QAAM,CAACgQ,GAAYC,CAAa,IAAIJ,EAAoB,IAAI,GACtD,CAACK,GAAWC,CAAY,IAAIN,EAA6B,IAAI,GAE7DO,IAAeC;AAAAA,IACnB,CAAC/K,MAAoB;AACf,MAAAA,KAAQgL,EAAa,YACvBA,EAAa,UAAUhL,GACvB2K,EAAc3K,CAAI;AAAA,IAEtB;AAAA,IACA,CAAC2K,CAAa;AAAA,EAAA,GAGVM,IAAcF;AAAAA,IAClB,CAAC/K,MAA6B;AACxB,MAAAA,MAASkL,EAAY,YACvBA,EAAY,UAAUlL,GACtB6K,EAAa7K,CAAI;AAAA,IAErB;AAAA,IACA,CAAC6K,CAAY;AAAA,EAAA,GAGT3C,IAAe+B,KAAqBS,GACpCS,IAAajB,KAAoBU,GAEjCI,IAAelB,EAAkB,IAAI,GACrCoB,IAAcpB,EAA2B,IAAI,GAC7CsB,IAAUtB,EAAO3O,CAAI,GAErBkQ,IAA0BzB,GAAaQ,CAAoB,GAC3DkB,IAAc1B,GAAajP,CAAQ,GAEnCiN,IAASmD,EAAY,MAAM;AAC/B,QAAI,CAACC,EAAa,WAAW,CAACE,EAAY;AACxC;AAGF,UAAM1Q,IAAgC;AAAA,MACpC,WAAAhD;AAAA,MACA,UAAAiD;AAAA,MACA,YAAY+P;AAAA,IAAA;AAGd,IAAIc,EAAY,YACd9Q,EAAO,WAAW8Q,EAAY,UAIhC/Q,GAAgByQ,EAAa,SAASE,EAAY,SAAS1Q,CAAM,EAAE;AAAA,MACjE,CAAC+Q,MAAiB;AAChB,cAAMC,IAAW,EAAE,GAAGD,GAAc,cAAc,GAAK;AACvD,QAAIE,EAAa,WAAW,CAAClC,GAAU6B,EAAQ,SAASI,CAAQ,MAC9DJ,EAAQ,UAAUI,GAClBlB,EAAQkB,CAAQ;AAAA,MAEpB;AAAA,IAAA;AAAA,KAED,CAAChB,GAAkBhT,GAAWiD,GAAU6Q,CAAW,CAAC;AAEvDvB,EAAAA,GAAgB,MAAM;AACpB,IAAIM,MAAS,MAASe,EAAQ,QAAQ,iBACpCA,EAAQ,QAAQ,eAAe,IAC/Bd,EAAQ,CAACiB,OAAkB,EAAE,GAAGA,GAAc,cAAc,GAAQ,EAAA;AAAA,EACtE,GACC,CAAClB,CAAI,CAAC;AAEH,QAAAoB,IAAe3B,EAAO,EAAK;AACjCC,EAAAA,GAAgB,OACd0B,EAAa,UAAU,IAChB,MAAM;AACX,IAAAA,EAAa,UAAU;AAAA,EAAA,IAExB,CAAE,CAAA,GAEL1B,GAAgB,MAAM;AAIpB,QAHI7B,QAA0B,UAAUA,IACpCiD,QAAwB,UAAUA,IAElCjD,KAAeiD;AACjB,aAAIE,EAAwB,UACnBA,EAAwB,QAAQnD,GAAaiD,GAAYvD,CAAM,IAE/DA,EAAO;AAAA,KAGjB,CAACM,GAAaiD,GAAYvD,GAAQyD,CAAuB,CAAC;AAE7D,QAAMK,IAAOC;AAAAA,IACX,OAAO;AAAA,MACL,WAAWX;AAAA,MACX,UAAUE;AAAA,MACV,cAAAJ;AAAA,MACA,aAAAG;AAAA,IAAA;AAAA,IAEF,CAACH,GAAcG,CAAW;AAAA,EAAA,GAGtBzP,IAAWmQ;AAAAA,IACf,OAAO,EAAE,WAAWzD,GAAa,UAAUiD,EAAW;AAAA,IACtD,CAACjD,GAAaiD,CAAU;AAAA,EAAA,GAGpBS,IAAiBD,EAAQ,MAAM;AACnC,UAAME,IAAgB;AAAA,MACpB,UAAUpR;AAAA,MACV,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAGH,QAAA,CAACe,EAAS;AACL,aAAAqQ;AAGT,UAAM1W,IAAIuU,GAAWlO,EAAS,UAAUL,EAAK,CAAC,GACxCvG,IAAI8U,GAAWlO,EAAS,UAAUL,EAAK,CAAC;AAE9C,WAAIgP,IACK;AAAA,MACL,GAAG0B;AAAA,MACH,WAAW,aAAa1W,CAAC,OAAOP,CAAC;AAAA,MACjC,GAAI6U,GAAOjO,EAAS,QAAQ,KAAK,OAAO,EAAE,YAAY,YAAY;AAAA,IAAA,IAI/D;AAAA,MACL,UAAUf;AAAA,MACV,MAAMtF;AAAA,MACN,KAAKP;AAAA,IAAA;AAAA,EACP,GACC,CAAC6F,GAAU0P,GAAW3O,EAAS,UAAUL,EAAK,GAAGA,EAAK,CAAC,CAAC;AAEpD,SAAAwQ;AAAAA,IACL,OAAO;AAAA,MACL,GAAGxQ;AAAA,MACH,QAAAyM;AAAA,MACA,MAAA8D;AAAA,MACA,UAAAlQ;AAAA,MACA,gBAAAoQ;AAAA,IAAA;AAAA,IAEF,CAACzQ,GAAMyM,GAAQ8D,GAAMlQ,GAAUoQ,CAAc;AAAA,EAAA;AAEjD;;ACjMA,SAASE,GAAgB7c,GAAU;AACjC,EAAAA,EAAE,gBAAgB;AACpB;AAEO,SAAS8c,GAAgBC,GAAqB;AACnD,MAAIC,IAAY,SAAS,cAAc,IAAID,CAAW,EAAE;AAExD,MAAI,CAACC,GAAW;AACF,IAAAA,IAAA,SAAS,cAAc,KAAK,GACxCA,EAAU,aAAa,EAAE,MAAM,OAAQ,CAAA,GACtCA,EAA0B,MAAM,MAAM,WACvCA,EAAU,KAAKD,GACN,SAAA,KAAK,YAAYC,CAAS;AAEnC,eAAWC,KAASzV;AAClB,MAAAwV,EAAU,iBAAiBC,GAAOJ,IAAiB,EAAE,SAAS,IAAM;AAAA,EAExE;AAEA,SAAOG,EAAU;AACnB;AAEA,SAASE,GAAYC,GAAyC;AACxD,SAAAA,MAAgB,SAAkB,SAClC,OAAOA,KAAgB,WAAiBA,IAAc,OAEnDA;AACT;AAEO,SAASC,GAAwBC,GAGrC;;AACD,QAAMC,IAAUJ,IAAYlc,IAAAqc,EAAS,WAAT,gBAAArc,EAAiB,CAAC,GACxCuc,IAAUL,IAAYhc,IAAAmc,EAAS,WAAT,gBAAAnc,EAAiB,CAAC;AAE9C,UAAQmc,EAAS,WAAW;AAAA,IAC1B,KAAK;AACI,aAAA;AAAA,QACL,KAAKC;AAAA,QACL,MAAMC;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACL,KAAKD;AAAA,QACL,OAAOC;AAAA,MAAA;AAAA,IAEX,KAAK;AACI,aAAA;AAAA,QACL,QAAQD;AAAA,QACR,MAAMC;AAAA,MAAA;AAAA,IAEV,KAAK;AACI,aAAA;AAAA,QACL,QAAQD;AAAA,QACR,OAAOC;AAAA,MAAA;AAAA,IAEX;AACE,qBAAQ,MAAM,YAAY,qBAAqBF,EAAS,SAAS,GAC1DD,GAAwB,EAAE,WAAW,eAAgB,CAAA;AAAA,EAChE;AACF;ACzBO,SAASI,GAAU;AAAA,EACxB,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC,IAAe;AACjB,IAII,IAAI;AACN,QAAM,CAACC,GAAQC,CAAS,IAAIvC,EAAkBqC,CAAY,GAEpDvC,IAAOU,EAAY,MAAM;AAC7B,IAAA+B,EAAU,EAAI,GACLH,KAAA,QAAAA;AAAA,EAAA,GACR,CAACA,CAAM,CAAC,GACLI,IAAQhC,EAAY,MAAM;AAC9B,IAAA+B,EAAU,EAAK,GACLJ,KAAA,QAAAA;AAAA,EAAA,GACT,CAACA,CAAO,CAAC,GACNM,IAASjC,EAAY,MAAM;AAC/B,IAAI8B,IAAkBH,KAAA,QAAAA,MACRC,KAAA,QAAAA,KACJG,EAAA,CAACG,MAAS,CAACA,CAAI;AAAA,EACxB,GAAA,CAACJ,GAAQH,GAASC,CAAM,CAAC;AAErB,SAAA;AAAA,IACL,QAAAE;AAAA,IACA,MAAAxC;AAAA,IACA,OAAA0C;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ;AAEO,MAAME,KAA+C,CAAC;AAAA,EAC3D,UAAAZ;AAAA,EACA,QAAAO;AAAA,EACA,OAAAE;AAAA,EACA,WAAAI;AAAA,EACA,aAAAnB;AAAA,EACA,UAAAvR;AAAA,EACA,UAAA2S;AAAA,EACA,WAAAC,IAAY;AACd,MAAM;AACE,QAAAC,IAAWxD,EAAuB,IAAI,GACtCyD,IAAYzD,EAA0B,IAAI,GAE1C0D,IAASlB,EAAS,SAAS,YAAYA,EAAS,SAAS,MACzD9U,IACJ8U,EAAS,SAAS,YAAYA,EAAS,YAAY,QAE/C;AAAA,IACJ,MAAAZ;AAAA,IACA,gBAAAE;AAAA,IACA,gBAAA9Q;AAAA,IACA,WAAW2S;AAAA,MACTzD,GAAY;AAAA,IACd,UAAU;AAAA,MACR,WAAWwD;AAAA,IACb;AAAA,IACA,UAAA/S;AAAA,IACA,WAAW;AAAA,IACX,WAAAjD;AAAA,IACA,sBAAsBmQ;AAAA,IACtB,YAAY;AAAA,MACVrK,GAAK;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MAAA,CACZ;AAAA,MACDkC,GAAM;AAAA,MACNrC,GAAO,CAAC;AAAA,MACRhB,GAAM;AAAA,QACJ,SAASmR;AAAA,MAAA,CACV;AAAA,IACH;AAAA,EAAA,CACD;AAED,MAAII,IAAkC,CAAA;AAClC,EAAApB,EAAS,SAAS,aACpBoB,IAAqBrB,GAAwBC,CAAQ;AAGjD,QAAAqB,IAAU5C,EAAY,MAAM;AAC1B,IAAAgC,KACMI,KAAA,QAAAA;AAAA,EAAA,GACX,CAACJ,GAAOI,CAAS,CAAC;AAErBS,EAAAA,GAAU,MAAM;AAEd,QAAItB,EAAS,SAAS,WAAWA,EAAS,SAAS,SAAU;AAEvD,UAAAuB,IAAgB,CAAC5e,MAAqB;AACtC,MAAAA,EAAE,OAAO,YACH0e;IACV,GAGIG,IAAsB,CAAC7e,MAAkB;AAE3C,OAAA,EAAEA,EAAE,kBAAkB,YACtB,CAACA,EAAE,OAAO,QAAQ,IAAI+c,CAAW,EAAE,MAE3B2B;IACV,GAGII,IAAW,IAAI,iBAAiB,CAACC,MAAc;AAC/C,MAAA1B,EAAS,WAAW,QAEd0B,EAAA,QAAQ,CAACC,MAAa;AAM9B,QALqB,MAAM,KAAKA,EAAS,YAAY,EACjB,KAAK,CAACjO,MACjCA,MAASsM,EAAS,UAAUtM,EAAK,SAASsM,EAAS,MAAM,CACjE,KAGOS;MACR,CACD;AAAA,IAAA,CACF;AAEM,kBAAA,iBAAiB,aAAae,CAAmB,GACjD,OAAA,iBAAiB,WAAWD,CAAa,GACvCE,EAAA,QAAQ,SAAS,MAAM;AAAA,MAC9B,SAAS;AAAA,MACT,WAAW;AAAA,IAAA,CACZ,GAEM,MAAM;AACJ,aAAA,oBAAoB,aAAaD,CAAmB,GACpD,OAAA,oBAAoB,WAAWD,CAAa,GACnDE,EAAS,WAAW;AAAA,IAAA;AAAA,EACtB,GAEC,CAACzB,EAAS,MAAMS,GAAQT,EAAiB,QAAQqB,GAAS3B,CAAW,CAAC;AAEzE,WAASkC,EAAWlO,GAAgC;AAClD,IAAA0L,EAAK,YAAY1L,CAAI,GACrBuN,EAAU,UAAUvN;AAAA,EACtB;AAEA4N,EAAAA,GAAU,MAAM;AACV,IAACL,EAAU,YACXV,KAAU,CAACU,EAAU,QAAQ,aAAa,MAAM,KAClDA,EAAU,QAAQjB,EAAS,SAAS,UAAU,cAAc,MAAM,KAEhE,CAACO,KAAUU,EAAU,QAAQ,aAAa,MAAM,KAClDA,EAAU,QAAQ;KAEnB,CAACA,GAAWV,GAAQP,EAAS,IAAI,CAAC;AAErC,QAAM6B,IAAU;AAAA,IACd;AAAA,IACA7B,EAAS,SAAS,UACd,UACAA,EAAS,SAAS,YAChB,aACA,yBAAyBA,EAAS,SAAS;AAAA,IACjDmB;AAAA,EAAA,EACA,KAAK,GAAG;AAGR,SAAA/Y,gBAAAA,EAAA0Z,GAAA,wBACG,SAAM,EAAA,yBAAyB,EAAE,QAAQC,MAAU,GACpD3Z,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKwZ;AAAA,MACL,OAAOC;AAAA,MACP,OAAOX,IAAS5B,IAAiB8B;AAAA,IAAA;AAAA,IAEhCN,KAAa1Y,gBAAAA,EAAA0Z,GAAA,MAAUhB,CAAS;AAAA,IAEhCI,KAAUH,KACT3Y,gBAAAA;AAAAA,MAAC4Z;AAAA,MAAA;AAAA,QACC,WAAWxT,KAAA,gBAAAA,EAAgB;AAAA,QAC3B,UAAAwS;AAAA,QACA,WAAWG;AAAA,MAAA;AAAA,IACb;AAAA,EAAA,CAGN;AAEJ;AAEA,SAASa,GAAY;AAAA,EACnB,WAAAC;AAAA,EACA,UAAAjB;AAAA,EACA,WAAA9V;AACF,GAIG;AACD,QAAM,EAAE,GAAGgX,GAAQ,GAAGC,EAAO,IAAIF,KAAa,IAExCG,IACJ;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA,EACNlX,EAAU,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,UAE1BmX,IAAc;AAAA,IAClB,MAAMH,KAAU,OAAO,GAAGA,CAAM,OAAO;AAAA,IACvC,KAAKC,KAAU,OAAO,GAAGA,CAAM,OAAO;AAAA,IACtC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,CAACC,CAAU,GAAG;AAAA,EAAA;AAGd,SAAAha,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK4Y;AAAA,MACL,OAAO,CAAC,SAAS9V,CAAS,EAAE,KAAK,GAAG;AAAA,MACpC,OAAOmX;AAAA,IAAA;AAAA,EAAA;AAGb;AAEO,SAASC,GAAa;AAAA,EAC3B,UAAAxB;AAAA,EACA,UAAAyB;AACF,GAGG;AACD,2BACG,UAAO,EAAA,KAAKA,GAAU,OAAM,mBAC1BzB,CACH;AAEJ;AAEO,SAAS0B,GAAc;AAAA,EAC5B,UAAA1B;AAAA,EACA,UAAAyB;AACF,GAGG;AACD,2BACG,OAAI,EAAA,KAAKA,GAAU,OAAM,oBACvBzB,CACH;AAEJ;ACzRa,MAAA2B,KAA+D,CAC1EC,MAEAta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCbWua,KAA6C;AAAA,EACxD,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,YAAY;AACd,GCfaC,KAAW,CAAC;AAAA,EACvB,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AACF,MAYK;AACH,QAAM,CAACC,GAASC,CAAU,IAAIhF,EAAS,CAAC6E,CAAO,GACzC,CAACI,GAAUC,CAAW,IAAIlF,EAAS4E,CAAe,GAClD,CAACO,GAAWC,CAAY,IAAIpF,EAAS,KAAK,KAAK,GAC/C,CAACqF,GAAaC,CAAc,IAAItF,EAAS,KAAK,KAAK;AAEzDqD,EAAAA,GAAU,MAAM;AACd,QAAI0B,EAAS;AAEP,UAAAva,IAAI,YAAY,MAAM;AACX,MAAA8a,EAAA,KAAK,KAAK,GAErB,KAAK,SAASH,IAAYF,MAC5B,aAAaza,CAAC,GACdwa,EAAW,EAAI,GACTF;OAEP,EAAE;AAEL,WAAO,MAAM;AACX,mBAAata,CAAC;AAAA,IAAA;AAAA,KAEf,CAACya,GAAUH,GAAOK,GAAWJ,CAAO,CAAC;AAElC,QAAAQ,IAAO/E,EAAY,MAAM;AAC7B,IAAAwE,EAAW,EAAI;AAAA,EACjB,GAAG,CAAE,CAAA,GAECQ,IAAoBhF,EAAY,CAACiF,MAAyB;AACjD,IAAAL,EAAA,KAAK,KAAK,GACvBF,EAAYO,CAAY,GACxBT,EAAW,EAAK;AAAA,EAClB,GAAG,CAAE,CAAA,GAECU,IAAUP,IAAYF,GAEtBU,KADYZ,IAAU,IAAIM,IAAcF,KACVF;AAE7B,SAAA;AAAA,IACL,UAAAA;AAAA,IACA,iBAAAU;AAAA,IACA,WAAAR;AAAA,IACA,SAAAO;AAAA,IACA,SAAAX;AAAA,IACA,mBAAAS;AAAA,IACA,MAAAD;AAAA,EAAA;AAEJ,GC/DaK,KAA+D,CAC1EnB,MAEAta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCdW0b,KAET,CAACpB,MACHta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCVW2b,KAAyC,CAAC;AAAA,EACrD,SAAAC,IAAU;AAAA,EACV,UAAAlD;AAAA,EACA,GAAGmD;AACL,MAAM;AACJ,QAAMpC,IAAU,CAAC,UAAUmC,CAAO,EAAE,KAAK,GAAG;AAE5C,2BACG,UAAO,EAAA,OAAOnC,GAAU,GAAGoC,KACzBnD,CACH;AAEJ,GChBaoD,KAA8D,CACzExB,IAAQ,EAAE,QAAQ,QAAQ,OAAO,aAEjCta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA,IAAA;AAAA,EACX;AAAA,EACAA,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA,MACL,UAAS;AAAA,IAAA;AAAA,EACX;AACF,GCnBW+b,KAA0B,MAEnC/b,gBAAAA,EAAC,YAAO,OAAM,OAAA,qBACX,KAAE,EAAA,MAAK,qBAAoB,KAAI,cAAa,QAAO,YAAS,iCAC/C8b,IAAK,EAAA,QAAO,QAAO,OAAM,OAAA,CAAO,GAAE,SAChD,CACF,GCRSE,KAET,CAAC1B,MACHta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AAAA,EACAA,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCnBWic,KAAiE,CAC5E3B,MAEAta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCfWkc,KAET,CAAC5B,MACHta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AAAA,EACAA,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCnBWmc,KAET,CAAC7B,MACHta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCfWoc,KAET,CAAC9B,MACHta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCDIqc,KAAS;AAAA,EACb;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,wBAAOF,IAAiB,IAAA;AAAA,IACxB,UAAU,CAAC,MAA4B,EAAE;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,wBAAOH,IAAa,IAAA;AAAA,IACpB,UAAU,CAAC,MAA4B,EAAE;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,wBAAOC,IAAQ,IAAA;AAAA,IACf,UAAU,CAAC,MAA4B,EAAE;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,wBAAOC,IAAU,IAAA;AAAA,IACjB,UAAU,CAAC,MAA4B,EAAE;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,wBAAOE,IAAc,IAAA;AAAA,IACrB,UAAU,CAAC,MAA4B,EAAE;AAAA,IACzC,OAAO;AAAA,EACT;AACF,GAWaE,KAAiD,CAAC;AAAA,EAC7D;AAAA,EACA,MAAA9f;AAAA,EACA,eAAA+f;AAAA,EACA,UAAAC;AACF,wBAEK,OAAI,EAAA,OAAM,iBACTxc,gBAAAA,EAAC,eACEqc,GAAO;AAAA,EACN,CAAC,EAAE,IAAAI,GAAI,OAAAC,KAASC,MAAU;AAAA,qDAEtBA,IAAQ,CACV;AAAA,8BACkBD,CAAK;AAAA;AAAA;AAAA,qDAIrBC,IAAQ,CACV;AAAA,kCACsBF,CAAE;AAAA;AAAA;AAAA,qDAItBE,IAAQ,CACV,iCAAiCA,IAAQ,CAAC;AAAA,mCACnBD,CAAK;AAAA;AAAA;AAAA,CAIlC,GACC1c,gBAAAA,EAAA,OAAA,EAAI,OAAM,oBACR,GAAAqc,GAAO,IAAI,CAACO,MACX5c,gBAAAA;AAAAA,EAAC6c;AAAA,EAAA;AAAA,IACC,KAAKD,EAAM;AAAA,IACX,YAAYA,EAAM,UAAUL;AAAA,IAC5B,MAAA/f;AAAA,IACA,OAAAogB;AAAA,IACA;AAAA,IACA,UAAAJ;AAAA,EAAA;AAEH,CAAA,CACH,CACF,GAIEK,KAAQ,CAAC;AAAA,EACb,YAAAC;AAAA,EACA,MAAAtgB;AAAA,EACA,UAAAggB;AAAA,EACA,OAAAI;AAAA,EACA,GAAAvc;AACF,MAMM;;AACE,QAAAuY,IAAWxD,EAAuB,IAAI,GACtC,EAAE,MAAA4B,GAAM,gBAAAE,GAAgB,gBAAA9Q,EAAA,IAAmBkP,GAAY;AAAA,IAC3D,WAAW;AAAA,IACX,YAAY;AAAA,MACV7M,GAAO,CAAC;AAAA,MACRhB,GAAM;AAAA,QACJ,SAASmR;AAAA,MAAA,CACV;AAAA,IACH;AAAA,EAAA,CACD;AAED,SAEI5Y,gBAAAA,EAAA0Z,GAAA,MAAA1Z,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,gBAAgB8c;AAAA,MAChB,IAAI,yBAAyBF,EAAM,KAAK;AAAA,MACxC,MAAApgB;AAAA,MACA,MAAK;AAAA,MACL,OAAOogB,EAAM;AAAA,MACb,UAAAJ;AAAA,IAAA;AAAA,EAAA,GAEFxc,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKgX,EAAK;AAAA,MACV,cAAY4F,EAAM,SAASvc,CAAC;AAAA,MAC5B,OAAM;AAAA,MACN,KAAK,yBAAyBuc,EAAM,KAAK;AAAA,MACzC,OAAO,EAAE,OAAOA,EAAM,MAAM;AAAA,IAAA;AAAA,IAE5B5c,gBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MAAA;AAAA,IACF;AAAA,IACCA,gBAAAA,EAAA,QAAA,EAAK,OAAO,EAAE,QAAQ,GAAG,SAAS,QAAQ,YAAY,SACpD,EAAA,GAAA4c,EAAM,IACT;AAAA,EAAA,GAEF5c,gBAAAA,EAAC,OAAI,EAAA,KAAKgX,EAAK,aAAa,OAAM,kBAAiB,OAAOE,EAAA,GACvD0F,EAAM,SAASvc,CAAC,GACjBL,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK4Y;AAAA,MACL,OAAM;AAAA,MACN,OAAO;AAAA,QACL,QACErd,IAAA6K,EAAe,UAAf,gBAAA7K,EAAsB,MAAK,OACvB,GAAG6K,EAAe,MAAM,CAAC,OACzB;AAAA,QACN,OACE3K,IAAA2K,EAAe,UAAf,gBAAA3K,EAAsB,MAAK,OACvB,GAAG2K,EAAe,MAAM,CAAC,OACzB;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ,CAAA,CACF;AAEJ,GC1KM2W,KAAkB;AAExB,SAASC,GAAwBxM,GAAqB;;AAC9C,QAAAyM,IAAW,IAAI,SAASzM,CAAE;AACzB,SAAA;AAAA,IACL,OAAO,QAAOjV,IAAA0hB,EAAS,IAAI,OAAO,MAApB,gBAAA1hB,EAAuB,UAAU;AAAA,IAC/C,YAAUE,IAAAwhB,EAAS,IAAI,SAAS,MAAtB,gBAAAxhB,EAAyB,eAAc,IAAI,KAAK;AAAA,EAAA;AAE9D;AAgBO,MAAMyhB,KAAqD,CAAC;AAAA,EACjE,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,GAAAnd;AACF,MAAM;AACJ,QAAM,CAACod,GAAWC,CAAY,IAAI7H,EAAS,EAAK,GAC1C,CAAC8H,GAAQC,CAAS,IAAI/H;AAAAA,IAC1B;AAAA,EAAA,GAEI,CAACnX,GAAOmf,CAAQ,IAAIhI,EAAiB,GACrC,CAACiI,GAAUC,CAAW,IAAIlI,EAAS,EAAI,GAEvCmI,IAA2D,OAC/DzjB,MACG;AACH,IAAAA,EAAE,eAAe;AACjB,UAAMkM,IAA2B;AAAA,MAC/B,GAAGuW,GAAwBziB,EAAE,MAAyB;AAAA,MACtD,UAAA4iB;AAAA,IAAA;AAEE,QAAC1W,EAAK,OACV;AAAA,MAAAoX,EAAS,EAAE;AACP,UAAA;AACF,QAAAD,EAAU,YAAY,GACtB,MAAML,EAAS9W,CAAI,GACnBmX,EAAU,WAAW;AAAA,eACdK,GAAK;AACZ,QAAAL,EAAU,MAAM,GACZK,aAAe,QACjBJ,EAASI,EAAI,OAAO,IAEpBJ,EADS,OAAOI,KAAQ,WACfA,IAEA,6CAFG;AAAA,MAIhB;AAAA;AAAA,EAAA,GAGIC,IAAe9I,EAAuB,IAAI,GAC1C+I,IAAU/I,EAAwB,IAAI,GACtCgJ,IAAYhJ,EAAuB,IAAI,GACvCiJ,IAAqBjJ,EAAuB,IAAI,GAChDkJ,IAAelJ,EAAuB,IAAI,GAE1CmJ,IAAsBlI,EAAY,MAAM;AACxC,IAAA6H,EAAa,YAAY,QACzBE,EAAU,YAAY,QACtBC,EAAmB,YAAY,SAEnCH,EAAa,QAAQ,MAAM,YAAY,GAAGE,EAAU,QAAQ,YAAY,MAErDC,EAAA,QAAQ,MAAM,WAAW,YACzBA,EAAA,QAAQ,MAAM,UAAU,KACxBA,EAAA,QAAQ,MAAM,gBAAgB;AAAA,EAChD,GAAA,CAACH,GAAcE,GAAWC,CAAkB,CAAC,GAE1CG,IAAuBnI,EAAY,MAAM;AACzC,IAAA6H,EAAa,YAAY,QACzBE,EAAU,YAAY,QACtBC,EAAmB,YAAY,SAEnCH,EAAa,QAAQ,MAAM,YAAY,GACrCE,EAAU,QAAQ;AAAA,IAClBC,EAAmB,QAAQ;AAAA,IAC3B,EACF,MAEmBA,EAAA,QAAQ,MAAM,WAAW,YACzBA,EAAA,QAAQ,MAAM,UAAU,KACxBA,EAAA,QAAQ,MAAM,gBAAgB;AAAA,EAChD,GAAA,CAACH,GAAcE,GAAWC,CAAkB,CAAC,GAE1CI,IAAsBpI,EAAY,MAAM;AACxC,IAAA6H,EAAa,YAAY,QACzBC,EAAQ,YAAY,QACpBG,EAAa,YAAY,SAErBH,EAAA,QAAQ,MAAM,UAAU,KACxBA,EAAA,QAAQ,MAAM,gBAAgB,QACtCD,EAAa,QAAQ,MAAM,YAAY,GAAGI,EAAa,QAAQ,YAAY,MAG3E,WAAW,MAAM;AACF,MAAAA,EAAA,QAAS,MAAM,WAAW,YAC1BA,EAAA,QAAS,MAAM,UAAU,KACzBA,EAAA,QAAS,MAAM,gBAAgB,OAC5CP,EAAY,EAAK;AAAA,IAAA,GAChBhB,KAAkB,EAAE;AAAA,EACtB,GAAA,CAACoB,GAASD,GAAcI,CAAY,CAAC;AAExCpF,SAAAA,GAAU,MAAM;AACd,IAAIyE,MAAW,cACOc,MACXpB,KAA0BI,IACde,MAEDD;EACtB,GACC;AAAA,IACDA;AAAA,IACAC;AAAA,IACAC;AAAA,IACApB;AAAA,IACAI;AAAA,IACAE;AAAA,EAAA,CACD,GAGE3d,gBAAAA,EAAA,OAAA,EAAI,KAAKke,GAAc,OAAM,eAC5Ble,gBAAAA,EAAC,OAAI,EAAA,KAAKse,GAAc,OAAM,YAAA,GAC3Bte,gBAAAA,EAAA,OAAA,EAAI,OAAM,qBACTA,gBAAAA,EAAC0b,IAAY,EAAA,QAAQ,IAAI,OAAO,GAAA,CAAI,CACtC,qBACC,KAAE,EAAA,OAAM,UAAQrb,EAAE,cAAe,GAClCL,gBAAAA,EAAC+b,IAAK,IAAA,CACR,GACC+B,KACC9d,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKme;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACP,OAAO,EAAE,SAAS,EAAE;AAAA,MACpB,SAASb;AAAA,MACT,SAASA;AAAA,MACT,gBAAgBA;AAAA,MAChB,UAAUU;AAAA,IAAA;AAAA,IAEVhe,gBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKoe;AAAA,QACL,mBAAgB;AAAA,QAChB,OAAM;AAAA,QACN,MAAK;AAAA,MAAA;AAAA,wBAEJ,OAAI,EAAA,OAAM,SAAQ,IAAG,iCACnBjB,CACH;AAAA,MACAnd,gBAAAA;AAAAA,QAACsc;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,GAAAjc;AAAA,UACA,UAAU,OAAO9F,MAAM;AACrB,YAAAmjB,EAAa,EAAI,GACjB,MAAMF,EAAc;AAAA,cAClB,UAAAL;AAAA,cACA,OAAO,OAAO5iB,EAAE,cAAc,KAAK;AAAA,YAAA,CACpC;AAAA,UACH;AAAA,QAAA;AAAA,MACF;AAAA,MAEAyF,gBAAAA,EAAC0e,IAAY,EAAA,YAAAtB,GAAwB,GAAA/c,EAAM,CAAA;AAAA,IAC7C;AAAA,IAEAL,gBAAAA,EAAC,SAAI,KAAKqe,GAAoB,OAAM,2BAClCre,gBAAAA,EAAC,OAAI,EAAA,OAAM,eACT,GAAAA,gBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,IAAG;AAAA,QACH,MAAK;AAAA,QACL,aAAaK,EAAE;AAAA,QACf,MAAM;AAAA,MAAA;AAAA,IAAA,CAEV,GAEC3B,KAASsB,gBAAAA,EAAC,OAAE,OAAM,QAAA,GAAStB,CAAM,GAElCsB,gBAAAA;AAAAA,MAAC2b;AAAA,MAAA;AAAA,QACC,UACE,CAAC8B,KACDE,MAAW,gBACXP,MAAe;AAAA,QAEjB,MAAK;AAAA,MAAA;AAAA,MAEJ/c,EAAE;AAAA,IAAA,GAGJL,gBAAAA,EAAA+b,IAAA,IAAK,CACR;AAAA,EAAA,CAGN;AAEJ,GAEM2C,KAGD,CAAC,EAAE,GAAG,YAAAtB,QAAiB;AAG1B,QAAM,CAACuB,GAAoBC,CAAqB,IAAI/I,EAAS,EAAK,GAI5D,CAACgJ,GAAkBC,CAAmB,IAAIjJ,EAAS,EAAK;AAE9DqD,EAAAA,GAAU,MAAM;AACd,QAAIkE,MAAe,QAAQ;AACzB,MAAAwB,EAAsB,EAAK;AAC3B;AAAA,IACF;AAEA,QAAIxB,MAAe,aAAa;AAC9B,MAAAwB,EAAsB,EAAK,GAC3BE,EAAoB,EAAI;AACxB;AAAA,IACF;AAEM,UAAAC,IAAQ,WAAW,MAAM;AAC7B,MAAAH,EAAsB,EAAI;AAAA,OACzB,GAAG;AAEC,WAAA,MAAM,aAAaG,CAAK;AAAA,EAAA,GAC9B,CAAC3B,CAAU,CAAC;AAEf,QAAM4B,IACJ5B,MAAe,UACdA,MAAe,gBAAgB,CAACyB,KAAoB,CAACF,GAClDM,IACJ7B,MAAe,eAAe,CAACyB,KAAoBF,GAC/CO,IAAgB9B,MAAe,eAAeyB;AAGlD,SAAA7e,gBAAAA,EAAC,OAAI,EAAA,OAAM,yBACT,GAAAA,gBAAAA,EAAC,QAAK,EAAA,OAAM,gBAAe,OAAO,EAAE,SAASgf,IAAW,IAAI,EAAE,EAAA,GAC3D,EAAE,sBACL,GAEAhf,gBAAAA,EAAC,OAAI,EAAA,OAAM,gBAAe,OAAO,EAAE,SAASif,IAAc,IAAI,EAAE,KAC7D,EAAE,kBACL,GAECjf,gBAAAA,EAAA,QAAA,EAAK,OAAM,gBAAe,OAAO,EAAE,SAASkf,IAAgB,IAAI,EAC/D,EAAA,GAAAlf,gBAAAA,EAACyb,IAAM,EAAA,QAAQ,IAAI,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,GAAI,CAAA,GAAG,KAC3D,EAAE,mBACL,CACF;AAEJ,q2PCtRa0D,KAGR,CAAC,EAAE,UAAAC,GAAU,UAAAC,QAAe;AAEzB,QAAAC,IAASF,IAAW,IAAI,GACxBG,IAAgB,IAAI,KAAK,KAAKD,GAC9BE,IAASD,IAAgBF;AAE/B,2BACG,OAAI,EAAA,OAAM,mBAAkB,QAAQD,GAAU,OAAOA,EACpD,GAAApf,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAIsf,IAAS;AAAA,MACb,IAAIA,IAAS;AAAA,MACb,MAAK;AAAA,MACLA;AAAA,MACA,oBAAkBC;AAAA,MAClB,qBAAmBC;AAAA,MACnB,gBAAc;AAAA,MACd,WAAW,0BAA0BF,IAAS,IAAI,IAAS,CAAC;AAAA,IAAA;AAAA,EAAA,CAEhE;AAEJ,GCDMG,KAAuB,KAAK,KAC5BC,KAAsB,IAAI,KAEnBC,KAAyD,CAAC;AAAA,EACrE,KAAAloB;AAAA,EACA,OAAAmoB,IAAQrF,GAAqB;AAAA,EAC7B,UAAA3C;AAAA,EACA,cAAAiI,IAAetF;AAAA,EACf,wBAAA8C,IAAyB;AAAA,EACzB,SAAArF;AAAA,EACA,WAAAS;AAAA,EACA,UAAA8E;AAAA,EACA,eAAAC;AACF,MAAM;AACJ,QAAM,CAACsC,GAAYC,CAAa,IAAIlK,EAA6B,MAAS,GACpE,CAACuH,GAAY4C,CAAa,IAAInK,EAElC,MAAM,GAEF,EAAE,QAAAsC,GAAQ,OAAAE,MAAUN,GAAU,EAAE,SAAAC,GAAS,cAAc,GAAA,CAAM,GAE7DiI,IAAYzF,GAAS;AAAA,IACzB,SAAS5C,EAAS,SAAS;AAAA,IAC3B,iBAAiB6H;AAAA,IACjB,OAAOpH;AAAA,EAAA,CACR,GAEK6H,IAAS7J;AAAAA,IACb,OAAO5P,MAAiD;AACtD,YAAM8W,EAAS,EAAE,GAAG9W,GAAM,YAAAqZ,EAAY,CAAA,GACtCG,EAAU,kBAAkBP,EAAmB;AAAA,IACjD;AAAA,IACA,CAACO,GAAWH,GAAYvC,CAAQ;AAAA,EAAA,GAG5B4C,IAAc9J;AAAAA,IAClB,OAAO5P,MAAsD;AAC3D,UAAI+W,MAAkB,QAAW;AAC/B,QAAAwC,EAAc,YAAY;AAE1B,cAAMtlB,IAAM,MAAM8iB,EAAc,EAAE,GAAG/W,GAAM,YAAAqZ,GAAY;AACvD,QAAAC,EAAcrlB,EAAI,UAAU,GAC5BslB,EAAc,WAAW;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAACF,GAAYtC,CAAa;AAAA,EAAA,GAEtBvE,IAAU5C,EAAY,MAAM;AAChC,IAAA4J,EAAU,KAAK,GACT5H,KACMI,KAAA,QAAAA;AAAA,EACX,GAAA,CAACwH,GAAW5H,GAAOI,CAAS,CAAC;AAG9B,SAAAzY,gBAAAA,EAAA0Z,GAAA,wBACG,SAAM,EAAA,yBAAyB,EAAE,QAAQC,MAAU,GACpD3Z,gBAAAA;AAAAA,IAACwY;AAAA,IAAA;AAAA,MACC,KAAA/gB;AAAA,MACA,OAAA4gB;AAAA,MACA,aAAaxW;AAAA,MACb,QAAAsW;AAAA,MACA,UAAAP;AAAA,MACA,WAAAa;AAAA,IAAA;AAAA,IAGEzY,gBAAAA,EAAA0Z,GAAA,MAAA1Z,gBAAAA;AAAAA,MAACkd;AAAA,MAAA;AAAA,QACC,KAAAzlB;AAAA,QACA,wBAAA4lB;AAAA,QACA,UAAUuC;AAAA,QACV,YAAAxC;AAAA,QACA,GAAG,EAAE,GAAG7C,IAAsB,GAAGsF,EAAa;AAAA,QAC9C,eAAeI,EAAU;AAAA,QACzB,eAAeE;AAAA,QACf,UAAUD;AAAA,MAAA;AAAA,IAGZ,GAAAlgB,gBAAAA,EAAC,UAAO,EAAA,OAAM,SAAQ,SAASiZ,KAC5B,CAACgH,EAAU,WAAWA,EAAU,kBAAkB,KACjDjgB,gBAAAA;AAAAA,MAACmf;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,UAAU,IAAMc,EAAU;AAAA,MAAA;AAAA,IAG9B,GAAAjgB,gBAAAA,EAACqa,IAAM,IAAA,CACT,CACF;AAAA,EAAA,CAEJ;AAEJ,GCzGa+F,KAA6B;AAAA,EACxC,MAAM;AAAA,EACN,WAAW;AACb;AAEA,SAAShJ,GAAgB7c,GAAU;AACjC,EAAAA,EAAE,gBAAgB;AACpB;AAEA,SAAS8lB,KAAwB;AAC/B,MAAI9I,IAAY,SAAS,cAAc,IAAI1V,EAAmB,EAAE;AAEhE,MAAI,CAAC0V,GAAW;AACF,IAAAA,IAAA,SAAS,cAAc,KAAK,GACxCA,EAAU,aAAa,EAAE,MAAM,OAAQ,CAAA,GACtCA,EAA0B,MAAM,MAAM,WACvCA,EAAU,KAAK1V,IACN,SAAA,KAAK,YAAY0V,CAAS;AAEnC,eAAWC,KAASzV;AAClB,MAAAwV,EAAU,iBAAiBC,GAAOJ,IAAiB,EAAE,SAAS,IAAM;AAAA,EAExE;AAEA,SAAOG,EAAU;AACnB;AAKA,IAAI+I,KAAgB;AAEb,SAASC,GAAiBrmB,GAAwC;AACvE,QAAMsmB,IAAaH,MACbzI,IAAW1d,EAAQ,YAAYkmB;AAEjC,MAAAxI,EAAS,SAAS,WAAW;AAC3B,QAAA,CAACA,EAAS,QAAQ;AACZ,cAAA;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,KAAK,SAASA,EAAS,MAAM,GAAG;AACpC,cAAA;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAEF;AAAA,IACF;AAAA,EACF;AAEA,EAAA0I,MAEAG;AAAAA,IACEzgB,EAAE2f,IAAgB,EAAE,GAAGzlB,GAAS,UAAA0d,GAAU,KAAK0I,GAAc,SAAS,GAAG;AAAA,IACzEE;AAAA,EAAA;AAEJ;ACqIO,MAAME,KAAqC,CAChDxmB,IAAwD,OAEjD,CAACymB,GAAyBC,MAAa;AAC5C,EAAAA,EAAS,iBAAiB1mB,CAAO;AAAA;AAiBf,eAAA2mB,GACpB7mB,GACA5C,GACA4D,GACA;AACA,MAAI,CAACA,EAAQ,SAAS,CAACA,EAAQ,SAAS;AAC/B,IAAA5D,EAAA;AAAA,MACL;AAAA,IAAA;AAEF;AAAA,EACF;AAEI,MAAA,CAAC4D,EAAQ,QAAQ;AACnB,IAAA5D,EAAO,MAAM,+CAA+C;AAC5D;AAAA,EACF;AAEA,QAAM0pB,IAAY,eAAe9lB,IAAUA,EAAQ,YAAY,QACzDM,IAAa,gBAAgBN,IAAUA,EAAQ,aAAa;AAE9D,MAAA,CAAC8lB,KAAa,CAACxlB,GAAY;AACtB,IAAAlE,EAAA;AAAA,MACL;AAAA,IAAA;AAEF;AAAA,EACF;AAGA,QAAM2pB,IAAkB;AAAA,IACtB,GAAG/lB;AAAA,IACH,YAAY;AAAA,IACZ,QAAQA,EAAQ,UAAU;AAAA,IAC1B,WAAA8lB;AAAA,IACA,KAAKxlB;AAAA,EAAA,GAGDZ,IAAM,MAAMV,EAAW,KAAK;AAAA,IAChC,MAAM;AAAA,IACN,MAAM+mB;AAAA,EAAA,CACP;AAEM,SAAA3pB,EAAA,MAAM,iBAAiBsD,CAAG,GAC1BA;AACT;AAEO,MAAMsmB,GAAa;AAAA,EAIxB,YACU/iB,GACA7G,GACA4C,GACAinB,IAA+CP,MAC/CvjB,GACAya,IAAqBwI,IACrBc,IAAsD,CAAA,GAC9D;AAPQ,SAAA,aAAAjjB,GACA,KAAA,SAAA7G,GACA,KAAA,aAAA4C,GACA,KAAA,wBAAAinB,GACA,KAAA,SAAA9jB,GACA,KAAA,WAAAya,GACA,KAAA,uBAAAsJ,GAVV,KAAQ,cAAc,IACtB,KAAQ,aAAoC;AAAA,EAUzC;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,aAAa;AACjB,QAAI,KAAK,aAAa;AACf,WAAA,OAAO,MAAM,2CAA2C;AAC7D;AAAA,IACF;AACA,SAAK,cAAc;AAEb,UAAAzjB,IAAU,MAAM,KAAK;AAC3B,QAAKA;AAED,UAAA;AACG,aAAA,OAAO,MAAM,0BAA0BA,CAAO,GACnD,KAAK,aAAawB,GAAmB;AAAA,UACnC,QAAQ,KAAK;AAAA,UACb,SAAAxB;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,UAAU,CAACxG,MACT,KAAK,4BAA4B,KAAK,QAAQA,CAAO;AAAA,UACvD,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,QAAA,CAClB,GACI,KAAA,OAAO,MAAM,uCAAuC;AAAA,eAClDsD,GAAG;AACL,aAAA,OAAO,MAAM,4CAA4CA,CAAC;AAAA,MACjE;AAAA,EACF;AAAA,EAEA,MAAc,aAAa;AACnB,UAAA4mB,IAAexjB,GAAa,KAAK,MAAM,GACvCF,IAAU0jB,KAAA,gBAAAA,EAAc;AAE9B,QAAI1jB;AACK,aAAAA;AAGL,QAAA;AACF,UAAI,CAACA,GAAS;AACZ,cAAM/C,IAAM,MAAM,KAAK,WAAW,KAAK;AAAA,UACrC,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,QAAQ,KAAK;AAAA,UACf;AAAA,QAAA,CACD;AAGD,YADK,KAAA,OAAO,MAAM,8BAA8BA,CAAG,GAC/CA,EAAI,IAAI;AACJ,gBAAAyD,IAA+C,MAAMzD,EAAI;AAC3D,cAAAyD,EAAK,WAAWA,EAAK;AACvB,mBAAOA,EAAK;AAAA,QAEhB;AAAA,MACF;AAAA,aACO5D,GAAG;AACL,WAAA,OAAO,MAAM,qCAAqCA,CAAC;AACxD;AAAA,IACF;AAAA,EAEF;AAAA,EAEA,4BAA4B4C,GAAgBlG,GAAc;AAClD,UAAAmqB,IAASjiB,GAAmBlI,CAAO;AACzC,IAAKmqB,IAIAhiB,GAAqBjC,GAAQikB,GAAQ,OAAO1hB,GAAGd,GAAG9D,MAAO;AACxD,YAAM,KAAK,oBAAoB;AAAA,QAC7B,UAAUsmB,EAAO;AAAA,QACjB,WAAWA,EAAO;AAAA,QAClB,kBAAkBA,EAAO;AAAA,QACzB,OAAO;AAAA,QACP,QAAAjkB;AAAA,MAAA,CACD,GACD,MAAM,KAAK,sBAAsBuC,GAAGd,GAAG9D,CAAE;AAAA,IAAA,CAC1C,KAED,KAAK,OAAO;AAAA,MACV;AAAA,MACA7D;AAAA,IAAA,IAhBC,KAAA,OAAO,MAAM,4CAA4CA,CAAO;AAAA,EAoBzE;AAAA,EAEA,OAAO;AACL,IAAI,KAAK,eACP,KAAK,WAAW,SAChB,KAAK,aAAa;AAAA,EAEtB;AAAA,EAEA,MAAM,sBACJkG,GACAlG,GACAsI,GACA;AACA,QAAIugB;AAEJ,UAAM,KAAK,oBAAoB;AAAA,MAC7B,UAAU7oB,EAAQ;AAAA,MAClB,WAAWA,EAAQ;AAAA,MACnB,kBAAkBA,EAAQ;AAAA,MAC1B,OAAO;AAAA,MACP,QAAAkG;AAAA,IAAA,CACD;AAEK,UAAAkkB,IAA4C,OAAOC,MAAU;AACjE,UAAI,CAACA,GAAO;AACV,cAAM,KAAK,oBAAoB;AAAA,UAC7B,UAAUrqB,EAAQ;AAAA,UAClB,WAAWA,EAAQ;AAAA,UACnB,OAAO;AAAA,UACP,QAAAkG;AAAA,UACA,kBAAkBlG,EAAQ;AAAA,QAAA,CAC3B,GAEiBsI;AAClB;AAAA,MACF;AAEA,YAAMwhB,IAAkB;AAAA,QACtB,YAAAjB;AAAA,QACA,WAAW7oB,EAAQ;AAAA,QACnB,QAAAkG;AAAA,QACA,WAAWmkB,EAAM;AAAA,QACjB,OAAOA,EAAM;AAAA,QACb,SAASA,EAAM;AAAA,QACf,UAAUrqB,EAAQ;AAAA,QAClB,UAAUqqB,EAAM;AAAA,QAChB,kBAAkBrqB,EAAQ;AAAA,QAC1B,QAAQ;AAAA,MAAA,GAGJiC,IAAW,MAAM2nB;AAAA,QACrB,KAAK;AAAA,QACL,KAAK;AAAA,QACLE;AAAA,MAAA;AAKE,UAFcxhB,KAEdrG,KAAYA,EAAS;AAChB,eAAA,OAAMA,KAAA,gBAAAA,EAAU;AAAA,IAEzB,GAGI0nB,IAA2C;AAAA,MAC/C,OAAOS;AAAA,MACP,kBAAkB,CAACnnB,MAAY;AAC7BqnB,QAAAA,GAA6B;AAAA,UAC3B,KAAKtqB,EAAQ;AAAA,UACb,OAAOA,EAAQ;AAAA,UACf,eAAe,OAAOwP,MAAS;AACvB,kBAAA/L,IAAM,MAAM2mB,EAAc5a,CAAI;AACpC,mBAAAqZ,IAAaplB,EAAI,YACV,EAAE,YAAYA,EAAI;UAC3B;AAAA,UACA,UAAU,OAAO+L,MAAS;;AACxB,kBAAM4a,EAAc5a,CAAI,IACxBlL,IAAArB,EAAQ,kBAAR,QAAAqB,EAAA,KAAArB,GAAwBuM;AAAA,UAC1B;AAAA,UACA,WAAW,MAAM4a,EAAc,IAAI;AAAA,UACnC,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,UACnB,GAAGnnB;AAAA,QAAA,CACJ;AAAA,MACH;AAAA,IAAA;AAGG,SAAA,sBAAsBjD,GAAS2pB,CAAQ;AAAA,EAC9C;AAAA,EAEA,MAAM,oBAAoB1pB,GAMvB;AACD,UAAM8D,IAAU;AAAA,MACd,QAAQ9D,EAAK;AAAA,MACb,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,kBAAkBA,EAAK;AAAA,IAAA,GAGnBwD,IAAM,MAAM,KAAK,WAAW,KAAK;AAAA,MACrC,MAAM;AAAA,MACN,MAAMM;AAAA,IAAA,CACP;AACI,gBAAA,OAAO,MAAM,qBAAqBN,CAAG,GACnCA;AAAA,EACT;AACF;AC/bO,MAAM8mB,GAAa;AAAA,EAAnB,cAAA;AACL,SAAQ,QAQJ;AAAA,MACF,cAAc,CAAC;AAAA,MACf,aAAa,CAAC;AAAA,MACd,OAAO,CAAC;AAAA,MACR,iBAAiB,CAAC;AAAA,MAClB,MAAM,CAAC;AAAA,MACP,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,IAAA;AAAA,EACV;AAAA,EAEA,QACEhK,GACA1c,GACY;AACX,gBAAK,MAAM0c,CAAK,EAAY,KAAK1c,CAAE,GAC7B,MAAM;AACN,WAAA,WAAW0c,GAAO1c,CAAE;AAAA,IAAA;AAAA,EAE7B;AAAA,EAEA,WACE0c,GACA1c,GACM;AACD,SAAA,MAAM0c,CAAK,IAAI,KAAK,MAAMA,CAAK,EAAE,OAAO,CAACiK,MAASA,MAAS3mB,CAAE;AAAA,EACpE;AAAA,EAEA,QACE0c,GACAkK,GACM;AACD,SAAA,MAAMlK,CAAK,EAAE,QAAQ,CAACiK,MAASA,EAAKC,CAAU,CAAC;AAAA,EACtD;AACF;AClEO,MAAMC,GAAW;AAAA,EAMtB,YACSC,GACPC,IAA0B,IAC1B;AAFO,SAAA,iBAAAD,GAGF,KAAA,UAAUC,EAAK,WAAWrrB,IAI1B,KAAK,QAAQ,SAAS,GAAG,MAC5B,KAAK,WAAW,MAEb,KAAA,aAAaqrB,EAAK,cAAcjrB,IACrC,KAAK,eAAe,EAAE,aAAairB,EAAK,YAAY;AAAA,EACtD;AAAA,EAEA,OAAOC,GAAmB;AAEpB,WAAAA,EAAK,WAAW,GAAG,MACdA,IAAAA,EAAK,MAAM,CAAC,IAEd,IAAI,IAAIA,GAAM,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,MAAM,IAAI;AAAA,IACR,MAAAA;AAAA,IACA,QAAArnB;AAAA,IACA,WAAAsnB;AAAA,EAAA,GAK2B;AAC3B,IAAKtnB,MACHA,IAAS,IAAI,oBAERA,EAAA,IAAI9D,IAAyB,KAAK,UAAU,GAC5C8D,EAAA,IAAI,kBAAkB,KAAK,cAAc;AAE1C,UAAA6D,IAAM,KAAK,OAAOwjB,CAAI;AAG5B,QAFIxjB,EAAA,SAAS7D,EAAO,YAEhBsnB,MAAc;AACT,aAAA,MAAMzjB,GAAK,KAAK,YAAY;AAG/B,UAAA0jB,IAAa,IAAI,mBACjBC,IAAK,WAAW,MAAMD,EAAW,MAAA,GAASD,CAAS,GAEnDrnB,IAAM,MAAM,MAAM4D,GAAK;AAAA,MAC3B,GAAG,KAAK;AAAA,MACR,QAAQ0jB,EAAW;AAAA,IAAA,CACpB;AACD,wBAAaC,CAAE,GAERvnB;AAAA,EACT;AAAA,EAEA,MAAM,KAAK;AAAA,IACT,MAAAonB;AAAA,IACA,MAAA3jB;AAAA,EAAA,GAK2B;AAC3B,WAAO,MAAM,KAAK,OAAO2jB,CAAI,GAAG;AAAA,MAC9B,GAAG,KAAK;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,CAACnrB,EAAuB,GAAG,KAAK;AAAA,QAChC,eAAe,UAAU,KAAK,cAAc;AAAA,MAC9C;AAAA,MACA,MAAM,KAAK,UAAUwH,CAAI;AAAA,IAAA,CAC1B;AAAA,EACH;AACF;ACxFa,MAAA+jB,KAAiE,CAC5E5H,MAEAta,gBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAGsa;AAAA,EAAA;AAAA,EAEJta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA,IAAA;AAAA,EACP;AACF,GCTImiB,KAAS;AAER,SAASC,GAAO;AAAA,EACrB,SAAAC;AAAA,EACA,OAAArd,IAAQ;AAAA,EACR,QAAAC,IAAS;AAAA,EACT,GAAGqV;AACL,GAAgB;AACd,oCAEKta,gBAAAA,EAAA,SAAA,EAAM,OAAM,UAAS,gBAAcqiB,EAClC,GAAAriB,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAAqiB;AAAA,MACA,OAAM;AAAA,MACN,MAAK;AAAA,MACL,MAAK;AAAA,MACJ,GAAG/H;AAAA,IAAA;AAAA,EAAA,GAENta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAO;AAAA,QACL,OAAO,GAAGgF,CAAK;AAAA,QACf,QAAQ,GAAGC,CAAM;AAAA,QACjB,cAAc,GAAGA,CAAM;AAAA,MACzB;AAAA,IAAA;AAAA,IAEAjF,gBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO;AAAA,UACL,OAAO,GAAGiF,IAASkd,KAAS,CAAC;AAAA,UAC7B,QAAQ,GAAGld,IAASkd,KAAS,CAAC;AAAA,UAC9B,WAAWE,IACP,cAAcrd,KAASC,IAASkd,KAAS,KAAKA,EAAM,QACpD,cAAcA,EAAM;AAAA,UACxB,KAAK,GAAGA,EAAM;AAAA,QAChB;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,CAAA,CACF;AAEJ;ACzCO,SAASG,GAAc;AAAA,EAC5B,UAAAtqB;AAAA,EACA,aAAAuqB;AAAA,EACA,YAAAC;AAAA,EACA,QAAArK;AAAA,EACA,sBAAAsK;AACF,GAMG;AACK,QAAAC,IAAc1qB,EAAS,SAAS,GAChC2qB,IAAmB3qB,EAAS;AAAA,IAAK,CAACC,MACtCA,EAAQ,IACL,kBAAA,EACA,UAASsqB,KAAA,gBAAAA,EAAa,wBAAuB,EAAE;AAAA,EAAA,GAI9CK,IACJL,MAAgB,OACZvqB,IACA,CAAC,GAAGA,CAAQ,EAAE,KAAK,CAACgJ,GAAGR,MAAM;AAC3B,UAAMqiB,IAAW7hB,EAAE,IAAI,SAASuhB,CAAW,GACrCO,IAAWtiB,EAAE,IAAI,SAAS+hB,CAAW;AAG3C,WAAIM,MAAaC,IACR9hB,EAAE,IAAI,cAAcR,EAAE,GAAG,IAI3BqiB,IAAW,KAAK;AAAA,EAAA,CACxB;AAEP,2BACG,SAAM,EAAA,OAAM,kBAAiB,OAAO,EAAE,OAAOD,EAAiB,OAAO,EAAA,qBACnE,SACG,OAAA,CAACF,KAAe,CAACC,wBAChB,MACC,MAAA3iB,gBAAAA,EAAC,MAAG,EAAA,OAAM,sBAAqB,SAAS,EAAA,GAAG,eAC7B,KACV2iB,IAAkD,KAA/B,aAAaJ,CAAW,MAAU,OAEzD,CACF,GAEDK,EAAiB,IAAI,CAAC3qB,GAAS0kB,MAC9B3c,gBAAAA;AAAAA,IAAC+iB;AAAA,IAAA;AAAA,MACC,KAAK9qB,EAAQ;AAAA,MACb,YAAAuqB;AAAA,MACA,SAAAvqB;AAAA,MACA,OAAA0kB;AAAA,MACA,cACE4F,MAAgB,QAChB,CAACtqB,EAAQ,IACN,kBAAA,EACA,SAASsqB,EAAY,mBAAmB;AAAA,MAE7C,QAAApK;AAAA,MACA,oBAAoB,CAACtc,MACnB4mB,EAAqBxqB,EAAQ,KAAK4D,CAAQ;AAAA,IAAA;AAAA,EAG/C,CAAA,CACH,CACF;AAEJ;AAEA,SAASknB,GAAW;AAAA,EAClB,oBAAAC;AAAA,EACA,YAAAR;AAAA,EACA,SAAAvqB;AAAA,EACA,QAAAkgB;AAAA,EACA,OAAAwE;AAAA,EACA,cAAAsG;AACF,GAOG;AACD,QAAM,CAACC,GAAYC,CAAa,IAAItN,EAASsC,CAAM;AACnDe,SAAAA,GAAU,MAAM;AACd,IAAAiK,EAAchL,CAAM;AAAA,EAAA,GACnB,CAACA,CAAM,CAAC,GAETnY,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK/H,EAAQ;AAAA,MACb,OAAO;AAAA,QACL;AAAA,QACAirB,IAAa,iBAAiB;AAAA,QAC9BD,IAAe,gBAAgB;AAAA,MAAA,EAC/B,KAAK,GAAG;AAAA,MACV,OAAO,EAAE,OAAOtG,EAAM;AAAA,IAAA;AAAA,IAEtB3c,gBAAAA,EAAC,QAAG,OAAM,oBAAA,qBACPkiB,IAAQ,EAAA,OAAM,gBAAe,GAC9BliB,gBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM,GAAGwiB,CAAU,gCAAgCvqB,EAAQ,GAAG;AAAA,QAC9D,KAAI;AAAA,QACJ,UAAU0kB,IAAQ;AAAA,QAClB,QAAO;AAAA,MAAA;AAAA,MAEN1kB,EAAQ;AAAA,IAAA,CAEb;AAAA,IACC+H,gBAAAA,EAAA,MAAA,EAAG,OAAM,qBAAA,GACP/H,EAAQ,kBAAkB,OACxB+H,gBAAAA,EAAAojB,IAAA,EAAM,oBAAAJ,GAAwC,UAAUrG,IAAQ,EAAA,CAAG,IAClE,IACN;AAAA,IACA3c,gBAAAA,EAAC,MAAG,EAAA,OAAM,sBACR,GAAAA,gBAAAA;AAAAA,MAACoiB;AAAA,MAAA;AAAA,QACC,SAASnqB,EAAQ,iBAAiBA,EAAQ;AAAA,QAC1C,UAAU0kB,IAAQ;AAAA,QAClB,UAAU,CAACpiB,MAAM;AACT,gBAAA8oB,IAAY9oB,EAAE,cAAc,SAC5B+oB,IAAeD,MAAcprB,EAAQ;AACxB,UAAA+qB,EAAAM,IAAeD,IAAY,IAAI;AAAA,QACpD;AAAA,MAAA;AAAA,IAAA,CAEJ;AAAA,EAAA;AAGN;AAEO,SAASE,GAAc;AAAA,EAC5B,UAAAC;AACF,GAEG;AAEC,SAAAxjB,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAS;AAAA,MACT,SAAS,CAACD,MAAMyjB,EAASzjB,EAAE,cAAc,KAAK;AAAA,IAAA;AAAA,EAAA;AAGpD;AAEA,SAASqjB,GAAM;AAAA,EACb,oBAAAJ;AAAA,EACA,GAAG1I;AACL,GAE6C;AAEzC,SAAAta,gBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,MAAK;AAAA,MACL,SAAS,CAACzF,MAAM;AACd,QAAAA,EAAE,eAAe,GACjByoB,EAAmB,IAAI;AAAA,MACzB;AAAA,MACC,GAAG1I;AAAA,IAAA;AAAA,IACL;AAAA,EAAA;AAIL;;AClJA,SAAwBmJ,GAAQ;AAAA,EAC9B,cAAAC;AAAA,EACA,UAAA9L;AACF,GAGG;AACK,QAAA+L,IAAmBvO,EAAuB,IAAI,GAC9CwO,IAAmBxO,EAAuB,IAAI,GAC9C,CAACpd,GAAU6rB,CAAW,IAAIhO,EAAoB,CAAE,CAAA,GAEhDiO,IAAiBzN,EAAY,MAAM;AACjC,UAAA0N,IAAcL,EAAa;AACjC,IAAAG;AAAA,MACE,OAAO,OAAOE,CAAW,EACtB,OAAO,CAAClkB,MAAMA,MAAM,MAAS,EAC7B;AAAA,QACC,CAAC5H,OACE;AAAA,UACC,KAAKA,EAAQ;AAAA,UACb,eAAeA,EAAQ;AAAA,UACvB,WAAWA,EAAQ;AAAA,QAAA;AAAA,MAEzB;AAAA,IAAA;AAAA,EACJ,GACC,CAACyrB,CAAY,CAAC,GAEXM,IAAkB/M,EAAQ,MACvBjf,EAAS,KAAK,CAAC6H,MAAMA,EAAE,kBAAkB,IAAI,GACnD,CAAC7H,CAAQ,CAAC;AAEbkhB,EAAAA,GAAU,MAAM;AACC,IAAA4K,KACFJ,EAAA,GAAG,mBAAmBI,CAAc;AAAA,EAAA,GAChD,CAACJ,GAAcI,CAAc,CAAC;AAEjC,QAAM,CAACG,GAAQC,CAAS,IAAIrO,EAAwB,IAAI,GAClD2N,IAAW,CAAC5lB,MAAgB;;AACtB,IAAAsmB,EAAAtmB,MAAQ,KAAK,OAAOA,CAAG,IACjCrC,IAAAqoB,EAAiB,YAAjB,QAAAroB,EAA0B,SAAS,EAAE,KAAK,EAAG;AAAA,EAAA,GAGzC4oB,IAAiB,CAAC,GAAGnsB,CAAQ,EAAE;AAAA,IAAK,CAACgJ,GAAGR,MAC5CQ,EAAE,IAAI,cAAcR,EAAE,GAAG;AAAA,EAAA,GAGrBgiB,IAAakB,EAAa,UAAA,EAAY,YAEtC,EAAE,QAAAvL,GAAQ,OAAAE,GAAO,QAAAC,MAAWP,GAAU;AAG1C,SAAA/X,gBAAAA,EAAC,OAAI,EAAA,OAAM,UACT,GAAAA,gBAAAA,EAAC,SAAM,EAAA,yBAAyB,EAAE,QAAQ2Z,GAAO,EAAA,CAAG,GACpD3Z,gBAAAA;AAAAA,IAACokB;AAAA,IAAA;AAAA,MACC,iBAAAJ;AAAA,MACA,UAAUL;AAAA,MACV,QAAAxL;AAAA,MACA,UAAAP;AAAA,MACA,SAASU;AAAA,IAAA;AAAA,EAAA,GAEXtY,gBAAAA;AAAAA,IAACwY;AAAA,IAAA;AAAA,MACC,OAAAH;AAAA,MACA,aAAavW;AAAA,MACb,QAAAqW;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,QAAQwL,EAAiB;AAAA,QACzB,WAAW;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX,UAAS;AAAA,IAAA;AAAA,IAER3jB,gBAAAA,EAAAka,IAAA,MACEla,gBAAAA,EAAAujB,IAAA,EAAc,UAAAC,GAAoB,CACrC;AAAA,IACAxjB,gBAAAA,EAACoa,IAAc,EAAA,UAAUwJ,EACvB,GAAA5jB,gBAAAA;AAAAA,MAACsiB;AAAA,MAAA;AAAA,QACC,YAAAE;AAAA,QACA,UAAU2B;AAAA,QACV,QAAAhM;AAAA,QACA,aAAa8L;AAAA,QACb,sBAAsB,CAACxsB,GAAKqE,MAC1B4nB,EAAa,WAAWjsB,CAAG,EAAE,qBAAqBqE,CAAS;AAAA,MAAA;AAAA,IAAA,CAGjE;AAAA,EAAA,CAEJ;AAEJ;AAEA,SAASsoB,GAAc;AAAA,EACrB,QAAAjM;AAAA,EACA,UAAAP;AAAA,EACA,SAAAyM;AAAA,EACA,UAAAlK;AAAA,EACA,iBAAA6J;AACF,GAOG;AACK,QAAA1U,IAAUqI,GAAwBC,CAAQ,GAE1C0M,IAAgB,CAAC,kBAAkBnM,IAAS,SAAS,MAAS,EAAE;AAAA,IACpE;AAAA,EAAA,GAGIoM,IAAmB;AAAA,IACvB;AAAA,IACAP,IAAkB,SAAS;AAAA,EAAA,EAC3B,KAAK,GAAG;AAGR,SAAAhkB,gBAAAA,EAAC,SAAI,KAAKma,GAAU,OAAOmK,GAAe,OAAOhV,GAAS,SAAA+U,EACxD,GAAArkB,gBAAAA,EAAC,SAAI,OAAOukB,GAAkB,GAC7BvkB,gBAAAA,EAAA8b,IAAA,EAAK,QAAO,QAAO,OAAM,QAAO,CACnC;AAEJ;AC3IO,MAAM0I,KAAoB;AAE1B,SAASC,GAAkBvqB,GAAmC;AAC7D,QAAAsmB,IAAanJ,GAAgBvV,EAAkB,GAC/C8V,IAA4B1d,EAAQ,YAAY;AAAA,IACpD,WAAWsqB;AAAA,EAAA;AAGN/D,EAAAA,GAAAzgB,EAAEyjB,IAAS,EAAE,GAAGvpB,GAAS,UAAA0d,EAAU,CAAA,GAAG4I,CAAU;AACzD;ACAA,MAAMkE,KAAW,OAAO,SAAW,OAAe,OAAO,aAAa,KAChEnZ,KAAS,OAAO,WAAa,KAqR7BoZ,KAAwB;AAAA,EAC5B,YAAYnuB;AAAA,EACZ,YAAYC;AAAA,EACZ,YAAYC;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AACX;AA0DA,SAASkuB,GAAkB/C,GAAmB;;AAC5C,QAAMgD,IAAchD,EAAK;AACrB,SAAA,OAAOgD,KAAgB,YAAkBA,IACzC,QAAOA,KAAA,gBAAAA,EAAa,SAAS,YAAkBA,EAAY,SAExDtpB,IAAA,iCAAQ,aAAR,gBAAAA,EAAkB,cAAa;AACxC;AAKO,MAAMupB,GAAa;AAAA;AAAA;AAAA;AAAA,EAkBxB,YAAYjD,GAAmB;;AAC7B,SAAK,iBAAiBA,EAAK,gBAC3B,KAAK,UACHA,KAAA,gBAAAA,EAAM,WAAU1qB,GAAiBJ,IAAoB,UAAU,GACjE,KAAK,UAAU;AAAA,MACb,OAAMwE,IAAAsmB,KAAA,gBAAAA,EAAM,SAAN,QAAAtmB,EAAY,KAAKsmB,EAAK,OAAO;AAAA,MACnC,UAASpmB,IAAAomB,KAAA,gBAAAA,EAAM,YAAN,QAAApmB,EAAe,KAAKomB,EAAK,UAAU;AAAA,MAC5C,cAAcA,KAAA,gBAAAA,EAAM;AAAA,IAAA,GAGtB,KAAK,SAAS;AAAA,MACZ,aAAYA,KAAA,gBAAAA,EAAM,eAAc8C,GAAc;AAAA,MAC9C,aAAY9C,KAAA,gBAAAA,EAAM,eAAc8C,GAAc;AAAA,MAC9C,aAAY9C,KAAA,gBAAAA,EAAM,eAAc8C,GAAc;AAAA,MAC9C,iBAAgB9C,KAAA,gBAAAA,EAAM,mBAAkB8C,GAAc;AAAA,MACtD,UAAS9C,KAAA,gBAAAA,EAAM,YAAW8C,GAAc;AAAA,IAAA,GAG1C,KAAK,yBAAyB;AAAA,MAC5B,WAAUI,KAAAvpB,IAAAqmB,KAAA,gBAAAA,EAAM,aAAN,gBAAArmB,EAAgB,OAAhB,gBAAAupB,EAAoB;AAAA,MAC9B,eAAcC,KAAAC,IAAApD,KAAA,gBAAAA,EAAM,aAAN,gBAAAoD,EAAgB,OAAhB,gBAAAD,EAAoB;AAAA,IAAA,GAGpC,KAAK,aAAa,IAAIrD,GAAW,KAAK,gBAAgB;AAAA,MACpD,SAAS,KAAK,OAAO;AAAA,MACrB,YAAYE,KAAA,gBAAAA,EAAM;AAAA,MAClB,aAAaA,KAAA,gBAAAA,EAAM;AAAA,IAAA,CACpB,GAED,KAAK,iBAAiB,IAAI9nB;AAAA,MACxB,KAAK;AAAA;AAAA,MAEL;AAAA,QACE,MAAM,KAAK,QAAQ;AAAA,QACnB,SAAS,KAAK,QAAQ;AAAA,QACtB,OAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,QACE,cAAc8nB,EAAK;AAAA,QACnB,aAAaA,EAAK;AAAA,QAClB,kBAAkBA,EAAK;AAAA,QACvB,WAAWA,EAAK;AAAA,QAChB,SAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IAAA,GAIA,CAAC,KAAK,OAAO,aACbqD,IAAA,KAAK,YAAL,QAAAA,EAAc,SACd,CAAC3Z;AAAA,MACD4Z,IAAAtD,KAAA,gBAAAA,EAAM,aAAN,gBAAAsD,EAAgB,wBAAuB,OAEnCT,KACF,KAAK,OAAO;AAAA,MACV;AAAA,IAAA,IAGF,KAAK,eAAe,IAAI1D;AAAA,MACtB,KAAK,OAAO;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,OACLoE,IAAAvD,KAAA,gBAAAA,EAAM,aAAN,gBAAAuD,EAAgB;AAAA,MAChB,QAAOC,IAAA,KAAK,QAAQ,SAAb,gBAAAA,EAAmB,EAAE;AAAA,OAC5BC,KAAA7sB,IAAAopB,KAAA,gBAAAA,EAAM,aAAN,gBAAAppB,EAAgB,OAAhB,gBAAA6sB,EAAoB;AAAA,OACpBC,KAAAC,IAAA3D,KAAA,gBAAAA,EAAM,aAAN,gBAAA2D,EAAgB,OAAhB,gBAAAD,EAAoB;AAAA,IAAA,IAKtBX,GAAkB/C,CAAI,MACnB,KAAA,OAAO,KAAK,yBAAyB,GACxB4C,GAAA;AAAA,MAChB,cAAc;AAAA,MACd,UACE,OAAO5C,EAAK,WAAY,WAAWA,EAAK,QAAQ,WAAW;AAAA,IAAA,CAC9D,IAIE,KAAA,QAAQ,IAAIL,MACZ,KAAA,eAAe,UAAU,MAAM;AAClC,WAAK,MAAM,QAAQ,mBAAmB,KAAK,eAAe,aAAa;AAAA,IAAA,CACxE;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa;AACX,UAAA/e,IAAQ,KAAK;AACnB,IAAI,KAAK,iBAEP,KAAK,mBAAmB,KAAK,aAAa,aAAa,MAAM,CAAClI,MAAM;AAC7D,WAAA,OAAO,MAAM,iDAAiDA,CAAC;AAAA,IAAA,CACrE,IAGG,MAAA,KAAK,eAAe,cACtB,KAAK,QAAQ,QAAQ,KAAK,OAAO,kBACnC,KAAK,KAAK,EAAE,MAAM,CAACA,MAAM;AAClB,WAAA,OAAO,MAAM,sBAAsBA,CAAC;AAAA,IAAA,CAC1C,GAGC,KAAK,QAAQ,WAAW,KAAK,OAAO,kBACtC,KAAK,QAAQ,EAAE,MAAM,CAACA,MAAM;AACrB,WAAA,OAAO,MAAM,yBAAyBA,CAAC;AAAA,IAAA,CAC7C,GAGH,KAAK,OAAO;AAAA,MACV,2BACE,KAAK,MAAM,KAAK,IAAI,IAAIkI,CAAK,IAC7B,QACC,KAAK,OAAO,UAAU,oBAAoB;AAAA,IAAA;AAAA,EAEjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GACEgjB,GACAC,GACA;AACA,WAAO,KAAK,MAAM,QAAQD,GAAMC,CAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IACED,GACAC,GACA;AACK,SAAA,MAAM,WAAWD,GAAMC,CAAO;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAWC,GAAsD;;AACrE,QAAIA,EAAK,MAAMA,EAAK,SAAOpqB,IAAA,KAAK,QAAQ,SAAb,gBAAAA,EAAmB,KAAI;AAChD,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,SAAK,QAAQ,OAAO;AAAA,MAClB,GAAG,KAAK,QAAQ;AAAA,MAChB,GAAGoqB;AAAA,MACH,IAAIA,EAAK,QAAMlqB,IAAA,KAAK,QAAQ,SAAb,gBAAAA,EAAmB;AAAA,IAAA,GAE/B,KAAK,QACV,MAAM,KAAK,eAAe,WAAW,KAAK,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAcmqB,GAAyD;;AAC3E,QAAIA,EAAQ,MAAMA,EAAQ,SAAOrqB,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB,KAAI;AACzD,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AACA,SAAK,QAAQ,UAAU;AAAA,MACrB,GAAG,KAAK,QAAQ;AAAA,MAChB,GAAGqqB;AAAA,MACH,IAAIA,EAAQ,QAAMnqB,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB;AAAA,IAAA,GAErC,KAAK,WACV,MAAM,KAAK,eAAe,WAAW,KAAK,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAmBoqB,GAEtB;AACD,SAAK,QAAQ,eAAe;AAAA,MAC1B,GAAG,KAAK,QAAQ;AAAA,MAChB,GAAGA;AAAA,IAAA,GAEL,MAAM,KAAK,eAAe,WAAW,KAAK,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAMC,GAAmBrpB,GAAyC;;AAClE,QAAA,CAAC,KAAK,QAAQ,MAAM;AACjB,WAAA,OAAO,KAAK,gDAAgD;AACjE;AAAA,IACF;AACI,QAAA,CAAC,KAAK,OAAO,gBAAgB;AAC1B,WAAA,OAAO,KAAK,iDAAiD;AAClE;AAAA,IACF;AAEI,QAAA,KAAK,OAAO;AACd;AAGF,UAAMzB,IAAwB;AAAA,MAC5B,QAAQ,OAAO,KAAK,QAAQ,KAAK,EAAE;AAAA,MACnC,OAAO8qB;AAAA,IAAA;AAEL,IAAArpB,QAAoB,aAAaA,KACjClB,IAAA,KAAK,QAAQ,YAAb,QAAAA,EAAsB,OACxBP,EAAQ,YAAY,QAAOS,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB,EAAE;AAE/C,UAAAf,IAAM,MAAM,KAAK,WAAW,KAAK,EAAE,MAAM,UAAU,MAAMM,EAAS,CAAA;AACnE,gBAAA,OAAO,MAAM,cAAcN,CAAG,GAE9B,KAAA,MAAM,QAAQ,SAAS;AAAA,MAC1B,WAAAorB;AAAA,MACA,YAAArpB;AAAA,MACA,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,QAAQ;AAAA,IAAA,CACvB,GACM/B;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAASM,GAAmB;;AAC5B,QAAA,KAAK,OAAO;AACd;AAGF,UAAMmC,IACJnC,EAAQ,YACPO,IAAA,KAAK,QAAQ,SAAb,QAAAA,EAAmB,KAAK,QAAOE,IAAA,KAAK,QAAQ,SAAb,gBAAAA,EAAmB,EAAE,IAAI,SAErDsqB,IACJ/qB,EAAQ,eACPQ,IAAA,KAAK,QAAQ,YAAb,QAAAA,EAAsB,KAAK,QAAOupB,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB,EAAE,IAAI;AAEjE,WAAO,MAAMlE,GAAS,KAAK,YAAY,KAAK,QAAQ;AAAA,MAClD,QAAA1jB;AAAA,MACA,WAAA4oB;AAAA,MACA,GAAG/qB;AAAA,IAAA,CACJ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgBd,GAA8B;;AAC5C,QAAI,GAACqB,IAAA,KAAK,QAAQ,SAAb,QAAAA,EAAmB,KAAI;AAC1B,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AAEI,QAAA,CAACrB,EAAQ,YAAY;AACvB,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AAEA,UAAM8rB,IAAe;AAAA,MACnB,YAAY9rB,EAAQ;AAAA,MACpB,WACEA,EAAQ,eACPuB,IAAA,KAAK,QAAQ,YAAb,QAAAA,EAAsB,KACnB,QAAOD,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAsB,EAAE,IAC/B;AAAA,MACN,QAAQ;AAAA,IAAA;AAKV,eAAW,MAAM;AACf+lB,MAAAA,GAA6B;AAAA,QAC3B,KAAKrnB,EAAQ;AAAA,QACb,OAAOA,EAAQ;AAAA,QACf,UAAUA,EAAQ,YAAY,KAAK,uBAAuB;AAAA,QAC1D,cACEA,EAAQ,gBAAgB,KAAK,uBAAuB;AAAA,QACtD,wBAAwBA,EAAQ;AAAA,QAChC,SAASA,EAAQ;AAAA,QACjB,WAAWA,EAAQ;AAAA,QACnB,eAAe,OAAOuM,MAAS;AACvB,gBAAA/L,IAAM,MAAM,KAAK,SAAS;AAAA,YAC9B,GAAGsrB;AAAA,YACH,GAAGvf;AAAA,UAAA,CACJ;AAED,iBAAI/L,IAEK,EAAE,aADI,MAAMA,EAAI,QACG,eAErB,EAAE,YAAY;QACvB;AAAA,QACA,UAAU,OAAO+L,MAAS;;AAExB,gBAAM,KAAK,SAAS;AAAA,YAClB,GAAGuf;AAAA,YACH,GAAGvf;AAAA,UAAA,CACJ,IAEDlL,IAAArB,EAAQ,kBAAR,QAAAqB,EAAA,KAAArB,GAAwBuM;AAAA,QAC1B;AAAA,MAAA,CACD;AAAA,OACA,CAAC;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAA2B;AAClB,WAAA,KAAK,eAAe;EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWhP,GAAsB;AAC/B,UAAMoI,IAAI,KAAK,YAAY,EAAEpI,CAAG,GAG1BwuB,IAAO,MACP9rB,KAAQ0F,KAAA,gBAAAA,EAAG,uBAAqBA,KAAA,gBAAAA,EAAG,cAAa,IAChDiG,IAASjG,KAAA,QAAAA,EAAG,SACd;AAAA,MACE,KAAKA,EAAE,OAAO;AAAA,MACd,SAASA,EAAE,OAAO;AAAA,IAAA,IAEpB,EAAE,KAAK,QAAW,SAAS,OAAU;AAElC,WAAA;AAAA,MACL,IAAI,YAAY;AACd,eAAAomB,EACG,eAAe;AAAA,UACd,QAAQ;AAAA,UACR,KAAAxuB;AAAA,UACA,SAASoI,KAAA,gBAAAA,EAAG;AAAA,UACZ,uBAAuBA,KAAA,gBAAAA,EAAG;AAAA,UAC1B,sBAAsBA,KAAA,gBAAAA,EAAG;AAAA,UACzB,OAAA1F;AAAA,QAAA,CACD,EACA,MAAM,MAAM;AAAA,QAAA,CAEZ,GACIA;AAAA,MACT;AAAA,MACA,IAAI,SAAS;;AACX,eAAA8rB,EACG,eAAe;AAAA,UACd,QAAQ;AAAA,UACR,KAAAxuB;AAAA,UACA,UAAS8D,IAAAsE,KAAA,gBAAAA,EAAG,WAAH,gBAAAtE,EAAW;AAAA,UACpB,wBAAuBE,IAAAoE,KAAA,gBAAAA,EAAG,WAAH,gBAAApE,EAAW;AAAA,UAClC,uBAAsBD,IAAAqE,KAAA,gBAAAA,EAAG,WAAH,gBAAArE,EAAW;AAAA,UACjC,QAAOqE,KAAA,gBAAAA,EAAG,WAAU;AAAA,YAClB,KAAKA,EAAE,OAAO;AAAA,YACd,SAASA,EAAE,OAAO;AAAA,UACpB;AAAA,QAAA,CACD,EACA,MAAM,MAAM;AAAA,QAAA,CAEZ,GAEIiG;AAAA,MACT;AAAA,MACA,OAAO,MAAM,KAAK,MAAMrO,CAAG;AAAA,MAC3B,iBAAiB,CACfyC,MACG;AACH,aAAK,gBAAgB;AAAA,UACnB,YAAYzC;AAAA,UACZ,GAAGyC;AAAA,QAAA,CACJ;AAAA,MACH;AAAA,MACA,mBAAmB,KAAK,eAAe,mBAAmBzC,CAAG;AAAA,MAC7D,qBAAqBqE,GAA2B;AACzC,QAAAmqB,EAAA,eAAe,mBAAmBxuB,GAAKqE,CAAS;AAAA,MACvD;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,eAAejB,GAAwB;AAC7C,WAAO,KAAK,eAAe,eAAeA,GAAY,MAAM;AAC1D,WAAK,MAAM;AAAA,QACTA,EAAW,UAAU,iBAAiB,gBAAgB;AAAA,QACtDA;AAAA,MAAA,GAEG,KAAA,MAAM,QAAQ,SAASA,CAAU;AAAA,IAAA,CACvC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO;AACX,IAAI,KAAK,iBAEP,MAAM,KAAK,kBACX,KAAK,aAAa,SAGpB,KAAK,eAAe;EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAO;AACf,QAAA,CAAC,KAAK,QAAQ,MAAM;AACtB,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AAEI,QAAA,KAAK,OAAO;AACd;AAGF,UAAM,EAAE,IAAAonB,GAAI,GAAGxlB,EAAW,IAAI,KAAK,QAAQ,MACrCzB,IAAgB;AAAA,MACpB,QAAQ,OAAOinB,CAAE;AAAA,MACjB,YAAAxlB;AAAA,IAAA,GAEI/B,IAAM,MAAM,KAAK,WAAW,KAAK,EAAE,MAAM,SAAS,MAAMM,EAAS,CAAA;AAClE,gBAAA,OAAO,MAAM,aAAaN,CAAG,GAElC,KAAK,MAAM,QAAQ,QAAQ,KAAK,QAAQ,IAAI,GACrCA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU;AAClB,QAAA,CAAC,KAAK,QAAQ,MAAM;AACtB,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AAEI,QAAA,CAAC,KAAK,QAAQ,SAAS;AACzB,WAAK,OAAO;AAAA,QACV;AAAA,MAAA;AAEF;AAAA,IACF;AAEI,QAAA,KAAK,OAAO;AACd;AAGF,UAAM,EAAE,IAAAunB,GAAI,GAAGxlB,EAAW,IAAI,KAAK,QAAQ,SACrCzB,IAAmB;AAAA,MACvB,QAAQ,OAAO,KAAK,QAAQ,KAAK,EAAE;AAAA,MACnC,WAAW,OAAOinB,CAAE;AAAA,MACpB,YAAAxlB;AAAA,IAAA,GAGI/B,IAAM,MAAM,KAAK,WAAW,KAAK,EAAE,MAAM,YAAY,MAAMM,EAAS,CAAA;AACrE,gBAAA,OAAO,MAAM,gBAAgBN,CAAG,GACrC,KAAK,MAAM,QAAQ,WAAW,KAAK,QAAQ,OAAO,GAC3CA;AAAA,EACT;AACF;","x_google_ignoreList":[5,9,11,12,13,14,15]}