@adhese/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/devtools.js +1786 -0
- package/dist/cjs/devtools.js.map +1 -0
- package/dist/cjs/index.js +1012 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/es/devtools.js +1766 -0
- package/dist/es/devtools.js.map +1 -0
- package/dist/es/index.js +1012 -0
- package/dist/es/index.js.map +1 -0
- package/dist/index.d.ts +734 -0
- package/dist/style.css +47 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../../utils/src/eventManager/eventManager.ts","../../../core/src/slot/findDomSlots/findDomSlots.ts","../../../core/src/slot/slotManager/slotManager.ts","../../../core/src/consent/tcfConsent.ts","../../../core/src/queryDetector/queryDetector.ts","../../../logger/src/createLogger/createLogger.ts","../../../core/src/logger/logger.ts","../../../core/src/main.utils.ts","../../../core/src/main.ts","../../../core/src/impressionTracking/impressionTracking.ts","../../../core/src/slot/createSlot/createSlot.utils.ts","../../../core/src/slot/createSlot/createSlot.ts","../../../core/src/requestAds/requestAds.schema.ts","../../../core/src/requestAds/requestAds.preview.ts","../../../core/src/requestAds/requestAds.utils.ts","../../../core/src/requestAds/requestAds.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","import { type AdheseContext, type AdheseSlot, createSlot } from '@core';\nimport { waitForDomLoad } from '@utils';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return (await Promise.all(Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter(element => Boolean(element.dataset.format))\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.getName() === slot.getName()));\n}\n","import type { Merge } from '@utils';\nimport { type AdheseContext, type AdheseSlot, type AdheseSlotOptions, createSlot, logger } from '@core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Promise<Readonly<AdheseSlot>>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport async function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Promise<Readonly<SlotManager>> {\n const slots = new Map<string, AdheseSlot>();\n\n await Promise.allSettled(initialSlots.map(async slot => add({\n ...slot,\n lazyLoading: false,\n })));\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n async function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Promise<Readonly<AdheseSlot>> {\n const slot = await createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n onNameChange,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.getName());\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n slots.set(slot.getName(), slot);\n\n function onNameChange(newName: string, previousName: string): void {\n slots.set(newName, slot);\n slots.delete(previousName);\n\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots) {\n slots.set(slot.getName(), slot);\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { debounce } from 'lodash-es';\nimport { logger } from '@core';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, 50);\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","import { createEventManager } from '@utils';\nimport { uniqueId } from 'lodash-es';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import { random } from 'lodash-es';\nimport { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): MapWithEvents<string, string | ReadonlyArray<string>> {\n const parameters = new MapWithEvents<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: random(10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n\nexport class MapWithEvents<T, U> extends Map<T, U> {\n private readonly listeners = new Set<() => void>();\n\n public addEventListener(listener: () => void): void {\n this.listeners.add(listener);\n }\n\n public removeEventListener(listener: () => void): void {\n this.listeners.delete(listener);\n }\n\n public set(key: T, value: U): this {\n const set = super.set(key, value);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return set;\n }\n\n public clear(): void {\n super.clear();\n\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n public delete(key: T): boolean {\n const deleted = super.delete(key);\n\n this.listeners.forEach((listener) => {\n listener();\n });\n\n return deleted;\n }\n\n /**\n * Remove all listeners and clear the map.\n */\n public dispose(): void {\n this.listeners.clear();\n super.clear();\n }\n}\n","import { createEventManager } from '@utils';\nimport { type AdheseSlot, type AdheseSlotOptions, logger, requestAd, requestAds } from '@core';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\n\nasync function createDevtools(context: AdheseContext): Promise<() => void> {\n const devtools = await import('@devtools');\n\n const wrapperElement = document.createElement('div');\n document.body.appendChild(wrapperElement);\n\n const unmount = devtools.createAdheseDevtools(wrapperElement, context);\n\n return () => {\n unmount();\n wrapperElement.outerHTML = '';\n };\n}\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport async function createAdhese(options: AdheseOptions): Promise<Readonly<Adhese>> {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n eagerRendering: false,\n viewabilityTracking: true,\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = new Proxy<AdheseContext>({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n }, {});\n\n context.events = createEventManager();\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n context.parameters.addEventListener(onParametersChange);\n\n let unmountDevtools: (() => void) | undefined;\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n unmountDevtools = await createDevtools(context);\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = await createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll();\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n async function addSlot(slotOptions: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const slot = await slotManager.add(slotOptions);\n\n if (!slot.lazyLoading) {\n const ad = await requestAd({\n slot,\n host: mergedOptions.host,\n parameters: context.parameters,\n account: mergedOptions.account,\n context,\n });\n\n await slot.setAd(ad);\n }\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots()).filter(slot => !slot.lazyLoading);\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots: domSlots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug && !unmountDevtools) {\n // eslint-disable-next-line require-atomic-updates\n unmountDevtools = await createDevtools(context);\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n }\n else {\n logger.debug('Debug mode disabled');\n unmountDevtools?.();\n unmountDevtools = undefined;\n logger.setMinLogLevelThreshold('info');\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = slotManager.getAll().filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n host: mergedOptions.host,\n slots,\n method: mergedOptions.requestType,\n account: mergedOptions.account,\n parameters: context.parameters,\n context,\n });\n\n await Promise.allSettled(ads.map(ad => slotManager.get(ad.slotName)?.setAd(ad)));\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n if (slotManager.getAll().length > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.dispose();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n unmountDevtools?.();\n logger.info('Adhese instance disposed');\n }\n\n if (mergedOptions.findDomSlotsOnLoad)\n await slotManager.findDomSlots();\n\n return {\n ...mergedOptions,\n ...slotManager,\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n };\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import type { Ad } from '@core';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${ad.tag}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : '100%';\n iframe.style.height = ad.height ? `${ad.height}px` : '100%';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.style.width = ad.width ? `${ad.width}px` : '100%';\n element.style.height = ad.height ? `${ad.height}px` : '100%';\n\n element.innerHTML = ad.tag;\n}\n","import { type Ad, logger, requestAd } from '@core';\nimport { waitForDomLoad } from '@utils';\nimport { round } from 'lodash-es';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { renderIframe, renderInline } from './createSlot.utils';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport async function createSlot(options: AdheseSlotOptions): Promise<Readonly<AdheseSlot>> {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n await waitForDomLoad();\n\n const parameters = new Map(Object.entries(options.parameters ?? {}));\n\n let format: string;\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format === 'string') {\n // eslint-disable-next-line prefer-destructuring\n format = options.format;\n }\n else {\n queryDetector = createQueryDetector({\n onChange: setFormat,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n\n format = queryDetector.getQuery();\n }\n\n async function setFormat(newFormat: string): Promise<void> {\n const oldName = getName();\n\n format = newFormat;\n options.onNameChange?.(getName(), oldName);\n\n const newAd = await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n cleanElement();\n\n await setAd(newAd);\n }\n\n function getFormat(): string {\n return format;\n }\n\n let element: HTMLElement | null = typeof containingElement === 'string' || !containingElement\n ? document.querySelector<HTMLElement>(`.adunit[data-format=\"${format}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`)\n : containingElement;\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element?.querySelector('iframe') ?? null;\n\n return element?.innerHTML ? (element.firstElementChild as HTMLElement) : null;\n }\n\n let impressionTrackingPixelElement: HTMLImageElement | null = null;\n let viewabilityTrackingPixelElement: HTMLImageElement | null = null;\n\n let isInViewport = false;\n\n let ad: Ad | null = null;\n function getAd(): Ad | null {\n return ad;\n }\n\n async function setAd(newAd: Ad): Promise<void> {\n ad = newAd;\n\n if (isInViewport || context.options.eagerRendering)\n await render(ad);\n\n if (element) {\n element.style.width = `${ad.width}px`;\n element.style.height = `${ad.height}px`;\n }\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n }\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport) {\n (async (): Promise<void> => {\n if (!ad && options.lazyLoading)\n await render();\n\n else if (ad)\n await render(ad);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !viewabilityTrackingPixelElement && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad?.viewableImpressionCounter) {\n viewabilityTrackingPixelElement = addTrackingPixel(ad.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${getName()}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n if (element && context.options.viewabilityTracking)\n viewabilityObserver.observe(element);\n\n if (element)\n renderIntersectionObserver.observe(element);\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n\n // eslint-disable-next-line require-atomic-updates\n ad = adToRender ?? ad ?? await requestAd({\n slot: {\n getName,\n parameters,\n },\n account: context.options.account,\n host: context.options.host,\n parameters: context.parameters,\n context,\n });\n\n if (!element) {\n const error = `Could not create slot for format ${format}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.style.position = 'relative';\n\n renderFunctions[renderMode](ad, element);\n\n if (ad?.impressionCounter && !impressionTrackingPixelElement) {\n impressionTrackingPixelElement = addTrackingPixel(ad.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${getName()}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n renderIntersectionObserver.disconnect();\n\n await context.events?.changeSlots.dispatchAsync(Array.from(context.getAll?.() ?? []));\n\n return element;\n }\n\n function cleanElement(): void {\n if (!element)\n return;\n\n element.innerHTML = '';\n element.style.position = '';\n element.style.width = '';\n element.style.height = '';\n }\n\n function getName(): string {\n return `${context.location}${slot ? `${slot}` : ''}-${format}`;\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement?.remove();\n viewabilityTrackingPixelElement?.remove();\n\n element = null;\n ad = null;\n\n renderIntersectionObserver.disconnect();\n viewabilityObserver.disconnect();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n }\n\n function isViewabilityTracked(): boolean {\n return Boolean(viewabilityTrackingPixelElement);\n }\n\n function isImpressionTracked(): boolean {\n return Boolean(impressionTrackingPixelElement);\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n setFormat,\n getFormat,\n render,\n getElement,\n getName,\n getAd,\n setAd,\n isViewabilityTracked,\n isImpressionTracked,\n dispose,\n };\n}\n","import { type TypeOf, type ZodType, coerce, lazy, literal, object, string, union, unknown } from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\nconst baseAdResponseScheme = object({\n adDuration: numberLike.optional(),\n adDuration2nd: numberLike.optional(),\n adDuration3rd: numberLike.optional(),\n adDuration4th: numberLike.optional(),\n adDuration5th: numberLike.optional(),\n adDuration6th: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: string().optional(),\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n dm: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n extraField1: string().optional(),\n extraField2: string().optional(),\n height: numberLike.optional(),\n height3rd: numberLike.optional(),\n height4th: numberLike.optional(),\n height5th: numberLike.optional(),\n height6th: numberLike.optional(),\n heightLarge: numberLike.optional(),\n id: string().optional(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: string().optional(),\n originData: unknown().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n swfSrc2nd: string().optional(),\n swfSrc3rd: string().optional(),\n swfSrc4th: string().optional(),\n swfSrc5th: string().optional(),\n swfSrc6th: string().optional(),\n tag: string(),\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n width3rd: numberLike.optional(),\n width4th: numberLike.optional(),\n width5th: numberLike.optional(),\n width6th: numberLike.optional(),\n widthLarge: numberLike.optional(),\n});\nexport type AdResponse = TypeOf<typeof baseAdResponseScheme> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n};\nconst adResponseSchema: ZodType<AdResponse> = baseAdResponseScheme.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\nexport type Ad = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<Ad> | string;\n};\nexport const adSchema: ZodType<Ad> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n","import { type Ad, logger } from '@core';\nimport { adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat());\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { type AdRequestOptions, logger } from '@core';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n host,\n ...options\n}: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: slot.getName(),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: options.parameters && parseParameters(options.parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet(options: Omit<AdRequestOptions, 'method' | 'context'>): Promise<Response> {\n return fetch(new URL(`${options.host}/json/sl${options.slots.map(slot => slot.getName()).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }));\n}\n","import type { UrlString } from '@utils';\nimport { type Adhese, type AdheseSlot, logger } from '@core';\nimport { type Ad, adSchema } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<Pick<AdheseSlot, 'getName' | 'parameters'>>;\n /**\n * Host that you want to fetch the ads from\n */\n host: UrlString;\n /**\n * The Adhese account name.\n */\n account: string;\n /**\n * Request method to use for the requestAds\n *\n * @default 'POST'\n */\n method?: 'GET' | 'POST' | 'get' | 'post';\n /**\n * The parameters that are used for all ads.\n */\n parameters?: Map<string, ReadonlyArray<string> | string>;\n context: Partial<Adhese>;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds({\n method = 'POST',\n context,\n ...options\n}: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n method,\n });\n\n const [response, previews] = await Promise.all([method?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = adSchema.array().parse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult: ReadonlyArray<Ad> = [\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ];\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: Pick<AdheseSlot, 'getName' | 'parameters'>;\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n"],"names":["_a","_b","findDomSlots","extFindDomSlots","debounce","uniqueId","random","round","union","coerce","literal","object","string","unknown","lazy"],"mappings":";;;;;;;;;;AAAA,eAAsB,iBAAgC;AAC7C,SAAA,IAAI,QAAQ,CAAC,YAAY;AAC9B,aAAS,YAAkB;AACjB;AACD,aAAA,oBAAoB,oBAAoB,SAAS;AAAA,IAC1D;AAEA,QAAI,SAAS,eAAe;AACjB,eAAA,iBAAiB,oBAAoB,SAAS;AAAA;AAE/C;EAAA,CACX;AACH;AC+BO,SAAS,qBAGU;AAClB,QAAA,kCAAkB;AAExB,WAAS,UAAgB;AACvB,eAAW,cAAc;AACZ;EACf;AAEA,SAAO,IAAI,MAA4B;AAAA,IACrC;AAAA,EAAA,GACyB;AAAA;AAAA,IAEzB,IAAI,QAAQ,KAAK,UAAU;AACzB,UAAI,EAAE,OAAO,WAAW,OAAO,QAAQ,UAAU;AAC/C,cAAM,QAAQ;AAEd,oBAAY,IAAI,MAAM;AACpB,gBAAM,UAAU;QAAM,CACvB;AAED,gBAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,MAC1C;AAEA,aAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC1C;AAAA,EAAA,CACD;AACH;AAEA,SAAS,cAA2B;AAC5B,QAAA,gCAAgB;AAEtB,WAAS,SAAS,MAAe;AAC/B,eAAW,YAAY;AAErB,WAAK,SAAS,IAAI;AAAA,EACtB;AAEA,iBAAe,cAAc,MAAwB;AACnD,UAAM,QAAQ;AAAA,MACZ,MAAM,KAAK,SAAS,EAAE,IAAI,CAAY,aAAA,SAAS,IAAI,CAAC;AAAA,IAAA;AAAA,EAExD;AAEA,WAAS,YAAY,UAAmD;AACtE,cAAU,IAAI,QAAQ;AAAA,EACxB;AAEA,WAAS,eAAe,UAAmD;AACzE,cAAU,OAAO,QAAQ;AAAA,EAC3B;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AClGA,eAAsB,aACpB,SACoC;AACpC,QAAM,eAAe;AAEb,UAAA,MAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,iBAA8B,SAAS,CAAC,EACnF,OAAO,CAAW,YAAA,QAAQ,QAAQ,QAAQ,MAAM,CAAC,EACjD,IAAI,aAAW,WAAW;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,mBAAmB;AAAA,IACnB,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,EAAA,CACD,CAAC,CAAC,GACF,OAAO,CAAA,SAAQ;;AAAA,cAAC,aAAQ,WAAR,iCAAmB,KAAK,gBAAc,WAAW,QAAA,MAAc,KAAK,QAAS;AAAA,GAAC;AACnG;ACiBA,eAAsB,kBAAkB;AAAA,EACtC,eAAe,CAAC;AAAA,EAChB;AACF,GAAuD;AAC/C,QAAA,4BAAY;AAElB,QAAM,QAAQ,WAAW,aAAa,IAAI,OAAM,SAAQ,IAAI;AAAA,IAC1D,GAAG;AAAA,IACH,aAAa;AAAA,EACd,CAAA,CAAC,CAAC;AAEH,WAAS,SAAoC;AACpC,WAAA,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,CAAG,EAAA,IAAI,MAAM,IAAI;AAAA,EACjD;AAEA,iBAAe,IAAI,SAA2G;;AACtH,UAAA,OAAO,MAAM,WAAW;AAAA,MAC5B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,aAAS,YAAkB;;AACnB,YAAA,OAAO,KAAK,QAAS,CAAA;AAC3B,aAAO,MAAM,gBAAgB;AAAA,QAC3B;AAAA,QACA,OAAO,MAAM,KAAK,KAAK;AAAA,MAAA,CACxB;AACO,OAAAA,MAAA,QAAA,WAAA,gBAAAA,IAAQ,WAAW,SAAS;AAC5B,OAAAC,MAAA,QAAA,WAAA,gBAAAA,IAAQ,YAAY,SAAS,MAAM,KAAK,MAAM,OAAQ,CAAA;AAAA,IAChE;AAEA,UAAM,IAAI,KAAK,QAAQ,GAAG,IAAI;AAErB,aAAA,aAAa,SAAiB,cAA4B;;AAC3D,YAAA,IAAI,SAAS,IAAI;AACvB,YAAM,OAAO,YAAY;AAEjB,OAAAD,MAAA,QAAA,WAAA,gBAAAA,IAAQ,YAAY,SAAS,MAAM,KAAK,MAAM,OAAQ,CAAA;AAAA,IAChE;AAEA,WAAO,MAAM,cAAc;AAAA,MACzB;AAAA,MACA,OAAO,MAAM,KAAK,MAAM,QAAQ;AAAA,IAAA,CACjC;AAEO,kBAAA,WAAA,mBAAQ,QAAQ,SAAS;AACzB,kBAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,KAAK,MAAM,OAAQ,CAAA;AAEvD,WAAA;AAAA,EACT;AAEA,iBAAeE,iBAAmD;;AAChE,UAAM,WAAW,MAAMC;AAAAA,MACrB;AAAA,IAAA;AAGF,eAAW,QAAQ,UAAU;AAC3B,YAAM,IAAI,KAAK,QAAQ,GAAG,IAAI;AACtB,oBAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,KAAK,MAAM,OAAQ,CAAA;AAAA,IAChE;AAEO,WAAA;AAAA,EACT;AAEA,WAAS,IAAI,MAAsC;AAC1C,WAAA,MAAM,IAAI,IAAI;AAAA,EACvB;AAEA,WAAS,UAAgB;;AACZ,eAAA,QAAQ,MAAM,OAAO;AAC9B,WAAK,QAAQ;AAEf,UAAM,MAAM;AACJ,kBAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,KAAK,MAAM,OAAQ,CAAA;AAAA,EAChE;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IAAA,cACAD;AAAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AClHO,SAAS,mBAAmB,UAAmE;;AAC7F,eAAA,aAAA,gCAAW,oBAAoB,GAAG;AAEzC,SAAO,MAAA;;AAAM,YAAAF,MAAA,OAAO,aAAP,gBAAAA,IAAA,aAAkB,uBAAuB,GAAG;AAAA;AAC3D;ACkBO,SAAS,oBACd;AAAA,EACE;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF,IAA2B,IACZ;AACf,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,WAAW,KAAK,CAAC,CAAC;AAAA,EAAA;AAG/E,WAAS,WAAmB;AAC1B,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjD,UAAA,OAAO,WAAW,KAAK,EAAE;AACpB,eAAA;AAAA,IACX;AAEO,WAAA;AAAA,EACT;AAEM,QAAA,iBAAiBI,SAAAA,SAAS,MAAY;AAErC,UAAA,qCAAW;AAEhB,WAAO,MAAM,iBAAiB,SAAU,CAAA,EAAE;AAAA,KACzC,EAAE;AAEL,MAAI,UAAU;AACD,eAAA,SAAS,SAAS,OAAO;AAC5B,YAAA,iBAAiB,UAAU,cAAc;AAAA,EACnD;AAEA,WAAS,UAAgB;AACZ,eAAA,SAAS,SAAS,OAAO;AAC5B,YAAA,oBAAoB,UAAU,cAAc;AAAA,EACtD;AAEO,SAAA;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAEJ;ACWA,MAAM,mBAAmB,CAAC,SAAS,SAAS,QAAQ,QAAQ,OAAO;AAK5D,SAAS,aAAkF;AAAA,EAChG;AAAA,EACA,YAAY;AAAA,EACZ,uBAAuB,UAAU,CAAC;AACpC,GAAmC;AAC3B,QAAA,2BAAW;AACjB,MAAI,8BAAiC;AACrC,QAAM,SAAS;AAKf,QAAM,eAAe,OAAO,YAAY,UAAU,IAAI,CAAC,OAAO,UAAU;AAChE,UAAA,cAA2B,CAAC,SAAS,eAAe;AACxD,WAAK,IAAI;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,IAAIC,SAAAA,SAAS;AAAA,MAAA,CACd;AAED,aAAO,IAAI,SAAS;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,IAAIA,SAAAA,SAAS;AAAA,MAAA,CACd;AAED,UAAI,SAAS,UAAU,QAAQ,2BAA2B,GAAG;AAC3D,YAAK,CAAC,QAAQ,SAAS,OAAO,EAA4B,SAAS,KAAK,GAAG;AAEjE,kBAAA,KAAwC,EAAE,GAAG;AAAA,YACnD,KAAK,KAAK;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,OAAO,OAAO,CAAC;AAAA,QAAA,OAEd;AAEH,kBAAQ,IAAI,GAAG;AAAA,YACb,KAAK,KAAK,MAAM,MAAM,YAAa,CAAA;AAAA,YACnC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,OAAO,OAAO,CAAC;AAAA,QACnB;AAAA,MACF;AAAA,IAAA;AAGK,WAAA,CAAC,OAAO,WAAW;AAAA,EAC3B,CAAA,CAAC;AAIK,SAAA;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,wBAAwB,OAAgB;AACR,oCAAA;AAAA,IAChC;AAAA,IACA,4BAAkC;AACF,oCAAA;AAAA,IAChC;AAAA,IACA,0BAA6B;AACpB,aAAA;AAAA,IACT;AAAA,IACA,UAAiC;AACxB,aAAA,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,IACA,YAAkB;AAChB,aAAO,MAAM;AACb,WAAK,MAAM;AAAA,IACb;AAAA,EAAA;AAEJ;AC1KO,MAAM,SAAS,aAAa;AAAA,EACjC,OAAO;AACT,CAAC;ACEe,SAAA,iBACd,SACA,eACuD;AACjD,QAAA,aAAa,IAAI;AAEvB,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,SAAS,QAAQ,CAAC;AAE9C,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,OAAO,SAAS,IAAI,CAAC;AAEjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ;AAAA,IACxC,GAAG,QAAQ,cAAc,CAAC;AAAA,IAC1B,IAAI,QAAQ,UAAU,QAAQ;AAAA,IAC9B,IAAI,cAAc,SAAS;AAAA,IAC3B,IAAI,cAAc,SAAS;AAAA,IAC3B,IAAIC,SAAA,OAAO,GAAM,EAAE,SAAS;AAAA,EAAA,CAC7B;AACY,eAAA,IAAI,KAAK,KAAK;AAEpB,SAAA;AACT;AAEO,SAAS,aAAa,eAA+C;AAC1E,MAAI,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,GAAG;AAC/E,WAAO,wBAAwB,OAAO;AACtC,WAAO,MAAM,uBAAuB;AAAA,EACtC;AAEA,SAAO,MAAM,+BAA+B;AAAA,IAC1C;AAAA,EAAA,CACD;AACH;AAEO,SAAS,gBAAyB;AACvC,SAAO,OAAO,SAAS,OAAO,SAAS,yBAAyB;AAClE;AAEO,MAAM,sBAA4B,IAAU;AAAA,EAA5C;AAAA;AACY,yDAAgB;;EAE1B,iBAAiB,UAA4B;AAC7C,SAAA,UAAU,IAAI,QAAQ;AAAA,EAC7B;AAAA,EAEO,oBAAoB,UAA4B;AAChD,SAAA,UAAU,OAAO,QAAQ;AAAA,EAChC;AAAA,EAEO,IAAI,KAAQ,OAAgB;AACjC,UAAM,MAAM,MAAM,IAAI,KAAK,KAAK;AAE3B,SAAA,UAAU,QAAQ,CAAC,aAAa;AAC1B;IAAA,CACV;AAEM,WAAA;AAAA,EACT;AAAA,EAEO,QAAc;AACnB,UAAM,MAAM;AAEP,SAAA,UAAU,QAAQ,CAAC,aAAa;AAC1B;IAAA,CACV;AAAA,EACH;AAAA,EAEO,OAAO,KAAiB;AACvB,UAAA,UAAU,MAAM,OAAO,GAAG;AAE3B,SAAA,UAAU,QAAQ,CAAC,aAAa;AAC1B;IAAA,CACV;AAEM,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,SAAK,UAAU;AACf,UAAM,MAAM;AAAA,EACd;AACF;ACnFA,eAAe,eAAe,SAA6C;AACnE,QAAA,WAAW,MAAM,QAAO,QAAA,EAAA,KAAA,MAAA,QAAA,eAAW;AAEnC,QAAA,iBAAiB,SAAS,cAAc,KAAK;AAC1C,WAAA,KAAK,YAAY,cAAc;AAExC,QAAM,UAAU,SAAS,qBAAqB,gBAAgB,OAAO;AAErE,SAAO,MAAM;AACH;AACR,mBAAe,YAAY;AAAA,EAAA;AAE/B;AAwBA,eAAsB,aAAa,SAAmD;AACpF,QAAM,gBAAgB;AAAA,IACpB,MAAM,eAAe,QAAQ,OAAO;AAAA,IACpC,UAAU,gBAAgB,QAAQ,OAAO;AAAA,IACzC,UAAU;AAAA,IACV,aAAa;AAAA,IACb,OAAO;AAAA,IACP,cAAc,CAAC;AAAA,IACf,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,GAAG;AAAA,EAAA;AAEL,eAAa,aAAa;AAEpB,QAAA,UAAU,IAAI,MAAqB;AAAA,IACvC,UAAU,cAAc;AAAA,IACxB,SAAS,cAAc;AAAA,IACvB,OAAO,cAAc;AAAA,IACrB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,GAAG,CAAE,CAAA;AAEL,UAAQ,SAAS;AAEjB,WAAS,cAAuC;AAC9C,WAAO,QAAQ;AAAA,EACjB;AAEA,WAAS,YAAY,aAA2B;;AAC9C,YAAQ,WAAW;AACX,kBAAA,WAAA,mBAAQ,eAAe,SAAS;AAAA,EAC1C;AAEA,QAAM,gBAAgB,oBAAoB;AAAA,IACxC,UAAU;AAAA,IACV,SAAS,cAAc;AAAA,EAAA,CACxB;AAEO,UAAA,aAAa,iBAAiB,eAAe,aAAa;AAC1D,UAAA,WAAW,iBAAiB,kBAAkB;AAElD,MAAA;AACA,MAAA,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,KAAK,cAAc;AAC7E,sBAAA,MAAM,eAAe,OAAO;AAEhD,WAAS,qBAA2B;;AAClC,QAAI,QAAQ;AACV,oBAAQ,WAAR,mBAAgB,iBAAiB,SAAS,QAAQ;AAAA,EACtD;AAEA,iBAAe,gBAA+B;;AACtC,UAAA,QAAQ,cAAc;AACpB,kBAAA,eAAA,mBAAY,IAAI,MAAM;AACtB,kBAAA,eAAA,mBAAY,IAAI,MAAM;AAE9B,UAAM,uBAAuB;AAAA,EAC/B;AAEA,WAAS,aAAqC;AAC5C,WAAO,QAAQ;AAAA,EACjB;AAEA,WAAS,WAAW,YAA2B;;AAC7C,kBAAQ,eAAR,mBAAoB,IAAI,MAAM,aAAa,QAAQ;AACnD,YAAQ,UAAU;AAEV,kBAAA,WAAA,mBAAQ,cAAc,SAAS;AAAA,EACzC;AAEM,QAAA,cAAc,MAAM,kBAAkB;AAAA,IAC1C,cAAc,cAAc;AAAA,IAC5B;AAAA,EAAA,CACD;AAED,WAAS,SAAoC;AAC3C,WAAO,YAAY;EACrB;AAEA,WAAS,IAAI,MAAsC;AAC1C,WAAA,YAAY,IAAI,IAAI;AAAA,EAC7B;AAEA,iBAAe,QAAQ,aAA+D;AACpF,UAAM,OAAO,MAAM,YAAY,IAAI,WAAW;AAE1C,QAAA,CAAC,KAAK,aAAa;AACf,YAAA,KAAK,MAAM,UAAU;AAAA,QACzB;AAAA,QACA,MAAM,cAAc;AAAA,QACpB,YAAY,QAAQ;AAAA,QACpB,SAAS,cAAc;AAAA,QACvB;AAAA,MAAA,CACD;AAEK,YAAA,KAAK,MAAM,EAAE;AAAA,IACrB;AAEO,WAAA;AAAA,EACT;AAEA,iBAAeJ,gBAAmD;AAC1D,UAAA,YAAY,MAAM,YAAY,gBAAgB,OAAO,CAAA,SAAQ,CAAC,KAAK,WAAW;AAE9E,UAAA,MAAM,MAAM,WAAW;AAAA,MAC3B,MAAM,cAAc;AAAA,MACpB,OAAO;AAAA,MACP,QAAQ,cAAc;AAAA,MACtB,SAAS,cAAc;AAAA,MACvB,YAAY,QAAQ;AAAA,MACpB;AAAA,IAAA,CACD;AAED,UAAM,QAAQ,WAAW,IAAI,IAAI,CAAM,OAAA;;AAAA,+BAAY,IAAI,GAAG,QAAQ,MAA3B,mBAA8B,MAAM;AAAA,KAAG,CAAC;AAExE,WAAA;AAAA,EACT;AAEA,iBAAe,cAAgC;AACrC,YAAA,QAAQ,CAAC,QAAQ;AAErB,QAAA,QAAQ,SAAS,CAAC,iBAAiB;AAEnB,wBAAA,MAAM,eAAe,OAAO;AAC9C,aAAO,wBAAwB,OAAO;AACtC,aAAO,MAAM,oBAAoB;AAAA,IAAA,OAE9B;AACH,aAAO,MAAM,qBAAqB;AAChB;AACA,wBAAA;AAClB,aAAO,wBAAwB,MAAM;AAAA,IACvC;AAEA,WAAO,QAAQ;AAAA,EACjB;AAEA,iBAAe,yBAAwC;AAC/C,UAAA,QAAQ,YAAY,SAAS,OAAO,CAAQ,SAAA,CAAC,KAAK,WAAW;AAEnE,QAAI,MAAM,WAAW;AACnB;AAEI,UAAA,MAAM,MAAM,WAAW;AAAA,MAC3B,MAAM,cAAc;AAAA,MACpB;AAAA,MACA,QAAQ,cAAc;AAAA,MACtB,SAAS,cAAc;AAAA,MACvB,YAAY,QAAQ;AAAA,MACpB;AAAA,IAAA,CACD;AAED,UAAM,QAAQ,WAAW,IAAI,IAAI,CAAM,OAAA;;AAAA,+BAAY,IAAI,GAAG,QAAQ,MAA3B,mBAA8B,MAAM;AAAA,KAAG,CAAC;AAAA,EACjF;AAEM,QAAA,4BAA4B,mBAAmB,OAAO,SAAS;;AACnE,QAAI,CAAC,KAAK;AACR;AAEF,WAAO,MAAM,gCAAgC;AAAA,MAC3C;AAAA,IAAA,CACD;AAED,kBAAQ,eAAR,mBAAoB,IAAI,MAAM,KAAK;AAC3B,kBAAA,eAAA,mBAAY,OAAO;AAE3B,UAAM,uBAAuB;AAAA,EAAA,CAC9B;AAEG,MAAA,YAAY,SAAS,SAAS;AAChC,UAAM,uBAAuB,EAAE,MAAM,OAAO,KAAK;AAEnD,WAAS,UAAgB;;AACvB,kBAAc,QAAQ;AACtB,gBAAY,QAAQ;AACpB,kBAAc,QAAQ;AACI;AAC1B,kBAAQ,eAAR,mBAAoB;AACpB,kBAAQ,eAAR,mBAAoB;AACpB,WAAO,UAAU;AACjB,kBAAQ,WAAR,mBAAgB;AACE;AAClB,WAAO,KAAK,0BAA0B;AAAA,EACxC;AAEA,MAAI,cAAc;AAChB,UAAM,YAAY;AAEb,SAAA;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAAA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACrPO,SAAS,iBAAiB,KAAqC;AAC9D,QAAA,MAAM,SAAS,cAAc,KAAK;AAEpC,MAAA,MAAM,IAAI;AACd,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,WAAW;AACrB,MAAI,MAAM,MAAM;AAET,SAAA,SAAS,KAAK,YAAY,GAAG;AACtC;AChBgB,SAAA,aAAa,IAAQ,SAA4B;AACzD,QAAA,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAaN,GAAG,GAAG;AAAA;AAAA,QAEV,WAAW,QAAQ,GAAG,EAAE,KAAK;AAEnC,SAAO,MAAM,SAAS;AACtB,SAAO,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,KAAK,OAAO;AAClD,SAAO,MAAM,SAAS,GAAG,SAAS,GAAG,GAAG,MAAM,OAAO;AACrD,UAAQ,gBAAgB,MAAM;AAChC;AAEgB,SAAA,aAAa,IAAQ,SAA4B;AAC/D,UAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,KAAK,OAAO;AACnD,UAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,GAAG,MAAM,OAAO;AAEtD,UAAQ,YAAY,GAAG;AACzB;ACxBA,MAAM,kBAA8E;AAAA,EAClF,QAAQ;AAAA,EACR,QAAQ;AACV;AAKA,eAAsB,WAAW,SAA2D;;AACpF,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACX,IAAA;AACJ,QAAM,eAAe;AAEf,QAAA,aAAa,IAAI,IAAI,OAAO,QAAQ,QAAQ,cAAc,CAAE,CAAA,CAAC;AAE/D,MAAA;AACJ,MAAI,gBAAsC;AAEtC,MAAA,OAAO,QAAQ,WAAW,UAAU;AAEtC,aAAS,QAAQ;AAAA,EAAA,OAEd;AACH,oBAAgB,oBAAoB;AAAA,MAClC,UAAU;AAAA,MACV,SAAS,OAAO,YAAY,QAAQ,OAAO,IAAI,CAAQ,SAAA,CAAC,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,IAAA,CAClF;AAED,aAAS,cAAc;EACzB;AAEA,iBAAe,UAAU,WAAkC;;AACzD,UAAM,UAAU;AAEP,aAAA;AACD,KAAAF,MAAA,QAAA,iBAAA,gBAAAA,IAAA,cAAe,QAAQ,GAAG;AAE5B,UAAA,QAAQ,MAAM,UAAU;AAAA,MAC5B,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,QAAQ,QAAQ;AAAA,MACzB,MAAM,QAAQ,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,MACpB;AAAA,IAAA,CACD;AAEY;AAEb,UAAM,MAAM,KAAK;AAAA,EACnB;AAEA,WAAS,YAAoB;AACpB,WAAA;AAAA,EACT;AAEA,MAAI,UAA8B,OAAO,sBAAsB,YAAY,CAAC,oBACxE,SAAS,cAA2B,wBAAwB,MAAM,MAAM,iBAAiB,GAAG,OAAO,eAAe,IAAI,OAAO,EAAE,EAAE,IACjI;AACJ,WAAS,aAAiC;AACxC,QAAI,eAAe;AACV,cAAA,mCAAS,cAAc,cAAa;AAEtC,YAAA,mCAAS,aAAa,QAAQ,oBAAoC;AAAA,EAC3E;AAEA,MAAI,iCAA0D;AAC9D,MAAI,kCAA2D;AAE/D,MAAI,eAAe;AAEnB,MAAI,KAAgB;AACpB,WAAS,QAAmB;AACnB,WAAA;AAAA,EACT;AAEA,iBAAe,MAAM,OAA0B;;AACxC,SAAA;AAED,QAAA,gBAAgB,QAAQ,QAAQ;AAClC,YAAM,OAAO,EAAE;AAEjB,QAAI,SAAS;AACX,cAAQ,MAAM,QAAQ,GAAG,GAAG,KAAK;AACjC,cAAQ,MAAM,SAAS,GAAG,GAAG,MAAM;AAAA,IACrC;AAEM,YAAA,aAAQ,WAAR,mBAAgB,YAAY,cAAc,MAAM,OAAKA,MAAA,QAAQ,WAAR,gBAAAA,IAAA,kBAAsB,CAAA,CAAE;AAAA,EACrF;AAEA,QAAM,6BAA6B,IAAI,qBAAqB,CAAC,YAAY;AACvE,mBAAe,QAAQ,KAAK,CAAS,UAAA,MAAM,cAAc;AAEzD,QAAI,cAAc;AAChB,OAAC,YAA2B;AACtB,YAAA,CAAC,MAAM,QAAQ;AACjB,gBAAM,OAAO;AAAA,iBAEN;AACP,gBAAM,OAAO,EAAE;AAAA,MAChB,GAAA,EAAE,MAAM,OAAO,KAAK;AAAA,IACzB;AAAA,EAAA,GACC;AAAA,IACD,cAAY,aAAQ,uBAAR,mBAA4B,eAAc;AAAA,IACtD,WAAW;AAAA,EAAA,CACZ;AAED,MAAI,YAA2B;AACzB,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,GAAG,QAAQ,QAAQ;AAAA,EAAA;AAGrB,QAAM,sBAAsB,IAAI,qBAAqB,CAAC,CAAC,KAAK,MAAM;AAChE,QAAI,QAAQ,QAAQ,uBAAuB,CAAC,mCAAmC,IAAI;AACjF,YAAM,QAAQO,SAAA,MAAM,MAAM,mBAAmB,CAAC;AAE1C,UAAA,SAAS,aAAa,CAAC,WAAW;AAEpC,oBAAY,WAAW,MAAM;;AACf,sBAAA;AAEZ,cAAI,yBAAI,2BAA2B;AACC,8CAAA,iBAAiB,GAAG,yBAAyB;AAE/E,mBAAO,MAAM,wCAAwC,QAAS,CAAA,EAAE;AAExD,0BAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,OAAKP,MAAA,QAAQ,WAAR,gBAAAA,IAAA,kBAAsB,CAAE,CAAA;AAAA,UAC1E;AAAA,WACC,QAAQ;AAAA,MAAA,WAEJ,QAAQ,aAAa,WAAW;AACvC,qBAAa,SAAS;AACV,oBAAA;AAAA,MACd;AAAA,IACF;AAAA,EAAA,GACC;AAAA,IACD;AAAA,IACA,WAAW,MAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,GAAG,MAAM,IAAI,GAAG;AAAA,EAAA,CACxD;AAEG,MAAA,WAAW,QAAQ,QAAQ;AAC7B,wBAAoB,QAAQ,OAAO;AAEjC,MAAA;AACF,+BAA2B,QAAQ,OAAO;AAE5C,iBAAe,OAAO,YAAuC;;AAC3D,UAAM,eAAe;AAGhB,SAAA,cAAc,MAAM,MAAM,UAAU;AAAA,MACvC,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,QAAQ,QAAQ;AAAA,MACzB,MAAM,QAAQ,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,MACpB;AAAA,IAAA,CACD;AAED,QAAI,CAAC,SAAS;AACN,YAAA,QAAQ,oCAAoC,MAAM;AACjD,aAAA,MAAM,OAAO,OAAO;AACrB,YAAA,IAAI,MAAM,KAAK;AAAA,IACvB;AAEA,QAAI,QAAQ;AACV,cAAQ,MAAM,WAAW;AAEX,oBAAA,UAAU,EAAE,IAAI,OAAO;AAEnC,SAAA,yBAAI,sBAAqB,CAAC,gCAAgC;AAC3B,uCAAA,iBAAiB,GAAG,iBAAiB;AAEtE,aAAO,MAAM,uCAAuC,QAAS,CAAA,EAAE;AAAA,IACjE;AAEA,WAAO,MAAM,iBAAiB;AAAA,MAC5B,iBAAiB;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,IAAA,CACD;AAED,+BAA2B,WAAW;AAEhC,YAAA,aAAQ,WAAR,mBAAgB,YAAY,cAAc,MAAM,OAAKA,MAAA,QAAQ,WAAR,gBAAAA,IAAA,kBAAsB,CAAA,CAAE;AAE5E,WAAA;AAAA,EACT;AAEA,WAAS,eAAqB;AAC5B,QAAI,CAAC;AACH;AAEF,YAAQ,YAAY;AACpB,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,QAAQ;AACtB,YAAQ,MAAM,SAAS;AAAA,EACzB;AAEA,WAAS,UAAkB;AAClB,WAAA,GAAG,QAAQ,QAAQ,GAAG,OAAO,GAAG,IAAI,KAAK,EAAE,IAAI,MAAM;AAAA,EAC9D;AAEA,WAAS,UAAgB;;AACV;AAEb,qFAAgC;AAChC,uFAAiC;AAEvB,cAAA;AACL,SAAA;AAEL,+BAA2B,WAAW;AACtC,wBAAoB,WAAW;AAE/B,KAAAA,MAAA,QAAQ,cAAR,gBAAAA,IAAA;AAEA,mDAAe;AAAA,EACjB;AAEA,WAAS,uBAAgC;AACvC,WAAO,QAAQ,+BAA+B;AAAA,EAChD;AAEA,WAAS,sBAA+B;AACtC,WAAO,QAAQ,8BAA8B;AAAA,EAC/C;AAEO,SAAA;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ,eAAe;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACzQa,MAAA,aAAaQ,IAAAA,MAAM,CAACC,WAAO,OAAS,EAAA,MAAM,OAAO,GAAGC,IAAAA,QAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,CAAA,UAAS,UAAU,KAAK,SAAY,OAAO,KAAK,CAAC;AAC7H,MAAA,cAAcF,IAAAA,MAAM,CAACC,WAAO,QAAW,GAAAC,YAAQ,EAAE,CAAC,CAAC;AACzD,MAAM,UAAUF,IAAA,MAAM,CAACC,IAAA,OAAO,OAAO,GAAGC,YAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU;AAC5E,MAAA;AACK,WAAA,IAAI,IAAI,KAAK;AAAA,EAAA,QAEhB;AACG,WAAA;AAAA,EACT;AACF,CAAC;AACM,MAAM,WAAWF,IAAA,MAAM,CAACC,IAAA,OAAO,OAAO,GAAGC,YAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU;AACjF,MAAI,UAAU;AACL,WAAA;AAEH,QAAA,OAAO,IAAI,KAAK,WAAW,UAAU,KAAK,EAAE,UAAU,OAAO,KAAK,IAAI,KAAK;AAEjF,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS;AACtB,WAAA;AAEF,SAAA;AACT,CAAC;AACD,MAAM,uBAAuBC,IAAAA,OAAO;AAAA,EAClC,YAAY,WAAW,SAAS;AAAA,EAChC,eAAe,WAAW,SAAS;AAAA,EACnC,eAAe,WAAW,SAAS;AAAA,EACnC,eAAe,WAAW,SAAS;AAAA,EACnC,eAAe,WAAW,SAAS;AAAA,EACnC,eAAe,WAAW,SAAS;AAAA,EACnC,UAAUC,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,IAAAA,OAAO;AAAA,EACf,2BAA2B,QAAQ,SAAS;AAAA,EAC5C,2BAA2BA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7C,YAAY,SAAS,SAAS;AAAA,EAC9B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAYA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,SAAS,SAAS;AAAA,EAChC,cAAcA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAChC,SAASA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAa,YAAY,SAAS;AAAA,EAClC,MAAMA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACxB,UAAU,QAAQ,SAAS;AAAA,EAC3B,SAASA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC3B,cAAcA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAChC,iBAAiBA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACnC,mBAAmBA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACrC,IAAIA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACtB,KAAKA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACvB,WAAWD,IAAAA,OAAO;AAAA,IAChB,WAAWC,IAAAA,OAAO;AAAA,IAClB,QAAQC,IAAAA,QAAQ,EAAE,SAAS;AAAA,EAC5B,CAAA,EAAE,SAAS;AAAA,EACZ,aAAaD,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC/B,aAAaA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,WAAW,SAAS;AAAA,EAC5B,WAAW,WAAW,SAAS;AAAA,EAC/B,WAAW,WAAW,SAAS;AAAA,EAC/B,WAAW,WAAW,SAAS;AAAA,EAC/B,WAAW,WAAW,SAAS;AAAA,EAC/B,aAAa,WAAW,SAAS;AAAA,EACjC,IAAIA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACtB,mBAAmB,QAAQ,SAAS;AAAA,EACpC,OAAOA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACzB,SAASA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAeA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC1B,YAAYC,IAAAA,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAU,QAAQ,SAAS;AAAA,EAC3B,SAAS,YAAY,SAAS;AAAA,EAC9B,UAAU,WAAW,SAAS;AAAA,EAC9B,OAAOD,IAAAA,OAAO,EAAE,SAAS;AAAA;AAAA,EAEzB,QAAQA,IAAAA,OAAO;AAAA,EACf,UAAUA,IAAAA,OAAO;AAAA,EACjB,QAAQ,QAAQ,SAAS;AAAA,EACzB,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,KAAKA,IAAAA,OAAO;AAAA,EACZ,QAAQ,QAAQ,SAAS;AAAA,EACzB,WAAW,SAAS,SAAS;AAAA,EAC7B,0BAA0B,QAAQ,SAAS;AAAA,EAC3C,SAAS,QAAQ,SAAS;AAAA,EAC1B,aAAa,QAAQ,SAAS;AAAA,EAC9B,KAAK,QAAQ,SAAS;AAAA,EACtB,2BAA2B,QAAQ,SAAS;AAAA,EAC5C,OAAO,WAAW,SAAS;AAAA,EAC3B,UAAU,WAAW,SAAS;AAAA,EAC9B,UAAU,WAAW,SAAS;AAAA,EAC9B,UAAU,WAAW,SAAS;AAAA,EAC9B,UAAU,WAAW,SAAS;AAAA,EAC9B,YAAY,WAAW,SAAS;AAClC,CAAC;AAID,MAAM,mBAAwC,qBAAqB,OAAO;AAAA,EACxE,qBAAqBE,IAAA,KAAK,MAAMN,IAAA,MAAM,CAAC,iBAAiB,MAAM,GAAGI,WAAQ,CAAA,CAAC,EAAE,UAAU;AACxF,CAAC;AAIY,MAAA,WAAwB,iBAAiB,UAAU,CAAC;AAAA,EAC/D;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,gBAAgB,OAAO;AAAA,IAC3B,OAAO,QAAQ,IAAI,EAChB,OAAO,CAAC,GAAG,KAAK,MACf,QAAQ,KAAK,KACV,KAAK,UAAU,KAAK,MAAM,QAC1B,KAAK,UAAU,KAAK,MAAM,IAAI;AAAA,EAAA;AAG/B,SAAA;AAAA,IACN,GAAG;AAAA,IACH,qBAAqB,MAAM,QAAQ,mBAAmB,IAAI,oBAAoB,IAAI,CAAA,aAAY,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,EAAA;AAE9H,CAAC;ACvHD,eAAsB,gBAAgB,SAA6C;AACjF,QAAM,iBAAiB;AAEvB,QAAM,QAAQ,MAAM,QAAQ,WAAW,eACpC,OAAO,CAAiB,kBAAA,6BAA6B,aAAa,EAClE,IAAI,OAAO,kBAAkB;AAC5B,UAAM,WAAW,IAAI,IAAI,WAAW,OAAO,mDAAmD;AAC9F,aAAS,aAAa;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,IAAA;AAGhB,UAAM,WAAW,MAAM,MAAM,SAAS,MAAM;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IAAA,CACD;AAED,QAAI,CAAC,SAAS;AACL,aAAA,QAAQ,OAAO,IAAI,MAAM,yCAAyC,cAAc,uBAAuB,EAAE,CAAC;AAE5G,WAAA,MAAM,SAAS;EAAK,CAC5B,CAAC,GACD,OAAO,CAAC,aAAyF;AAC5F,QAAA,SAAS,WAAW,YAAY;AAC3B,aAAA,MAAM,SAAS,MAAgB;AAC/B,aAAA;AAAA,IACT;AACA,WAAO,SAAS,WAAW;AAAA,EAAA,CAC5B,EACA,IAAI,cAAY,SAAS,MAAM,IAAI,CAAS,UAAA;AAAA,IAC3C,GAAG;AAAA,IACH,SAAS;AAAA,IACT,CAAC;AAEL,SAAO,SAAS,MAAM,EAAE,MAAM,KAAK,MAAM;AAC3C;AAEA,SAAS,oBAA2D;AAClE,QAAM,aAAa,IAAI,IAAI,OAAO,SAAS,IAAI;AAE/C,QAAM,iBAAgD,CAAA;AACtD,MAAI,gBAAwC,CAAA;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW,aAAa,WAAW;AAC5D,QAAI,QAAQ,6BAA6B,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AAC9E,qBAAe,KAAK,aAAa;AACjC,sBAAgB,CAAA;AAAA,IAClB;AAEA,kBAAc,GAAG,IAAI;AAAA,EACvB;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,SAAS;AACtC,mBAAe,KAAK,aAAa;AAE5B,SAAA;AACT;ACnDO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAAoE;AAClE,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,OAAO,QAAQ,MAAM,IAAI,CAAS,UAAA;AAAA,MAChC,UAAU,KAAK,QAAQ;AAAA,MACvB,YAAY,gBAAgB,KAAK,UAAU;AAAA,IAAA,EAC3C;AAAA,IACF,YAAY,QAAQ,cAAc,gBAAgB,QAAQ,UAAU;AAAA,EAAA;AAGtE,SAAO,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ;AAAA,IACxC,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC5B,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,eAAe,SAA0E;AAC7G,SAAO,MAAM,IAAI,IAAI,GAAG,QAAQ,IAAI,WAAW,QAAQ,MAAM,IAAI,CAAQ,SAAA,KAAK,QAAS,CAAA,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG;AAAA,IACvG,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEO,SAAS,gBAA0D,YAA+C;AACvH,SAAO,OAAO,YAAY,MAAM,KAAK,WAAW,QAAA,CAAS,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM;AAC3E,QAAI,IAAI,WAAW;AACV,aAAA;AAEF,WAAA,KAAK,0BAA0B,GAAG,iEAAiE;AACnG,WAAA;AAAA,EACR,CAAA,CAAC;AACJ;AChBA,eAAsB,WAAW;AAAA,EAC/B,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACL,GAAiD;;AAC3C,MAAA;AACM,kBAAA,WAAA,mBAAQ,UAAU,SAAS;AAAA,MACjC,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IAAA;AAGI,UAAA,CAAC,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI,EAAC,iCAAQ,mBAAkB,SACtE,gBAAgB,OAAO,IACvB,eAAe,OAAO,GAAG,gBAAgB,QAAQ,OAAO,CAAC,CAAC;AAEvD,WAAA,MAAM,qBAAqB,QAAQ;AAE1C,QAAI,CAAC,SAAS;AACN,YAAA,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAE7E,UAAA,SAAS,SAAS,MAAM,EAAE,MAAO,MAAM,SAAS,MAAkB;AACjE,WAAA,MAAM,aAAa,MAAM;AAEhC,QAAI,SAAS,SAAS;AACb,aAAA,KAAK,SAAS,SAAS,MAAM,IAAI,SAAS,WAAW,IAAI,YAAY,UAAU,kDAAkD,QAAQ;AAE5I,UAAA,kBAAkB,SAAS,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc;AACjE,YAAM,YAAY,OAAO,KAAK,QAAM,GAAG,UAAU,QAAQ,KAAK;AAEtD,aAAA;AAAA,QACN,UAAU,IAAG,uCAAW,aAAY,QAAQ;AAAA,QAC5C,GAAG;AAAA,MAAA;AAAA,IACL,CACD;AAED,QAAI,gBAAgB,SAAS;AACnB,oBAAA,WAAA,mBAAQ,gBAAgB,SAAS;AAE3C,UAAM,eAAkC;AAAA,MACtC,GAAG,OAAO,OAAO,CAAA,OAAM,CAAC,SAAS,KAAK,CAAA,YAAW,QAAQ,UAAU,GAAG,KAAK,CAAC;AAAA,MAC5E,GAAG;AAAA,IAAA;AAGL,QAAI,aAAa,WAAW;AACpB,YAAA,IAAI,MAAM,cAAc;AAExB,kBAAA,WAAA,mBAAQ,iBAAiB,SAAS;AAEnC,WAAA;AAAA,WAEF,OAAO;AACL,WAAA,MAAM,OAAO,KAAK,CAAC;AAClB,kBAAA,WAAA,mBAAQ,aAAa,SAAS;AAEhC,UAAA;AAAA,EACR;AACF;AAKA,eAAsB,UAAU;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAEgB;AACd,QAAM,CAAC,EAAE,IAAI,MAAM,WAAW;AAAA,IAC5B,OAAO,CAAC,IAAI;AAAA,IACZ,GAAG;AAAA,EAAA,CACJ;AAEM,SAAA;AACT;;"}
|