{"version":3,"file":"Entry-DD8o79YY.js","sources":["../../../node_modules/@sentry/utils/build/esm/aggregate-errors.js","../../../node_modules/@sentry/utils/build/esm/breadcrumb-log-level.js","../../../node_modules/@sentry/utils/build/esm/error.js","../../../node_modules/@sentry/utils/build/esm/instrument/console.js","../../../node_modules/@sentry/utils/build/esm/env.js","../../../node_modules/@sentry/utils/build/esm/node.js","../../../node_modules/@sentry/utils/build/esm/isBrowser.js","../../../node_modules/@sentry/utils/build/esm/promisebuffer.js","../../../node_modules/@sentry/utils/build/esm/severity.js","../../../node_modules/@sentry/utils/build/esm/clientreport.js","../../../node_modules/@sentry/utils/build/esm/ratelimit.js","../../../node_modules/@sentry/utils/build/esm/buildPolyfills/_nullishCoalesce.js","../../../node_modules/@sentry/core/build/esm/api.js","../../../node_modules/@sentry/core/build/esm/integration.js","../../../node_modules/@sentry/core/build/esm/baseclient.js","../../../node_modules/@sentry/core/build/esm/sdk.js","../../../node_modules/@sentry/core/build/esm/transports/base.js","../../../node_modules/@sentry/core/build/esm/utils/isSentryRequestUrl.js","../../../node_modules/@sentry/core/build/esm/utils/sdkMetadata.js","../../../node_modules/@sentry/core/build/esm/breadcrumbs.js","../../../node_modules/@sentry/core/build/esm/integrations/functiontostring.js","../../../node_modules/@sentry/core/build/esm/integrations/inboundfilters.js","../../../node_modules/@sentry/core/build/esm/integrations/dedupe.js","../../../node_modules/@sentry/browser/build/npm/esm/eventbuilder.js","../../../node_modules/@sentry/browser/build/npm/esm/userfeedback.js","../../../node_modules/@sentry/browser/build/npm/esm/client.js","../../../node_modules/@sentry-internal/browser-utils/build/esm/instrument/dom.js","../../../node_modules/@sentry-internal/browser-utils/build/esm/getNativeImplementation.js","../../../node_modules/@sentry/browser/build/npm/esm/transports/fetch.js","../../../node_modules/@sentry/browser/build/npm/esm/stack-parsers.js","../../../node_modules/@sentry/browser/build/npm/esm/integrations/breadcrumbs.js","../../../node_modules/@sentry/browser/build/npm/esm/integrations/browserapierrors.js","../../../node_modules/@sentry/browser/build/npm/esm/integrations/globalhandlers.js","../../../node_modules/@sentry/browser/build/npm/esm/integrations/httpcontext.js","../../../node_modules/@sentry/browser/build/npm/esm/integrations/linkederrors.js","../../../node_modules/@sentry/browser/build/npm/esm/sdk.js","../../../node_modules/@sentry-internal/replay/build/npm/esm/index.js","../../../node_modules/@sentry/react/node_modules/@sentry/core/build/esm/tracing/trace.js","../../../node_modules/@sentry/react/node_modules/@sentry/core/build/esm/utils/sdkMetadata.js","../../../node_modules/@sentry/react/build/esm/sdk.js","../../../node_modules/@sentry/react/build/esm/error.js","../../../node_modules/@sentry/react/build/esm/constants.js","../../../node_modules/@sentry/react/build/esm/profiler.js","../../../node_modules/@sentry/react/build/esm/errorboundary.js","../../../node_modules/react-dom/client.js","../../../app/frontend/utils/amplitude/config.ts","../../../app/frontend/store/store.ts","../../../app/frontend/utils/AppProvider.tsx","../../../app/frontend/entrypoints/Entry.tsx"],"sourcesContent":["import { isInstanceOf } from './is.js';\nimport { truncate } from './string.js';\n\n/**\n * Creates exceptions inside `event.exception.values` for errors that are nested on properties based on the `key` parameter.\n */\nfunction applyAggregateErrorsToEvent(\n exceptionFromErrorImplementation,\n parser,\n maxValueLimit = 250,\n key,\n limit,\n event,\n hint,\n) {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return;\n }\n\n // Generally speaking the last item in `event.exception.values` is the exception originating from the original Error\n const originalException =\n event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : undefined;\n\n // We only create exception grouping if there is an exception in the event.\n if (originalException) {\n event.exception.values = truncateAggregateExceptions(\n aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n hint.originalException ,\n key,\n event.exception.values,\n originalException,\n 0,\n ),\n maxValueLimit,\n );\n }\n}\n\nfunction aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n error,\n key,\n prevExceptions,\n exception,\n exceptionId,\n) {\n if (prevExceptions.length >= limit + 1) {\n return prevExceptions;\n }\n\n let newExceptions = [...prevExceptions];\n\n // Recursively call this function in order to walk down a chain of errors\n if (isInstanceOf(error[key], Error)) {\n applyExceptionGroupFieldsForParentException(exception, exceptionId);\n const newException = exceptionFromErrorImplementation(parser, error[key]);\n const newExceptionId = newExceptions.length;\n applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId);\n newExceptions = aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n error[key],\n key,\n [newException, ...newExceptions],\n newException,\n newExceptionId,\n );\n }\n\n // This will create exception grouping for AggregateErrors\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n if (Array.isArray(error.errors)) {\n error.errors.forEach((childError, i) => {\n if (isInstanceOf(childError, Error)) {\n applyExceptionGroupFieldsForParentException(exception, exceptionId);\n const newException = exceptionFromErrorImplementation(parser, childError);\n const newExceptionId = newExceptions.length;\n applyExceptionGroupFieldsForChildException(newException, `errors[${i}]`, newExceptionId, exceptionId);\n newExceptions = aggregateExceptionsFromError(\n exceptionFromErrorImplementation,\n parser,\n limit,\n childError,\n key,\n [newException, ...newExceptions],\n newException,\n newExceptionId,\n );\n }\n });\n }\n\n return newExceptions;\n}\n\nfunction applyExceptionGroupFieldsForParentException(exception, exceptionId) {\n // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n exception.mechanism = {\n ...exception.mechanism,\n ...(exception.type === 'AggregateError' && { is_exception_group: true }),\n exception_id: exceptionId,\n };\n}\n\nfunction applyExceptionGroupFieldsForChildException(\n exception,\n source,\n exceptionId,\n parentId,\n) {\n // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n exception.mechanism = {\n ...exception.mechanism,\n type: 'chained',\n source,\n exception_id: exceptionId,\n parent_id: parentId,\n };\n}\n\n/**\n * Truncate the message (exception.value) of all exceptions in the event.\n * Because this event processor is ran after `applyClientOptions`,\n * we need to truncate the message of the added exceptions here.\n */\nfunction truncateAggregateExceptions(exceptions, maxValueLength) {\n return exceptions.map(exception => {\n if (exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n return exception;\n });\n}\n\nexport { applyAggregateErrorsToEvent };\n//# sourceMappingURL=aggregate-errors.js.map\n","/**\n * Determine a breadcrumb's log level (only `warning` or `error`) based on an HTTP status code.\n */\nfunction getBreadcrumbLogLevelFromHttpStatusCode(statusCode) {\n // NOTE: undefined defaults to 'info' in Sentry\n if (statusCode === undefined) {\n return undefined;\n } else if (statusCode >= 400 && statusCode < 500) {\n return 'warning';\n } else if (statusCode >= 500) {\n return 'error';\n } else {\n return undefined;\n }\n}\n\nexport { getBreadcrumbLogLevelFromHttpStatusCode };\n//# sourceMappingURL=breadcrumb-log-level.js.map\n","/** An error emitted by Sentry SDKs and related utilities. */\nclass SentryError extends Error {\n /** Display name of this error instance. */\n\n constructor( message, logLevel = 'warn') {\n super(message);this.message = message;\n this.name = new.target.prototype.constructor.name;\n // This sets the prototype to be `Error`, not `SentryError`. It's unclear why we do this, but commenting this line\n // out causes various (seemingly totally unrelated) playwright tests consistently time out. FYI, this makes\n // instances of `SentryError` fail `obj instanceof SentryError` checks.\n Object.setPrototypeOf(this, new.target.prototype);\n this.logLevel = logLevel;\n }\n}\n\nexport { SentryError };\n//# sourceMappingURL=error.js.map\n","import { CONSOLE_LEVELS, originalConsoleMethods } from '../logger.js';\nimport { fill } from '../object.js';\nimport { GLOBAL_OBJ } from '../worldwide.js';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers.js';\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addConsoleInstrumentationHandler(handler) {\n const type = 'console';\n addHandler(type, handler);\n maybeInstrument(type, instrumentConsole);\n}\n\nfunction instrumentConsole() {\n if (!('console' in GLOBAL_OBJ)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level) {\n if (!(level in GLOBAL_OBJ.console)) {\n return;\n }\n\n fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod) {\n originalConsoleMethods[level] = originalConsoleMethod;\n\n return function (...args) {\n const handlerData = { args, level };\n triggerHandlers('console', handlerData);\n\n const log = originalConsoleMethods[level];\n log && log.apply(GLOBAL_OBJ.console, args);\n };\n });\n });\n}\n\nexport { addConsoleInstrumentationHandler };\n//# sourceMappingURL=console.js.map\n","/*\n * This module exists for optimizations in the build process through rollup and terser. We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `logger` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These flags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nfunction isBrowserBundle() {\n return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n\n/**\n * Get source of SDK.\n */\nfunction getSDKSource() {\n // This comment is used to identify this line in the CDN bundle build step and replace this with \"return 'cdn';\"\n /* __SENTRY_SDK_SOURCE__ */ return 'npm';\n}\n\nexport { getSDKSource, isBrowserBundle };\n//# sourceMappingURL=env.js.map\n","import { isBrowserBundle } from './env.js';\n\n/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\n\n\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nfunction isNodeEnv() {\n // explicitly check for browser bundles as those can be optimized statically\n // by terser/rollup.\n return (\n !isBrowserBundle() &&\n Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n );\n}\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction dynamicRequire(mod, request) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return mod.require(request);\n}\n\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\nfunction loadModule(moduleName) {\n let mod;\n\n try {\n mod = dynamicRequire(module, moduleName);\n } catch (e) {\n // no-empty\n }\n\n if (!mod) {\n try {\n const { cwd } = dynamicRequire(module, 'process');\n mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) ;\n } catch (e) {\n // no-empty\n }\n }\n\n return mod;\n}\n\nexport { dynamicRequire, isNodeEnv, loadModule };\n//# sourceMappingURL=node.js.map\n","import { isNodeEnv } from './node.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/**\n * Returns true if we are in the browser.\n */\nfunction isBrowser() {\n // eslint-disable-next-line no-restricted-globals\n return typeof window !== 'undefined' && (!isNodeEnv() || isElectronNodeRenderer());\n}\n\n// Electron renderers with nodeIntegration enabled are detected as Node.js so we specifically test for them\nfunction isElectronNodeRenderer() {\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (GLOBAL_OBJ ).process !== undefined && ((GLOBAL_OBJ ).process ).type === 'renderer'\n );\n}\n\nexport { isBrowser };\n//# sourceMappingURL=isBrowser.js.map\n","import { SentryError } from './error.js';\nimport { rejectedSyncPromise, SyncPromise, resolvedSyncPromise } from './syncpromise.js';\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nfunction makePromiseBuffer(limit) {\n const buffer = [];\n\n function isReady() {\n return limit === undefined || buffer.length < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike\n * @returns Removed promise.\n */\n function remove(task) {\n return buffer.splice(buffer.indexOf(task), 1)[0] || Promise.resolve(undefined);\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike; In previous versions this used to be `task:\n * PromiseLike`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer) {\n if (!isReady()) {\n return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n if (buffer.indexOf(task) === -1) {\n buffer.push(task);\n }\n void task\n .then(() => remove(task))\n // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n // have promises, so TS has to polyfill when down-compiling.)\n .then(null, () =>\n remove(task).then(null, () => {\n // We have to add another catch here because `remove()` starts a new promise chain.\n }),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout) {\n return new SyncPromise((resolve, reject) => {\n let counter = buffer.length;\n\n if (!counter) {\n return resolve(true);\n }\n\n // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n const capturedSetTimeout = setTimeout(() => {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n\n // if all promises resolve in time, cancel the timer and resolve to `true`\n buffer.forEach(item => {\n void resolvedSyncPromise(item).then(() => {\n if (!--counter) {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n }\n }, reject);\n });\n });\n }\n\n return {\n $: buffer,\n add,\n drain,\n };\n}\n\nexport { makePromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map\n","// Note: Ideally the `SeverityLevel` type would be derived from `validSeverityLevels`, but that would mean either\n//\n// a) moving `validSeverityLevels` to `@sentry/types`,\n// b) moving the`SeverityLevel` type here, or\n// c) importing `validSeverityLevels` from here into `@sentry/types`.\n//\n// Option A would make `@sentry/types` a runtime dependency of `@sentry/utils` (not good), and options B and C would\n// create a circular dependency between `@sentry/types` and `@sentry/utils` (also not good). So a TODO accompanying the\n// type, reminding anyone who changes it to change this list also, will have to do.\n\nconst validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'];\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nfunction severityLevelFromString(level) {\n return (level === 'warn' ? 'warning' : validSeverityLevels.includes(level) ? level : 'log') ;\n}\n\nexport { severityLevelFromString, validSeverityLevels };\n//# sourceMappingURL=severity.js.map\n","import { createEnvelope } from './envelope.js';\nimport { dateTimestampInSeconds } from './time.js';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nfunction createClientReportEnvelope(\n discarded_events,\n dsn,\n timestamp,\n) {\n const clientReportItem = [\n { type: 'client_report' },\n {\n timestamp: timestamp || dateTimestampInSeconds(),\n discarded_events,\n },\n ];\n return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]);\n}\n\nexport { createClientReportEnvelope };\n//# sourceMappingURL=clientreport.js.map\n","// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\n\nconst DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nfunction parseRetryAfterHeader(header, now = Date.now()) {\n const headerDelay = parseInt(`${header}`, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n\n const headerDate = Date.parse(`${header}`);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n\n return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that the given category is disabled until for rate limiting.\n * In case no category-specific limit is set but a general rate limit across all categories is active,\n * that time is returned.\n *\n * @return the time in ms that the category is disabled until or 0 if there's no active rate limit.\n */\nfunction disabledUntil(limits, dataCategory) {\n return limits[dataCategory] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nfunction isRateLimited(limits, dataCategory, now = Date.now()) {\n return disabledUntil(limits, dataCategory) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n *\n * @return the updated RateLimits object.\n */\nfunction updateRateLimits(\n limits,\n { statusCode, headers },\n now = Date.now(),\n) {\n const updatedRateLimits = {\n ...limits,\n };\n\n // \"The name is case-insensitive.\"\n // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n const rateLimitHeader = headers && headers['x-sentry-rate-limits'];\n const retryAfterHeader = headers && headers['retry-after'];\n\n if (rateLimitHeader) {\n /**\n * rate limit headers are of the form\n *
,
,..\n * where each
is of the form\n * : : : : \n * where\n * is a delay in seconds\n * is the event type(s) (error, transaction, etc) being rate limited and is of the form\n * ;;...\n * is what's being limited (org, project, or key) - ignored by SDK\n * is an arbitrary string like \"org_quota\" - ignored by SDK\n * Semicolon-separated list of metric namespace identifiers. Defines which namespace(s) will be affected.\n * Only present if rate limit applies to the metric_bucket data category.\n */\n for (const limit of rateLimitHeader.trim().split(',')) {\n const [retryAfter, categories, , , namespaces] = limit.split(':', 5) ;\n const headerDelay = parseInt(retryAfter, 10);\n const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n if (!categories) {\n updatedRateLimits.all = now + delay;\n } else {\n for (const category of categories.split(';')) {\n if (category === 'metric_bucket') {\n // namespaces will be present when category === 'metric_bucket'\n if (!namespaces || namespaces.split(';').includes('custom')) {\n updatedRateLimits[category] = now + delay;\n }\n } else {\n updatedRateLimits[category] = now + delay;\n }\n }\n }\n }\n } else if (retryAfterHeader) {\n updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n } else if (statusCode === 429) {\n updatedRateLimits.all = now + 60 * 1000;\n }\n\n return updatedRateLimits;\n}\n\nexport { DEFAULT_RETRY_AFTER, disabledUntil, isRateLimited, parseRetryAfterHeader, updateRateLimits };\n//# sourceMappingURL=ratelimit.js.map\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Polyfill for the nullish coalescing operator (`??`).\n *\n * Note that the RHS is wrapped in a function so that if it's a computed value, that evaluation won't happen unless the\n * LHS evaluates to a nullish value, to mimic the operator's short-circuiting behavior.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n *\n * @param lhs The value of the expression to the left of the `??`\n * @param rhsFn A function returning the value of the expression to the right of the `??`\n * @returns The LHS value, unless it's `null` or `undefined`, in which case, the RHS value\n */\nfunction _nullishCoalesce(lhs, rhsFn) {\n // by checking for loose equality to `null`, we catch both `null` and `undefined`\n return lhs != null ? lhs : rhsFn();\n}\n\n// Sucrase version:\n// function _nullishCoalesce(lhs, rhsFn) {\n// if (lhs != null) {\n// return lhs;\n// } else {\n// return rhsFn();\n// }\n// }\n\nexport { _nullishCoalesce };\n//# sourceMappingURL=_nullishCoalesce.js.map\n","import { makeDsn, dsnToString, urlEncode } from '@sentry/utils';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn) {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n const port = dsn.port ? `:${dsn.port}` : '';\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn) {\n return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn, sdkInfo) {\n return urlEncode({\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n sentry_key: dsn.publicKey,\n sentry_version: SENTRY_API_VERSION,\n ...(sdkInfo && { sentry_client: `${sdkInfo.name}/${sdkInfo.version}` }),\n });\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nfunction getEnvelopeEndpointWithUrlEncodedAuth(dsn, tunnel, sdkInfo) {\n return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nfunction getReportDialogEndpoint(\n dsnLike,\n dialogOptions\n\n,\n) {\n const dsn = makeDsn(dsnLike);\n if (!dsn) {\n return '';\n }\n\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === 'dsn') {\n continue;\n }\n\n if (key === 'onClose') {\n continue;\n }\n\n if (key === 'user') {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] )}`;\n }\n }\n\n return `${endpoint}?${encodedOptions}`;\n}\n\nexport { getEnvelopeEndpointWithUrlEncodedAuth, getReportDialogEndpoint };\n//# sourceMappingURL=api.js.map\n","import { arrayify, logger } from '@sentry/utils';\nimport { getClient } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\n\nconst installedIntegrations = [];\n\n/** Map of integrations assigned to a client */\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations) {\n const integrationsByName = {};\n\n integrations.forEach(currentInstance => {\n const { name } = currentInstance;\n\n const existingInstance = integrationsByName[name];\n\n // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n // default instance to overwrite an existing user instance\n if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n return;\n }\n\n integrationsByName[name] = currentInstance;\n });\n\n return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nfunction getIntegrationsToSetup(options) {\n const defaultIntegrations = options.defaultIntegrations || [];\n const userIntegrations = options.integrations;\n\n // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n defaultIntegrations.forEach(integration => {\n integration.isDefaultInstance = true;\n });\n\n let integrations;\n\n if (Array.isArray(userIntegrations)) {\n integrations = [...defaultIntegrations, ...userIntegrations];\n } else if (typeof userIntegrations === 'function') {\n integrations = arrayify(userIntegrations(defaultIntegrations));\n } else {\n integrations = defaultIntegrations;\n }\n\n const finalIntegrations = filterDuplicates(integrations);\n\n // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend` or\n // `beforeSendTransaction`. It therefore has to run after all other integrations, so that the changes of all event\n // processors will be reflected in the printed values. For lack of a more elegant way to guarantee that, we therefore\n // locate it and, assuming it exists, pop it out of its current spot and shove it onto the end of the array.\n const debugIndex = finalIntegrations.findIndex(integration => integration.name === 'Debug');\n if (debugIndex > -1) {\n const [debugInstance] = finalIntegrations.splice(debugIndex, 1) ;\n finalIntegrations.push(debugInstance);\n }\n\n return finalIntegrations;\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nfunction setupIntegrations(client, integrations) {\n const integrationIndex = {};\n\n integrations.forEach(integration => {\n // guard against empty provided integrations\n if (integration) {\n setupIntegration(client, integration, integrationIndex);\n }\n });\n\n return integrationIndex;\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nfunction afterSetupIntegrations(client, integrations) {\n for (const integration of integrations) {\n // guard against empty provided integrations\n if (integration && integration.afterAllSetup) {\n integration.afterAllSetup(client);\n }\n }\n}\n\n/** Setup a single integration. */\nfunction setupIntegration(client, integration, integrationIndex) {\n if (integrationIndex[integration.name]) {\n DEBUG_BUILD && logger.log(`Integration skipped because it was already installed: ${integration.name}`);\n return;\n }\n integrationIndex[integration.name] = integration;\n\n // `setupOnce` is only called the first time\n if (installedIntegrations.indexOf(integration.name) === -1 && typeof integration.setupOnce === 'function') {\n integration.setupOnce();\n installedIntegrations.push(integration.name);\n }\n\n // `setup` is run for each client\n if (integration.setup && typeof integration.setup === 'function') {\n integration.setup(client);\n }\n\n if (typeof integration.preprocessEvent === 'function') {\n const callback = integration.preprocessEvent.bind(integration) ;\n client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n }\n\n if (typeof integration.processEvent === 'function') {\n const callback = integration.processEvent.bind(integration) ;\n\n const processor = Object.assign((event, hint) => callback(event, hint, client), {\n id: integration.name,\n });\n\n client.addEventProcessor(processor);\n }\n\n DEBUG_BUILD && logger.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nfunction addIntegration(integration) {\n const client = getClient();\n\n if (!client) {\n DEBUG_BUILD && logger.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n return;\n }\n\n client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nfunction defineIntegration(fn) {\n return fn;\n}\n\nexport { addIntegration, afterSetupIntegrations, defineIntegration, getIntegrationsToSetup, installedIntegrations, setupIntegration, setupIntegrations };\n//# sourceMappingURL=integration.js.map\n","import { makeDsn, logger, uuid4, checkOrSetAlreadyCaught, isParameterizedString, isPrimitive, resolvedSyncPromise, addItemToEnvelope, createAttachmentEnvelopeItem, SyncPromise, dropUndefinedKeys, rejectedSyncPromise, SentryError, createClientReportEnvelope, dsnToString, isThenable, isPlainObject } from '@sentry/utils';\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api.js';\nimport { getIsolationScope } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope.js';\nimport { setupIntegration, afterSetupIntegrations, setupIntegrations } from './integration.js';\nimport { updateSession } from './session.js';\nimport { getDynamicSamplingContextFromClient } from './tracing/dynamicSamplingContext.js';\nimport { parseSampleRate } from './utils/parseSampleRate.js';\nimport { prepareEvent } from './utils/prepareEvent.js';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient {\n * public constructor(options: NodeOptions) {\n * super(options);\n * }\n *\n * // ...\n * }\n */\nclass BaseClient {\n /** Options passed to the SDK. */\n\n /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n\n /** Array of set up integrations. */\n\n /** Number of calls being processed */\n\n /** Holds flushable */\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n\n /**\n * Initializes this client instance.\n *\n * @param options Options for the client.\n */\n constructor(options) {\n this._options = options;\n this._integrations = {};\n this._numProcessing = 0;\n this._outcomes = {};\n this._hooks = {};\n this._eventProcessors = [];\n\n if (options.dsn) {\n this._dsn = makeDsn(options.dsn);\n } else {\n DEBUG_BUILD && logger.warn('No DSN provided, client will not send events.');\n }\n\n if (this._dsn) {\n const url = getEnvelopeEndpointWithUrlEncodedAuth(\n this._dsn,\n options.tunnel,\n options._metadata ? options._metadata.sdk : undefined,\n );\n this._transport = options.transport({\n tunnel: this._options.tunnel,\n recordDroppedEvent: this.recordDroppedEvent.bind(this),\n ...options.transportOptions,\n url,\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n captureException(exception, hint, scope) {\n const eventId = uuid4();\n\n // ensure we haven't captured this very object before\n if (checkOrSetAlreadyCaught(exception)) {\n DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n return eventId;\n }\n\n const hintWithEventId = {\n event_id: eventId,\n ...hint,\n };\n\n this._process(\n this.eventFromException(exception, hintWithEventId).then(event =>\n this._captureEvent(event, hintWithEventId, scope),\n ),\n );\n\n return hintWithEventId.event_id;\n }\n\n /**\n * @inheritDoc\n */\n captureMessage(\n message,\n level,\n hint,\n currentScope,\n ) {\n const hintWithEventId = {\n event_id: uuid4(),\n ...hint,\n };\n\n const eventMessage = isParameterizedString(message) ? message : String(message);\n\n const promisedEvent = isPrimitive(message)\n ? this.eventFromMessage(eventMessage, level, hintWithEventId)\n : this.eventFromException(message, hintWithEventId);\n\n this._process(promisedEvent.then(event => this._captureEvent(event, hintWithEventId, currentScope)));\n\n return hintWithEventId.event_id;\n }\n\n /**\n * @inheritDoc\n */\n captureEvent(event, hint, currentScope) {\n const eventId = uuid4();\n\n // ensure we haven't captured this very object before\n if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n return eventId;\n }\n\n const hintWithEventId = {\n event_id: eventId,\n ...hint,\n };\n\n const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n const capturedSpanScope = sdkProcessingMetadata.capturedSpanScope;\n\n this._process(this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope));\n\n return hintWithEventId.event_id;\n }\n\n /**\n * @inheritDoc\n */\n captureSession(session) {\n if (!(typeof session.release === 'string')) {\n DEBUG_BUILD && logger.warn('Discarded session because of missing or non-string release');\n } else {\n this.sendSession(session);\n // After sending, we set init false to indicate it's not the first occurrence\n updateSession(session, { init: false });\n }\n }\n\n /**\n * @inheritDoc\n */\n getDsn() {\n return this._dsn;\n }\n\n /**\n * @inheritDoc\n */\n getOptions() {\n return this._options;\n }\n\n /**\n * @see SdkMetadata in @sentry/types\n *\n * @return The metadata of the SDK\n */\n getSdkMetadata() {\n return this._options._metadata;\n }\n\n /**\n * @inheritDoc\n */\n getTransport() {\n return this._transport;\n }\n\n /**\n * @inheritDoc\n */\n flush(timeout) {\n const transport = this._transport;\n if (transport) {\n this.emit('flush');\n return this._isClientDoneProcessing(timeout).then(clientFinished => {\n return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n });\n } else {\n return resolvedSyncPromise(true);\n }\n }\n\n /**\n * @inheritDoc\n */\n close(timeout) {\n return this.flush(timeout).then(result => {\n this.getOptions().enabled = false;\n this.emit('close');\n return result;\n });\n }\n\n /** Get all installed event processors. */\n getEventProcessors() {\n return this._eventProcessors;\n }\n\n /** @inheritDoc */\n addEventProcessor(eventProcessor) {\n this._eventProcessors.push(eventProcessor);\n }\n\n /** @inheritdoc */\n init() {\n if (\n this._isEnabled() ||\n // Force integrations to be setup even if no DSN was set when we have\n // Spotlight enabled. This is particularly important for browser as we\n // don't support the `spotlight` option there and rely on the users\n // adding the `spotlightBrowserIntegration()` to their integrations which\n // wouldn't get initialized with the check below when there's no DSN set.\n this._options.integrations.some(({ name }) => name.startsWith('Spotlight'))\n ) {\n this._setupIntegrations();\n }\n }\n\n /**\n * Gets an installed integration by its name.\n *\n * @returns The installed integration or `undefined` if no integration with that `name` was installed.\n */\n getIntegrationByName(integrationName) {\n return this._integrations[integrationName] ;\n }\n\n /**\n * @inheritDoc\n */\n addIntegration(integration) {\n const isAlreadyInstalled = this._integrations[integration.name];\n\n // This hook takes care of only installing if not already installed\n setupIntegration(this, integration, this._integrations);\n // Here we need to check manually to make sure to not run this multiple times\n if (!isAlreadyInstalled) {\n afterSetupIntegrations(this, [integration]);\n }\n }\n\n /**\n * @inheritDoc\n */\n sendEvent(event, hint = {}) {\n this.emit('beforeSendEvent', event, hint);\n\n let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n for (const attachment of hint.attachments || []) {\n env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));\n }\n\n const promise = this.sendEnvelope(env);\n if (promise) {\n promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);\n }\n }\n\n /**\n * @inheritDoc\n */\n sendSession(session) {\n const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(env);\n }\n\n /**\n * @inheritDoc\n */\n recordDroppedEvent(reason, category, eventOrCount) {\n if (this._options.sendClientReports) {\n // TODO v9: We do not need the `event` passed as third argument anymore, and can possibly remove this overload\n // If event is passed as third argument, we assume this is a count of 1\n const count = typeof eventOrCount === 'number' ? eventOrCount : 1;\n\n // We want to track each category (error, transaction, session, replay_event) separately\n // but still keep the distinction between different type of outcomes.\n // We could use nested maps, but it's much easier to read and type this way.\n // A correct type for map-based implementation if we want to go that route\n // would be `Partial>>>`\n // With typescript 4.1 we could even use template literal types\n const key = `${reason}:${category}`;\n DEBUG_BUILD && logger.log(`Recording outcome: \"${key}\"${count > 1 ? ` (${count} times)` : ''}`);\n this._outcomes[key] = (this._outcomes[key] || 0) + count;\n }\n }\n\n // Keep on() & emit() signatures in sync with types' client.ts interface\n /* eslint-disable @typescript-eslint/unified-signatures */\n\n /** @inheritdoc */\n\n /** @inheritdoc */\n on(hook, callback) {\n const hooks = (this._hooks[hook] = this._hooks[hook] || []);\n\n // @ts-expect-error We assume the types are correct\n hooks.push(callback);\n\n // This function returns a callback execution handler that, when invoked,\n // deregisters a callback. This is crucial for managing instances where callbacks\n // need to be unregistered to prevent self-referencing in callback closures,\n // ensuring proper garbage collection.\n return () => {\n // @ts-expect-error We assume the types are correct\n const cbIndex = hooks.indexOf(callback);\n if (cbIndex > -1) {\n hooks.splice(cbIndex, 1);\n }\n };\n }\n\n /** @inheritdoc */\n\n /** @inheritdoc */\n emit(hook, ...rest) {\n const callbacks = this._hooks[hook];\n if (callbacks) {\n callbacks.forEach(callback => callback(...rest));\n }\n }\n\n /**\n * @inheritdoc\n */\n sendEnvelope(envelope) {\n this.emit('beforeEnvelope', envelope);\n\n if (this._isEnabled() && this._transport) {\n return this._transport.send(envelope).then(null, reason => {\n DEBUG_BUILD && logger.error('Error while sending envelope:', reason);\n return reason;\n });\n }\n\n DEBUG_BUILD && logger.error('Transport disabled');\n\n return resolvedSyncPromise({});\n }\n\n /* eslint-enable @typescript-eslint/unified-signatures */\n\n /** Setup integrations for this client. */\n _setupIntegrations() {\n const { integrations } = this._options;\n this._integrations = setupIntegrations(this, integrations);\n afterSetupIntegrations(this, integrations);\n }\n\n /** Updates existing session based on the provided event */\n _updateSessionFromEvent(session, event) {\n let crashed = false;\n let errored = false;\n const exceptions = event.exception && event.exception.values;\n\n if (exceptions) {\n errored = true;\n\n for (const ex of exceptions) {\n const mechanism = ex.mechanism;\n if (mechanism && mechanism.handled === false) {\n crashed = true;\n break;\n }\n }\n }\n\n // A session is updated and that session update is sent in only one of the two following scenarios:\n // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n const sessionNonTerminal = session.status === 'ok';\n const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n if (shouldUpdateAndSend) {\n updateSession(session, {\n ...(crashed && { status: 'crashed' }),\n errors: session.errors || Number(errored || crashed),\n });\n this.captureSession(session);\n }\n }\n\n /**\n * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n * `false` otherwise\n */\n _isClientDoneProcessing(timeout) {\n return new SyncPromise(resolve => {\n let ticked = 0;\n const tick = 1;\n\n const interval = setInterval(() => {\n if (this._numProcessing == 0) {\n clearInterval(interval);\n resolve(true);\n } else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n clearInterval(interval);\n resolve(false);\n }\n }\n }, tick);\n });\n }\n\n /** Determines whether this SDK is enabled and a transport is present. */\n _isEnabled() {\n return this.getOptions().enabled !== false && this._transport !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param currentScope A scope containing event metadata.\n * @returns A new event with more information.\n */\n _prepareEvent(\n event,\n hint,\n currentScope,\n isolationScope = getIsolationScope(),\n ) {\n const options = this.getOptions();\n const integrations = Object.keys(this._integrations);\n if (!hint.integrations && integrations.length > 0) {\n hint.integrations = integrations;\n }\n\n this.emit('preprocessEvent', event, hint);\n\n if (!event.type) {\n isolationScope.setLastEventId(event.event_id || hint.event_id);\n }\n\n return prepareEvent(options, event, hint, currentScope, this, isolationScope).then(evt => {\n if (evt === null) {\n return evt;\n }\n\n const propagationContext = {\n ...isolationScope.getPropagationContext(),\n ...(currentScope ? currentScope.getPropagationContext() : undefined),\n };\n\n const trace = evt.contexts && evt.contexts.trace;\n if (!trace && propagationContext) {\n const { traceId: trace_id, spanId, parentSpanId, dsc } = propagationContext;\n evt.contexts = {\n trace: dropUndefinedKeys({\n trace_id,\n span_id: spanId,\n parent_span_id: parentSpanId,\n }),\n ...evt.contexts,\n };\n\n const dynamicSamplingContext = dsc ? dsc : getDynamicSamplingContextFromClient(trace_id, this);\n\n evt.sdkProcessingMetadata = {\n dynamicSamplingContext,\n ...evt.sdkProcessingMetadata,\n };\n }\n return evt;\n });\n }\n\n /**\n * Processes the event and logs an error in case of rejection\n * @param event\n * @param hint\n * @param scope\n */\n _captureEvent(event, hint = {}, scope) {\n return this._processEvent(event, hint, scope).then(\n finalEvent => {\n return finalEvent.event_id;\n },\n reason => {\n if (DEBUG_BUILD) {\n // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for\n // control flow, log just the message (no stack) as a log-level log.\n const sentryError = reason ;\n if (sentryError.logLevel === 'log') {\n logger.log(sentryError.message);\n } else {\n logger.warn(sentryError);\n }\n }\n return undefined;\n },\n );\n }\n\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional information about the original exception.\n * @param currentScope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n _processEvent(event, hint, currentScope) {\n const options = this.getOptions();\n const { sampleRate } = options;\n\n const isTransaction = isTransactionEvent(event);\n const isError = isErrorEvent(event);\n const eventType = event.type || 'error';\n const beforeSendLabel = `before send for type \\`${eventType}\\``;\n\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n const parsedSampleRate = typeof sampleRate === 'undefined' ? undefined : parseSampleRate(sampleRate);\n if (isError && typeof parsedSampleRate === 'number' && Math.random() > parsedSampleRate) {\n this.recordDroppedEvent('sample_rate', 'error', event);\n return rejectedSyncPromise(\n new SentryError(\n `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n 'log',\n ),\n );\n }\n\n const dataCategory = eventType === 'replay_event' ? 'replay' : eventType;\n\n const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n const capturedSpanIsolationScope = sdkProcessingMetadata.capturedSpanIsolationScope;\n\n return this._prepareEvent(event, hint, currentScope, capturedSpanIsolationScope)\n .then(prepared => {\n if (prepared === null) {\n this.recordDroppedEvent('event_processor', dataCategory, event);\n throw new SentryError('An event processor returned `null`, will not send event.', 'log');\n }\n\n const isInternalException = hint.data && (hint.data ).__sentry__ === true;\n if (isInternalException) {\n return prepared;\n }\n\n const result = processBeforeSend(this, options, prepared, hint);\n return _validateBeforeSendResult(result, beforeSendLabel);\n })\n .then(processedEvent => {\n if (processedEvent === null) {\n this.recordDroppedEvent('before_send', dataCategory, event);\n if (isTransaction) {\n const spans = event.spans || [];\n // the transaction itself counts as one span, plus all the child spans that are added\n const spanCount = 1 + spans.length;\n this.recordDroppedEvent('before_send', 'span', spanCount);\n }\n throw new SentryError(`${beforeSendLabel} returned \\`null\\`, will not send event.`, 'log');\n }\n\n const session = currentScope && currentScope.getSession();\n if (!isTransaction && session) {\n this._updateSessionFromEvent(session, processedEvent);\n }\n\n if (isTransaction) {\n const spanCountBefore =\n (processedEvent.sdkProcessingMetadata && processedEvent.sdkProcessingMetadata.spanCountBeforeProcessing) ||\n 0;\n const spanCountAfter = processedEvent.spans ? processedEvent.spans.length : 0;\n\n const droppedSpanCount = spanCountBefore - spanCountAfter;\n if (droppedSpanCount > 0) {\n this.recordDroppedEvent('before_send', 'span', droppedSpanCount);\n }\n }\n\n // None of the Sentry built event processor will update transaction name,\n // so if the transaction name has been changed by an event processor, we know\n // it has to come from custom event processor added by a user\n const transactionInfo = processedEvent.transaction_info;\n if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n const source = 'custom';\n processedEvent.transaction_info = {\n ...transactionInfo,\n source,\n };\n }\n\n this.sendEvent(processedEvent, hint);\n return processedEvent;\n })\n .then(null, reason => {\n if (reason instanceof SentryError) {\n throw reason;\n }\n\n this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason,\n });\n throw new SentryError(\n `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n );\n });\n }\n\n /**\n * Occupies the client with processing and event\n */\n _process(promise) {\n this._numProcessing++;\n void promise.then(\n value => {\n this._numProcessing--;\n return value;\n },\n reason => {\n this._numProcessing--;\n return reason;\n },\n );\n }\n\n /**\n * Clears outcomes on this client and returns them.\n */\n _clearOutcomes() {\n const outcomes = this._outcomes;\n this._outcomes = {};\n return Object.entries(outcomes).map(([key, quantity]) => {\n const [reason, category] = key.split(':') ;\n return {\n reason,\n category,\n quantity,\n };\n });\n }\n\n /**\n * Sends client reports as an envelope.\n */\n _flushOutcomes() {\n DEBUG_BUILD && logger.log('Flushing outcomes...');\n\n const outcomes = this._clearOutcomes();\n\n if (outcomes.length === 0) {\n DEBUG_BUILD && logger.log('No outcomes to send');\n return;\n }\n\n // This is really the only place where we want to check for a DSN and only send outcomes then\n if (!this._dsn) {\n DEBUG_BUILD && logger.log('No dsn provided, will not send outcomes');\n return;\n }\n\n DEBUG_BUILD && logger.log('Sending outcomes:', outcomes);\n\n const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(envelope);\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n}\n\n/**\n * Verifies that return value of configured `beforeSend` or `beforeSendTransaction` is of expected type, and returns the value if so.\n */\nfunction _validateBeforeSendResult(\n beforeSendResult,\n beforeSendLabel,\n) {\n const invalidValueError = `${beforeSendLabel} must return \\`null\\` or a valid event.`;\n if (isThenable(beforeSendResult)) {\n return beforeSendResult.then(\n event => {\n if (!isPlainObject(event) && event !== null) {\n throw new SentryError(invalidValueError);\n }\n return event;\n },\n e => {\n throw new SentryError(`${beforeSendLabel} rejected with ${e}`);\n },\n );\n } else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) {\n throw new SentryError(invalidValueError);\n }\n return beforeSendResult;\n}\n\n/**\n * Process the matching `beforeSendXXX` callback.\n */\nfunction processBeforeSend(\n client,\n options,\n event,\n hint,\n) {\n const { beforeSend, beforeSendTransaction, beforeSendSpan } = options;\n\n if (isErrorEvent(event) && beforeSend) {\n return beforeSend(event, hint);\n }\n\n if (isTransactionEvent(event)) {\n if (event.spans && beforeSendSpan) {\n const processedSpans = [];\n for (const span of event.spans) {\n const processedSpan = beforeSendSpan(span);\n if (processedSpan) {\n processedSpans.push(processedSpan);\n } else {\n client.recordDroppedEvent('before_send', 'span');\n }\n }\n event.spans = processedSpans;\n }\n\n if (beforeSendTransaction) {\n if (event.spans) {\n // We store the # of spans before processing in SDK metadata,\n // so we can compare it afterwards to determine how many spans were dropped\n const spanCountBefore = event.spans.length;\n event.sdkProcessingMetadata = {\n ...event.sdkProcessingMetadata,\n spanCountBeforeProcessing: spanCountBefore,\n };\n }\n return beforeSendTransaction(event, hint);\n }\n }\n\n return event;\n}\n\nfunction isErrorEvent(event) {\n return event.type === undefined;\n}\n\nfunction isTransactionEvent(event) {\n return event.type === 'transaction';\n}\n\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map\n","import { logger, consoleSandbox } from '@sentry/utils';\nimport { getCurrentScope } from './currentScopes.js';\nimport { DEBUG_BUILD } from './debug-build.js';\n\n/** A class object that can instantiate Client objects. */\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nfunction initAndBind(\n clientClass,\n options,\n) {\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n logger.enable();\n } else {\n // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n const client = new clientClass(options);\n setCurrentClient(client);\n client.init();\n return client;\n}\n\n/**\n * Make the given client the current client.\n */\nfunction setCurrentClient(client) {\n getCurrentScope().setClient(client);\n}\n\nexport { initAndBind, setCurrentClient };\n//# sourceMappingURL=sdk.js.map\n","import { makePromiseBuffer, forEachEnvelopeItem, envelopeItemTypeToDataCategory, isRateLimited, resolvedSyncPromise, createEnvelope, SentryError, logger, serializeEnvelope, updateRateLimits } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\n\nconst DEFAULT_TRANSPORT_BUFFER_SIZE = 64;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nfunction createTransport(\n options,\n makeRequest,\n buffer = makePromiseBuffer(\n options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,\n ),\n) {\n let rateLimits = {};\n const flush = (timeout) => buffer.drain(timeout);\n\n function send(envelope) {\n const filteredEnvelopeItems = [];\n\n // Drop rate limited items from envelope\n forEachEnvelopeItem(envelope, (item, type) => {\n const dataCategory = envelopeItemTypeToDataCategory(type);\n if (isRateLimited(rateLimits, dataCategory)) {\n const event = getEventForEnvelopeItem(item, type);\n options.recordDroppedEvent('ratelimit_backoff', dataCategory, event);\n } else {\n filteredEnvelopeItems.push(item);\n }\n });\n\n // Skip sending if envelope is empty after filtering out rate limited events\n if (filteredEnvelopeItems.length === 0) {\n return resolvedSyncPromise({});\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems );\n\n // Creates client report for each item in an envelope\n const recordEnvelopeLoss = (reason) => {\n forEachEnvelopeItem(filteredEnvelope, (item, type) => {\n const event = getEventForEnvelopeItem(item, type);\n options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type), event);\n });\n };\n\n const requestTask = () =>\n makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(\n response => {\n // We don't want to throw on NOK responses, but we want to at least log them\n if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n DEBUG_BUILD && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n }\n\n rateLimits = updateRateLimits(rateLimits, response);\n return response;\n },\n error => {\n recordEnvelopeLoss('network_error');\n throw error;\n },\n );\n\n return buffer.add(requestTask).then(\n result => result,\n error => {\n if (error instanceof SentryError) {\n DEBUG_BUILD && logger.error('Skipped sending event because buffer is full.');\n recordEnvelopeLoss('queue_overflow');\n return resolvedSyncPromise({});\n } else {\n throw error;\n }\n },\n );\n }\n\n return {\n send,\n flush,\n };\n}\n\nfunction getEventForEnvelopeItem(item, type) {\n if (type !== 'event' && type !== 'transaction') {\n return undefined;\n }\n\n return Array.isArray(item) ? (item )[1] : undefined;\n}\n\nexport { DEFAULT_TRANSPORT_BUFFER_SIZE, createTransport };\n//# sourceMappingURL=base.js.map\n","/**\n * Checks whether given url points to Sentry server\n *\n * @param url url to verify\n */\nfunction isSentryRequestUrl(url, client) {\n const dsn = client && client.getDsn();\n const tunnel = client && client.getOptions().tunnel;\n return checkDsn(url, dsn) || checkTunnel(url, tunnel);\n}\n\nfunction checkTunnel(url, tunnel) {\n if (!tunnel) {\n return false;\n }\n\n return removeTrailingSlash(url) === removeTrailingSlash(tunnel);\n}\n\nfunction checkDsn(url, dsn) {\n return dsn ? url.includes(dsn.host) : false;\n}\n\nfunction removeTrailingSlash(str) {\n return str[str.length - 1] === '/' ? str.slice(0, -1) : str;\n}\n\nexport { isSentryRequestUrl };\n//# sourceMappingURL=isSentryRequestUrl.js.map\n","import { SDK_VERSION } from '@sentry/utils';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nfunction applySdkMetadata(options, name, names = [name], source = 'npm') {\n const metadata = options._metadata || {};\n\n if (!metadata.sdk) {\n metadata.sdk = {\n name: `sentry.javascript.${name}`,\n packages: names.map(name => ({\n name: `${source}:@sentry/${name}`,\n version: SDK_VERSION,\n })),\n version: SDK_VERSION,\n };\n }\n\n options._metadata = metadata;\n}\n\nexport { applySdkMetadata };\n//# sourceMappingURL=sdkMetadata.js.map\n","import { dateTimestampInSeconds, consoleSandbox } from '@sentry/utils';\nimport { getClient, getIsolationScope } from './currentScopes.js';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n */\nfunction addBreadcrumb(breadcrumb, hint) {\n const client = getClient();\n const isolationScope = getIsolationScope();\n\n if (!client) return;\n\n const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = client.getOptions();\n\n if (maxBreadcrumbs <= 0) return;\n\n const timestamp = dateTimestampInSeconds();\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n const finalBreadcrumb = beforeBreadcrumb\n ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) )\n : mergedBreadcrumb;\n\n if (finalBreadcrumb === null) return;\n\n if (client.emit) {\n client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n }\n\n isolationScope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n}\n\nexport { addBreadcrumb };\n//# sourceMappingURL=breadcrumbs.js.map\n","import { getOriginalFunction } from '@sentry/utils';\nimport { getClient } from '../currentScopes.js';\nimport { defineIntegration } from '../integration.js';\n\nlet originalFunctionToString;\n\nconst INTEGRATION_NAME = 'FunctionToString';\n\nconst SETUP_CLIENTS = new WeakMap();\n\nconst _functionToStringIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString;\n\n // intrinsics (like Function.prototype) might be immutable in some environments\n // e.g. Node with --frozen-intrinsics, XS (an embedded JavaScript engine) or SES (a JavaScript proposal)\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Function.prototype.toString = function ( ...args) {\n const originalFunction = getOriginalFunction(this);\n const context =\n SETUP_CLIENTS.has(getClient() ) && originalFunction !== undefined ? originalFunction : this;\n return originalFunctionToString.apply(context, args);\n };\n } catch (e) {\n // ignore errors here, just don't patch this\n }\n },\n setup(client) {\n SETUP_CLIENTS.set(client, true);\n },\n };\n}) ;\n\n/**\n * Patch toString calls to return proper name for wrapped functions.\n *\n * ```js\n * Sentry.init({\n * integrations: [\n * functionToStringIntegration(),\n * ],\n * });\n * ```\n */\nconst functionToStringIntegration = defineIntegration(_functionToStringIntegration);\n\nexport { functionToStringIntegration };\n//# sourceMappingURL=functiontostring.js.map\n","import { logger, getEventDescription, stringMatchesSomePattern } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { defineIntegration } from '../integration.js';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n /^Script error\\.?$/,\n /^Javascript error: Script error\\.? on line 0$/,\n /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n \"undefined is not an object (evaluating 'a.L')\", // Random error that happens but not actionable or noticeable to end-users.\n 'can\\'t redefine non-configurable property \"solana\"', // Probably a browser extension or custom browser (Brave) throwing this error\n \"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)\", // Error thrown by GTM, seemingly not affecting end-users\n \"Can't find variable: _AutofillCallbackHandler\", // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n];\n\n/** Options for the InboundFilters integration */\n\nconst INTEGRATION_NAME = 'InboundFilters';\nconst _inboundFiltersIntegration = ((options = {}) => {\n return {\n name: INTEGRATION_NAME,\n processEvent(event, _hint, client) {\n const clientOptions = client.getOptions();\n const mergedOptions = _mergeOptions(options, clientOptions);\n return _shouldDropEvent(event, mergedOptions) ? null : event;\n },\n };\n}) ;\n\nconst inboundFiltersIntegration = defineIntegration(_inboundFiltersIntegration);\n\nfunction _mergeOptions(\n internalOptions = {},\n clientOptions = {},\n) {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n ],\n ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n };\n}\n\nfunction _shouldDropEvent(event, options) {\n if (options.ignoreInternal && _isSentryError(event)) {\n DEBUG_BUILD &&\n logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n return true;\n }\n if (_isIgnoredError(event, options.ignoreErrors)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isUselessError(event)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n event,\n )}`,\n );\n return true;\n }\n if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n DEBUG_BUILD &&\n logger.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n return false;\n}\n\nfunction _isIgnoredError(event, ignoreErrors) {\n // If event.type, this is not an error\n if (event.type || !ignoreErrors || !ignoreErrors.length) {\n return false;\n }\n\n return _getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event, ignoreTransactions) {\n if (event.type !== 'transaction' || !ignoreTransactions || !ignoreTransactions.length) {\n return false;\n }\n\n const name = event.transaction;\n return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event, denyUrls) {\n // TODO: Use Glob instead?\n if (!denyUrls || !denyUrls.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event, allowUrls) {\n // TODO: Use Glob instead?\n if (!allowUrls || !allowUrls.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getPossibleEventMessages(event) {\n const possibleMessages = [];\n\n if (event.message) {\n possibleMessages.push(event.message);\n }\n\n let lastException;\n try {\n // @ts-expect-error Try catching to save bundle size\n lastException = event.exception.values[event.exception.values.length - 1];\n } catch (e) {\n // try catching to save bundle size checking existence of variables\n }\n\n if (lastException) {\n if (lastException.value) {\n possibleMessages.push(lastException.value);\n if (lastException.type) {\n possibleMessages.push(`${lastException.type}: ${lastException.value}`);\n }\n }\n }\n\n return possibleMessages;\n}\n\nfunction _isSentryError(event) {\n try {\n // @ts-expect-error can't be a sentry error if undefined\n return event.exception.values[0].type === 'SentryError';\n } catch (e) {\n // ignore\n }\n return false;\n}\n\nfunction _getLastValidUrl(frames = []) {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event) {\n try {\n let frames;\n try {\n // @ts-expect-error we only care about frames if the whole thing here is defined\n frames = event.exception.values[0].stacktrace.frames;\n } catch (e) {\n // ignore\n }\n return frames ? _getLastValidUrl(frames) : null;\n } catch (oO) {\n DEBUG_BUILD && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n\nfunction _isUselessError(event) {\n if (event.type) {\n // event is not an error\n return false;\n }\n\n // We only want to consider events for dropping that actually have recorded exception values.\n if (!event.exception || !event.exception.values || event.exception.values.length === 0) {\n return false;\n }\n\n return (\n // No top-level message\n !event.message &&\n // There are no exception values that have a stacktrace, a non-generic-Error type or value\n !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n );\n}\n\nexport { inboundFiltersIntegration };\n//# sourceMappingURL=inboundfilters.js.map\n","import { logger, getFramesFromEvent } from '@sentry/utils';\nimport { defineIntegration } from '../integration.js';\nimport { DEBUG_BUILD } from '../debug-build.js';\n\nconst INTEGRATION_NAME = 'Dedupe';\n\nconst _dedupeIntegration = (() => {\n let previousEvent;\n\n return {\n name: INTEGRATION_NAME,\n processEvent(currentEvent) {\n // We want to ignore any non-error type events, e.g. transactions or replays\n // These should never be deduped, and also not be compared against as _previousEvent.\n if (currentEvent.type) {\n return currentEvent;\n }\n\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, previousEvent)) {\n DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {} // eslint-disable-line no-empty\n\n return (previousEvent = currentEvent);\n },\n };\n}) ;\n\n/**\n * Deduplication filter.\n */\nconst dedupeIntegration = defineIntegration(_dedupeIntegration);\n\n/** only exported for tests. */\nfunction _shouldDropEvent(currentEvent, previousEvent) {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\nfunction _isSameMessageEvent(currentEvent, previousEvent) {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\nfunction _isSameExceptionEvent(currentEvent, previousEvent) {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\nfunction _isSameStacktrace(currentEvent, previousEvent) {\n let currentFrames = getFramesFromEvent(currentEvent);\n let previousFrames = getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames ;\n previousFrames = previousFrames ;\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const frameA = previousFrames[i];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const frameB = currentFrames[i];\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction _isSameFingerprint(currentEvent, previousEvent) {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint ;\n previousFingerprint = previousFingerprint ;\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\nfunction _getExceptionFromEvent(event) {\n return event.exception && event.exception.values && event.exception.values[0];\n}\n\nexport { _shouldDropEvent, dedupeIntegration };\n//# sourceMappingURL=dedupe.js.map\n","import { getClient } from '@sentry/core';\nimport { addExceptionMechanism, resolvedSyncPromise, isErrorEvent, isDOMError, isDOMException, addExceptionTypeValue, isError, isPlainObject, isEvent, isParameterizedString, normalizeToSize, extractExceptionKeysForMessage } from '@sentry/utils';\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nfunction exceptionFromError(stackParser, ex) {\n // Get the frames first since Opera can lose the stack if we touch anything else first\n const frames = parseStackFrames(stackParser, ex);\n\n const exception = {\n type: extractType(ex),\n value: extractMessage(ex),\n };\n\n if (frames.length) {\n exception.stacktrace = { frames };\n }\n\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n\nfunction eventFromPlainObject(\n stackParser,\n exception,\n syntheticException,\n isUnhandledRejection,\n) {\n const client = getClient();\n const normalizeDepth = client && client.getOptions().normalizeDepth;\n\n // If we can, we extract an exception from the object properties\n const errorFromProp = getErrorPropertyFromObject(exception);\n\n const extra = {\n __serialized__: normalizeToSize(exception, normalizeDepth),\n };\n\n if (errorFromProp) {\n return {\n exception: {\n values: [exceptionFromError(stackParser, errorFromProp)],\n },\n extra,\n };\n }\n\n const event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n value: getNonErrorObjectExceptionValue(exception, { isUnhandledRejection }),\n } ,\n ],\n },\n extra,\n } ;\n\n if (syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n // event.exception.values[0] has been set above\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values[0].stacktrace = { frames };\n }\n }\n\n return event;\n}\n\nfunction eventFromError(stackParser, ex) {\n return {\n exception: {\n values: [exceptionFromError(stackParser, ex)],\n },\n };\n}\n\n/** Parses stack frames from an error */\nfunction parseStackFrames(\n stackParser,\n ex,\n) {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || '';\n\n const skipLines = getSkipFirstStackStringLines(ex);\n const framesToPop = getPopFirstTopFrames(ex);\n\n try {\n return stackParser(stacktrace, skipLines, framesToPop);\n } catch (e) {\n // no-empty\n }\n\n return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\n/**\n * Certain known React errors contain links that would be falsely\n * parsed as frames. This function check for these errors and\n * returns number of the stack string lines to skip.\n */\nfunction getSkipFirstStackStringLines(ex) {\n if (ex && reactMinifiedRegexp.test(ex.message)) {\n return 1;\n }\n\n return 0;\n}\n\n/**\n * If error has `framesToPop` property, it means that the\n * creator tells us the first x frames will be useless\n * and should be discarded. Typically error from wrapper function\n * which don't point to the actual location in the developer's code.\n *\n * Example: https://github.com/zertosh/invariant/blob/master/invariant.js#L46\n */\nfunction getPopFirstTopFrames(ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop;\n }\n\n return 0;\n}\n\n// https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Exception\n// @ts-expect-error - WebAssembly.Exception is a valid class\nfunction isWebAssemblyException(exception) {\n // Check for support\n // @ts-expect-error - WebAssembly.Exception is a valid class\n if (typeof WebAssembly !== 'undefined' && typeof WebAssembly.Exception !== 'undefined') {\n // @ts-expect-error - WebAssembly.Exception is a valid class\n return exception instanceof WebAssembly.Exception;\n } else {\n return false;\n }\n}\n\n/**\n * Extracts from errors what we use as the exception `type` in error events.\n *\n * Usually, this is the `name` property on Error objects but WASM errors need to be treated differently.\n */\nfunction extractType(ex) {\n const name = ex && ex.name;\n\n // The name for WebAssembly.Exception Errors needs to be extracted differently.\n // Context: https://github.com/getsentry/sentry-javascript/issues/13787\n if (!name && isWebAssemblyException(ex)) {\n // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n const hasTypeInMessage = ex.message && Array.isArray(ex.message) && ex.message.length == 2;\n return hasTypeInMessage ? ex.message[0] : 'WebAssembly.Exception';\n }\n\n return name;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n const message = ex && ex.message;\n\n if (!message) {\n return 'No error message';\n }\n\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n\n // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n if (isWebAssemblyException(ex) && Array.isArray(ex.message) && ex.message.length == 2) {\n return ex.message[1];\n }\n\n return message;\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nfunction eventFromException(\n stackParser,\n exception,\n hint,\n attachStacktrace,\n) {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n event.level = 'error';\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nfunction eventFromMessage(\n stackParser,\n message,\n level = 'info',\n hint,\n attachStacktrace,\n) {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nfunction eventFromUnknownInput(\n stackParser,\n exception,\n syntheticException,\n attachStacktrace,\n isUnhandledRejection,\n) {\n let event;\n\n if (isErrorEvent(exception ) && (exception ).error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n const errorEvent = exception ;\n return eventFromError(stackParser, errorEvent.error );\n }\n\n // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n if (isDOMError(exception) || isDOMException(exception )) {\n const domException = exception ;\n\n if ('stack' in (exception )) {\n event = eventFromError(stackParser, exception );\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, message);\n }\n if ('code' in domException) {\n // eslint-disable-next-line deprecation/deprecation\n event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n }\n\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n return eventFromError(stackParser, exception);\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n // group on any key/value change.\n const objectException = exception ;\n event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(stackParser, exception , syntheticException, attachStacktrace);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\nfunction eventFromString(\n stackParser,\n message,\n syntheticException,\n attachStacktrace,\n) {\n const event = {};\n\n if (attachStacktrace && syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n event.exception = {\n values: [{ value: message, stacktrace: { frames } }],\n };\n }\n }\n\n if (isParameterizedString(message)) {\n const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n event.logentry = {\n message: __sentry_template_string__,\n params: __sentry_template_values__,\n };\n return event;\n }\n\n event.message = message;\n return event;\n}\n\nfunction getNonErrorObjectExceptionValue(\n exception,\n { isUnhandledRejection },\n) {\n const keys = extractExceptionKeysForMessage(exception);\n const captureType = isUnhandledRejection ? 'promise rejection' : 'exception';\n\n // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n // We still want to try to get a decent message for these cases\n if (isErrorEvent(exception)) {\n return `Event \\`ErrorEvent\\` captured as ${captureType} with message \\`${exception.message}\\``;\n }\n\n if (isEvent(exception)) {\n const className = getObjectClassName(exception);\n return `Event \\`${className}\\` (type=${exception.type}) captured as ${captureType}`;\n }\n\n return `Object captured as ${captureType} with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj) {\n try {\n const prototype = Object.getPrototypeOf(obj);\n return prototype ? prototype.constructor.name : undefined;\n } catch (e) {\n // ignore errors here\n }\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj) {\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n const value = obj[prop];\n if (value instanceof Error) {\n return value;\n }\n }\n }\n\n return undefined;\n}\n\nexport { eventFromException, eventFromMessage, eventFromUnknownInput, exceptionFromError, extractMessage, extractType };\n//# sourceMappingURL=eventbuilder.js.map\n","import { dsnToString, createEnvelope } from '@sentry/utils';\n\n/**\n * Creates an envelope from a user feedback.\n */\nfunction createUserFeedbackEnvelope(\n feedback,\n {\n metadata,\n tunnel,\n dsn,\n }\n\n,\n) {\n const headers = {\n event_id: feedback.event_id,\n sent_at: new Date().toISOString(),\n ...(metadata &&\n metadata.sdk && {\n sdk: {\n name: metadata.sdk.name,\n version: metadata.sdk.version,\n },\n }),\n ...(!!tunnel && !!dsn && { dsn: dsnToString(dsn) }),\n };\n const item = createUserFeedbackEnvelopeItem(feedback);\n\n return createEnvelope(headers, [item]);\n}\n\nfunction createUserFeedbackEnvelopeItem(feedback) {\n const feedbackHeaders = {\n type: 'user_report',\n };\n return [feedbackHeaders, feedback];\n}\n\nexport { createUserFeedbackEnvelope };\n//# sourceMappingURL=userfeedback.js.map\n","import { BaseClient, applySdkMetadata } from '@sentry/core';\nimport { getSDKSource, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { eventFromException, eventFromMessage } from './eventbuilder.js';\nimport { WINDOW } from './helpers.js';\nimport { createUserFeedbackEnvelope } from './userfeedback.js';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/types Options for more information.\n */\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nclass BrowserClient extends BaseClient {\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n constructor(options) {\n const opts = {\n // We default this to true, as it is the safer scenario\n parentSpanIsAlwaysRootSpan: true,\n ...options,\n };\n const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n applySdkMetadata(opts, 'browser', ['browser'], sdkSource);\n\n super(opts);\n\n if (opts.sendClientReports && WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n if (WINDOW.document.visibilityState === 'hidden') {\n this._flushOutcomes();\n }\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n eventFromException(exception, hint) {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n eventFromMessage(\n message,\n level = 'info',\n hint,\n ) {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * Sends user feedback to Sentry.\n *\n * @deprecated Use `captureFeedback` instead.\n */\n captureUserFeedback(feedback) {\n if (!this._isEnabled()) {\n DEBUG_BUILD && logger.warn('SDK not enabled, will not capture user feedback.');\n return;\n }\n\n const envelope = createUserFeedbackEnvelope(feedback, {\n metadata: this.getSdkMetadata(),\n dsn: this.getDsn(),\n tunnel: this.getOptions().tunnel,\n });\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(envelope);\n }\n\n /**\n * @inheritDoc\n */\n _prepareEvent(event, hint, scope) {\n event.platform = event.platform || 'javascript';\n return super._prepareEvent(event, hint, scope);\n }\n}\n\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map\n","import { addHandler, maybeInstrument, triggerHandlers, fill, addNonEnumerableProperty, uuid4 } from '@sentry/utils';\nimport { WINDOW } from '../types.js';\n\nconst DEBOUNCE_DURATION = 1000;\n\nlet debounceTimerID;\nlet lastCapturedEventType;\nlet lastCapturedEventTargetId;\n\n/**\n * Add an instrumentation handler for when a click or a keypress happens.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addClickKeypressInstrumentationHandler(handler) {\n const type = 'dom';\n addHandler(type, handler);\n maybeInstrument(type, instrumentDOM);\n}\n\n/** Exported for tests only. */\nfunction instrumentDOM() {\n if (!WINDOW.document) {\n return;\n }\n\n // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n WINDOW.document.addEventListener('click', globalDOMEventHandler, false);\n WINDOW.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n // guaranteed to fire at least once.)\n ['EventTarget', 'Node'].forEach((target) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const proto = (WINDOW )[target] && (WINDOW )[target].prototype;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (originalAddEventListener) {\n return function (\n\n type,\n listener,\n options,\n ) {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this ;\n const handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n if (!handlerForType.handler) {\n const handler = makeDOMEventHandler(triggerDOMHandler);\n handlerForType.handler = handler;\n originalAddEventListener.call(this, type, handler, options);\n }\n\n handlerForType.refCount++;\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n }\n }\n\n return originalAddEventListener.call(this, type, listener, options);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (originalRemoveEventListener) {\n return function (\n\n type,\n listener,\n options,\n ) {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this ;\n const handlers = el.__sentry_instrumentation_handlers__ || {};\n const handlerForType = handlers[type];\n\n if (handlerForType) {\n handlerForType.refCount--;\n // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n if (handlerForType.refCount <= 0) {\n originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n handlerForType.handler = undefined;\n delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n\n // If there are no longer any custom handlers of any type on this element, cleanup everything.\n if (Object.keys(handlers).length === 0) {\n delete el.__sentry_instrumentation_handlers__;\n }\n }\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n }\n }\n\n return originalRemoveEventListener.call(this, type, listener, options);\n };\n },\n );\n });\n}\n\n/**\n * Check whether the event is similar to the last captured one. For example, two click events on the same button.\n */\nfunction isSimilarToLastCapturedEvent(event) {\n // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n if (event.type !== lastCapturedEventType) {\n return false;\n }\n\n try {\n // If both events have the same type, it's still possible that actions were performed on different targets.\n // e.g. 2 clicks on different buttons.\n if (!event.target || (event.target )._sentryId !== lastCapturedEventTargetId) {\n return false;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n // to which an event listener was attached), we treat them as the same action, as we want to capture\n // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n return true;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(eventType, target) {\n // We are only interested in filtering `keypress` events for now.\n if (eventType !== 'keypress') {\n return false;\n }\n\n if (!target || !target.tagName) {\n return true;\n }\n\n // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n // e.g.tabbing through elements, hotkeys, etc.\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n */\nfunction makeDOMEventHandler(\n handler,\n globalListener = false,\n) {\n return (event) => {\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors).\n // Ignore if we've already captured that event.\n if (!event || event['_sentryCaptured']) {\n return;\n }\n\n const target = getEventTarget(event);\n\n // We always want to skip _some_ events.\n if (shouldSkipDOMEvent(event.type, target)) {\n return;\n }\n\n // Mark event as \"seen\"\n addNonEnumerableProperty(event, '_sentryCaptured', true);\n\n if (target && !target._sentryId) {\n // Add UUID to event target so we can identify if\n addNonEnumerableProperty(target, '_sentryId', uuid4());\n }\n\n const name = event.type === 'keypress' ? 'input' : event.type;\n\n // If there is no last captured event, it means that we can safely capture the new event and store it for future comparisons.\n // If there is a last captured event, see if the new event is different enough to treat it as a unique one.\n // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n if (!isSimilarToLastCapturedEvent(event)) {\n const handlerData = { event, name, global: globalListener };\n handler(handlerData);\n lastCapturedEventType = event.type;\n lastCapturedEventTargetId = target ? target._sentryId : undefined;\n }\n\n // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n clearTimeout(debounceTimerID);\n debounceTimerID = WINDOW.setTimeout(() => {\n lastCapturedEventTargetId = undefined;\n lastCapturedEventType = undefined;\n }, DEBOUNCE_DURATION);\n };\n}\n\nfunction getEventTarget(event) {\n try {\n return event.target ;\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n return null;\n }\n}\n\nexport { addClickKeypressInstrumentationHandler, instrumentDOM };\n//# sourceMappingURL=dom.js.map\n","import { isNativeFunction, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { WINDOW } from './types.js';\n\n/**\n * We generally want to use window.fetch / window.setTimeout.\n * However, in some cases this may be wrapped (e.g. by Zone.js for Angular),\n * so we try to get an unpatched version of this from a sandboxed iframe.\n */\n\nconst cachedImplementations = {};\n\n/**\n * Get the native implementation of a browser function.\n *\n * This can be used to ensure we get an unwrapped version of a function, in cases where a wrapped function can lead to problems.\n *\n * The following methods can be retrieved:\n * - `setTimeout`: This can be wrapped by e.g. Angular, causing change detection to be triggered.\n * - `fetch`: This can be wrapped by e.g. ad-blockers, causing an infinite loop when a request is blocked.\n */\nfunction getNativeImplementation(\n name,\n) {\n const cached = cachedImplementations[name];\n if (cached) {\n return cached;\n }\n\n let impl = WINDOW[name] ;\n\n // Fast path to avoid DOM I/O\n if (isNativeFunction(impl)) {\n return (cachedImplementations[name] = impl.bind(WINDOW) );\n }\n\n const document = WINDOW.document;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow[name]) {\n impl = contentWindow[name] ;\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n // Could not create sandbox iframe, just use window.xxx\n DEBUG_BUILD && logger.warn(`Could not create sandbox iframe for ${name} check, bailing to window.${name}: `, e);\n }\n }\n\n // Sanity check: This _should_ not happen, but if it does, we just skip caching...\n // This can happen e.g. in tests where fetch may not be available in the env, or similar.\n if (!impl) {\n return impl;\n }\n\n return (cachedImplementations[name] = impl.bind(WINDOW) );\n}\n\n/** Clear a cached implementation. */\nfunction clearCachedImplementation(name) {\n cachedImplementations[name] = undefined;\n}\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nfunction fetch(...rest) {\n return getNativeImplementation('fetch')(...rest);\n}\n\n/**\n * Get an unwrapped `setTimeout` method.\n * This ensures that even if e.g. Angular wraps `setTimeout`, we get the native implementation,\n * avoiding triggering change detection.\n */\nfunction setTimeout(...rest) {\n return getNativeImplementation('setTimeout')(...rest);\n}\n\nexport { clearCachedImplementation, fetch, getNativeImplementation, setTimeout };\n//# sourceMappingURL=getNativeImplementation.js.map\n","import { getNativeImplementation, clearCachedImplementation } from '@sentry-internal/browser-utils';\nimport { createTransport } from '@sentry/core';\nimport { rejectedSyncPromise } from '@sentry/utils';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nfunction makeFetchTransport(\n options,\n nativeFetch = getNativeImplementation('fetch'),\n) {\n let pendingBodySize = 0;\n let pendingCount = 0;\n\n function makeRequest(request) {\n const requestSize = request.body.length;\n pendingBodySize += requestSize;\n pendingCount++;\n\n const requestOptions = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'origin',\n headers: options.headers,\n // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n // frequently sending events right before the user is switching pages (eg. when finishing navigation transactions).\n // Gotchas:\n // - `keepalive` isn't supported by Firefox\n // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):\n // If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.\n // We will therefore only activate the flag when we're below that limit.\n // There is also a limit of requests that can be open at the same time, so we also limit this to 15\n // See https://github.com/getsentry/sentry-javascript/pull/7553 for details\n keepalive: pendingBodySize <= 60000 && pendingCount < 15,\n ...options.fetchOptions,\n };\n\n if (!nativeFetch) {\n clearCachedImplementation('fetch');\n return rejectedSyncPromise('No fetch implementation available');\n }\n\n try {\n // TODO: This may need a `suppressTracing` call in the future when we switch the browser SDK to OTEL\n return nativeFetch(options.url, requestOptions).then(response => {\n pendingBodySize -= requestSize;\n pendingCount--;\n return {\n statusCode: response.status,\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n };\n });\n } catch (e) {\n clearCachedImplementation('fetch');\n pendingBodySize -= requestSize;\n pendingCount--;\n return rejectedSyncPromise(e);\n }\n }\n\n return createTransport(options, makeRequest);\n}\n\nexport { makeFetchTransport };\n//# sourceMappingURL=fetch.js.map\n","import { createStackParser, UNKNOWN_FUNCTION } from '@sentry/utils';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename, func, lineno, colno) {\n const frame = {\n filename,\n function: func === '' ? UNKNOWN_FUNCTION : func,\n in_app: true, // All browser frames are considered in_app\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// This regex matches frames that have no function name (ie. are at the top level of a module).\n// For example \"at http://localhost:5000//script.js:1:126\"\n// Frames _with_ function names usually look as follows: \"at commitLayoutEffects (react-dom.development.js:23426:1)\"\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\n\n// This regex matches all the frames that have a function name.\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\n// We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments\n// See: https://github.com/getsentry/sentry-javascript/issues/6880\nconst chromeStackParserFn = line => {\n // If the stack line has no function name, we need to parse it differently\n const noFnParts = chromeRegexNoFnName.exec(line) ;\n\n if (noFnParts) {\n const [, filename, line, col] = noFnParts;\n return createFrame(filename, UNKNOWN_FUNCTION, +line, +col);\n }\n\n const parts = chromeRegex.exec(line) ;\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]) ;\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nconst chromeStackLineParser = [CHROME_PRIORITY, chromeStackParserFn];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko = line => {\n const parts = geckoREgex.exec(line) ;\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]) ;\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nconst geckoStackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs = line => {\n const parts = winjsRegex.exec(line) ;\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nconst winjsStackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10 = line => {\n const parts = opera10Regex.exec(line) ;\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nconst opera10StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11 = line => {\n const parts = opera11Regex.exec(line) ;\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nconst opera11StackLineParser = [OPERA11_PRIORITY, opera11];\n\nconst defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser];\n\nconst defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func, filename) => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? (func.split('@')[0] ) : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n\nexport { chromeStackLineParser, defaultStackLineParsers, defaultStackParser, geckoStackLineParser, opera10StackLineParser, opera11StackLineParser, winjsStackLineParser };\n//# sourceMappingURL=stack-parsers.js.map\n","import { addClickKeypressInstrumentationHandler, addXhrInstrumentationHandler, addHistoryInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { defineIntegration, getClient, addBreadcrumb } from '@sentry/core';\nimport { addConsoleInstrumentationHandler, addFetchInstrumentationHandler, getEventDescription, logger, htmlTreeAsString, getComponentName, severityLevelFromString, safeJoin, getBreadcrumbLogLevelFromHttpStatusCode, parseUrl } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { WINDOW } from '../helpers.js';\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs';\n\nconst _breadcrumbsIntegration = ((options = {}) => {\n const _options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n if (_options.console) {\n addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n }\n if (_options.dom) {\n addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n }\n if (_options.xhr) {\n addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n }\n if (_options.fetch) {\n addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n }\n if (_options.history) {\n addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n }\n if (_options.sentry) {\n client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n }\n },\n };\n}) ;\n\nconst breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client) {\n return function addSentryBreadcrumb(event) {\n if (getClient() !== client) {\n return;\n }\n\n addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n };\n}\n\n/**\n * A HOC that creates a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n client,\n dom,\n) {\n return function _innerDomBreadcrumb(handlerData) {\n if (getClient() !== client) {\n return;\n }\n\n let target;\n let componentName;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n let maxStringLength =\n typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n DEBUG_BUILD &&\n logger.warn(\n `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n );\n maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n }\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n const event = handlerData.event ;\n const element = _isEvent(event) ? event.target : event;\n\n target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n componentName = getComponentName(element);\n } catch (e) {\n target = '';\n }\n\n if (target.length === 0) {\n return;\n }\n\n const breadcrumb = {\n category: `ui.${handlerData.name}`,\n message: target,\n };\n\n if (componentName) {\n breadcrumb.data = { 'ui.component_name': componentName };\n }\n\n addBreadcrumb(breadcrumb, {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client) {\n return function _consoleBreadcrumb(handlerData) {\n if (getClient() !== client) {\n return;\n }\n\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client) {\n return function _xhrBreadcrumb(handlerData) {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n // We only capture complete, non-sentry requests\n if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n return;\n }\n\n const { method, url, status_code, body } = sentryXhrData;\n\n const data = {\n method,\n url,\n status_code,\n };\n\n const hint = {\n xhr: handlerData.xhr,\n input: body,\n startTimestamp,\n endTimestamp,\n };\n\n const level = getBreadcrumbLogLevelFromHttpStatusCode(status_code);\n\n addBreadcrumb(\n {\n category: 'xhr',\n data,\n type: 'http',\n level,\n },\n hint,\n );\n };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client) {\n return function _fetchBreadcrumb(handlerData) {\n if (getClient() !== client) {\n return;\n }\n\n const { startTimestamp, endTimestamp } = handlerData;\n\n // We only capture complete fetch requests\n if (!endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n const data = handlerData.fetchData;\n const hint = {\n data: handlerData.error,\n input: handlerData.args,\n startTimestamp,\n endTimestamp,\n };\n\n addBreadcrumb(\n {\n category: 'fetch',\n data,\n level: 'error',\n type: 'http',\n },\n hint,\n );\n } else {\n const response = handlerData.response ;\n const data = {\n ...handlerData.fetchData,\n status_code: response && response.status,\n };\n const hint = {\n input: handlerData.args,\n response,\n startTimestamp,\n endTimestamp,\n };\n const level = getBreadcrumbLogLevelFromHttpStatusCode(data.status_code);\n\n addBreadcrumb(\n {\n category: 'fetch',\n data,\n type: 'http',\n level,\n },\n hint,\n );\n }\n };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client) {\n return function _historyBreadcrumb(handlerData) {\n if (getClient() !== client) {\n return;\n }\n\n let from = handlerData.from;\n let to = handlerData.to;\n const parsedLoc = parseUrl(WINDOW.location.href);\n let parsedFrom = from ? parseUrl(from) : undefined;\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom || !parsedFrom.path) {\n parsedFrom = parsedLoc;\n }\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n };\n}\n\nfunction _isEvent(event) {\n return !!event && !!(event ).target;\n}\n\nexport { breadcrumbsIntegration };\n//# sourceMappingURL=breadcrumbs.js.map\n","import { defineIntegration } from '@sentry/core';\nimport { fill, getFunctionName, getOriginalFunction } from '@sentry/utils';\nimport { WINDOW, wrap } from '../helpers.js';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'BroadcastChannel',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'SharedWorker',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\nconst _browserApiErrorsIntegration = ((options = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(_wrapEventTarget);\n }\n },\n };\n}) ;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nconst browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function ( ...args) {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: false,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function ( callback) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function ( ...args) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const globalObject = WINDOW ;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = globalObject[target] && globalObject[target].prototype;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original,)\n\n {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n eventName,\n fn,\n options,\n ) {\n try {\n if (typeof fn.handleEvent === 'function') {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n });\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n return original.apply(this, [\n eventName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(fn , {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (\n originalRemoveEventListener,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n eventName,\n fn,\n options,\n ) {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n const wrappedEventHandler = fn ;\n try {\n const originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n };\n },\n );\n}\n\nexport { browserApiErrorsIntegration };\n//# sourceMappingURL=browserapierrors.js.map\n","import { defineIntegration, getClient, captureEvent } from '@sentry/core';\nimport { addGlobalErrorInstrumentationHandler, addGlobalUnhandledRejectionInstrumentationHandler, isPrimitive, isString, getLocationHref, UNKNOWN_FUNCTION, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { eventFromUnknownInput } from '../eventbuilder.js';\nimport { shouldIgnoreOnError } from '../helpers.js';\n\nconst INTEGRATION_NAME = 'GlobalHandlers';\n\nconst _globalHandlersIntegration = ((options = {}) => {\n const _options = {\n onerror: true,\n onunhandledrejection: true,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n Error.stackTraceLimit = 50;\n },\n setup(client) {\n if (_options.onerror) {\n _installGlobalOnErrorHandler(client);\n globalHandlerLog('onerror');\n }\n if (_options.onunhandledrejection) {\n _installGlobalOnUnhandledRejectionHandler(client);\n globalHandlerLog('onunhandledrejection');\n }\n },\n };\n}) ;\n\nconst globalHandlersIntegration = defineIntegration(_globalHandlersIntegration);\n\nfunction _installGlobalOnErrorHandler(client) {\n addGlobalErrorInstrumentationHandler(data => {\n const { stackParser, attachStacktrace } = getOptions();\n\n if (getClient() !== client || shouldIgnoreOnError()) {\n return;\n }\n\n const { msg, url, line, column, error } = data;\n\n const event = _enhanceEventWithInitialFrame(\n eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n url,\n line,\n column,\n );\n\n event.level = 'error';\n\n captureEvent(event, {\n originalException: error,\n mechanism: {\n handled: false,\n type: 'onerror',\n },\n });\n });\n}\n\nfunction _installGlobalOnUnhandledRejectionHandler(client) {\n addGlobalUnhandledRejectionInstrumentationHandler(e => {\n const { stackParser, attachStacktrace } = getOptions();\n\n if (getClient() !== client || shouldIgnoreOnError()) {\n return;\n }\n\n const error = _getUnhandledRejectionError(e );\n\n const event = isPrimitive(error)\n ? _eventFromRejectionWithPrimitive(error)\n : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n event.level = 'error';\n\n captureEvent(event, {\n originalException: error,\n mechanism: {\n handled: false,\n type: 'onunhandledrejection',\n },\n });\n });\n}\n\nfunction _getUnhandledRejectionError(error) {\n if (isPrimitive(error)) {\n return error;\n }\n\n // dig the object of the rejection out of known event types\n try {\n\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in (error )) {\n return (error ).reason;\n }\n\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n if ('detail' in (error ) && 'reason' in (error ).detail) {\n return (error ).detail.reason;\n }\n } catch (e2) {} // eslint-disable-line no-empty\n\n return error;\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason) {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n },\n ],\n },\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event, url, line, column) {\n // event.exception\n const e = (event.exception = event.exception || {});\n // event.exception.values\n const ev = (e.values = e.values || []);\n // event.exception.values[0]\n const ev0 = (ev[0] = ev[0] || {});\n // event.exception.values[0].stacktrace\n const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n // event.exception.values[0].stacktrace.frames\n const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n const colno = isNaN(parseInt(column, 10)) ? undefined : column;\n const lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n // event.exception.values[0].stacktrace.frames\n if (ev0sf.length === 0) {\n ev0sf.push({\n colno,\n filename,\n function: UNKNOWN_FUNCTION,\n in_app: true,\n lineno,\n });\n }\n\n return event;\n}\n\nfunction globalHandlerLog(type) {\n DEBUG_BUILD && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction getOptions() {\n const client = getClient();\n const options = (client && client.getOptions()) || {\n stackParser: () => [],\n attachStacktrace: false,\n };\n return options;\n}\n\nexport { globalHandlersIntegration };\n//# sourceMappingURL=globalhandlers.js.map\n","import { defineIntegration } from '@sentry/core';\nimport { WINDOW } from '../helpers.js';\n\n/**\n * Collects information about HTTP request headers and\n * attaches them to the event.\n */\nconst httpContextIntegration = defineIntegration(() => {\n return {\n name: 'HttpContext',\n preprocessEvent(event) {\n // if none of the information we want exists, don't bother\n if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n return;\n }\n\n // grab as much info as exists and add it to the event\n const url = (event.request && event.request.url) || (WINDOW.location && WINDOW.location.href);\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...(event.request && event.request.headers),\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = { ...event.request, ...(url && { url }), headers };\n\n event.request = request;\n },\n };\n});\n\nexport { httpContextIntegration };\n//# sourceMappingURL=httpcontext.js.map\n","import { defineIntegration } from '@sentry/core';\nimport { applyAggregateErrorsToEvent } from '@sentry/utils';\nimport { exceptionFromError } from '../eventbuilder.js';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\nconst INTEGRATION_NAME = 'LinkedErrors';\n\nconst _linkedErrorsIntegration = ((options = {}) => {\n const limit = options.limit || DEFAULT_LIMIT;\n const key = options.key || DEFAULT_KEY;\n\n return {\n name: INTEGRATION_NAME,\n preprocessEvent(event, hint, client) {\n const options = client.getOptions();\n\n applyAggregateErrorsToEvent(\n // This differs from the LinkedErrors integration in core by using a different exceptionFromError function\n exceptionFromError,\n options.stackParser,\n options.maxValueLength,\n key,\n limit,\n event,\n hint,\n );\n },\n };\n}) ;\n\n/**\n * Aggregrate linked errors in an event.\n */\nconst linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration);\n\nexport { linkedErrorsIntegration };\n//# sourceMappingURL=linkederrors.js.map\n","import { inboundFiltersIntegration, functionToStringIntegration, dedupeIntegration, getIntegrationsToSetup, initAndBind, getCurrentScope, lastEventId, getReportDialogEndpoint, startSession, captureSession, getClient } from '@sentry/core';\nimport { consoleSandbox, supportsFetch, logger, stackParserFromStackParserOptions } from '@sentry/utils';\nimport { addHistoryInstrumentationHandler } from '@sentry-internal/browser-utils';\nimport { BrowserClient } from './client.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { WINDOW } from './helpers.js';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs.js';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors.js';\nimport { globalHandlersIntegration } from './integrations/globalhandlers.js';\nimport { httpContextIntegration } from './integrations/httpcontext.js';\nimport { linkedErrorsIntegration } from './integrations/linkederrors.js';\nimport { defaultStackParser } from './stack-parsers.js';\nimport { makeFetchTransport } from './transports/fetch.js';\n\n/** Get the default integrations for the browser SDK. */\nfunction getDefaultIntegrations(_options) {\n /**\n * Note: Please make sure this stays in sync with Angular SDK, which re-exports\n * `getDefaultIntegrations` but with an adjusted set of integrations.\n */\n return [\n inboundFiltersIntegration(),\n functionToStringIntegration(),\n browserApiErrorsIntegration(),\n breadcrumbsIntegration(),\n globalHandlersIntegration(),\n linkedErrorsIntegration(),\n dedupeIntegration(),\n httpContextIntegration(),\n ];\n}\n\nfunction applyDefaultOptions(optionsArg = {}) {\n const defaultOptions = {\n defaultIntegrations: getDefaultIntegrations(),\n release:\n typeof __SENTRY_RELEASE__ === 'string' // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n ? __SENTRY_RELEASE__\n : WINDOW.SENTRY_RELEASE && WINDOW.SENTRY_RELEASE.id // This supports the variable that sentry-webpack-plugin injects\n ? WINDOW.SENTRY_RELEASE.id\n : undefined,\n autoSessionTracking: true,\n sendClientReports: true,\n };\n\n // TODO: Instead of dropping just `defaultIntegrations`, we should simply\n // call `dropUndefinedKeys` on the entire `optionsArg`.\n // However, for this to work we need to adjust the `hasTracingEnabled()` logic\n // first as it differentiates between `undefined` and the key not being in the object.\n if (optionsArg.defaultIntegrations == null) {\n delete optionsArg.defaultIntegrations;\n }\n\n return { ...defaultOptions, ...optionsArg };\n}\n\nfunction shouldShowBrowserExtensionError() {\n const windowWithMaybeExtension =\n typeof WINDOW.window !== 'undefined' && (WINDOW );\n if (!windowWithMaybeExtension) {\n // No need to show the error if we're not in a browser window environment (e.g. service workers)\n return false;\n }\n\n const extensionKey = windowWithMaybeExtension.chrome ? 'chrome' : 'browser';\n const extensionObject = windowWithMaybeExtension[extensionKey];\n\n const runtimeId = extensionObject && extensionObject.runtime && extensionObject.runtime.id;\n const href = (WINDOW.location && WINDOW.location.href) || '';\n\n const extensionProtocols = ['chrome-extension:', 'moz-extension:', 'ms-browser-extension:', 'safari-web-extension:'];\n\n // Running the SDK in a dedicated extension page and calling Sentry.init is fine; no risk of data leakage\n const isDedicatedExtensionPage =\n !!runtimeId && WINDOW === WINDOW.top && extensionProtocols.some(protocol => href.startsWith(`${protocol}//`));\n\n // Running the SDK in NW.js, which appears like a browser extension but isn't, is also fine\n // see: https://github.com/getsentry/sentry-javascript/issues/12668\n const isNWjs = typeof windowWithMaybeExtension.nw !== 'undefined';\n\n return !!runtimeId && !isDedicatedExtensionPage && !isNWjs;\n}\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nfunction init(browserOptions = {}) {\n const options = applyDefaultOptions(browserOptions);\n\n if (!options.skipBrowserExtensionCheck && shouldShowBrowserExtensionError()) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.error(\n '[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/',\n );\n });\n return;\n }\n\n if (DEBUG_BUILD) {\n if (!supportsFetch()) {\n logger.warn(\n 'No Fetch API detected. The Sentry SDK requires a Fetch API compatible environment to send events. Please add a Fetch API polyfill.',\n );\n }\n }\n const clientOptions = {\n ...options,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations: getIntegrationsToSetup(options),\n transport: options.transport || makeFetchTransport,\n };\n\n const client = initAndBind(BrowserClient, clientOptions);\n\n if (options.autoSessionTracking) {\n startSessionTracking();\n }\n\n return client;\n}\n\n/**\n * All properties the report dialog supports\n */\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nfunction showReportDialog(options = {}) {\n // doesn't work without a document (React Native)\n if (!WINDOW.document) {\n DEBUG_BUILD && logger.error('Global document not defined in showReportDialog call');\n return;\n }\n\n const scope = getCurrentScope();\n const client = scope.getClient();\n const dsn = client && client.getDsn();\n\n if (!dsn) {\n DEBUG_BUILD && logger.error('DSN not configured for showReportDialog call');\n return;\n }\n\n if (scope) {\n options.user = {\n ...scope.getUser(),\n ...options.user,\n };\n }\n\n if (!options.eventId) {\n const eventId = lastEventId();\n if (eventId) {\n options.eventId = eventId;\n }\n }\n\n const script = WINDOW.document.createElement('script');\n script.async = true;\n script.crossOrigin = 'anonymous';\n script.src = getReportDialogEndpoint(dsn, options);\n\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n\n const { onClose } = options;\n if (onClose) {\n const reportDialogClosedMessageHandler = (event) => {\n if (event.data === '__sentry_reportdialog_closed__') {\n try {\n onClose();\n } finally {\n WINDOW.removeEventListener('message', reportDialogClosedMessageHandler);\n }\n }\n };\n WINDOW.addEventListener('message', reportDialogClosedMessageHandler);\n }\n\n const injectionPoint = WINDOW.document.head || WINDOW.document.body;\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n } else {\n DEBUG_BUILD && logger.error('Not injecting report dialog. No injection point found in HTML');\n }\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nfunction forceLoad() {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nfunction onLoad(callback) {\n callback();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking() {\n if (typeof WINDOW.document === 'undefined') {\n DEBUG_BUILD && logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSession({ ignoreDuration: true });\n captureSession();\n\n // We want to create a session for every navigation as well\n addHistoryInstrumentationHandler(({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (from !== undefined && from !== to) {\n startSession({ ignoreDuration: true });\n captureSession();\n }\n });\n}\n\n/**\n * Captures user feedback and sends it to Sentry.\n *\n * @deprecated Use `captureFeedback` instead.\n */\nfunction captureUserFeedback(feedback) {\n const client = getClient();\n if (client) {\n // eslint-disable-next-line deprecation/deprecation\n client.captureUserFeedback(feedback);\n }\n}\n\nexport { captureUserFeedback, forceLoad, getDefaultIntegrations, init, onLoad, showReportDialog };\n//# sourceMappingURL=sdk.js.map\n","import { _nullishCoalesce, _optionalChain } from '@sentry/utils';\nimport { captureException, addBreadcrumb, getClient, isSentryRequestUrl, addEventProcessor, getCurrentScope, getActiveSpan, getDynamicSamplingContextFromSpan, prepareEvent, getIsolationScope, setContext, getRootSpan, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, parseSampleRate } from '@sentry/core';\nimport { GLOBAL_OBJ, logger as logger$1, severityLevelFromString, normalize, fill, htmlTreeAsString, browserPerformanceTimeOrigin, uuid4, getLocationHref, dropUndefinedKeys, stringMatchesSomePattern, createEnvelope, createEventEnvelopeHeaders, getSdkMetadataForEnvelopeHeader, resolvedSyncPromise, updateRateLimits, isRateLimited, isBrowser, consoleSandbox } from '@sentry/utils';\nimport { setTimeout as setTimeout$3, addPerformanceInstrumentationHandler, addLcpInstrumentationHandler, addClsInstrumentationHandler, addFidInstrumentationHandler, addInpInstrumentationHandler, SENTRY_XHR_DATA_KEY, addClickKeypressInstrumentationHandler, addHistoryInstrumentationHandler } from '@sentry-internal/browser-utils';\n\n// exporting a separate copy of `WINDOW` rather than exporting the one from `@sentry/browser`\n// prevents the browser package from being bundled in the CDN bundle, and avoids a\n// circular dependency between the browser and replay packages should `@sentry/browser` import\n// from `@sentry/replay` in the future\nconst WINDOW = GLOBAL_OBJ ;\n\nconst REPLAY_SESSION_KEY = 'sentryReplaySession';\nconst REPLAY_EVENT_NAME = 'replay_event';\nconst UNABLE_TO_SEND_REPLAY = 'Unable to send Replay';\n\n// The idle limit for a session after which recording is paused.\nconst SESSION_IDLE_PAUSE_DURATION = 300000; // 5 minutes in ms\n\n// The idle limit for a session after which the session expires.\nconst SESSION_IDLE_EXPIRE_DURATION = 900000; // 15 minutes in ms\n\n/** Default flush delays */\nconst DEFAULT_FLUSH_MIN_DELAY = 5000;\n// XXX: Temp fix for our debounce logic where `maxWait` would never occur if it\n// was the same as `wait`\nconst DEFAULT_FLUSH_MAX_DELAY = 5500;\n\n/* How long to wait for error checkouts */\nconst BUFFER_CHECKOUT_TIME = 60000;\n\nconst RETRY_BASE_INTERVAL = 5000;\nconst RETRY_MAX_COUNT = 3;\n\n/* The max (uncompressed) size in bytes of a network body. Any body larger than this will be truncated. */\nconst NETWORK_BODY_MAX_SIZE = 150000;\n\n/* The max size of a single console arg that is captured. Any arg larger than this will be truncated. */\nconst CONSOLE_ARG_MAX_SIZE = 5000;\n\n/* Min. time to wait before we consider something a slow click. */\nconst SLOW_CLICK_THRESHOLD = 3000;\n/* For scroll actions after a click, we only look for a very short time period to detect programmatic scrolling. */\nconst SLOW_CLICK_SCROLL_TIMEOUT = 300;\n\n/** When encountering a total segment size exceeding this size, stop the replay (as we cannot properly ingest it). */\nconst REPLAY_MAX_EVENT_BUFFER_SIZE = 20000000; // ~20MB\n\n/** Replays must be min. 5s long before we send them. */\nconst MIN_REPLAY_DURATION = 4999;\n/* The max. allowed value that the minReplayDuration can be set to. */\nconst MIN_REPLAY_DURATION_LIMIT = 15000;\n\n/** The max. length of a replay. */\nconst MAX_REPLAY_DURATION = 3600000; // 60 minutes in ms;\n\nfunction _nullishCoalesce$1(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }function _optionalChain$5(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var NodeType$1;\n(function (NodeType) {\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\n})(NodeType$1 || (NodeType$1 = {}));\n\nfunction isElement$1(n) {\n return n.nodeType === n.ELEMENT_NODE;\n}\nfunction isShadowRoot(n) {\n const host = _optionalChain$5([n, 'optionalAccess', _ => _.host]);\n return Boolean(_optionalChain$5([host, 'optionalAccess', _2 => _2.shadowRoot]) === n);\n}\nfunction isNativeShadowDom(shadowRoot) {\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\n}\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\n if (cssText.includes(' background-clip: text;') &&\n !cssText.includes(' -webkit-background-clip: text;')) {\n cssText = cssText.replace(/\\sbackground-clip:\\s*text;/g, ' -webkit-background-clip: text; background-clip: text;');\n }\n return cssText;\n}\nfunction escapeImportStatement(rule) {\n const { cssText } = rule;\n if (cssText.split('\"').length < 3)\n return cssText;\n const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\n if (rule.layerName === '') {\n statement.push(`layer`);\n }\n else if (rule.layerName) {\n statement.push(`layer(${rule.layerName})`);\n }\n if (rule.supportsText) {\n statement.push(`supports(${rule.supportsText})`);\n }\n if (rule.media.length) {\n statement.push(rule.media.mediaText);\n }\n return statement.join(' ') + ';';\n}\nfunction stringifyStylesheet(s) {\n try {\n const rules = s.rules || s.cssRules;\n return rules\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join(''))\n : null;\n }\n catch (error) {\n return null;\n }\n}\nfunction stringifyRule(rule) {\n let importStringified;\n if (isCSSImportRule(rule)) {\n try {\n importStringified =\n stringifyStylesheet(rule.styleSheet) ||\n escapeImportStatement(rule);\n }\n catch (error) {\n }\n }\n else if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\n return fixSafariColons(rule.cssText);\n }\n return importStringified || rule.cssText;\n}\nfunction fixSafariColons(cssStringified) {\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n return cssStringified.replace(regex, '$1\\\\$2');\n}\nfunction isCSSImportRule(rule) {\n return 'styleSheet' in rule;\n}\nfunction isCSSStyleRule(rule) {\n return 'selectorText' in rule;\n}\nclass Mirror {\n constructor() {\n this.idNodeMap = new Map();\n this.nodeMetaMap = new WeakMap();\n }\n getId(n) {\n if (!n)\n return -1;\n const id = _optionalChain$5([this, 'access', _3 => _3.getMeta, 'call', _4 => _4(n), 'optionalAccess', _5 => _5.id]);\n return _nullishCoalesce$1(id, () => ( -1));\n }\n getNode(id) {\n return this.idNodeMap.get(id) || null;\n }\n getIds() {\n return Array.from(this.idNodeMap.keys());\n }\n getMeta(n) {\n return this.nodeMetaMap.get(n) || null;\n }\n removeNodeFromMap(n) {\n const id = this.getId(n);\n this.idNodeMap.delete(id);\n if (n.childNodes) {\n n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\n }\n }\n has(id) {\n return this.idNodeMap.has(id);\n }\n hasNode(node) {\n return this.nodeMetaMap.has(node);\n }\n add(n, meta) {\n const id = meta.id;\n this.idNodeMap.set(id, n);\n this.nodeMetaMap.set(n, meta);\n }\n replace(id, n) {\n const oldNode = this.getNode(id);\n if (oldNode) {\n const meta = this.nodeMetaMap.get(oldNode);\n if (meta)\n this.nodeMetaMap.set(n, meta);\n }\n this.idNodeMap.set(id, n);\n }\n reset() {\n this.idNodeMap = new Map();\n this.nodeMetaMap = new WeakMap();\n }\n}\nfunction createMirror() {\n return new Mirror();\n}\nfunction shouldMaskInput({ maskInputOptions, tagName, type, }) {\n if (tagName === 'OPTION') {\n tagName = 'SELECT';\n }\n return Boolean(maskInputOptions[tagName.toLowerCase()] ||\n (type && maskInputOptions[type]) ||\n type === 'password' ||\n (tagName === 'INPUT' && !type && maskInputOptions['text']));\n}\nfunction maskInputValue({ isMasked, element, value, maskInputFn, }) {\n let text = value || '';\n if (!isMasked) {\n return text;\n }\n if (maskInputFn) {\n text = maskInputFn(text, element);\n }\n return '*'.repeat(text.length);\n}\nfunction toLowerCase(str) {\n return str.toLowerCase();\n}\nfunction toUpperCase(str) {\n return str.toUpperCase();\n}\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\nfunction is2DCanvasBlank(canvas) {\n const ctx = canvas.getContext('2d');\n if (!ctx)\n return true;\n const chunkSize = 50;\n for (let x = 0; x < canvas.width; x += chunkSize) {\n for (let y = 0; y < canvas.height; y += chunkSize) {\n const getImageData = ctx.getImageData;\n const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n : getImageData;\n const pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\n if (pixelBuffer.some((pixel) => pixel !== 0))\n return false;\n }\n }\n return true;\n}\nfunction getInputType(element) {\n const type = element.type;\n return element.hasAttribute('data-rr-is-password')\n ? 'password'\n : type\n ?\n toLowerCase(type)\n : null;\n}\nfunction getInputValue(el, tagName, type) {\n if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\n return el.getAttribute('value') || '';\n }\n return el.value;\n}\nfunction extractFileExtension(path, baseURL) {\n let url;\n try {\n url = new URL(path, _nullishCoalesce$1(baseURL, () => ( window.location.href)));\n }\n catch (err) {\n return null;\n }\n const regex = /\\.([0-9a-z]+)(?:$)/i;\n const match = url.pathname.match(regex);\n return _nullishCoalesce$1(_optionalChain$5([match, 'optionalAccess', _6 => _6[1]]), () => ( null));\n}\nconst cachedImplementations$1 = {};\nfunction getImplementation$1(name) {\n const cached = cachedImplementations$1[name];\n if (cached) {\n return cached;\n }\n const document = window.document;\n let impl = window[name];\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow[name]) {\n impl =\n contentWindow[name];\n }\n document.head.removeChild(sandbox);\n }\n catch (e) {\n }\n }\n return (cachedImplementations$1[name] = impl.bind(window));\n}\nfunction setTimeout$2(...rest) {\n return getImplementation$1('setTimeout')(...rest);\n}\nfunction clearTimeout$2(...rest) {\n return getImplementation$1('clearTimeout')(...rest);\n}\n\nlet _id = 1;\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\nconst IGNORED_NODE = -2;\nfunction genId() {\n return _id++;\n}\nfunction getValidTagName(element) {\n if (element instanceof HTMLFormElement) {\n return 'form';\n }\n const processedTagName = toLowerCase(element.tagName);\n if (tagNameRegex.test(processedTagName)) {\n return 'div';\n }\n return processedTagName;\n}\nfunction extractOrigin(url) {\n let origin = '';\n if (url.indexOf('//') > -1) {\n origin = url.split('/').slice(0, 3).join('/');\n }\n else {\n origin = url.split('/')[0];\n }\n origin = origin.split('?')[0];\n return origin;\n}\nlet canvasService;\nlet canvasCtx;\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\nconst URL_WWW_MATCH = /^www\\..*/i;\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\nfunction absoluteToStylesheet(cssText, href) {\n return (cssText || '').replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3) => {\n const filePath = path1 || path2 || path3;\n const maybeQuote = quote1 || quote2 || '';\n if (!filePath) {\n return origin;\n }\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (DATA_URI.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (filePath[0] === '/') {\n return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\n }\n const stack = href.split('/');\n const parts = filePath.split('/');\n stack.pop();\n for (const part of parts) {\n if (part === '.') {\n continue;\n }\n else if (part === '..') {\n stack.pop();\n }\n else {\n stack.push(part);\n }\n }\n return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\n });\n}\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\n if (attributeValue.trim() === '') {\n return attributeValue;\n }\n let pos = 0;\n function collectCharacters(regEx) {\n let chars;\n const match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars = match[0];\n pos += chars.length;\n return chars;\n }\n return '';\n }\n const output = [];\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n let url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === ',') {\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n output.push(url);\n }\n else {\n let descriptorsStr = '';\n url = absoluteToDoc(doc, url);\n let inParens = false;\n while (true) {\n const c = attributeValue.charAt(pos);\n if (c === '') {\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (!inParens) {\n if (c === ',') {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break;\n }\n else if (c === '(') {\n inParens = true;\n }\n }\n else {\n if (c === ')') {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(', ');\n}\nconst cachedDocument = new WeakMap();\nfunction absoluteToDoc(doc, attributeValue) {\n if (!attributeValue || attributeValue.trim() === '') {\n return attributeValue;\n }\n return getHref(doc, attributeValue);\n}\nfunction isSVGElement(el) {\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\n}\nfunction getHref(doc, customHref) {\n let a = cachedDocument.get(doc);\n if (!a) {\n a = doc.createElement('a');\n cachedDocument.set(doc, a);\n }\n if (!customHref) {\n customHref = '';\n }\n else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\n return customHref;\n }\n a.setAttribute('href', customHref);\n return a.href;\n}\nfunction transformAttribute(doc, tagName, name, value, element, maskAttributeFn) {\n if (!value) {\n return value;\n }\n if (name === 'src' ||\n (name === 'href' && !(tagName === 'use' && value[0] === '#'))) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'xlink:href' && value[0] !== '#') {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'background' &&\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\n return absoluteToDoc(doc, value);\n }\n else if (name === 'srcset') {\n return getAbsoluteSrcsetString(doc, value);\n }\n else if (name === 'style') {\n return absoluteToStylesheet(value, getHref(doc));\n }\n else if (tagName === 'object' && name === 'data') {\n return absoluteToDoc(doc, value);\n }\n if (typeof maskAttributeFn === 'function') {\n return maskAttributeFn(name, value, element);\n }\n return value;\n}\nfunction ignoreAttribute(tagName, name, _value) {\n return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\n}\nfunction _isBlockedElement(element, blockClass, blockSelector, unblockSelector) {\n try {\n if (unblockSelector && element.matches(unblockSelector)) {\n return false;\n }\n if (typeof blockClass === 'string') {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n }\n else {\n for (let eIndex = element.classList.length; eIndex--;) {\n const className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n }\n catch (e) {\n }\n return false;\n}\nfunction elementClassMatchesRegex(el, regex) {\n for (let eIndex = el.classList.length; eIndex--;) {\n const className = el.classList[eIndex];\n if (regex.test(className)) {\n return true;\n }\n }\n return false;\n}\nfunction distanceToMatch(node, matchPredicate, limit = Infinity, distance = 0) {\n if (!node)\n return -1;\n if (node.nodeType !== node.ELEMENT_NODE)\n return -1;\n if (distance > limit)\n return -1;\n if (matchPredicate(node))\n return distance;\n return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1);\n}\nfunction createMatchPredicate(className, selector) {\n return (node) => {\n const el = node;\n if (el === null)\n return false;\n try {\n if (className) {\n if (typeof className === 'string') {\n if (el.matches(`.${className}`))\n return true;\n }\n else if (elementClassMatchesRegex(el, className)) {\n return true;\n }\n }\n if (selector && el.matches(selector))\n return true;\n return false;\n }\n catch (e2) {\n return false;\n }\n };\n}\nfunction needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) {\n try {\n const el = node.nodeType === node.ELEMENT_NODE\n ? node\n : node.parentElement;\n if (el === null)\n return false;\n if (el.tagName === 'INPUT') {\n const autocomplete = el.getAttribute('autocomplete');\n const disallowedAutocompleteValues = [\n 'current-password',\n 'new-password',\n 'cc-number',\n 'cc-exp',\n 'cc-exp-month',\n 'cc-exp-year',\n 'cc-csc',\n ];\n if (disallowedAutocompleteValues.includes(autocomplete)) {\n return true;\n }\n }\n let maskDistance = -1;\n let unmaskDistance = -1;\n if (maskAllText) {\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector));\n if (unmaskDistance < 0) {\n return true;\n }\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity);\n }\n else {\n maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector));\n if (maskDistance < 0) {\n return false;\n }\n unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity);\n }\n return maskDistance >= 0\n ? unmaskDistance >= 0\n ? maskDistance <= unmaskDistance\n : true\n : unmaskDistance >= 0\n ? false\n : !!maskAllText;\n }\n catch (e) {\n }\n return !!maskAllText;\n}\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\n const win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n let fired = false;\n let readyState;\n try {\n readyState = win.document.readyState;\n }\n catch (error) {\n return;\n }\n if (readyState !== 'complete') {\n const timer = setTimeout$2(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener('load', () => {\n clearTimeout$2(timer);\n fired = true;\n listener();\n });\n return;\n }\n const blankUrl = 'about:blank';\n if (win.location.href !== blankUrl ||\n iframeEl.src === blankUrl ||\n iframeEl.src === '') {\n setTimeout$2(listener, 0);\n return iframeEl.addEventListener('load', listener);\n }\n iframeEl.addEventListener('load', listener);\n}\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\n let fired = false;\n let styleSheetLoaded;\n try {\n styleSheetLoaded = link.sheet;\n }\n catch (error) {\n return;\n }\n if (styleSheetLoaded)\n return;\n const timer = setTimeout$2(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, styleSheetLoadTimeout);\n link.addEventListener('load', () => {\n clearTimeout$2(timer);\n fired = true;\n listener();\n });\n}\nfunction serializeNode(n, options) {\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, } = options;\n const rootId = getRootId(doc, mirror);\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if (n.compatMode !== 'CSS1Compat') {\n return {\n type: NodeType$1.Document,\n childNodes: [],\n compatMode: n.compatMode,\n };\n }\n else {\n return {\n type: NodeType$1.Document,\n childNodes: [],\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType$1.DocumentType,\n name: n.name,\n publicId: n.publicId,\n systemId: n.systemId,\n rootId,\n };\n case n.ELEMENT_NODE:\n return serializeElementNode(n, {\n doc,\n blockClass,\n blockSelector,\n unblockSelector,\n inlineStylesheet,\n maskAttributeFn,\n maskInputOptions,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n rootId,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n });\n case n.TEXT_NODE:\n return serializeTextNode(n, {\n doc,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n maskTextFn,\n maskInputOptions,\n maskInputFn,\n rootId,\n });\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType$1.CDATA,\n textContent: '',\n rootId,\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType$1.Comment,\n textContent: n.textContent || '',\n rootId,\n };\n default:\n return false;\n }\n}\nfunction getRootId(doc, mirror) {\n if (!mirror.hasNode(doc))\n return undefined;\n const docId = mirror.getId(doc);\n return docId === 1 ? undefined : docId;\n}\nfunction serializeTextNode(n, options) {\n const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId, } = options;\n const parentTagName = n.parentNode && n.parentNode.tagName;\n let textContent = n.textContent;\n const isStyle = parentTagName === 'STYLE' ? true : undefined;\n const isScript = parentTagName === 'SCRIPT' ? true : undefined;\n const isTextarea = parentTagName === 'TEXTAREA' ? true : undefined;\n if (isStyle && textContent) {\n try {\n if (n.nextSibling || n.previousSibling) {\n }\n else if (_optionalChain$5([n, 'access', _7 => _7.parentNode, 'access', _8 => _8.sheet, 'optionalAccess', _9 => _9.cssRules])) {\n textContent = stringifyStylesheet(n.parentNode.sheet);\n }\n }\n catch (err) {\n console.warn(`Cannot get CSS styles from text's parentNode. Error: ${err}`, n);\n }\n textContent = absoluteToStylesheet(textContent, getHref(options.doc));\n }\n if (isScript) {\n textContent = 'SCRIPT_PLACEHOLDER';\n }\n const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText);\n if (!isStyle && !isScript && !isTextarea && textContent && forceMask) {\n textContent = maskTextFn\n ? maskTextFn(textContent, n.parentElement)\n : textContent.replace(/[\\S]/g, '*');\n }\n if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) {\n textContent = maskInputFn\n ? maskInputFn(textContent, n.parentNode)\n : textContent.replace(/[\\S]/g, '*');\n }\n if (parentTagName === 'OPTION' && textContent) {\n const isInputMasked = shouldMaskInput({\n type: null,\n tagName: parentTagName,\n maskInputOptions,\n });\n textContent = maskInputValue({\n isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked),\n element: n,\n value: textContent,\n maskInputFn,\n });\n }\n return {\n type: NodeType$1.Text,\n textContent: textContent || '',\n isStyle,\n rootId,\n };\n}\nfunction serializeElementNode(n, options) {\n const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, } = options;\n const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector);\n const tagName = getValidTagName(n);\n let attributes = {};\n const len = n.attributes.length;\n for (let i = 0; i < len; i++) {\n const attr = n.attributes[i];\n if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) {\n attributes[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn);\n }\n }\n if (tagName === 'link' && inlineStylesheet) {\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\n return s.href === n.href;\n });\n let cssText = null;\n if (stylesheet) {\n cssText = stringifyStylesheet(stylesheet);\n }\n if (cssText) {\n delete attributes.rel;\n delete attributes.href;\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\n }\n }\n if (tagName === 'style' &&\n n.sheet &&\n !(n.innerText || n.textContent || '').trim().length) {\n const cssText = stringifyStylesheet(n.sheet);\n if (cssText) {\n attributes._cssText = absoluteToStylesheet(cssText, getHref(doc));\n }\n }\n if (tagName === 'input' ||\n tagName === 'textarea' ||\n tagName === 'select' ||\n tagName === 'option') {\n const el = n;\n const type = getInputType(el);\n const value = getInputValue(el, toUpperCase(tagName), type);\n const checked = el.checked;\n if (type !== 'submit' && type !== 'button' && value) {\n const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({\n type,\n tagName: toUpperCase(tagName),\n maskInputOptions,\n }));\n attributes.value = maskInputValue({\n isMasked: forceMask,\n element: el,\n value,\n maskInputFn,\n });\n }\n if (checked) {\n attributes.checked = checked;\n }\n }\n if (tagName === 'option') {\n if (n.selected && !maskInputOptions['select']) {\n attributes.selected = true;\n }\n else {\n delete attributes.selected;\n }\n }\n if (tagName === 'canvas' && recordCanvas) {\n if (n.__context === '2d') {\n if (!is2DCanvasBlank(n)) {\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n }\n else if (!('__context' in n)) {\n const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n const blankCanvas = doc.createElement('canvas');\n blankCanvas.width = n.width;\n blankCanvas.height = n.height;\n const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes.rr_dataURL = canvasDataURL;\n }\n }\n }\n if (tagName === 'img' && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement('canvas');\n canvasCtx = canvasService.getContext('2d');\n }\n const image = n;\n const imageSrc = image.currentSrc || image.getAttribute('src') || '';\n const priorCrossOrigin = image.crossOrigin;\n const recordInlineImage = () => {\n image.removeEventListener('load', recordInlineImage);\n try {\n canvasService.width = image.naturalWidth;\n canvasService.height = image.naturalHeight;\n canvasCtx.drawImage(image, 0, 0);\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\n }\n catch (err) {\n if (image.crossOrigin !== 'anonymous') {\n image.crossOrigin = 'anonymous';\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage();\n else\n image.addEventListener('load', recordInlineImage);\n return;\n }\n else {\n console.warn(`Cannot inline img src=${imageSrc}! Error: ${err}`);\n }\n }\n if (image.crossOrigin === 'anonymous') {\n priorCrossOrigin\n ? (attributes.crossOrigin = priorCrossOrigin)\n : image.removeAttribute('crossorigin');\n }\n };\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage();\n else\n image.addEventListener('load', recordInlineImage);\n }\n if (tagName === 'audio' || tagName === 'video') {\n attributes.rr_mediaState = n.paused\n ? 'paused'\n : 'played';\n attributes.rr_mediaCurrentTime = n.currentTime;\n }\n if (!newlyAddedElement) {\n if (n.scrollLeft) {\n attributes.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes.rr_scrollTop = n.scrollTop;\n }\n }\n if (needBlock) {\n const { width, height } = n.getBoundingClientRect();\n attributes = {\n class: attributes.class,\n rr_width: `${width}px`,\n rr_height: `${height}px`,\n };\n }\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\n if (!needBlock && !n.contentDocument) {\n attributes.rr_src = attributes.src;\n }\n delete attributes.src;\n }\n let isCustomElement;\n try {\n if (customElements.get(tagName))\n isCustomElement = true;\n }\n catch (e) {\n }\n return {\n type: NodeType$1.Element,\n tagName,\n attributes,\n childNodes: [],\n isSVG: isSVGElement(n) || undefined,\n needBlock,\n rootId,\n isCustom: isCustomElement,\n };\n}\nfunction lowerIfExists(maybeAttr) {\n if (maybeAttr === undefined || maybeAttr === null) {\n return '';\n }\n else {\n return maybeAttr.toLowerCase();\n }\n}\nfunction slimDOMExcluded(sn, slimDOMOptions) {\n if (slimDOMOptions.comment && sn.type === NodeType$1.Comment) {\n return true;\n }\n else if (sn.type === NodeType$1.Element) {\n if (slimDOMOptions.script &&\n (sn.tagName === 'script' ||\n (sn.tagName === 'link' &&\n (sn.attributes.rel === 'preload' ||\n sn.attributes.rel === 'modulepreload') &&\n sn.attributes.as === 'script') ||\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'prefetch' &&\n typeof sn.attributes.href === 'string' &&\n extractFileExtension(sn.attributes.href) === 'js'))) {\n return true;\n }\n else if (slimDOMOptions.headFavicon &&\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n (sn.tagName === 'meta' &&\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\n lowerIfExists(sn.attributes.name) === 'application-name' ||\n lowerIfExists(sn.attributes.rel) === 'icon' ||\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\n return true;\n }\n else if (sn.tagName === 'meta') {\n if (slimDOMOptions.headMetaDescKeywords &&\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\n return true;\n }\n else if (slimDOMOptions.headMetaSocial &&\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\n return true;\n }\n else if (slimDOMOptions.headMetaRobots &&\n (lowerIfExists(sn.attributes.name) === 'robots' ||\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\n return true;\n }\n else if (slimDOMOptions.headMetaHttpEquiv &&\n sn.attributes['http-equiv'] !== undefined) {\n return true;\n }\n else if (slimDOMOptions.headMetaAuthorship &&\n (lowerIfExists(sn.attributes.name) === 'author' ||\n lowerIfExists(sn.attributes.name) === 'generator' ||\n lowerIfExists(sn.attributes.name) === 'framework' ||\n lowerIfExists(sn.attributes.name) === 'publisher' ||\n lowerIfExists(sn.attributes.name) === 'progid' ||\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\n return true;\n }\n else if (slimDOMOptions.headMetaVerification &&\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\n lowerIfExists(sn.attributes.name) === 'verification' ||\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\n return true;\n }\n }\n }\n return false;\n}\nfunction serializeNodeWithId(n, options) {\n const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5000, onStylesheetLoad, stylesheetLoadTimeout = 5000, keepIframeSrcFn = () => false, newlyAddedElement = false, } = options;\n let { preserveWhiteSpace = true } = options;\n const _serializedNode = serializeNode(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n maskAllText,\n unblockSelector,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n });\n if (!_serializedNode) {\n console.warn(n, 'not serialized');\n return null;\n }\n let id;\n if (mirror.hasNode(n)) {\n id = mirror.getId(n);\n }\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n (!preserveWhiteSpace &&\n _serializedNode.type === NodeType$1.Text &&\n !_serializedNode.isStyle &&\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\n id = IGNORED_NODE;\n }\n else {\n id = genId();\n }\n const serializedNode = Object.assign(_serializedNode, { id });\n mirror.add(n, serializedNode);\n if (id === IGNORED_NODE) {\n return null;\n }\n if (onSerialize) {\n onSerialize(n);\n }\n let recordChild = !skipChild;\n if (serializedNode.type === NodeType$1.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n delete serializedNode.needBlock;\n const shadowRoot = n.shadowRoot;\n if (shadowRoot && isNativeShadowDom(shadowRoot))\n serializedNode.isShadowHost = true;\n }\n if ((serializedNode.type === NodeType$1.Document ||\n serializedNode.type === NodeType$1.Element) &&\n recordChild) {\n if (slimDOMOptions.headWhitespace &&\n serializedNode.type === NodeType$1.Element &&\n serializedNode.tagName === 'head') {\n preserveWhiteSpace = false;\n }\n const bypassOptions = {\n doc,\n mirror,\n blockClass,\n blockSelector,\n maskAllText,\n unblockSelector,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n };\n for (const childN of Array.from(n.childNodes)) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n if (isElement$1(n) && n.shadowRoot) {\n for (const childN of Array.from(n.shadowRoot.childNodes)) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n isNativeShadowDom(n.shadowRoot) &&\n (serializedChildNode.isShadow = true);\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n if (n.parentNode &&\n isShadowRoot(n.parentNode) &&\n isNativeShadowDom(n.parentNode)) {\n serializedNode.isShadow = true;\n }\n if (serializedNode.type === NodeType$1.Element &&\n serializedNode.tagName === 'iframe') {\n onceIframeLoaded(n, () => {\n const iframeDoc = n.contentDocument;\n if (iframeDoc && onIframeLoad) {\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n });\n if (serializedIframeNode) {\n onIframeLoad(n, serializedIframeNode);\n }\n }\n }, iframeLoadTimeout);\n }\n if (serializedNode.type === NodeType$1.Element &&\n serializedNode.tagName === 'link' &&\n typeof serializedNode.attributes.rel === 'string' &&\n (serializedNode.attributes.rel === 'stylesheet' ||\n (serializedNode.attributes.rel === 'preload' &&\n typeof serializedNode.attributes.href === 'string' &&\n extractFileExtension(serializedNode.attributes.href) === 'css'))) {\n onceStylesheetLoaded(n, () => {\n if (onStylesheetLoad) {\n const serializedLinkNode = serializeNodeWithId(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n });\n if (serializedLinkNode) {\n onStylesheetLoad(n, serializedLinkNode);\n }\n }\n }, stylesheetLoadTimeout);\n }\n return serializedNode;\n}\nfunction snapshot(n, options) {\n const { mirror = new Mirror(), blockClass = 'rr-block', blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = () => false, } = options || {};\n const maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n }\n : maskAllInputs === false\n ? {}\n : maskAllInputs;\n const slimDOMOptions = slimDOM === true || slimDOM === 'all'\n ?\n {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaDescKeywords: slimDOM === 'all',\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaAuthorship: true,\n headMetaVerification: true,\n }\n : slimDOM === false\n ? {}\n : slimDOM;\n return serializeNodeWithId(n, {\n doc: n,\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n newlyAddedElement: false,\n });\n}\n\nfunction _optionalChain$4(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nfunction on(type, fn, target = document) {\n const options = { capture: true, passive: true };\n target.addEventListener(type, fn, options);\n return () => target.removeEventListener(type, fn, options);\n}\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\n '\\r\\n' +\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\n '\\r\\n' +\n 'or you can use record.mirror to access the mirror instance during recording.';\nlet _mirror = {\n map: {},\n getId() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return -1;\n },\n getNode() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return null;\n },\n removeNodeFromMap() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n has() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return false;\n },\n reset() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n};\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\n _mirror = new Proxy(_mirror, {\n get(target, prop, receiver) {\n if (prop === 'map') {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\nfunction throttle$1(func, wait, options = {}) {\n let timeout = null;\n let previous = 0;\n return function (...args) {\n const now = Date.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n const remaining = wait - (now - previous);\n const context = this;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout$1(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n }\n else if (!timeout && options.trailing !== false) {\n timeout = setTimeout$1(() => {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\nfunction hookSetter(target, key, d, isRevoked, win = window) {\n const original = win.Object.getOwnPropertyDescriptor(target, key);\n win.Object.defineProperty(target, key, isRevoked\n ? d\n : {\n set(value) {\n setTimeout$1(() => {\n d.set.call(this, value);\n }, 0);\n if (original && original.set) {\n original.set.call(this, value);\n }\n },\n });\n return () => hookSetter(target, key, original || {}, true);\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === 'function') {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n }\n catch (e2) {\n return () => {\n };\n }\n}\nlet nowTimestamp = Date.now;\nif (!(/[1-9][0-9]{12}/.test(Date.now().toString()))) {\n nowTimestamp = () => new Date().getTime();\n}\nfunction getWindowScroll(win) {\n const doc = win.document;\n return {\n left: doc.scrollingElement\n ? doc.scrollingElement.scrollLeft\n : win.pageXOffset !== undefined\n ? win.pageXOffset\n : _optionalChain$4([doc, 'optionalAccess', _ => _.documentElement, 'access', _2 => _2.scrollLeft]) ||\n _optionalChain$4([doc, 'optionalAccess', _3 => _3.body, 'optionalAccess', _4 => _4.parentElement, 'optionalAccess', _5 => _5.scrollLeft]) ||\n _optionalChain$4([doc, 'optionalAccess', _6 => _6.body, 'optionalAccess', _7 => _7.scrollLeft]) ||\n 0,\n top: doc.scrollingElement\n ? doc.scrollingElement.scrollTop\n : win.pageYOffset !== undefined\n ? win.pageYOffset\n : _optionalChain$4([doc, 'optionalAccess', _8 => _8.documentElement, 'access', _9 => _9.scrollTop]) ||\n _optionalChain$4([doc, 'optionalAccess', _10 => _10.body, 'optionalAccess', _11 => _11.parentElement, 'optionalAccess', _12 => _12.scrollTop]) ||\n _optionalChain$4([doc, 'optionalAccess', _13 => _13.body, 'optionalAccess', _14 => _14.scrollTop]) ||\n 0,\n };\n}\nfunction getWindowHeight() {\n return (window.innerHeight ||\n (document.documentElement && document.documentElement.clientHeight) ||\n (document.body && document.body.clientHeight));\n}\nfunction getWindowWidth() {\n return (window.innerWidth ||\n (document.documentElement && document.documentElement.clientWidth) ||\n (document.body && document.body.clientWidth));\n}\nfunction closestElementOfNode(node) {\n if (!node) {\n return null;\n }\n const el = node.nodeType === node.ELEMENT_NODE\n ? node\n : node.parentElement;\n return el;\n}\nfunction isBlocked(node, blockClass, blockSelector, unblockSelector, checkAncestors) {\n if (!node) {\n return false;\n }\n const el = closestElementOfNode(node);\n if (!el) {\n return false;\n }\n const blockedPredicate = createMatchPredicate(blockClass, blockSelector);\n if (!checkAncestors) {\n const isUnblocked = unblockSelector && el.matches(unblockSelector);\n return blockedPredicate(el) && !isUnblocked;\n }\n const blockDistance = distanceToMatch(el, blockedPredicate);\n let unblockDistance = -1;\n if (blockDistance < 0) {\n return false;\n }\n if (unblockSelector) {\n unblockDistance = distanceToMatch(el, createMatchPredicate(null, unblockSelector));\n }\n if (blockDistance > -1 && unblockDistance < 0) {\n return true;\n }\n return blockDistance < unblockDistance;\n}\nfunction isSerialized(n, mirror) {\n return mirror.getId(n) !== -1;\n}\nfunction isIgnored(n, mirror) {\n return mirror.getId(n) === IGNORED_NODE;\n}\nfunction isAncestorRemoved(target, mirror) {\n if (isShadowRoot(target)) {\n return false;\n }\n const id = mirror.getId(target);\n if (!mirror.has(id)) {\n return true;\n }\n if (target.parentNode &&\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\n return false;\n }\n if (!target.parentNode) {\n return true;\n }\n return isAncestorRemoved(target.parentNode, mirror);\n}\nfunction legacy_isTouchEvent(event) {\n return Boolean(event.changedTouches);\n}\nfunction polyfill(win = window) {\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\n win.NodeList.prototype.forEach = Array.prototype\n .forEach;\n }\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\n win.DOMTokenList.prototype.forEach = Array.prototype\n .forEach;\n }\n if (!Node.prototype.contains) {\n Node.prototype.contains = (...args) => {\n let node = args[0];\n if (!(0 in args)) {\n throw new TypeError('1 argument is required');\n }\n do {\n if (this === node) {\n return true;\n }\n } while ((node = node && node.parentNode));\n return false;\n };\n }\n}\nfunction isSerializedIframe(n, mirror) {\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\n}\nfunction isSerializedStylesheet(n, mirror) {\n return Boolean(n.nodeName === 'LINK' &&\n n.nodeType === n.ELEMENT_NODE &&\n n.getAttribute &&\n n.getAttribute('rel') === 'stylesheet' &&\n mirror.getMeta(n));\n}\nfunction hasShadowRoot(n) {\n return Boolean(_optionalChain$4([n, 'optionalAccess', _18 => _18.shadowRoot]));\n}\nclass StyleSheetMirror {\n constructor() {\n this.id = 1;\n this.styleIDMap = new WeakMap();\n this.idStyleMap = new Map();\n }\n getId(stylesheet) {\n return _nullishCoalesce(this.styleIDMap.get(stylesheet), () => ( -1));\n }\n has(stylesheet) {\n return this.styleIDMap.has(stylesheet);\n }\n add(stylesheet, id) {\n if (this.has(stylesheet))\n return this.getId(stylesheet);\n let newId;\n if (id === undefined) {\n newId = this.id++;\n }\n else\n newId = id;\n this.styleIDMap.set(stylesheet, newId);\n this.idStyleMap.set(newId, stylesheet);\n return newId;\n }\n getStyle(id) {\n return this.idStyleMap.get(id) || null;\n }\n reset() {\n this.styleIDMap = new WeakMap();\n this.idStyleMap = new Map();\n this.id = 1;\n }\n generateId() {\n return this.id++;\n }\n}\nfunction getShadowHost(n) {\n let shadowHost = null;\n if (_optionalChain$4([n, 'access', _19 => _19.getRootNode, 'optionalCall', _20 => _20(), 'optionalAccess', _21 => _21.nodeType]) === Node.DOCUMENT_FRAGMENT_NODE &&\n n.getRootNode().host)\n shadowHost = n.getRootNode().host;\n return shadowHost;\n}\nfunction getRootShadowHost(n) {\n let rootShadowHost = n;\n let shadowHost;\n while ((shadowHost = getShadowHost(rootShadowHost)))\n rootShadowHost = shadowHost;\n return rootShadowHost;\n}\nfunction shadowHostInDom(n) {\n const doc = n.ownerDocument;\n if (!doc)\n return false;\n const shadowHost = getRootShadowHost(n);\n return doc.contains(shadowHost);\n}\nfunction inDom(n) {\n const doc = n.ownerDocument;\n if (!doc)\n return false;\n return doc.contains(n) || shadowHostInDom(n);\n}\nconst cachedImplementations = {};\nfunction getImplementation(name) {\n const cached = cachedImplementations[name];\n if (cached) {\n return cached;\n }\n const document = window.document;\n let impl = window[name];\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow[name]) {\n impl =\n contentWindow[name];\n }\n document.head.removeChild(sandbox);\n }\n catch (e) {\n }\n }\n return (cachedImplementations[name] = impl.bind(window));\n}\nfunction onRequestAnimationFrame(...rest) {\n return getImplementation('requestAnimationFrame')(...rest);\n}\nfunction setTimeout$1(...rest) {\n return getImplementation('setTimeout')(...rest);\n}\nfunction clearTimeout$1(...rest) {\n return getImplementation('clearTimeout')(...rest);\n}\n\nvar EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\n\nfunction _optionalChain$3(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nfunction isNodeInLinkedList(n) {\n return '__ln' in n;\n}\nclass DoubleLinkedList {\n constructor() {\n this.length = 0;\n this.head = null;\n this.tail = null;\n }\n get(position) {\n if (position >= this.length) {\n throw new Error('Position outside of list range');\n }\n let current = this.head;\n for (let index = 0; index < position; index++) {\n current = _optionalChain$3([current, 'optionalAccess', _ => _.next]) || null;\n }\n return current;\n }\n addNode(n) {\n const node = {\n value: n,\n previous: null,\n next: null,\n };\n n.__ln = node;\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\n const current = n.previousSibling.__ln.next;\n node.next = current;\n node.previous = n.previousSibling.__ln;\n n.previousSibling.__ln.next = node;\n if (current) {\n current.previous = node;\n }\n }\n else if (n.nextSibling &&\n isNodeInLinkedList(n.nextSibling) &&\n n.nextSibling.__ln.previous) {\n const current = n.nextSibling.__ln.previous;\n node.previous = current;\n node.next = n.nextSibling.__ln;\n n.nextSibling.__ln.previous = node;\n if (current) {\n current.next = node;\n }\n }\n else {\n if (this.head) {\n this.head.previous = node;\n }\n node.next = this.head;\n this.head = node;\n }\n if (node.next === null) {\n this.tail = node;\n }\n this.length++;\n }\n removeNode(n) {\n const current = n.__ln;\n if (!this.head) {\n return;\n }\n if (!current.previous) {\n this.head = current.next;\n if (this.head) {\n this.head.previous = null;\n }\n else {\n this.tail = null;\n }\n }\n else {\n current.previous.next = current.next;\n if (current.next) {\n current.next.previous = current.previous;\n }\n else {\n this.tail = current.previous;\n }\n }\n if (n.__ln) {\n delete n.__ln;\n }\n this.length--;\n }\n}\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\nclass MutationBuffer {\n constructor() {\n this.frozen = false;\n this.locked = false;\n this.texts = [];\n this.attributes = [];\n this.attributeMap = new WeakMap();\n this.removes = [];\n this.mapRemoves = [];\n this.movedMap = {};\n this.addedSet = new Set();\n this.movedSet = new Set();\n this.droppedSet = new Set();\n this.processMutations = (mutations) => {\n mutations.forEach(this.processMutation);\n this.emit();\n };\n this.emit = () => {\n if (this.frozen || this.locked) {\n return;\n }\n const adds = [];\n const addedIds = new Set();\n const addList = new DoubleLinkedList();\n const getNextId = (n) => {\n let ns = n;\n let nextId = IGNORED_NODE;\n while (nextId === IGNORED_NODE) {\n ns = ns && ns.nextSibling;\n nextId = ns && this.mirror.getId(ns);\n }\n return nextId;\n };\n const pushAdd = (n) => {\n if (!n.parentNode || !inDom(n)) {\n return;\n }\n const parentId = isShadowRoot(n.parentNode)\n ? this.mirror.getId(getShadowHost(n))\n : this.mirror.getId(n.parentNode);\n const nextId = getNextId(n);\n if (parentId === -1 || nextId === -1) {\n return addList.addNode(n);\n }\n const sn = serializeNodeWithId(n, {\n doc: this.doc,\n mirror: this.mirror,\n blockClass: this.blockClass,\n blockSelector: this.blockSelector,\n maskAllText: this.maskAllText,\n unblockSelector: this.unblockSelector,\n maskTextClass: this.maskTextClass,\n unmaskTextClass: this.unmaskTextClass,\n maskTextSelector: this.maskTextSelector,\n unmaskTextSelector: this.unmaskTextSelector,\n skipChild: true,\n newlyAddedElement: true,\n inlineStylesheet: this.inlineStylesheet,\n maskInputOptions: this.maskInputOptions,\n maskAttributeFn: this.maskAttributeFn,\n maskTextFn: this.maskTextFn,\n maskInputFn: this.maskInputFn,\n slimDOMOptions: this.slimDOMOptions,\n dataURLOptions: this.dataURLOptions,\n recordCanvas: this.recordCanvas,\n inlineImages: this.inlineImages,\n onSerialize: (currentN) => {\n if (isSerializedIframe(currentN, this.mirror) &&\n !isBlocked(currentN, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\n this.iframeManager.addIframe(currentN);\n }\n if (isSerializedStylesheet(currentN, this.mirror)) {\n this.stylesheetManager.trackLinkElement(currentN);\n }\n if (hasShadowRoot(n)) {\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n if (isBlocked(iframe, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\n return;\n }\n this.iframeManager.attachIframe(iframe, childSn);\n if (iframe.contentWindow) {\n this.canvasManager.addWindow(iframe.contentWindow);\n }\n this.shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (link, childSn) => {\n this.stylesheetManager.attachLinkElement(link, childSn);\n },\n });\n if (sn) {\n adds.push({\n parentId,\n nextId,\n node: sn,\n });\n addedIds.add(sn.id);\n }\n };\n while (this.mapRemoves.length) {\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\n }\n for (const n of this.movedSet) {\n if (isParentRemoved(this.removes, n, this.mirror) &&\n !this.movedSet.has(n.parentNode)) {\n continue;\n }\n pushAdd(n);\n }\n for (const n of this.addedSet) {\n if (!isAncestorInSet(this.droppedSet, n) &&\n !isParentRemoved(this.removes, n, this.mirror)) {\n pushAdd(n);\n }\n else if (isAncestorInSet(this.movedSet, n)) {\n pushAdd(n);\n }\n else {\n this.droppedSet.add(n);\n }\n }\n let candidate = null;\n while (addList.length) {\n let node = null;\n if (candidate) {\n const parentId = this.mirror.getId(candidate.value.parentNode);\n const nextId = getNextId(candidate.value);\n if (parentId !== -1 && nextId !== -1) {\n node = candidate;\n }\n }\n if (!node) {\n let tailNode = addList.tail;\n while (tailNode) {\n const _node = tailNode;\n tailNode = tailNode.previous;\n if (_node) {\n const parentId = this.mirror.getId(_node.value.parentNode);\n const nextId = getNextId(_node.value);\n if (nextId === -1)\n continue;\n else if (parentId !== -1) {\n node = _node;\n break;\n }\n else {\n const unhandledNode = _node.value;\n if (unhandledNode.parentNode &&\n unhandledNode.parentNode.nodeType ===\n Node.DOCUMENT_FRAGMENT_NODE) {\n const shadowHost = unhandledNode.parentNode\n .host;\n const parentId = this.mirror.getId(shadowHost);\n if (parentId !== -1) {\n node = _node;\n break;\n }\n }\n }\n }\n }\n }\n if (!node) {\n while (addList.head) {\n addList.removeNode(addList.head.value);\n }\n break;\n }\n candidate = node.previous;\n addList.removeNode(node.value);\n pushAdd(node.value);\n }\n const payload = {\n texts: this.texts\n .map((text) => ({\n id: this.mirror.getId(text.node),\n value: text.value,\n }))\n .filter((text) => !addedIds.has(text.id))\n .filter((text) => this.mirror.has(text.id)),\n attributes: this.attributes\n .map((attribute) => {\n const { attributes } = attribute;\n if (typeof attributes.style === 'string') {\n const diffAsStr = JSON.stringify(attribute.styleDiff);\n const unchangedAsStr = JSON.stringify(attribute._unchangedStyles);\n if (diffAsStr.length < attributes.style.length) {\n if ((diffAsStr + unchangedAsStr).split('var(').length ===\n attributes.style.split('var(').length) {\n attributes.style = attribute.styleDiff;\n }\n }\n }\n return {\n id: this.mirror.getId(attribute.node),\n attributes: attributes,\n };\n })\n .filter((attribute) => !addedIds.has(attribute.id))\n .filter((attribute) => this.mirror.has(attribute.id)),\n removes: this.removes,\n adds,\n };\n if (!payload.texts.length &&\n !payload.attributes.length &&\n !payload.removes.length &&\n !payload.adds.length) {\n return;\n }\n this.texts = [];\n this.attributes = [];\n this.attributeMap = new WeakMap();\n this.removes = [];\n this.addedSet = new Set();\n this.movedSet = new Set();\n this.droppedSet = new Set();\n this.movedMap = {};\n this.mutationCb(payload);\n };\n this.processMutation = (m) => {\n if (isIgnored(m.target, this.mirror)) {\n return;\n }\n switch (m.type) {\n case 'characterData': {\n const value = m.target.textContent;\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) &&\n value !== m.oldValue) {\n this.texts.push({\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, this.maskAllText) && value\n ? this.maskTextFn\n ? this.maskTextFn(value, closestElementOfNode(m.target))\n : value.replace(/[\\S]/g, '*')\n : value,\n node: m.target,\n });\n }\n break;\n }\n case 'attributes': {\n const target = m.target;\n let attributeName = m.attributeName;\n let value = m.target.getAttribute(attributeName);\n if (attributeName === 'value') {\n const type = getInputType(target);\n const tagName = target.tagName;\n value = getInputValue(target, tagName, type);\n const isInputMasked = shouldMaskInput({\n maskInputOptions: this.maskInputOptions,\n tagName,\n type,\n });\n const forceMask = needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, isInputMasked);\n value = maskInputValue({\n isMasked: forceMask,\n element: target,\n value,\n maskInputFn: this.maskInputFn,\n });\n }\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\n value === m.oldValue) {\n return;\n }\n let item = this.attributeMap.get(m.target);\n if (target.tagName === 'IFRAME' &&\n attributeName === 'src' &&\n !this.keepIframeSrcFn(value)) {\n if (!target.contentDocument) {\n attributeName = 'rr_src';\n }\n else {\n return;\n }\n }\n if (!item) {\n item = {\n node: m.target,\n attributes: {},\n styleDiff: {},\n _unchangedStyles: {},\n };\n this.attributes.push(item);\n this.attributeMap.set(m.target, item);\n }\n if (attributeName === 'type' &&\n target.tagName === 'INPUT' &&\n (m.oldValue || '').toLowerCase() === 'password') {\n target.setAttribute('data-rr-is-password', 'true');\n }\n if (!ignoreAttribute(target.tagName, attributeName)) {\n item.attributes[attributeName] = transformAttribute(this.doc, toLowerCase(target.tagName), toLowerCase(attributeName), value, target, this.maskAttributeFn);\n if (attributeName === 'style') {\n if (!this.unattachedDoc) {\n try {\n this.unattachedDoc =\n document.implementation.createHTMLDocument();\n }\n catch (e) {\n this.unattachedDoc = this.doc;\n }\n }\n const old = this.unattachedDoc.createElement('span');\n if (m.oldValue) {\n old.setAttribute('style', m.oldValue);\n }\n for (const pname of Array.from(target.style)) {\n const newValue = target.style.getPropertyValue(pname);\n const newPriority = target.style.getPropertyPriority(pname);\n if (newValue !== old.style.getPropertyValue(pname) ||\n newPriority !== old.style.getPropertyPriority(pname)) {\n if (newPriority === '') {\n item.styleDiff[pname] = newValue;\n }\n else {\n item.styleDiff[pname] = [newValue, newPriority];\n }\n }\n else {\n item._unchangedStyles[pname] = [newValue, newPriority];\n }\n }\n for (const pname of Array.from(old.style)) {\n if (target.style.getPropertyValue(pname) === '') {\n item.styleDiff[pname] = false;\n }\n }\n }\n }\n break;\n }\n case 'childList': {\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, true)) {\n return;\n }\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\n m.removedNodes.forEach((n) => {\n const nodeId = this.mirror.getId(n);\n const parentId = isShadowRoot(m.target)\n ? this.mirror.getId(m.target.host)\n : this.mirror.getId(m.target);\n if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\n isIgnored(n, this.mirror) ||\n !isSerialized(n, this.mirror)) {\n return;\n }\n if (this.addedSet.has(n)) {\n deepDelete(this.addedSet, n);\n this.droppedSet.add(n);\n }\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\n else if (isAncestorRemoved(m.target, this.mirror)) ;\n else if (this.movedSet.has(n) &&\n this.movedMap[moveKey(nodeId, parentId)]) {\n deepDelete(this.movedSet, n);\n }\n else {\n this.removes.push({\n parentId,\n id: nodeId,\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\n ? true\n : undefined,\n });\n }\n this.mapRemoves.push(n);\n });\n break;\n }\n }\n };\n this.genAdds = (n, target) => {\n if (this.processedNodeManager.inOtherBuffer(n, this))\n return;\n if (this.addedSet.has(n) || this.movedSet.has(n))\n return;\n if (this.mirror.hasNode(n)) {\n if (isIgnored(n, this.mirror)) {\n return;\n }\n this.movedSet.add(n);\n let targetId = null;\n if (target && this.mirror.hasNode(target)) {\n targetId = this.mirror.getId(target);\n }\n if (targetId && targetId !== -1) {\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\n }\n }\n else {\n this.addedSet.add(n);\n this.droppedSet.delete(n);\n }\n if (!isBlocked(n, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\n n.childNodes.forEach((childN) => this.genAdds(childN));\n if (hasShadowRoot(n)) {\n n.shadowRoot.childNodes.forEach((childN) => {\n this.processedNodeManager.add(childN, this);\n this.genAdds(childN, n);\n });\n }\n }\n };\n }\n init(options) {\n [\n 'mutationCb',\n 'blockClass',\n 'blockSelector',\n 'unblockSelector',\n 'maskAllText',\n 'maskTextClass',\n 'unmaskTextClass',\n 'maskTextSelector',\n 'unmaskTextSelector',\n 'inlineStylesheet',\n 'maskInputOptions',\n 'maskAttributeFn',\n 'maskTextFn',\n 'maskInputFn',\n 'keepIframeSrcFn',\n 'recordCanvas',\n 'inlineImages',\n 'slimDOMOptions',\n 'dataURLOptions',\n 'doc',\n 'mirror',\n 'iframeManager',\n 'stylesheetManager',\n 'shadowDomManager',\n 'canvasManager',\n 'processedNodeManager',\n ].forEach((key) => {\n this[key] = options[key];\n });\n }\n freeze() {\n this.frozen = true;\n this.canvasManager.freeze();\n }\n unfreeze() {\n this.frozen = false;\n this.canvasManager.unfreeze();\n this.emit();\n }\n isFrozen() {\n return this.frozen;\n }\n lock() {\n this.locked = true;\n this.canvasManager.lock();\n }\n unlock() {\n this.locked = false;\n this.canvasManager.unlock();\n this.emit();\n }\n reset() {\n this.shadowDomManager.reset();\n this.canvasManager.reset();\n }\n}\nfunction deepDelete(addsSet, n) {\n addsSet.delete(n);\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\n}\nfunction isParentRemoved(removes, n, mirror) {\n if (removes.length === 0)\n return false;\n return _isParentRemoved(removes, n, mirror);\n}\nfunction _isParentRemoved(removes, n, mirror) {\n let node = n.parentNode;\n while (node) {\n const parentId = mirror.getId(node);\n if (removes.some((r) => r.id === parentId)) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\nfunction isAncestorInSet(set, n) {\n if (set.size === 0)\n return false;\n return _isAncestorInSet(set, n);\n}\nfunction _isAncestorInSet(set, n) {\n const { parentNode } = n;\n if (!parentNode) {\n return false;\n }\n if (set.has(parentNode)) {\n return true;\n }\n return _isAncestorInSet(set, parentNode);\n}\n\nlet errorHandler;\nfunction registerErrorHandler(handler) {\n errorHandler = handler;\n}\nfunction unregisterErrorHandler() {\n errorHandler = undefined;\n}\nconst callbackWrapper = (cb) => {\n if (!errorHandler) {\n return cb;\n }\n const rrwebWrapped = ((...rest) => {\n try {\n return cb(...rest);\n }\n catch (error) {\n if (errorHandler && errorHandler(error) === true) {\n return () => {\n };\n }\n throw error;\n }\n });\n return rrwebWrapped;\n};\n\nfunction _optionalChain$2(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nconst mutationBuffers = [];\nfunction getEventTarget(event) {\n try {\n if ('composedPath' in event) {\n const path = event.composedPath();\n if (path.length) {\n return path[0];\n }\n }\n else if ('path' in event && event.path.length) {\n return event.path[0];\n }\n }\n catch (e2) {\n }\n return event && event.target;\n}\nfunction initMutationObserver(options, rootEl) {\n const mutationBuffer = new MutationBuffer();\n mutationBuffers.push(mutationBuffer);\n mutationBuffer.init(options);\n let mutationObserverCtor = window.MutationObserver ||\n window.__rrMutationObserver;\n const angularZoneSymbol = _optionalChain$2([window, 'optionalAccess', _ => _.Zone, 'optionalAccess', _2 => _2.__symbol__, 'optionalCall', _3 => _3('MutationObserver')]);\n if (angularZoneSymbol &&\n window[angularZoneSymbol]) {\n mutationObserverCtor = window[angularZoneSymbol];\n }\n const observer = new mutationObserverCtor(callbackWrapper((mutations) => {\n if (options.onMutation && options.onMutation(mutations) === false) {\n return;\n }\n mutationBuffer.processMutations.bind(mutationBuffer)(mutations);\n }));\n observer.observe(rootEl, {\n attributes: true,\n attributeOldValue: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n });\n return observer;\n}\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\n if (sampling.mousemove === false) {\n return () => {\n };\n }\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\n ? sampling.mousemoveCallback\n : 500;\n let positions = [];\n let timeBaseline;\n const wrappedCb = throttle$1(callbackWrapper((source) => {\n const totalOffset = Date.now() - timeBaseline;\n mousemoveCb(positions.map((p) => {\n p.timeOffset -= totalOffset;\n return p;\n }), source);\n positions = [];\n timeBaseline = null;\n }), callbackThreshold);\n const updatePosition = callbackWrapper(throttle$1(callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n const { clientX, clientY } = legacy_isTouchEvent(evt)\n ? evt.changedTouches[0]\n : evt;\n if (!timeBaseline) {\n timeBaseline = nowTimestamp();\n }\n positions.push({\n x: clientX,\n y: clientY,\n id: mirror.getId(target),\n timeOffset: nowTimestamp() - timeBaseline,\n });\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\n ? IncrementalSource.Drag\n : evt instanceof MouseEvent\n ? IncrementalSource.MouseMove\n : IncrementalSource.TouchMove);\n }), threshold, {\n trailing: false,\n }));\n const handlers = [\n on('mousemove', updatePosition, doc),\n on('touchmove', updatePosition, doc),\n on('drag', updatePosition, doc),\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\n if (sampling.mouseInteraction === false) {\n return () => {\n };\n }\n const disableMap = sampling.mouseInteraction === true ||\n sampling.mouseInteraction === undefined\n ? {}\n : sampling.mouseInteraction;\n const handlers = [];\n let currentPointerType = null;\n const getHandler = (eventKey) => {\n return (event) => {\n const target = getEventTarget(event);\n if (isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n let pointerType = null;\n let thisEventKey = eventKey;\n if ('pointerType' in event) {\n switch (event.pointerType) {\n case 'mouse':\n pointerType = PointerTypes.Mouse;\n break;\n case 'touch':\n pointerType = PointerTypes.Touch;\n break;\n case 'pen':\n pointerType = PointerTypes.Pen;\n break;\n }\n if (pointerType === PointerTypes.Touch) {\n if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {\n thisEventKey = 'TouchStart';\n }\n else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) {\n thisEventKey = 'TouchEnd';\n }\n }\n else if (pointerType === PointerTypes.Pen) ;\n }\n else if (legacy_isTouchEvent(event)) {\n pointerType = PointerTypes.Touch;\n }\n if (pointerType !== null) {\n currentPointerType = pointerType;\n if ((thisEventKey.startsWith('Touch') &&\n pointerType === PointerTypes.Touch) ||\n (thisEventKey.startsWith('Mouse') &&\n pointerType === PointerTypes.Mouse)) {\n pointerType = null;\n }\n }\n else if (MouseInteractions[eventKey] === MouseInteractions.Click) {\n pointerType = currentPointerType;\n currentPointerType = null;\n }\n const e = legacy_isTouchEvent(event) ? event.changedTouches[0] : event;\n if (!e) {\n return;\n }\n const id = mirror.getId(target);\n const { clientX, clientY } = e;\n callbackWrapper(mouseInteractionCb)({\n type: MouseInteractions[thisEventKey],\n id,\n x: clientX,\n y: clientY,\n ...(pointerType !== null && { pointerType }),\n });\n };\n };\n Object.keys(MouseInteractions)\n .filter((key) => Number.isNaN(Number(key)) &&\n !key.endsWith('_Departed') &&\n disableMap[key] !== false)\n .forEach((eventKey) => {\n let eventName = toLowerCase(eventKey);\n const handler = getHandler(eventKey);\n if (window.PointerEvent) {\n switch (MouseInteractions[eventKey]) {\n case MouseInteractions.MouseDown:\n case MouseInteractions.MouseUp:\n eventName = eventName.replace('mouse', 'pointer');\n break;\n case MouseInteractions.TouchStart:\n case MouseInteractions.TouchEnd:\n return;\n }\n }\n handlers.push(on(eventName, handler, doc));\n });\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\n const updatePosition = callbackWrapper(throttle$1(callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n if (!target ||\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n const id = mirror.getId(target);\n if (target === doc && doc.defaultView) {\n const scrollLeftTop = getWindowScroll(doc.defaultView);\n scrollCb({\n id,\n x: scrollLeftTop.left,\n y: scrollLeftTop.top,\n });\n }\n else {\n scrollCb({\n id,\n x: target.scrollLeft,\n y: target.scrollTop,\n });\n }\n }), sampling.scroll || 100));\n return on('scroll', updatePosition, doc);\n}\nfunction initViewportResizeObserver({ viewportResizeCb }, { win }) {\n let lastH = -1;\n let lastW = -1;\n const updateDimension = callbackWrapper(throttle$1(callbackWrapper(() => {\n const height = getWindowHeight();\n const width = getWindowWidth();\n if (lastH !== height || lastW !== width) {\n viewportResizeCb({\n width: Number(width),\n height: Number(height),\n });\n lastH = height;\n lastW = width;\n }\n }), 200));\n return on('resize', updateDimension, win);\n}\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\nconst lastInputValueMap = new WeakMap();\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, unblockSelector, ignoreClass, ignoreSelector, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, }) {\n function eventHandler(event) {\n let target = getEventTarget(event);\n const userTriggered = event.isTrusted;\n const tagName = target && toUpperCase(target.tagName);\n if (tagName === 'OPTION')\n target = target.parentElement;\n if (!target ||\n !tagName ||\n INPUT_TAGS.indexOf(tagName) < 0 ||\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n const el = target;\n if (el.classList.contains(ignoreClass) ||\n (ignoreSelector && el.matches(ignoreSelector))) {\n return;\n }\n const type = getInputType(target);\n let text = getInputValue(el, tagName, type);\n let isChecked = false;\n const isInputMasked = shouldMaskInput({\n maskInputOptions,\n tagName,\n type,\n });\n const forceMask = needMaskingText(target, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked);\n if (type === 'radio' || type === 'checkbox') {\n isChecked = target.checked;\n }\n text = maskInputValue({\n isMasked: forceMask,\n element: target,\n value: text,\n maskInputFn,\n });\n cbWithDedup(target, userTriggeredOnInput\n ? { text, isChecked, userTriggered }\n : { text, isChecked });\n const name = target.name;\n if (type === 'radio' && name && isChecked) {\n doc\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\n .forEach((el) => {\n if (el !== target) {\n const text = maskInputValue({\n isMasked: forceMask,\n element: el,\n value: getInputValue(el, tagName, type),\n maskInputFn,\n });\n cbWithDedup(el, userTriggeredOnInput\n ? { text, isChecked: !isChecked, userTriggered: false }\n : { text, isChecked: !isChecked });\n }\n });\n }\n }\n function cbWithDedup(target, v) {\n const lastInputValue = lastInputValueMap.get(target);\n if (!lastInputValue ||\n lastInputValue.text !== v.text ||\n lastInputValue.isChecked !== v.isChecked) {\n lastInputValueMap.set(target, v);\n const id = mirror.getId(target);\n callbackWrapper(inputCb)({\n ...v,\n id,\n });\n }\n }\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\n const handlers = events.map((eventName) => on(eventName, callbackWrapper(eventHandler), doc));\n const currentWindow = doc.defaultView;\n if (!currentWindow) {\n return () => {\n handlers.forEach((h) => h());\n };\n }\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\n const hookProperties = [\n [currentWindow.HTMLInputElement.prototype, 'value'],\n [currentWindow.HTMLInputElement.prototype, 'checked'],\n [currentWindow.HTMLSelectElement.prototype, 'value'],\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\n ];\n if (propertyDescriptor && propertyDescriptor.set) {\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\n set() {\n callbackWrapper(eventHandler)({\n target: this,\n isTrusted: false,\n });\n },\n }, false, currentWindow)));\n }\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction getNestedCSSRulePositions(rule) {\n const positions = [];\n function recurse(childRule, pos) {\n if ((hasNestedCSSRule('CSSGroupingRule') &&\n childRule.parentRule instanceof CSSGroupingRule) ||\n (hasNestedCSSRule('CSSMediaRule') &&\n childRule.parentRule instanceof CSSMediaRule) ||\n (hasNestedCSSRule('CSSSupportsRule') &&\n childRule.parentRule instanceof CSSSupportsRule) ||\n (hasNestedCSSRule('CSSConditionRule') &&\n childRule.parentRule instanceof CSSConditionRule)) {\n const rules = Array.from(childRule.parentRule.cssRules);\n const index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n else if (childRule.parentStyleSheet) {\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\n const index = rules.indexOf(childRule);\n pos.unshift(index);\n }\n return pos;\n }\n return recurse(rule, positions);\n}\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\n let id, styleId;\n if (!sheet)\n return {};\n if (sheet.ownerNode)\n id = mirror.getId(sheet.ownerNode);\n else\n styleId = styleMirror.getId(sheet);\n return {\n styleId,\n id,\n };\n}\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\n if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) {\n return () => {\n };\n }\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [rule, index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [{ rule, index }],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [{ index }],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n let replace;\n if (win.CSSStyleSheet.prototype.replace) {\n replace = win.CSSStyleSheet.prototype.replace;\n win.CSSStyleSheet.prototype.replace = new Proxy(replace, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n replace: text,\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n }\n let replaceSync;\n if (win.CSSStyleSheet.prototype.replaceSync) {\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\n win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n replaceSync: text,\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n }\n const supportedNestedCSSRuleTypes = {};\n if (canMonkeyPatchNestedCSSRule('CSSGroupingRule')) {\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\n }\n else {\n if (canMonkeyPatchNestedCSSRule('CSSMediaRule')) {\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\n }\n if (canMonkeyPatchNestedCSSRule('CSSConditionRule')) {\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\n }\n if (canMonkeyPatchNestedCSSRule('CSSSupportsRule')) {\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\n }\n }\n const unmodifiedFunctions = {};\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n unmodifiedFunctions[typeKey] = {\n insertRule: type.prototype.insertRule,\n deleteRule: type.prototype.deleteRule,\n };\n type.prototype.insertRule = new Proxy(unmodifiedFunctions[typeKey].insertRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [rule, index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [\n {\n rule,\n index: [\n ...getNestedCSSRulePositions(thisArg),\n index || 0,\n ],\n },\n ],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n type.prototype.deleteRule = new Proxy(unmodifiedFunctions[typeKey].deleteRule, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [index] = argumentsList;\n const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [\n { index: [...getNestedCSSRulePositions(thisArg), index] },\n ],\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n });\n return callbackWrapper(() => {\n win.CSSStyleSheet.prototype.insertRule = insertRule;\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\n replace && (win.CSSStyleSheet.prototype.replace = replace);\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\n });\n });\n}\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\n let hostId = null;\n if (host.nodeName === '#document')\n hostId = mirror.getId(host);\n else\n hostId = mirror.getId(host.host);\n const patchTarget = host.nodeName === '#document'\n ? _optionalChain$2([host, 'access', _4 => _4.defaultView, 'optionalAccess', _5 => _5.Document])\n : _optionalChain$2([host, 'access', _6 => _6.ownerDocument, 'optionalAccess', _7 => _7.defaultView, 'optionalAccess', _8 => _8.ShadowRoot]);\n const originalPropertyDescriptor = _optionalChain$2([patchTarget, 'optionalAccess', _9 => _9.prototype])\n ? Object.getOwnPropertyDescriptor(_optionalChain$2([patchTarget, 'optionalAccess', _10 => _10.prototype]), 'adoptedStyleSheets')\n : undefined;\n if (hostId === null ||\n hostId === -1 ||\n !patchTarget ||\n !originalPropertyDescriptor)\n return () => {\n };\n Object.defineProperty(host, 'adoptedStyleSheets', {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n get() {\n return _optionalChain$2([originalPropertyDescriptor, 'access', _11 => _11.get, 'optionalAccess', _12 => _12.call, 'call', _13 => _13(this)]);\n },\n set(sheets) {\n const result = _optionalChain$2([originalPropertyDescriptor, 'access', _14 => _14.set, 'optionalAccess', _15 => _15.call, 'call', _16 => _16(this, sheets)]);\n if (hostId !== null && hostId !== -1) {\n try {\n stylesheetManager.adoptStyleSheets(sheets, hostId);\n }\n catch (e) {\n }\n }\n return result;\n },\n });\n return callbackWrapper(() => {\n Object.defineProperty(host, 'adoptedStyleSheets', {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n get: originalPropertyDescriptor.get,\n set: originalPropertyDescriptor.set,\n });\n });\n}\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\n win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [property, value, priority] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return setProperty.apply(thisArg, [property, value, priority]);\n }\n const { id, styleId } = getIdAndStyleId(_optionalChain$2([thisArg, 'access', _17 => _17.parentRule, 'optionalAccess', _18 => _18.parentStyleSheet]), mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleDeclarationCb({\n id,\n styleId,\n set: {\n property,\n value,\n priority,\n },\n index: getNestedCSSRulePositions(thisArg.parentRule),\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, {\n apply: callbackWrapper((target, thisArg, argumentsList) => {\n const [property] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return removeProperty.apply(thisArg, [property]);\n }\n const { id, styleId } = getIdAndStyleId(_optionalChain$2([thisArg, 'access', _19 => _19.parentRule, 'optionalAccess', _20 => _20.parentStyleSheet]), mirror, stylesheetManager.styleMirror);\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\n styleDeclarationCb({\n id,\n styleId,\n remove: {\n property,\n },\n index: getNestedCSSRulePositions(thisArg.parentRule),\n });\n }\n return target.apply(thisArg, argumentsList);\n }),\n });\n return callbackWrapper(() => {\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\n });\n}\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, unblockSelector, mirror, sampling, doc, }) {\n const handler = callbackWrapper((type) => throttle$1(callbackWrapper((event) => {\n const target = getEventTarget(event);\n if (!target ||\n isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\n return;\n }\n const { currentTime, volume, muted, playbackRate } = target;\n mediaInteractionCb({\n type,\n id: mirror.getId(target),\n currentTime,\n volume,\n muted,\n playbackRate,\n });\n }), sampling.media || 500));\n const handlers = [\n on('play', handler(0), doc),\n on('pause', handler(1), doc),\n on('seeked', handler(2), doc),\n on('volumechange', handler(3), doc),\n on('ratechange', handler(4), doc),\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initFontObserver({ fontCb, doc }) {\n const win = doc.defaultView;\n if (!win) {\n return () => {\n };\n }\n const handlers = [];\n const fontMap = new WeakMap();\n const originalFontFace = win.FontFace;\n win.FontFace = function FontFace(family, source, descriptors) {\n const fontFace = new originalFontFace(family, source, descriptors);\n fontMap.set(fontFace, {\n family,\n buffer: typeof source !== 'string',\n descriptors,\n fontSource: typeof source === 'string'\n ? source\n : JSON.stringify(Array.from(new Uint8Array(source))),\n });\n return fontFace;\n };\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\n return function (fontFace) {\n setTimeout$1(callbackWrapper(() => {\n const p = fontMap.get(fontFace);\n if (p) {\n fontCb(p);\n fontMap.delete(fontFace);\n }\n }), 0);\n return original.apply(this, [fontFace]);\n };\n });\n handlers.push(() => {\n win.FontFace = originalFontFace;\n });\n handlers.push(restoreHandler);\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initSelectionObserver(param) {\n const { doc, mirror, blockClass, blockSelector, unblockSelector, selectionCb, } = param;\n let collapsed = true;\n const updateSelection = callbackWrapper(() => {\n const selection = doc.getSelection();\n if (!selection || (collapsed && _optionalChain$2([selection, 'optionalAccess', _21 => _21.isCollapsed])))\n return;\n collapsed = selection.isCollapsed || false;\n const ranges = [];\n const count = selection.rangeCount || 0;\n for (let i = 0; i < count; i++) {\n const range = selection.getRangeAt(i);\n const { startContainer, startOffset, endContainer, endOffset } = range;\n const blocked = isBlocked(startContainer, blockClass, blockSelector, unblockSelector, true) ||\n isBlocked(endContainer, blockClass, blockSelector, unblockSelector, true);\n if (blocked)\n continue;\n ranges.push({\n start: mirror.getId(startContainer),\n startOffset,\n end: mirror.getId(endContainer),\n endOffset,\n });\n }\n selectionCb({ ranges });\n });\n updateSelection();\n return on('selectionchange', updateSelection);\n}\nfunction initCustomElementObserver({ doc, customElementCb, }) {\n const win = doc.defaultView;\n if (!win || !win.customElements)\n return () => { };\n const restoreHandler = patch(win.customElements, 'define', function (original) {\n return function (name, constructor, options) {\n try {\n customElementCb({\n define: {\n name,\n },\n });\n }\n catch (e) {\n }\n return original.apply(this, [name, constructor, options]);\n };\n });\n return restoreHandler;\n}\nfunction initObservers(o, _hooks = {}) {\n const currentWindow = o.doc.defaultView;\n if (!currentWindow) {\n return () => {\n };\n }\n let mutationObserver;\n if (o.recordDOM) {\n mutationObserver = initMutationObserver(o, o.doc);\n }\n const mousemoveHandler = initMoveObserver(o);\n const mouseInteractionHandler = initMouseInteractionObserver(o);\n const scrollHandler = initScrollObserver(o);\n const viewportResizeHandler = initViewportResizeObserver(o, {\n win: currentWindow,\n });\n const inputHandler = initInputObserver(o);\n const mediaInteractionHandler = initMediaInteractionObserver(o);\n let styleSheetObserver = () => { };\n let adoptedStyleSheetObserver = () => { };\n let styleDeclarationObserver = () => { };\n let fontObserver = () => { };\n if (o.recordDOM) {\n styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\n adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\n styleDeclarationObserver = initStyleDeclarationObserver(o, {\n win: currentWindow,\n });\n if (o.collectFonts) {\n fontObserver = initFontObserver(o);\n }\n }\n const selectionObserver = initSelectionObserver(o);\n const customElementObserver = initCustomElementObserver(o);\n const pluginHandlers = [];\n for (const plugin of o.plugins) {\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\n }\n return callbackWrapper(() => {\n mutationBuffers.forEach((b) => b.reset());\n _optionalChain$2([mutationObserver, 'optionalAccess', _22 => _22.disconnect, 'call', _23 => _23()]);\n mousemoveHandler();\n mouseInteractionHandler();\n scrollHandler();\n viewportResizeHandler();\n inputHandler();\n mediaInteractionHandler();\n styleSheetObserver();\n adoptedStyleSheetObserver();\n styleDeclarationObserver();\n fontObserver();\n selectionObserver();\n customElementObserver();\n pluginHandlers.forEach((h) => h());\n });\n}\nfunction hasNestedCSSRule(prop) {\n return typeof window[prop] !== 'undefined';\n}\nfunction canMonkeyPatchNestedCSSRule(prop) {\n return Boolean(typeof window[prop] !== 'undefined' &&\n window[prop].prototype &&\n 'insertRule' in window[prop].prototype &&\n 'deleteRule' in window[prop].prototype);\n}\n\nclass CrossOriginIframeMirror {\n constructor(generateIdFn) {\n this.generateIdFn = generateIdFn;\n this.iframeIdToRemoteIdMap = new WeakMap();\n this.iframeRemoteIdToIdMap = new WeakMap();\n }\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\n let id = idToRemoteIdMap.get(remoteId);\n if (!id) {\n id = this.generateIdFn();\n idToRemoteIdMap.set(remoteId, id);\n remoteIdToIdMap.set(id, remoteId);\n }\n return id;\n }\n getIds(iframe, remoteId) {\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\n }\n getRemoteId(iframe, id, map) {\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\n if (typeof id !== 'number')\n return id;\n const remoteId = remoteIdToIdMap.get(id);\n if (!remoteId)\n return -1;\n return remoteId;\n }\n getRemoteIds(iframe, ids) {\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\n }\n reset(iframe) {\n if (!iframe) {\n this.iframeIdToRemoteIdMap = new WeakMap();\n this.iframeRemoteIdToIdMap = new WeakMap();\n return;\n }\n this.iframeIdToRemoteIdMap.delete(iframe);\n this.iframeRemoteIdToIdMap.delete(iframe);\n }\n getIdToRemoteIdMap(iframe) {\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\n if (!idToRemoteIdMap) {\n idToRemoteIdMap = new Map();\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\n }\n return idToRemoteIdMap;\n }\n getRemoteIdToIdMap(iframe) {\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\n if (!remoteIdToIdMap) {\n remoteIdToIdMap = new Map();\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\n }\n return remoteIdToIdMap;\n }\n}\n\nfunction _optionalChain$1(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }\nclass IframeManagerNoop {\n constructor() {\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\n this.crossOriginIframeRootIdMap = new WeakMap();\n }\n addIframe() {\n }\n addLoadListener() {\n }\n attachIframe() {\n }\n}\nclass IframeManager {\n constructor(options) {\n this.iframes = new WeakMap();\n this.crossOriginIframeMap = new WeakMap();\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\n this.crossOriginIframeRootIdMap = new WeakMap();\n this.mutationCb = options.mutationCb;\n this.wrappedEmit = options.wrappedEmit;\n this.stylesheetManager = options.stylesheetManager;\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\n this.mirror = options.mirror;\n if (this.recordCrossOriginIframes) {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n }\n addIframe(iframeEl) {\n this.iframes.set(iframeEl, true);\n if (iframeEl.contentWindow)\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\n }\n addLoadListener(cb) {\n this.loadListener = cb;\n }\n attachIframe(iframeEl, childSn) {\n this.mutationCb({\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: childSn,\n },\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true,\n });\n _optionalChain$1([this, 'access', _ => _.loadListener, 'optionalCall', _2 => _2(iframeEl)]);\n if (iframeEl.contentDocument &&\n iframeEl.contentDocument.adoptedStyleSheets &&\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\n }\n handleMessage(message) {\n const crossOriginMessageEvent = message;\n if (crossOriginMessageEvent.data.type !== 'rrweb' ||\n crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin)\n return;\n const iframeSourceWindow = message.source;\n if (!iframeSourceWindow)\n return;\n const iframeEl = this.crossOriginIframeMap.get(message.source);\n if (!iframeEl)\n return;\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, crossOriginMessageEvent.data.event);\n if (transformedEvent)\n this.wrappedEmit(transformedEvent, crossOriginMessageEvent.data.isCheckout);\n }\n transformCrossOriginEvent(iframeEl, e) {\n switch (e.type) {\n case EventType.FullSnapshot: {\n this.crossOriginIframeMirror.reset(iframeEl);\n this.crossOriginIframeStyleMirror.reset(iframeEl);\n this.replaceIdOnNode(e.data.node, iframeEl);\n const rootId = e.data.node.id;\n this.crossOriginIframeRootIdMap.set(iframeEl, rootId);\n this.patchRootIdOnNode(e.data.node, rootId);\n return {\n timestamp: e.timestamp,\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: e.data.node,\n },\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true,\n },\n };\n }\n case EventType.Meta:\n case EventType.Load:\n case EventType.DomContentLoaded: {\n return false;\n }\n case EventType.Plugin: {\n return e;\n }\n case EventType.Custom: {\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\n return e;\n }\n case EventType.IncrementalSnapshot: {\n switch (e.data.source) {\n case IncrementalSource.Mutation: {\n e.data.adds.forEach((n) => {\n this.replaceIds(n, iframeEl, [\n 'parentId',\n 'nextId',\n 'previousId',\n ]);\n this.replaceIdOnNode(n.node, iframeEl);\n const rootId = this.crossOriginIframeRootIdMap.get(iframeEl);\n rootId && this.patchRootIdOnNode(n.node, rootId);\n });\n e.data.removes.forEach((n) => {\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\n });\n e.data.attributes.forEach((n) => {\n this.replaceIds(n, iframeEl, ['id']);\n });\n e.data.texts.forEach((n) => {\n this.replaceIds(n, iframeEl, ['id']);\n });\n return e;\n }\n case IncrementalSource.Drag:\n case IncrementalSource.TouchMove:\n case IncrementalSource.MouseMove: {\n e.data.positions.forEach((p) => {\n this.replaceIds(p, iframeEl, ['id']);\n });\n return e;\n }\n case IncrementalSource.ViewportResize: {\n return false;\n }\n case IncrementalSource.MediaInteraction:\n case IncrementalSource.MouseInteraction:\n case IncrementalSource.Scroll:\n case IncrementalSource.CanvasMutation:\n case IncrementalSource.Input: {\n this.replaceIds(e.data, iframeEl, ['id']);\n return e;\n }\n case IncrementalSource.StyleSheetRule:\n case IncrementalSource.StyleDeclaration: {\n this.replaceIds(e.data, iframeEl, ['id']);\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\n return e;\n }\n case IncrementalSource.Font: {\n return e;\n }\n case IncrementalSource.Selection: {\n e.data.ranges.forEach((range) => {\n this.replaceIds(range, iframeEl, ['start', 'end']);\n });\n return e;\n }\n case IncrementalSource.AdoptedStyleSheet: {\n this.replaceIds(e.data, iframeEl, ['id']);\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\n _optionalChain$1([e, 'access', _3 => _3.data, 'access', _4 => _4.styles, 'optionalAccess', _5 => _5.forEach, 'call', _6 => _6((style) => {\n this.replaceStyleIds(style, iframeEl, ['styleId']);\n })]);\n return e;\n }\n }\n }\n }\n return false;\n }\n replace(iframeMirror, obj, iframeEl, keys) {\n for (const key of keys) {\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\n continue;\n if (Array.isArray(obj[key])) {\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\n }\n else {\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\n }\n }\n return obj;\n }\n replaceIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\n }\n replaceStyleIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\n }\n replaceIdOnNode(node, iframeEl) {\n this.replaceIds(node, iframeEl, ['id', 'rootId']);\n if ('childNodes' in node) {\n node.childNodes.forEach((child) => {\n this.replaceIdOnNode(child, iframeEl);\n });\n }\n }\n patchRootIdOnNode(node, rootId) {\n if (node.type !== NodeType$1.Document && !node.rootId)\n node.rootId = rootId;\n if ('childNodes' in node) {\n node.childNodes.forEach((child) => {\n this.patchRootIdOnNode(child, rootId);\n });\n }\n }\n}\n\nclass ShadowDomManagerNoop {\n init() {\n }\n addShadowRoot() {\n }\n observeAttachShadow() {\n }\n reset() {\n }\n}\nclass ShadowDomManager {\n constructor(options) {\n this.shadowDoms = new WeakSet();\n this.restoreHandlers = [];\n this.mutationCb = options.mutationCb;\n this.scrollCb = options.scrollCb;\n this.bypassOptions = options.bypassOptions;\n this.mirror = options.mirror;\n this.init();\n }\n init() {\n this.reset();\n this.patchAttachShadow(Element, document);\n }\n addShadowRoot(shadowRoot, doc) {\n if (!isNativeShadowDom(shadowRoot))\n return;\n if (this.shadowDoms.has(shadowRoot))\n return;\n this.shadowDoms.add(shadowRoot);\n this.bypassOptions.canvasManager.addShadowRoot(shadowRoot);\n const observer = initMutationObserver({\n ...this.bypassOptions,\n doc,\n mutationCb: this.mutationCb,\n mirror: this.mirror,\n shadowDomManager: this,\n }, shadowRoot);\n this.restoreHandlers.push(() => observer.disconnect());\n this.restoreHandlers.push(initScrollObserver({\n ...this.bypassOptions,\n scrollCb: this.scrollCb,\n doc: shadowRoot,\n mirror: this.mirror,\n }));\n setTimeout$1(() => {\n if (shadowRoot.adoptedStyleSheets &&\n shadowRoot.adoptedStyleSheets.length > 0)\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\n this.restoreHandlers.push(initAdoptedStyleSheetObserver({\n mirror: this.mirror,\n stylesheetManager: this.bypassOptions.stylesheetManager,\n }, shadowRoot));\n }, 0);\n }\n observeAttachShadow(iframeElement) {\n if (!iframeElement.contentWindow || !iframeElement.contentDocument)\n return;\n this.patchAttachShadow(iframeElement.contentWindow.Element, iframeElement.contentDocument);\n }\n patchAttachShadow(element, doc) {\n const manager = this;\n this.restoreHandlers.push(patch(element.prototype, 'attachShadow', function (original) {\n return function (option) {\n const shadowRoot = original.call(this, option);\n if (this.shadowRoot && inDom(this))\n manager.addShadowRoot(this.shadowRoot, doc);\n return shadowRoot;\n };\n }));\n }\n reset() {\n this.restoreHandlers.forEach((handler) => {\n try {\n handler();\n }\n catch (e) {\n }\n });\n this.restoreHandlers = [];\n this.shadowDoms = new WeakSet();\n this.bypassOptions.canvasManager.resetShadowRoots();\n }\n}\n\nclass CanvasManagerNoop {\n reset() {\n }\n freeze() {\n }\n unfreeze() {\n }\n lock() {\n }\n unlock() {\n }\n snapshot() {\n }\n addWindow() {\n }\n addShadowRoot() {\n }\n resetShadowRoots() {\n }\n}\n\nclass StylesheetManager {\n constructor(options) {\n this.trackedLinkElements = new WeakSet();\n this.styleMirror = new StyleSheetMirror();\n this.mutationCb = options.mutationCb;\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\n }\n attachLinkElement(linkEl, childSn) {\n if ('_cssText' in childSn.attributes)\n this.mutationCb({\n adds: [],\n removes: [],\n texts: [],\n attributes: [\n {\n id: childSn.id,\n attributes: childSn\n .attributes,\n },\n ],\n });\n this.trackLinkElement(linkEl);\n }\n trackLinkElement(linkEl) {\n if (this.trackedLinkElements.has(linkEl))\n return;\n this.trackedLinkElements.add(linkEl);\n this.trackStylesheetInLinkElement(linkEl);\n }\n adoptStyleSheets(sheets, hostId) {\n if (sheets.length === 0)\n return;\n const adoptedStyleSheetData = {\n id: hostId,\n styleIds: [],\n };\n const styles = [];\n for (const sheet of sheets) {\n let styleId;\n if (!this.styleMirror.has(sheet)) {\n styleId = this.styleMirror.add(sheet);\n styles.push({\n styleId,\n rules: Array.from(sheet.rules || CSSRule, (r, index) => ({\n rule: stringifyRule(r),\n index,\n })),\n });\n }\n else\n styleId = this.styleMirror.getId(sheet);\n adoptedStyleSheetData.styleIds.push(styleId);\n }\n if (styles.length > 0)\n adoptedStyleSheetData.styles = styles;\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\n }\n reset() {\n this.styleMirror.reset();\n this.trackedLinkElements = new WeakSet();\n }\n trackStylesheetInLinkElement(linkEl) {\n }\n}\n\nclass ProcessedNodeManager {\n constructor() {\n this.nodeMap = new WeakMap();\n this.active = false;\n }\n inOtherBuffer(node, thisBuffer) {\n const buffers = this.nodeMap.get(node);\n return (buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer));\n }\n add(node, buffer) {\n if (!this.active) {\n this.active = true;\n onRequestAnimationFrame(() => {\n this.nodeMap = new WeakMap();\n this.active = false;\n });\n }\n this.nodeMap.set(node, (this.nodeMap.get(node) || new Set()).add(buffer));\n }\n destroy() {\n }\n}\n\nlet wrappedEmit;\nlet _takeFullSnapshot;\ntry {\n if (Array.from([1], (x) => x * 2)[0] !== 2) {\n const cleanFrame = document.createElement('iframe');\n document.body.appendChild(cleanFrame);\n Array.from = _optionalChain([cleanFrame, 'access', _ => _.contentWindow, 'optionalAccess', _2 => _2.Array, 'access', _3 => _3.from]) || Array.from;\n document.body.removeChild(cleanFrame);\n }\n}\ncatch (err) {\n console.debug('Unable to override Array.from', err);\n}\nconst mirror = createMirror();\nfunction record(options = {}) {\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, unblockSelector = null, ignoreClass = 'rr-ignore', ignoreSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, maxCanvasSize = null, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordDOM = true, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === 'DOMContentLoaded'\n ? options.recordAfter\n : 'load', userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), errorHandler, onMutation, getCanvasManager, } = options;\n registerErrorHandler(errorHandler);\n const inEmittingFrame = recordCrossOriginIframes\n ? window.parent === window\n : true;\n let passEmitsToParent = false;\n if (!inEmittingFrame) {\n try {\n if (window.parent.document) {\n passEmitsToParent = false;\n }\n }\n catch (e) {\n passEmitsToParent = true;\n }\n }\n if (inEmittingFrame && !emit) {\n throw new Error('emit function is required');\n }\n if (!inEmittingFrame && !passEmitsToParent) {\n return () => {\n };\n }\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\n sampling.mousemove = mousemoveWait;\n }\n mirror.reset();\n const maskInputOptions = maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n radio: true,\n checkbox: true,\n }\n : _maskInputOptions !== undefined\n ? _maskInputOptions\n : {};\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\n ? {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaVerification: true,\n headMetaAuthorship: _slimDOMOptions === 'all',\n headMetaDescKeywords: _slimDOMOptions === 'all',\n }\n : _slimDOMOptions\n ? _slimDOMOptions\n : {};\n polyfill();\n let lastFullSnapshotEvent;\n let incrementalSnapshotCount = 0;\n const eventProcessor = (e) => {\n for (const plugin of plugins || []) {\n if (plugin.eventProcessor) {\n e = plugin.eventProcessor(e);\n }\n }\n if (packFn &&\n !passEmitsToParent) {\n e = packFn(e);\n }\n return e;\n };\n wrappedEmit = (r, isCheckout) => {\n const e = r;\n e.timestamp = nowTimestamp();\n if (_optionalChain([mutationBuffers, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.isFrozen, 'call', _6 => _6()]) &&\n e.type !== EventType.FullSnapshot &&\n !(e.type === EventType.IncrementalSnapshot &&\n e.data.source === IncrementalSource.Mutation)) {\n mutationBuffers.forEach((buf) => buf.unfreeze());\n }\n if (inEmittingFrame) {\n _optionalChain([emit, 'optionalCall', _7 => _7(eventProcessor(e), isCheckout)]);\n }\n else if (passEmitsToParent) {\n const message = {\n type: 'rrweb',\n event: eventProcessor(e),\n origin: window.location.origin,\n isCheckout,\n };\n window.parent.postMessage(message, '*');\n }\n if (e.type === EventType.FullSnapshot) {\n lastFullSnapshotEvent = e;\n incrementalSnapshotCount = 0;\n }\n else if (e.type === EventType.IncrementalSnapshot) {\n if (e.data.source === IncrementalSource.Mutation &&\n e.data.isAttachIframe) {\n return;\n }\n incrementalSnapshotCount++;\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\n const exceedTime = checkoutEveryNms &&\n lastFullSnapshotEvent &&\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\n if (exceedCount || exceedTime) {\n takeFullSnapshot(true);\n }\n }\n };\n const wrappedMutationEmit = (m) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n ...m,\n },\n });\n };\n const wrappedScrollEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Scroll,\n ...p,\n },\n });\n const wrappedCanvasMutationEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CanvasMutation,\n ...p,\n },\n });\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.AdoptedStyleSheet,\n ...a,\n },\n });\n const stylesheetManager = new StylesheetManager({\n mutationCb: wrappedMutationEmit,\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\n });\n const iframeManager = typeof __RRWEB_EXCLUDE_IFRAME__ === 'boolean' && __RRWEB_EXCLUDE_IFRAME__\n ? new IframeManagerNoop()\n : new IframeManager({\n mirror,\n mutationCb: wrappedMutationEmit,\n stylesheetManager: stylesheetManager,\n recordCrossOriginIframes,\n wrappedEmit,\n });\n for (const plugin of plugins || []) {\n if (plugin.getMirror)\n plugin.getMirror({\n nodeMirror: mirror,\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\n });\n }\n const processedNodeManager = new ProcessedNodeManager();\n const canvasManager = _getCanvasManager(getCanvasManager, {\n mirror,\n win: window,\n mutationCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CanvasMutation,\n ...p,\n },\n }),\n recordCanvas,\n blockClass,\n blockSelector,\n unblockSelector,\n maxCanvasSize,\n sampling: sampling['canvas'],\n dataURLOptions,\n errorHandler,\n });\n const shadowDomManager = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' &&\n __RRWEB_EXCLUDE_SHADOW_DOM__\n ? new ShadowDomManagerNoop()\n : new ShadowDomManager({\n mutationCb: wrappedMutationEmit,\n scrollCb: wrappedScrollEmit,\n bypassOptions: {\n onMutation,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n inlineStylesheet,\n maskInputOptions,\n dataURLOptions,\n maskAttributeFn,\n maskTextFn,\n maskInputFn,\n recordCanvas,\n inlineImages,\n sampling,\n slimDOMOptions,\n iframeManager,\n stylesheetManager,\n canvasManager,\n keepIframeSrcFn,\n processedNodeManager,\n },\n mirror,\n });\n const takeFullSnapshot = (isCheckout = false) => {\n if (!recordDOM) {\n return;\n }\n wrappedEmit({\n type: EventType.Meta,\n data: {\n href: window.location.href,\n width: getWindowWidth(),\n height: getWindowHeight(),\n },\n }, isCheckout);\n stylesheetManager.reset();\n shadowDomManager.init();\n mutationBuffers.forEach((buf) => buf.lock());\n const node = snapshot(document, {\n mirror,\n blockClass,\n blockSelector,\n unblockSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n inlineStylesheet,\n maskAllInputs: maskInputOptions,\n maskAttributeFn,\n maskInputFn,\n maskTextFn,\n slimDOM: slimDOMOptions,\n dataURLOptions,\n recordCanvas,\n inlineImages,\n onSerialize: (n) => {\n if (isSerializedIframe(n, mirror)) {\n iframeManager.addIframe(n);\n }\n if (isSerializedStylesheet(n, mirror)) {\n stylesheetManager.trackLinkElement(n);\n }\n if (hasShadowRoot(n)) {\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n iframeManager.attachIframe(iframe, childSn);\n if (iframe.contentWindow) {\n canvasManager.addWindow(iframe.contentWindow);\n }\n shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (linkEl, childSn) => {\n stylesheetManager.attachLinkElement(linkEl, childSn);\n },\n keepIframeSrcFn,\n });\n if (!node) {\n return console.warn('Failed to snapshot the document');\n }\n wrappedEmit({\n type: EventType.FullSnapshot,\n data: {\n node,\n initialOffset: getWindowScroll(window),\n },\n });\n mutationBuffers.forEach((buf) => buf.unlock());\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\n };\n _takeFullSnapshot = takeFullSnapshot;\n try {\n const handlers = [];\n const observe = (doc) => {\n return callbackWrapper(initObservers)({\n onMutation,\n mutationCb: wrappedMutationEmit,\n mousemoveCb: (positions, source) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source,\n positions,\n },\n }),\n mouseInteractionCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MouseInteraction,\n ...d,\n },\n }),\n scrollCb: wrappedScrollEmit,\n viewportResizeCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.ViewportResize,\n ...d,\n },\n }),\n inputCb: (v) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Input,\n ...v,\n },\n }),\n mediaInteractionCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MediaInteraction,\n ...p,\n },\n }),\n styleSheetRuleCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleSheetRule,\n ...r,\n },\n }),\n styleDeclarationCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleDeclaration,\n ...r,\n },\n }),\n canvasMutationCb: wrappedCanvasMutationEmit,\n fontCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Font,\n ...p,\n },\n }),\n selectionCb: (p) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Selection,\n ...p,\n },\n });\n },\n customElementCb: (c) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CustomElement,\n ...c,\n },\n });\n },\n blockClass,\n ignoreClass,\n ignoreSelector,\n maskAllText,\n maskTextClass,\n unmaskTextClass,\n maskTextSelector,\n unmaskTextSelector,\n maskInputOptions,\n inlineStylesheet,\n sampling,\n recordDOM,\n recordCanvas,\n inlineImages,\n userTriggeredOnInput,\n collectFonts,\n doc,\n maskAttributeFn,\n maskInputFn,\n maskTextFn,\n keepIframeSrcFn,\n blockSelector,\n unblockSelector,\n slimDOMOptions,\n dataURLOptions,\n mirror,\n iframeManager,\n stylesheetManager,\n shadowDomManager,\n processedNodeManager,\n canvasManager,\n ignoreCSSAttributes,\n plugins: _optionalChain([plugins\n, 'optionalAccess', _8 => _8.filter, 'call', _9 => _9((p) => p.observer)\n, 'optionalAccess', _10 => _10.map, 'call', _11 => _11((p) => ({\n observer: p.observer,\n options: p.options,\n callback: (payload) => wrappedEmit({\n type: EventType.Plugin,\n data: {\n plugin: p.name,\n payload,\n },\n }),\n }))]) || [],\n }, {});\n };\n iframeManager.addLoadListener((iframeEl) => {\n try {\n handlers.push(observe(iframeEl.contentDocument));\n }\n catch (error) {\n console.warn(error);\n }\n });\n const init = () => {\n takeFullSnapshot();\n handlers.push(observe(document));\n };\n if (document.readyState === 'interactive' ||\n document.readyState === 'complete') {\n init();\n }\n else {\n handlers.push(on('DOMContentLoaded', () => {\n wrappedEmit({\n type: EventType.DomContentLoaded,\n data: {},\n });\n if (recordAfter === 'DOMContentLoaded')\n init();\n }));\n handlers.push(on('load', () => {\n wrappedEmit({\n type: EventType.Load,\n data: {},\n });\n if (recordAfter === 'load')\n init();\n }, window));\n }\n return () => {\n handlers.forEach((h) => h());\n processedNodeManager.destroy();\n _takeFullSnapshot = undefined;\n unregisterErrorHandler();\n };\n }\n catch (error) {\n console.warn(error);\n }\n}\nfunction takeFullSnapshot(isCheckout) {\n if (!_takeFullSnapshot) {\n throw new Error('please take full snapshot after start recording');\n }\n _takeFullSnapshot(isCheckout);\n}\nrecord.mirror = mirror;\nrecord.takeFullSnapshot = takeFullSnapshot;\nfunction _getCanvasManager(getCanvasManagerFn, options) {\n try {\n return getCanvasManagerFn\n ? getCanvasManagerFn(options)\n : new CanvasManagerNoop();\n }\n catch (e2) {\n console.warn('Unable to initialize CanvasManager');\n return new CanvasManagerNoop();\n }\n}\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nconst CONSOLE_LEVELS = ['info', 'warn', 'error', 'log'] ;\nconst PREFIX = '[Replay] ';\n\nfunction _addBreadcrumb(message, level = 'info') {\n addBreadcrumb(\n {\n category: 'console',\n data: {\n logger: 'replay',\n },\n level,\n message: `${PREFIX}${message}`,\n },\n { level },\n );\n}\n\nfunction makeReplayLogger() {\n let _capture = false;\n let _trace = false;\n\n const _logger = {\n exception: () => undefined,\n infoTick: () => undefined,\n setConfig: (opts) => {\n _capture = opts.captureExceptions;\n _trace = opts.traceInternals;\n },\n };\n\n if (DEBUG_BUILD) {\n CONSOLE_LEVELS.forEach(name => {\n _logger[name] = (...args) => {\n logger$1[name](PREFIX, ...args);\n if (_trace) {\n _addBreadcrumb(args.join(''), severityLevelFromString(name));\n }\n };\n });\n\n _logger.exception = (error, ...message) => {\n if (message.length && _logger.error) {\n _logger.error(...message);\n }\n\n logger$1.error(PREFIX, error);\n\n if (_capture) {\n captureException(error);\n } else if (_trace) {\n // No need for a breadcrumb if `_capture` is enabled since it should be\n // captured as an exception\n _addBreadcrumb(error, 'error');\n }\n };\n\n _logger.infoTick = (...args) => {\n logger$1.info(PREFIX, ...args);\n if (_trace) {\n // Wait a tick here to avoid race conditions for some initial logs\n // which may be added before replay is initialized\n setTimeout(() => _addBreadcrumb(args[0]), 0);\n }\n };\n } else {\n CONSOLE_LEVELS.forEach(name => {\n _logger[name] = () => undefined;\n });\n }\n\n return _logger ;\n}\n\nconst logger = makeReplayLogger();\n\nconst ReplayEventTypeIncrementalSnapshot = 3;\nconst ReplayEventTypeCustom = 5;\n\n/**\n * Converts a timestamp to ms, if it was in s, or keeps it as ms.\n */\nfunction timestampToMs(timestamp) {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp : timestamp * 1000;\n}\n\n/**\n * Converts a timestamp to s, if it was in ms, or keeps it as s.\n */\nfunction timestampToS(timestamp) {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Add a breadcrumb event to replay.\n */\nfunction addBreadcrumbEvent(replay, breadcrumb) {\n if (breadcrumb.category === 'sentry.transaction') {\n return;\n }\n\n if (['ui.click', 'ui.input'].includes(breadcrumb.category )) {\n replay.triggerUserActivity();\n } else {\n replay.checkAndHandleExpiredSession();\n }\n\n replay.addUpdate(() => {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.throttledAddEvent({\n type: EventType.Custom,\n // TODO: We were converting from ms to seconds for breadcrumbs, spans,\n // but maybe we should just keep them as milliseconds\n timestamp: (breadcrumb.timestamp || 0) * 1000,\n data: {\n tag: 'breadcrumb',\n // normalize to max. 10 depth and 1_000 properties per object\n payload: normalize(breadcrumb, 10, 1000),\n },\n });\n\n // Do not flush after console log messages\n return breadcrumb.category === 'console';\n });\n}\n\nconst INTERACTIVE_SELECTOR = 'button,a';\n\n/** Get the closest interactive parent element, or else return the given element. */\nfunction getClosestInteractive(element) {\n const closestInteractive = element.closest(INTERACTIVE_SELECTOR);\n return closestInteractive || element;\n}\n\n/**\n * For clicks, we check if the target is inside of a button or link\n * If so, we use this as the target instead\n * This is useful because if you click on the image in ,\n * The target will be the image, not the button, which we don't want here\n */\nfunction getClickTargetNode(event) {\n const target = getTargetNode(event);\n\n if (!target || !(target instanceof Element)) {\n return target;\n }\n\n return getClosestInteractive(target);\n}\n\n/** Get the event target node. */\nfunction getTargetNode(event) {\n if (isEventWithTarget(event)) {\n return event.target ;\n }\n\n return event;\n}\n\nfunction isEventWithTarget(event) {\n return typeof event === 'object' && !!event && 'target' in event;\n}\n\nlet handlers;\n\n/**\n * Register a handler to be called when `window.open()` is called.\n * Returns a cleanup function.\n */\nfunction onWindowOpen(cb) {\n // Ensure to only register this once\n if (!handlers) {\n handlers = [];\n monkeyPatchWindowOpen();\n }\n\n handlers.push(cb);\n\n return () => {\n const pos = handlers ? handlers.indexOf(cb) : -1;\n if (pos > -1) {\n (handlers ).splice(pos, 1);\n }\n };\n}\n\nfunction monkeyPatchWindowOpen() {\n fill(WINDOW, 'open', function (originalWindowOpen) {\n return function (...args) {\n if (handlers) {\n try {\n handlers.forEach(handler => handler());\n } catch (e) {\n // ignore errors in here\n }\n }\n\n return originalWindowOpen.apply(WINDOW, args);\n };\n });\n}\n\n/** Any IncrementalSource for rrweb that we interpret as a kind of mutation. */\nconst IncrementalMutationSources = new Set([\n IncrementalSource.Mutation,\n IncrementalSource.StyleSheetRule,\n IncrementalSource.StyleDeclaration,\n IncrementalSource.AdoptedStyleSheet,\n IncrementalSource.CanvasMutation,\n IncrementalSource.Selection,\n IncrementalSource.MediaInteraction,\n]);\n\n/** Handle a click. */\nfunction handleClick(clickDetector, clickBreadcrumb, node) {\n clickDetector.handleClick(clickBreadcrumb, node);\n}\n\n/** A click detector class that can be used to detect slow or rage clicks on elements. */\nclass ClickDetector {\n // protected for testing\n\n constructor(\n replay,\n slowClickConfig,\n // Just for easier testing\n _addBreadcrumbEvent = addBreadcrumbEvent,\n ) {\n this._lastMutation = 0;\n this._lastScroll = 0;\n this._clicks = [];\n\n // We want everything in s, but options are in ms\n this._timeout = slowClickConfig.timeout / 1000;\n this._threshold = slowClickConfig.threshold / 1000;\n this._scrollTimeout = slowClickConfig.scrollTimeout / 1000;\n this._replay = replay;\n this._ignoreSelector = slowClickConfig.ignoreSelector;\n this._addBreadcrumbEvent = _addBreadcrumbEvent;\n }\n\n /** Register click detection handlers on mutation or scroll. */\n addListeners() {\n const cleanupWindowOpen = onWindowOpen(() => {\n // Treat window.open as mutation\n this._lastMutation = nowInSeconds();\n });\n\n this._teardown = () => {\n cleanupWindowOpen();\n\n this._clicks = [];\n this._lastMutation = 0;\n this._lastScroll = 0;\n };\n }\n\n /** Clean up listeners. */\n removeListeners() {\n if (this._teardown) {\n this._teardown();\n }\n\n if (this._checkClickTimeout) {\n clearTimeout(this._checkClickTimeout);\n }\n }\n\n /** @inheritDoc */\n handleClick(breadcrumb, node) {\n if (ignoreElement(node, this._ignoreSelector) || !isClickBreadcrumb(breadcrumb)) {\n return;\n }\n\n const newClick = {\n timestamp: timestampToS(breadcrumb.timestamp),\n clickBreadcrumb: breadcrumb,\n // Set this to 0 so we know it originates from the click breadcrumb\n clickCount: 0,\n node,\n };\n\n // If there was a click in the last 1s on the same element, ignore it - only keep a single reference per second\n if (\n this._clicks.some(click => click.node === newClick.node && Math.abs(click.timestamp - newClick.timestamp) < 1)\n ) {\n return;\n }\n\n this._clicks.push(newClick);\n\n // If this is the first new click, set a timeout to check for multi clicks\n if (this._clicks.length === 1) {\n this._scheduleCheckClicks();\n }\n }\n\n /** @inheritDoc */\n registerMutation(timestamp = Date.now()) {\n this._lastMutation = timestampToS(timestamp);\n }\n\n /** @inheritDoc */\n registerScroll(timestamp = Date.now()) {\n this._lastScroll = timestampToS(timestamp);\n }\n\n /** @inheritDoc */\n registerClick(element) {\n const node = getClosestInteractive(element);\n this._handleMultiClick(node );\n }\n\n /** Count multiple clicks on elements. */\n _handleMultiClick(node) {\n this._getClicks(node).forEach(click => {\n click.clickCount++;\n });\n }\n\n /** Get all pending clicks for a given node. */\n _getClicks(node) {\n return this._clicks.filter(click => click.node === node);\n }\n\n /** Check the clicks that happened. */\n _checkClicks() {\n const timedOutClicks = [];\n\n const now = nowInSeconds();\n\n this._clicks.forEach(click => {\n if (!click.mutationAfter && this._lastMutation) {\n click.mutationAfter = click.timestamp <= this._lastMutation ? this._lastMutation - click.timestamp : undefined;\n }\n if (!click.scrollAfter && this._lastScroll) {\n click.scrollAfter = click.timestamp <= this._lastScroll ? this._lastScroll - click.timestamp : undefined;\n }\n\n // All of these are in seconds!\n if (click.timestamp + this._timeout <= now) {\n timedOutClicks.push(click);\n }\n });\n\n // Remove \"old\" clicks\n for (const click of timedOutClicks) {\n const pos = this._clicks.indexOf(click);\n\n if (pos > -1) {\n this._generateBreadcrumbs(click);\n this._clicks.splice(pos, 1);\n }\n }\n\n // Trigger new check, unless no clicks left\n if (this._clicks.length) {\n this._scheduleCheckClicks();\n }\n }\n\n /** Generate matching breadcrumb(s) for the click. */\n _generateBreadcrumbs(click) {\n const replay = this._replay;\n const hadScroll = click.scrollAfter && click.scrollAfter <= this._scrollTimeout;\n const hadMutation = click.mutationAfter && click.mutationAfter <= this._threshold;\n\n const isSlowClick = !hadScroll && !hadMutation;\n const { clickCount, clickBreadcrumb } = click;\n\n // Slow click\n if (isSlowClick) {\n // If `mutationAfter` is set, it means a mutation happened after the threshold, but before the timeout\n // If not, it means we just timed out without scroll & mutation\n const timeAfterClickMs = Math.min(click.mutationAfter || this._timeout, this._timeout) * 1000;\n const endReason = timeAfterClickMs < this._timeout * 1000 ? 'mutation' : 'timeout';\n\n const breadcrumb = {\n type: 'default',\n message: clickBreadcrumb.message,\n timestamp: clickBreadcrumb.timestamp,\n category: 'ui.slowClickDetected',\n data: {\n ...clickBreadcrumb.data,\n url: WINDOW.location.href,\n route: replay.getCurrentRoute(),\n timeAfterClickMs,\n endReason,\n // If clickCount === 0, it means multiClick was not correctly captured here\n // - we still want to send 1 in this case\n clickCount: clickCount || 1,\n },\n };\n\n this._addBreadcrumbEvent(replay, breadcrumb);\n return;\n }\n\n // Multi click\n if (clickCount > 1) {\n const breadcrumb = {\n type: 'default',\n message: clickBreadcrumb.message,\n timestamp: clickBreadcrumb.timestamp,\n category: 'ui.multiClick',\n data: {\n ...clickBreadcrumb.data,\n url: WINDOW.location.href,\n route: replay.getCurrentRoute(),\n clickCount,\n metric: true,\n },\n };\n\n this._addBreadcrumbEvent(replay, breadcrumb);\n }\n }\n\n /** Schedule to check current clicks. */\n _scheduleCheckClicks() {\n if (this._checkClickTimeout) {\n clearTimeout(this._checkClickTimeout);\n }\n\n this._checkClickTimeout = setTimeout$3(() => this._checkClicks(), 1000);\n }\n}\n\nconst SLOW_CLICK_TAGS = ['A', 'BUTTON', 'INPUT'];\n\n/** exported for tests only */\nfunction ignoreElement(node, ignoreSelector) {\n if (!SLOW_CLICK_TAGS.includes(node.tagName)) {\n return true;\n }\n\n // If tag, we only want to consider input[type='submit'] & input[type='button']\n if (node.tagName === 'INPUT' && !['submit', 'button'].includes(node.getAttribute('type') || '')) {\n return true;\n }\n\n // If tag, detect special variants that may not lead to an action\n // If target !== _self, we may open the link somewhere else, which would lead to no action\n // Also, when downloading a file, we may not leave the page, but still not trigger an action\n if (\n node.tagName === 'A' &&\n (node.hasAttribute('download') || (node.hasAttribute('target') && node.getAttribute('target') !== '_self'))\n ) {\n return true;\n }\n\n if (ignoreSelector && node.matches(ignoreSelector)) {\n return true;\n }\n\n return false;\n}\n\nfunction isClickBreadcrumb(breadcrumb) {\n return !!(breadcrumb.data && typeof breadcrumb.data.nodeId === 'number' && breadcrumb.timestamp);\n}\n\n// This is good enough for us, and is easier to test/mock than `timestampInSeconds`\nfunction nowInSeconds() {\n return Date.now() / 1000;\n}\n\n/** Update the click detector based on a recording event of rrweb. */\nfunction updateClickDetectorForRecordingEvent(clickDetector, event) {\n try {\n // note: We only consider incremental snapshots here\n // This means that any full snapshot is ignored for mutation detection - the reason is that we simply cannot know if a mutation happened here.\n // E.g. think that we are buffering, an error happens and we take a full snapshot because we switched to session mode -\n // in this scenario, we would not know if a dead click happened because of the error, which is a key dead click scenario.\n // Instead, by ignoring full snapshots, we have the risk that we generate a false positive\n // (if a mutation _did_ happen but was \"swallowed\" by the full snapshot)\n // But this should be more unlikely as we'd generally capture the incremental snapshot right away\n\n if (!isIncrementalEvent(event)) {\n return;\n }\n\n const { source } = event.data;\n if (IncrementalMutationSources.has(source)) {\n clickDetector.registerMutation(event.timestamp);\n }\n\n if (source === IncrementalSource.Scroll) {\n clickDetector.registerScroll(event.timestamp);\n }\n\n if (isIncrementalMouseInteraction(event)) {\n const { type, id } = event.data;\n const node = record.mirror.getNode(id);\n\n if (node instanceof HTMLElement && type === MouseInteractions.Click) {\n clickDetector.registerClick(node);\n }\n }\n } catch (e) {\n // ignore errors here, e.g. if accessing something that does not exist\n }\n}\n\nfunction isIncrementalEvent(event) {\n return event.type === ReplayEventTypeIncrementalSnapshot;\n}\n\nfunction isIncrementalMouseInteraction(\n event,\n) {\n return event.data.source === IncrementalSource.MouseInteraction;\n}\n\n/**\n * Create a breadcrumb for a replay.\n */\nfunction createBreadcrumb(\n breadcrumb,\n) {\n return {\n timestamp: Date.now() / 1000,\n type: 'default',\n ...breadcrumb,\n };\n}\n\nvar NodeType;\n(function (NodeType) {\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\n})(NodeType || (NodeType = {}));\n\n// Note that these are the serialized attributes and not attributes directly on\n// the DOM Node. Attributes we are interested in:\nconst ATTRIBUTES_TO_RECORD = new Set([\n 'id',\n 'class',\n 'aria-label',\n 'role',\n 'name',\n 'alt',\n 'title',\n 'data-test-id',\n 'data-testid',\n 'disabled',\n 'aria-disabled',\n 'data-sentry-component',\n]);\n\n/**\n * Inclusion list of attributes that we want to record from the DOM element\n */\nfunction getAttributesToRecord(attributes) {\n const obj = {};\n if (!attributes['data-sentry-component'] && attributes['data-sentry-element']) {\n attributes['data-sentry-component'] = attributes['data-sentry-element'];\n }\n for (const key in attributes) {\n if (ATTRIBUTES_TO_RECORD.has(key)) {\n let normalizedKey = key;\n\n if (key === 'data-testid' || key === 'data-test-id') {\n normalizedKey = 'testId';\n }\n\n obj[normalizedKey] = attributes[key];\n }\n }\n\n return obj;\n}\n\nconst handleDomListener = (\n replay,\n) => {\n return (handlerData) => {\n if (!replay.isEnabled()) {\n return;\n }\n\n const result = handleDom(handlerData);\n\n if (!result) {\n return;\n }\n\n const isClick = handlerData.name === 'click';\n const event = isClick ? (handlerData.event ) : undefined;\n // Ignore clicks if ctrl/alt/meta/shift keys are held down as they alter behavior of clicks (e.g. open in new tab)\n if (\n isClick &&\n replay.clickDetector &&\n event &&\n event.target &&\n !event.altKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey\n ) {\n handleClick(\n replay.clickDetector,\n result ,\n getClickTargetNode(handlerData.event ) ,\n );\n }\n\n addBreadcrumbEvent(replay, result);\n };\n};\n\n/** Get the base DOM breadcrumb. */\nfunction getBaseDomBreadcrumb(target, message) {\n const nodeId = record.mirror.getId(target);\n const node = nodeId && record.mirror.getNode(nodeId);\n const meta = node && record.mirror.getMeta(node);\n const element = meta && isElement(meta) ? meta : null;\n\n return {\n message,\n data: element\n ? {\n nodeId,\n node: {\n id: nodeId,\n tagName: element.tagName,\n textContent: Array.from(element.childNodes)\n .map((node) => node.type === NodeType.Text && node.textContent)\n .filter(Boolean) // filter out empty values\n .map(text => (text ).trim())\n .join(''),\n attributes: getAttributesToRecord(element.attributes),\n },\n }\n : {},\n };\n}\n\n/**\n * An event handler to react to DOM events.\n * Exported for tests.\n */\nfunction handleDom(handlerData) {\n const { target, message } = getDomTarget(handlerData);\n\n return createBreadcrumb({\n category: `ui.${handlerData.name}`,\n ...getBaseDomBreadcrumb(target, message),\n });\n}\n\nfunction getDomTarget(handlerData) {\n const isClick = handlerData.name === 'click';\n\n let message;\n let target = null;\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = isClick ? getClickTargetNode(handlerData.event ) : getTargetNode(handlerData.event );\n message = htmlTreeAsString(target, { maxStringLength: 200 }) || '';\n } catch (e) {\n message = '';\n }\n\n return { target, message };\n}\n\nfunction isElement(node) {\n return node.type === NodeType.Element;\n}\n\n/** Handle keyboard events & create breadcrumbs. */\nfunction handleKeyboardEvent(replay, event) {\n if (!replay.isEnabled()) {\n return;\n }\n\n // Update user activity, but do not restart recording as it can create\n // noisy/low-value replays (e.g. user comes back from idle, hits alt-tab, new\n // session with a single \"keydown\" breadcrumb is created)\n replay.updateUserActivity();\n\n const breadcrumb = getKeyboardBreadcrumb(event);\n\n if (!breadcrumb) {\n return;\n }\n\n addBreadcrumbEvent(replay, breadcrumb);\n}\n\n/** exported only for tests */\nfunction getKeyboardBreadcrumb(event) {\n const { metaKey, shiftKey, ctrlKey, altKey, key, target } = event;\n\n // never capture for input fields\n if (!target || isInputElement(target ) || !key) {\n return null;\n }\n\n // Note: We do not consider shift here, as that means \"uppercase\"\n const hasModifierKey = metaKey || ctrlKey || altKey;\n const isCharacterKey = key.length === 1; // other keys like Escape, Tab, etc have a longer length\n\n // Do not capture breadcrumb if only a word key is pressed\n // This could leak e.g. user input\n if (!hasModifierKey && isCharacterKey) {\n return null;\n }\n\n const message = htmlTreeAsString(target, { maxStringLength: 200 }) || '';\n const baseBreadcrumb = getBaseDomBreadcrumb(target , message);\n\n return createBreadcrumb({\n category: 'ui.keyDown',\n message,\n data: {\n ...baseBreadcrumb.data,\n metaKey,\n shiftKey,\n ctrlKey,\n altKey,\n key,\n },\n });\n}\n\nfunction isInputElement(target) {\n return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n}\n\n// Map entryType -> function to normalize data for event\nconst ENTRY_TYPES\n\n = {\n // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n resource: createResourceEntry,\n paint: createPaintEntry,\n // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n navigation: createNavigationEntry,\n};\n\n/**\n * Handler creater for web vitals\n */\nfunction webVitalHandler(\n getter,\n replay,\n) {\n return ({ metric }) => void replay.replayPerformanceEntries.push(getter(metric));\n}\n\n/**\n * Create replay performance entries from the browser performance entries.\n */\nfunction createPerformanceEntries(\n entries,\n) {\n return entries.map(createPerformanceEntry).filter(Boolean) ;\n}\n\nfunction createPerformanceEntry(entry) {\n const entryType = ENTRY_TYPES[entry.entryType];\n if (!entryType) {\n return null;\n }\n\n return entryType(entry);\n}\n\nfunction getAbsoluteTime(time) {\n // browserPerformanceTimeOrigin can be undefined if `performance` or\n // `performance.now` doesn't exist, but this is already checked by this integration\n return ((browserPerformanceTimeOrigin || WINDOW.performance.timeOrigin) + time) / 1000;\n}\n\nfunction createPaintEntry(entry) {\n const { duration, entryType, name, startTime } = entry;\n\n const start = getAbsoluteTime(startTime);\n return {\n type: entryType,\n name,\n start,\n end: start + duration,\n data: undefined,\n };\n}\n\nfunction createNavigationEntry(entry) {\n const {\n entryType,\n name,\n decodedBodySize,\n duration,\n domComplete,\n encodedBodySize,\n domContentLoadedEventStart,\n domContentLoadedEventEnd,\n domInteractive,\n loadEventStart,\n loadEventEnd,\n redirectCount,\n startTime,\n transferSize,\n type,\n } = entry;\n\n // Ignore entries with no duration, they do not seem to be useful and cause dupes\n if (duration === 0) {\n return null;\n }\n\n return {\n type: `${entryType}.${type}`,\n start: getAbsoluteTime(startTime),\n end: getAbsoluteTime(domComplete),\n name,\n data: {\n size: transferSize,\n decodedBodySize,\n encodedBodySize,\n duration,\n domInteractive,\n domContentLoadedEventStart,\n domContentLoadedEventEnd,\n loadEventStart,\n loadEventEnd,\n domComplete,\n redirectCount,\n },\n };\n}\n\nfunction createResourceEntry(\n entry,\n) {\n const {\n entryType,\n initiatorType,\n name,\n responseEnd,\n startTime,\n decodedBodySize,\n encodedBodySize,\n responseStatus,\n transferSize,\n } = entry;\n\n // Core SDK handles these\n if (['fetch', 'xmlhttprequest'].includes(initiatorType)) {\n return null;\n }\n\n return {\n type: `${entryType}.${initiatorType}`,\n start: getAbsoluteTime(startTime),\n end: getAbsoluteTime(responseEnd),\n name,\n data: {\n size: transferSize,\n statusCode: responseStatus,\n decodedBodySize,\n encodedBodySize,\n },\n };\n}\n\n/**\n * Add a LCP event to the replay based on a LCP metric.\n */\nfunction getLargestContentfulPaint(metric) {\n const lastEntry = metric.entries[metric.entries.length - 1] ;\n const node = lastEntry && lastEntry.element ? [lastEntry.element] : undefined;\n return getWebVital(metric, 'largest-contentful-paint', node);\n}\n\nfunction isLayoutShift(entry) {\n return (entry ).sources !== undefined;\n}\n\n/**\n * Add a CLS event to the replay based on a CLS metric.\n */\nfunction getCumulativeLayoutShift(metric) {\n const layoutShifts = [];\n const nodes = [];\n for (const entry of metric.entries) {\n if (isLayoutShift(entry)) {\n const nodeIds = [];\n for (const source of entry.sources) {\n if (source.node) {\n nodes.push(source.node);\n const nodeId = record.mirror.getId(source.node);\n if (nodeId) {\n nodeIds.push(nodeId);\n }\n }\n }\n layoutShifts.push({ value: entry.value, nodeIds: nodeIds.length ? nodeIds : undefined });\n }\n }\n\n return getWebVital(metric, 'cumulative-layout-shift', nodes, layoutShifts);\n}\n\n/**\n * Add a FID event to the replay based on a FID metric.\n */\nfunction getFirstInputDelay(metric) {\n const lastEntry = metric.entries[metric.entries.length - 1] ;\n const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n return getWebVital(metric, 'first-input-delay', node);\n}\n\n/**\n * Add an INP event to the replay based on an INP metric.\n */\nfunction getInteractionToNextPaint(metric) {\n const lastEntry = metric.entries[metric.entries.length - 1] ;\n const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n return getWebVital(metric, 'interaction-to-next-paint', node);\n}\n\n/**\n * Add an web vital event to the replay based on the web vital metric.\n */\nfunction getWebVital(\n metric,\n name,\n nodes,\n attributions,\n) {\n const value = metric.value;\n const rating = metric.rating;\n\n const end = getAbsoluteTime(value);\n\n return {\n type: 'web-vital',\n name,\n start: end,\n end,\n data: {\n value,\n size: value,\n rating,\n nodeIds: nodes ? nodes.map(node => record.mirror.getId(node)) : undefined,\n attributions,\n },\n };\n}\n\n/**\n * Sets up a PerformanceObserver to listen to all performance entry types.\n * Returns a callback to stop observing.\n */\nfunction setupPerformanceObserver(replay) {\n function addPerformanceEntry(entry) {\n // It is possible for entries to come up multiple times\n if (!replay.performanceEntries.includes(entry)) {\n replay.performanceEntries.push(entry);\n }\n }\n\n function onEntries({ entries }) {\n entries.forEach(addPerformanceEntry);\n }\n\n const clearCallbacks = [];\n\n (['navigation', 'paint', 'resource'] ).forEach(type => {\n clearCallbacks.push(addPerformanceInstrumentationHandler(type, onEntries));\n });\n\n clearCallbacks.push(\n addLcpInstrumentationHandler(webVitalHandler(getLargestContentfulPaint, replay)),\n addClsInstrumentationHandler(webVitalHandler(getCumulativeLayoutShift, replay)),\n addFidInstrumentationHandler(webVitalHandler(getFirstInputDelay, replay)),\n addInpInstrumentationHandler(webVitalHandler(getInteractionToNextPaint, replay)),\n );\n\n // A callback to cleanup all handlers\n return () => {\n clearCallbacks.forEach(clearCallback => clearCallback());\n };\n}\n\nconst r = `var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a>h]=l}else for(o=new n(i),a=0;a>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},_=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},x=function(r,e){for(var i=[],a=0;ad&&(d=o[a].s);var g=new n(d+1),w=A(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<e))break;p+=m-(1<>=y;p>0;){var M=o[a].s;g[M]=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},A=function(t,n,r){return-1==t.s?Math.max(A(t.l,n,r+1),A(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,U)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B255){_(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;_(r,m,Q[et]),m+=R[et],et>3&&(_(r,m,rt>>5&8191),m+=i[et])}else _(r,m,N[rt]),m+=P[rt]}return _(r,m,N[256]),m+P[256]},C=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e>>8;t=r},d:function(){return~t}}},L=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},O=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=C[s-1],M=y>>13,E=8191&y,z=(1<7e3||q>24576)&&(N>423||!w)){p=U(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;Pnt&&(nt=et,K=rt)}}}W+=(J=K)-(K=_[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},j=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},q=function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&j(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}},B=function(t){return 10+(t.filename?t.filename.length+1:0)},G=function(){function n(n,r){if(\"function\"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(O(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();var H=function(){function t(t,n){this.c=L(),this.v=1,G.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),G.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=O(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=L();i.p(n.dictionary),j(t,2,i.d())}}(r,this.o),this.v=0),n&&j(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),J=\"undefined\"!=typeof TextEncoder&&new TextEncoder,K=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{K.decode(F,{stream:!0})}catch(t){}var N=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(P(t),this.d=n||!1)},t}();function P(n,r){if(J)return J.encode(n);for(var e=n.length,i=new t(n.length+(n.length>>1)),a=0,s=function(t){i[a++]=t},o=0;oi.length){var f=new t(a+8+(e-o<<1));f.set(i),i=f}var h=n.charCodeAt(o);h<128||r?s(h):h<2048?(s(192|h>>6),s(128|63&h)):h>55295&&h<57344?(s(240|(h=65536+(1047552&h)|1023&n.charCodeAt(++o))>>18),s(128|h>>12&63),s(128|h>>6&63),s(128|63&h)):(s(224|h>>12),s(128|h>>6&63),s(128|63&h))}return b(i,0,a)}function Q(t){return function(t,n){n||(n={});var r=S(),e=t.length;r.p(t);var i=O(t,n,B(n),8),a=i.length;return q(i,n),j(i,a-8,r.d()),j(i,a-4,e),i}(P(t))}const R=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error(\"Adding invalid event\");const n=this._hasEvents?\",\":\"\";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push(\"]\",!0);const t=function(t){let n=0;for(const r of t)n+=r.length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n{this._deflatedData.push(t)},this.stream=new N(((t,n)=>{this.deflate.push(t,n)})),this.stream.push(\"[\")}},V={clear:()=>{R.clear()},addEvent:t=>R.addEvent(t),finish:()=>R.finish(),compress:t=>Q(t)};addEventListener(\"message\",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in V&&\"function\"==typeof V[n])try{const t=V[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:\"init\",success:!0,response:void 0});`;\n\nfunction e(){const e=new Blob([r]);return URL.createObjectURL(e)}\n\n/** This error indicates that the event buffer size exceeded the limit.. */\nclass EventBufferSizeExceededError extends Error {\n constructor() {\n super(`Event buffer exceeded maximum size of ${REPLAY_MAX_EVENT_BUFFER_SIZE}.`);\n }\n}\n\n/**\n * A basic event buffer that does not do any compression.\n * Used as fallback if the compression worker cannot be loaded or is disabled.\n */\nclass EventBufferArray {\n /** All the events that are buffered to be sent. */\n\n /** @inheritdoc */\n\n constructor() {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n get hasEvents() {\n return this.events.length > 0;\n }\n\n /** @inheritdoc */\n get type() {\n return 'sync';\n }\n\n /** @inheritdoc */\n destroy() {\n this.events = [];\n }\n\n /** @inheritdoc */\n async addEvent(event) {\n const eventSize = JSON.stringify(event).length;\n this._totalSize += eventSize;\n if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n throw new EventBufferSizeExceededError();\n }\n\n this.events.push(event);\n }\n\n /** @inheritdoc */\n finish() {\n return new Promise(resolve => {\n // Make a copy of the events array reference and immediately clear the\n // events member so that we do not lose new events while uploading\n // attachment.\n const eventsRet = this.events;\n this.clear();\n resolve(JSON.stringify(eventsRet));\n });\n }\n\n /** @inheritdoc */\n clear() {\n this.events = [];\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n getEarliestTimestamp() {\n const timestamp = this.events.map(event => event.timestamp).sort()[0];\n\n if (!timestamp) {\n return null;\n }\n\n return timestampToMs(timestamp);\n }\n}\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nclass WorkerHandler {\n\n constructor(worker) {\n this._worker = worker;\n this._id = 0;\n }\n\n /**\n * Ensure the worker is ready (or not).\n * This will either resolve when the worker is ready, or reject if an error occurred.\n */\n ensureReady() {\n // Ensure we only check once\n if (this._ensureReadyPromise) {\n return this._ensureReadyPromise;\n }\n\n this._ensureReadyPromise = new Promise((resolve, reject) => {\n this._worker.addEventListener(\n 'message',\n ({ data }) => {\n if ((data ).success) {\n resolve();\n } else {\n reject();\n }\n },\n { once: true },\n );\n\n this._worker.addEventListener(\n 'error',\n error => {\n reject(error);\n },\n { once: true },\n );\n });\n\n return this._ensureReadyPromise;\n }\n\n /**\n * Destroy the worker.\n */\n destroy() {\n DEBUG_BUILD && logger.info('Destroying compression worker');\n this._worker.terminate();\n }\n\n /**\n * Post message to worker and wait for response before resolving promise.\n */\n postMessage(method, arg) {\n const id = this._getAndIncrementId();\n\n return new Promise((resolve, reject) => {\n const listener = ({ data }) => {\n const response = data ;\n if (response.method !== method) {\n return;\n }\n\n // There can be multiple listeners for a single method, the id ensures\n // that the response matches the caller.\n if (response.id !== id) {\n return;\n }\n\n // At this point, we'll always want to remove listener regardless of result status\n this._worker.removeEventListener('message', listener);\n\n if (!response.success) {\n // TODO: Do some error handling, not sure what\n DEBUG_BUILD && logger.error('Error in compression worker: ', response.response);\n\n reject(new Error('Error in compression worker'));\n return;\n }\n\n resolve(response.response );\n };\n\n // Note: we can't use `once` option because it's possible it needs to\n // listen to multiple messages\n this._worker.addEventListener('message', listener);\n this._worker.postMessage({ id, method, arg });\n });\n }\n\n /** Get the current ID and increment it for the next call. */\n _getAndIncrementId() {\n return this._id++;\n }\n}\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nclass EventBufferCompressionWorker {\n /** @inheritdoc */\n\n constructor(worker) {\n this._worker = new WorkerHandler(worker);\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n }\n\n /** @inheritdoc */\n get hasEvents() {\n return !!this._earliestTimestamp;\n }\n\n /** @inheritdoc */\n get type() {\n return 'worker';\n }\n\n /**\n * Ensure the worker is ready (or not).\n * This will either resolve when the worker is ready, or reject if an error occurred.\n */\n ensureReady() {\n return this._worker.ensureReady();\n }\n\n /**\n * Destroy the event buffer.\n */\n destroy() {\n this._worker.destroy();\n }\n\n /**\n * Add an event to the event buffer.\n *\n * Returns true if event was successfully received and processed by worker.\n */\n addEvent(event) {\n const timestamp = timestampToMs(event.timestamp);\n if (!this._earliestTimestamp || timestamp < this._earliestTimestamp) {\n this._earliestTimestamp = timestamp;\n }\n\n const data = JSON.stringify(event);\n this._totalSize += data.length;\n\n if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n return Promise.reject(new EventBufferSizeExceededError());\n }\n\n return this._sendEventToWorker(data);\n }\n\n /**\n * Finish the event buffer and return the compressed data.\n */\n finish() {\n return this._finishRequest();\n }\n\n /** @inheritdoc */\n clear() {\n this._earliestTimestamp = null;\n this._totalSize = 0;\n this.hasCheckout = false;\n\n // We do not wait on this, as we assume the order of messages is consistent for the worker\n this._worker.postMessage('clear').then(null, e => {\n DEBUG_BUILD && logger.exception(e, 'Sending \"clear\" message to worker failed', e);\n });\n }\n\n /** @inheritdoc */\n getEarliestTimestamp() {\n return this._earliestTimestamp;\n }\n\n /**\n * Send the event to the worker.\n */\n _sendEventToWorker(data) {\n return this._worker.postMessage('addEvent', data);\n }\n\n /**\n * Finish the request and return the compressed data from the worker.\n */\n async _finishRequest() {\n const response = await this._worker.postMessage('finish');\n\n this._earliestTimestamp = null;\n this._totalSize = 0;\n\n return response;\n }\n}\n\n/**\n * This proxy will try to use the compression worker, and fall back to use the simple buffer if an error occurs there.\n * This can happen e.g. if the worker cannot be loaded.\n * Exported only for testing.\n */\nclass EventBufferProxy {\n\n constructor(worker) {\n this._fallback = new EventBufferArray();\n this._compression = new EventBufferCompressionWorker(worker);\n this._used = this._fallback;\n\n this._ensureWorkerIsLoadedPromise = this._ensureWorkerIsLoaded();\n }\n\n /** @inheritdoc */\n get type() {\n return this._used.type;\n }\n\n /** @inheritDoc */\n get hasEvents() {\n return this._used.hasEvents;\n }\n\n /** @inheritdoc */\n get hasCheckout() {\n return this._used.hasCheckout;\n }\n /** @inheritdoc */\n set hasCheckout(value) {\n this._used.hasCheckout = value;\n }\n\n /** @inheritDoc */\n destroy() {\n this._fallback.destroy();\n this._compression.destroy();\n }\n\n /** @inheritdoc */\n clear() {\n return this._used.clear();\n }\n\n /** @inheritdoc */\n getEarliestTimestamp() {\n return this._used.getEarliestTimestamp();\n }\n\n /**\n * Add an event to the event buffer.\n *\n * Returns true if event was successfully added.\n */\n addEvent(event) {\n return this._used.addEvent(event);\n }\n\n /** @inheritDoc */\n async finish() {\n // Ensure the worker is loaded, so the sent event is compressed\n await this.ensureWorkerIsLoaded();\n\n return this._used.finish();\n }\n\n /** Ensure the worker has loaded. */\n ensureWorkerIsLoaded() {\n return this._ensureWorkerIsLoadedPromise;\n }\n\n /** Actually check if the worker has been loaded. */\n async _ensureWorkerIsLoaded() {\n try {\n await this._compression.ensureReady();\n } catch (error) {\n // If the worker fails to load, we fall back to the simple buffer.\n // Nothing more to do from our side here\n DEBUG_BUILD && logger.exception(error, 'Failed to load the compression worker, falling back to simple buffer');\n return;\n }\n\n // Now we need to switch over the array buffer to the compression worker\n await this._switchToCompressionWorker();\n }\n\n /** Switch the used buffer to the compression worker. */\n async _switchToCompressionWorker() {\n const { events, hasCheckout } = this._fallback;\n\n const addEventPromises = [];\n for (const event of events) {\n addEventPromises.push(this._compression.addEvent(event));\n }\n\n this._compression.hasCheckout = hasCheckout;\n\n // We switch over to the new buffer immediately - any further events will be added\n // after the previously buffered ones\n this._used = this._compression;\n\n // Wait for original events to be re-added before resolving\n try {\n await Promise.all(addEventPromises);\n\n // Can now clear fallback buffer as it's no longer necessary\n this._fallback.clear();\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to add events when switching buffers.');\n }\n }\n}\n\n/**\n * Create an event buffer for replays.\n */\nfunction createEventBuffer({\n useCompression,\n workerUrl: customWorkerUrl,\n}) {\n if (\n useCompression &&\n // eslint-disable-next-line no-restricted-globals\n window.Worker\n ) {\n const worker = _loadWorker(customWorkerUrl);\n\n if (worker) {\n return worker;\n }\n }\n\n DEBUG_BUILD && logger.info('Using simple buffer');\n return new EventBufferArray();\n}\n\nfunction _loadWorker(customWorkerUrl) {\n try {\n const workerUrl = customWorkerUrl || _getWorkerUrl();\n\n if (!workerUrl) {\n return;\n }\n\n DEBUG_BUILD && logger.info(`Using compression worker${customWorkerUrl ? ` from ${customWorkerUrl}` : ''}`);\n const worker = new Worker(workerUrl);\n return new EventBufferProxy(worker);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to create compression worker');\n // Fall back to use simple event buffer array\n }\n}\n\nfunction _getWorkerUrl() {\n if (typeof __SENTRY_EXCLUDE_REPLAY_WORKER__ === 'undefined' || !__SENTRY_EXCLUDE_REPLAY_WORKER__) {\n return e();\n }\n\n return '';\n}\n\n/** If sessionStorage is available. */\nfunction hasSessionStorage() {\n try {\n // This can throw, e.g. when being accessed in a sandboxed iframe\n return 'sessionStorage' in WINDOW && !!WINDOW.sessionStorage;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Removes the session from Session Storage and unsets session in replay instance\n */\nfunction clearSession(replay) {\n deleteSession();\n replay.session = undefined;\n}\n\n/**\n * Deletes a session from storage\n */\nfunction deleteSession() {\n if (!hasSessionStorage()) {\n return;\n }\n\n try {\n WINDOW.sessionStorage.removeItem(REPLAY_SESSION_KEY);\n } catch (e) {\n // Ignore potential SecurityError exceptions\n }\n}\n\n/**\n * Given a sample rate, returns true if replay should be sampled.\n *\n * 1.0 = 100% sampling\n * 0.0 = 0% sampling\n */\nfunction isSampled(sampleRate) {\n if (sampleRate === undefined) {\n return false;\n }\n\n // Math.random() returns a number in range of 0 to 1 (inclusive of 0, but not 1)\n return Math.random() < sampleRate;\n}\n\n/**\n * Get a session with defaults & applied sampling.\n */\nfunction makeSession(session) {\n const now = Date.now();\n const id = session.id || uuid4();\n // Note that this means we cannot set a started/lastActivity of `0`, but this should not be relevant outside of tests.\n const started = session.started || now;\n const lastActivity = session.lastActivity || now;\n const segmentId = session.segmentId || 0;\n const sampled = session.sampled;\n const previousSessionId = session.previousSessionId;\n\n return {\n id,\n started,\n lastActivity,\n segmentId,\n sampled,\n previousSessionId,\n };\n}\n\n/**\n * Save a session to session storage.\n */\nfunction saveSession(session) {\n if (!hasSessionStorage()) {\n return;\n }\n\n try {\n WINDOW.sessionStorage.setItem(REPLAY_SESSION_KEY, JSON.stringify(session));\n } catch (e) {\n // Ignore potential SecurityError exceptions\n }\n}\n\n/**\n * Get the sampled status for a session based on sample rates & current sampled status.\n */\nfunction getSessionSampleType(sessionSampleRate, allowBuffering) {\n return isSampled(sessionSampleRate) ? 'session' : allowBuffering ? 'buffer' : false;\n}\n\n/**\n * Create a new session, which in its current implementation is a Sentry event\n * that all replays will be saved to as attachments. Currently, we only expect\n * one of these Sentry events per \"replay session\".\n */\nfunction createSession(\n { sessionSampleRate, allowBuffering, stickySession = false },\n { previousSessionId } = {},\n) {\n const sampled = getSessionSampleType(sessionSampleRate, allowBuffering);\n const session = makeSession({\n sampled,\n previousSessionId,\n });\n\n if (stickySession) {\n saveSession(session);\n }\n\n return session;\n}\n\n/**\n * Fetches a session from storage\n */\nfunction fetchSession() {\n if (!hasSessionStorage()) {\n return null;\n }\n\n try {\n // This can throw if cookies are disabled\n const sessionStringFromStorage = WINDOW.sessionStorage.getItem(REPLAY_SESSION_KEY);\n\n if (!sessionStringFromStorage) {\n return null;\n }\n\n const sessionObj = JSON.parse(sessionStringFromStorage) ;\n\n DEBUG_BUILD && logger.infoTick('Loading existing session');\n\n return makeSession(sessionObj);\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Given an initial timestamp and an expiry duration, checks to see if current\n * time should be considered as expired.\n */\nfunction isExpired(\n initialTime,\n expiry,\n targetTime = +new Date(),\n) {\n // Always expired if < 0\n if (initialTime === null || expiry === undefined || expiry < 0) {\n return true;\n }\n\n // Never expires if == 0\n if (expiry === 0) {\n return false;\n }\n\n return initialTime + expiry <= targetTime;\n}\n\n/**\n * Checks to see if session is expired\n */\nfunction isSessionExpired(\n session,\n {\n maxReplayDuration,\n sessionIdleExpire,\n targetTime = Date.now(),\n },\n) {\n return (\n // First, check that maximum session length has not been exceeded\n isExpired(session.started, maxReplayDuration, targetTime) ||\n // check that the idle timeout has not been exceeded (i.e. user has\n // performed an action within the last `sessionIdleExpire` ms)\n isExpired(session.lastActivity, sessionIdleExpire, targetTime)\n );\n}\n\n/** If the session should be refreshed or not. */\nfunction shouldRefreshSession(\n session,\n { sessionIdleExpire, maxReplayDuration },\n) {\n // If not expired, all good, just keep the session\n if (!isSessionExpired(session, { sessionIdleExpire, maxReplayDuration })) {\n return false;\n }\n\n // If we are buffering & haven't ever flushed yet, always continue\n if (session.sampled === 'buffer' && session.segmentId === 0) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Get or create a session, when initializing the replay.\n * Returns a session that may be unsampled.\n */\nfunction loadOrCreateSession(\n {\n sessionIdleExpire,\n maxReplayDuration,\n previousSessionId,\n }\n\n,\n sessionOptions,\n) {\n const existingSession = sessionOptions.stickySession && fetchSession();\n\n // No session exists yet, just create a new one\n if (!existingSession) {\n DEBUG_BUILD && logger.infoTick('Creating new session');\n return createSession(sessionOptions, { previousSessionId });\n }\n\n if (!shouldRefreshSession(existingSession, { sessionIdleExpire, maxReplayDuration })) {\n return existingSession;\n }\n\n DEBUG_BUILD && logger.infoTick('Session in sessionStorage is expired, creating new one...');\n return createSession(sessionOptions, { previousSessionId: existingSession.id });\n}\n\nfunction isCustomEvent(event) {\n return event.type === EventType.Custom;\n}\n\n/**\n * Add an event to the event buffer.\n * In contrast to `addEvent`, this does not return a promise & does not wait for the adding of the event to succeed/fail.\n * Instead this returns `true` if we tried to add the event, else false.\n * It returns `false` e.g. if we are paused, disabled, or out of the max replay duration.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nfunction addEventSync(replay, event, isCheckout) {\n if (!shouldAddEvent(replay, event)) {\n return false;\n }\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n _addEvent(replay, event, isCheckout);\n\n return true;\n}\n\n/**\n * Add an event to the event buffer.\n * Resolves to `null` if no event was added, else to `void`.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nfunction addEvent(\n replay,\n event,\n isCheckout,\n) {\n if (!shouldAddEvent(replay, event)) {\n return Promise.resolve(null);\n }\n\n return _addEvent(replay, event, isCheckout);\n}\n\nasync function _addEvent(\n replay,\n event,\n isCheckout,\n) {\n if (!replay.eventBuffer) {\n return null;\n }\n\n try {\n if (isCheckout && replay.recordingMode === 'buffer') {\n replay.eventBuffer.clear();\n }\n\n if (isCheckout) {\n replay.eventBuffer.hasCheckout = true;\n }\n\n const replayOptions = replay.getOptions();\n\n const eventAfterPossibleCallback = maybeApplyCallback(event, replayOptions.beforeAddRecordingEvent);\n\n if (!eventAfterPossibleCallback) {\n return;\n }\n\n return await replay.eventBuffer.addEvent(eventAfterPossibleCallback);\n } catch (error) {\n const reason = error && error instanceof EventBufferSizeExceededError ? 'addEventSizeExceeded' : 'addEvent';\n replay.handleException(error);\n\n await replay.stop({ reason });\n\n const client = getClient();\n\n if (client) {\n client.recordDroppedEvent('internal_sdk_error', 'replay');\n }\n }\n}\n\n/** Exported only for tests. */\nfunction shouldAddEvent(replay, event) {\n if (!replay.eventBuffer || replay.isPaused() || !replay.isEnabled()) {\n return false;\n }\n\n const timestampInMs = timestampToMs(event.timestamp);\n\n // Throw out events that happen more than 5 minutes ago. This can happen if\n // page has been left open and idle for a long period of time and user\n // comes back to trigger a new session. The performance entries rely on\n // `performance.timeOrigin`, which is when the page first opened.\n if (timestampInMs + replay.timeouts.sessionIdlePause < Date.now()) {\n return false;\n }\n\n // Throw out events that are +60min from the initial timestamp\n if (timestampInMs > replay.getContext().initialTimestamp + replay.getOptions().maxReplayDuration) {\n DEBUG_BUILD &&\n logger.infoTick(`Skipping event with timestamp ${timestampInMs} because it is after maxReplayDuration`);\n return false;\n }\n\n return true;\n}\n\nfunction maybeApplyCallback(\n event,\n callback,\n) {\n try {\n if (typeof callback === 'function' && isCustomEvent(event)) {\n return callback(event);\n }\n } catch (error) {\n DEBUG_BUILD &&\n logger.exception(error, 'An error occurred in the `beforeAddRecordingEvent` callback, skipping the event...');\n return null;\n }\n\n return event;\n}\n\n/** If the event is an error event */\nfunction isErrorEvent(event) {\n return !event.type;\n}\n\n/** If the event is a transaction event */\nfunction isTransactionEvent(event) {\n return event.type === 'transaction';\n}\n\n/** If the event is an replay event */\nfunction isReplayEvent(event) {\n return event.type === 'replay_event';\n}\n\n/** If the event is a feedback event */\nfunction isFeedbackEvent(event) {\n return event.type === 'feedback';\n}\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nfunction handleAfterSendEvent(replay) {\n return (event, sendResponse) => {\n if (!replay.isEnabled() || (!isErrorEvent(event) && !isTransactionEvent(event))) {\n return;\n }\n\n const statusCode = sendResponse && sendResponse.statusCode;\n\n // We only want to do stuff on successful error sending, otherwise you get error replays without errors attached\n // If not using the base transport, we allow `undefined` response (as a custom transport may not implement this correctly yet)\n // If we do use the base transport, we skip if we encountered an non-OK status code\n if (!statusCode || statusCode < 200 || statusCode >= 300) {\n return;\n }\n\n if (isTransactionEvent(event)) {\n handleTransactionEvent(replay, event);\n return;\n }\n\n handleErrorEvent(replay, event);\n };\n}\n\nfunction handleTransactionEvent(replay, event) {\n const replayContext = replay.getContext();\n\n // Collect traceIds in _context regardless of `recordingMode`\n // In error mode, _context gets cleared on every checkout\n // We limit to max. 100 transactions linked\n if (event.contexts && event.contexts.trace && event.contexts.trace.trace_id && replayContext.traceIds.size < 100) {\n replayContext.traceIds.add(event.contexts.trace.trace_id );\n }\n}\n\nfunction handleErrorEvent(replay, event) {\n const replayContext = replay.getContext();\n\n // Add error to list of errorIds of replay. This is ok to do even if not\n // sampled because context will get reset at next checkout.\n // XXX: There is also a race condition where it's possible to capture an\n // error to Sentry before Replay SDK has loaded, but response returns after\n // it was loaded, and this gets called.\n // We limit to max. 100 errors linked\n if (event.event_id && replayContext.errorIds.size < 100) {\n replayContext.errorIds.add(event.event_id);\n }\n\n // If error event is tagged with replay id it means it was sampled (when in buffer mode)\n // Need to be very careful that this does not cause an infinite loop\n if (replay.recordingMode !== 'buffer' || !event.tags || !event.tags.replayId) {\n return;\n }\n\n const { beforeErrorSampling } = replay.getOptions();\n if (typeof beforeErrorSampling === 'function' && !beforeErrorSampling(event)) {\n return;\n }\n\n setTimeout$3(async () => {\n try {\n // Capture current event buffer as new replay\n await replay.sendBufferedReplayOrFlush();\n } catch (err) {\n replay.handleException(err);\n }\n });\n}\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nfunction handleBeforeSendEvent(replay) {\n return (event) => {\n if (!replay.isEnabled() || !isErrorEvent(event)) {\n return;\n }\n\n handleHydrationError(replay, event);\n };\n}\n\nfunction handleHydrationError(replay, event) {\n const exceptionValue =\n event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].value;\n if (typeof exceptionValue !== 'string') {\n return;\n }\n\n if (\n // Only matches errors in production builds of react-dom\n // Example https://reactjs.org/docs/error-decoder.html?invariant=423\n // With newer React versions, the messages changed to a different website https://react.dev/errors/418\n exceptionValue.match(\n /(reactjs\\.org\\/docs\\/error-decoder\\.html\\?invariant=|react\\.dev\\/errors\\/)(418|419|422|423|425)/,\n ) ||\n // Development builds of react-dom\n // Error 1: Hydration failed because the initial UI does not match what was rendered on the server.\n // Error 2: Text content does not match server-rendered HTML. Warning: Text content did not match.\n exceptionValue.match(/(does not match server-rendered HTML|Hydration failed because)/i)\n ) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.hydrate-error',\n data: {\n url: getLocationHref(),\n },\n });\n addBreadcrumbEvent(replay, breadcrumb);\n }\n}\n\n/**\n * Handle breadcrumbs that Sentry captures, and make sure to capture relevant breadcrumbs to Replay as well.\n */\nfunction handleBreadcrumbs(replay) {\n const client = getClient();\n\n if (!client) {\n return;\n }\n\n client.on('beforeAddBreadcrumb', breadcrumb => beforeAddBreadcrumb(replay, breadcrumb));\n}\n\nfunction beforeAddBreadcrumb(replay, breadcrumb) {\n if (!replay.isEnabled() || !isBreadcrumbWithCategory(breadcrumb)) {\n return;\n }\n\n const result = normalizeBreadcrumb(breadcrumb);\n if (result) {\n addBreadcrumbEvent(replay, result);\n }\n}\n\n/** Exported only for tests. */\nfunction normalizeBreadcrumb(breadcrumb) {\n if (\n !isBreadcrumbWithCategory(breadcrumb) ||\n [\n // fetch & xhr are handled separately,in handleNetworkBreadcrumbs\n 'fetch',\n 'xhr',\n // These two are breadcrumbs for emitted sentry events, we don't care about them\n 'sentry.event',\n 'sentry.transaction',\n ].includes(breadcrumb.category) ||\n // We capture UI breadcrumbs separately\n breadcrumb.category.startsWith('ui.')\n ) {\n return null;\n }\n\n if (breadcrumb.category === 'console') {\n return normalizeConsoleBreadcrumb(breadcrumb);\n }\n\n return createBreadcrumb(breadcrumb);\n}\n\n/** exported for tests only */\nfunction normalizeConsoleBreadcrumb(\n breadcrumb,\n) {\n const args = breadcrumb.data && breadcrumb.data.arguments;\n\n if (!Array.isArray(args) || args.length === 0) {\n return createBreadcrumb(breadcrumb);\n }\n\n let isTruncated = false;\n\n // Avoid giant args captures\n const normalizedArgs = args.map(arg => {\n if (!arg) {\n return arg;\n }\n if (typeof arg === 'string') {\n if (arg.length > CONSOLE_ARG_MAX_SIZE) {\n isTruncated = true;\n return `${arg.slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n }\n\n return arg;\n }\n if (typeof arg === 'object') {\n try {\n const normalizedArg = normalize(arg, 7);\n const stringified = JSON.stringify(normalizedArg);\n if (stringified.length > CONSOLE_ARG_MAX_SIZE) {\n isTruncated = true;\n // We use the pretty printed JSON string here as a base\n return `${JSON.stringify(normalizedArg, null, 2).slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n }\n return normalizedArg;\n } catch (e) {\n // fall back to default\n }\n }\n\n return arg;\n });\n\n return createBreadcrumb({\n ...breadcrumb,\n data: {\n ...breadcrumb.data,\n arguments: normalizedArgs,\n ...(isTruncated ? { _meta: { warnings: ['CONSOLE_ARG_TRUNCATED'] } } : {}),\n },\n });\n}\n\nfunction isBreadcrumbWithCategory(breadcrumb) {\n return !!breadcrumb.category;\n}\n\n/**\n * Returns true if we think the given event is an error originating inside of rrweb.\n */\nfunction isRrwebError(event, hint) {\n if (event.type || !event.exception || !event.exception.values || !event.exception.values.length) {\n return false;\n }\n\n // @ts-expect-error this may be set by rrweb when it finds errors\n if (hint.originalException && hint.originalException.__rrweb__) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Add a feedback breadcrumb event to replay.\n */\nfunction addFeedbackBreadcrumb(replay, event) {\n replay.triggerUserActivity();\n replay.addUpdate(() => {\n if (!event.timestamp) {\n // Ignore events that don't have timestamps (this shouldn't happen, more of a typing issue)\n // Return true here so that we don't flush\n return true;\n }\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.throttledAddEvent({\n type: EventType.Custom,\n timestamp: event.timestamp * 1000,\n data: {\n tag: 'breadcrumb',\n payload: {\n timestamp: event.timestamp,\n type: 'default',\n category: 'sentry.feedback',\n data: {\n feedbackId: event.event_id,\n },\n },\n },\n } );\n\n return false;\n });\n}\n\n/**\n * Determine if event should be sampled (only applies in buffer mode).\n * When an event is captured by `handleGlobalEvent`, when in buffer mode\n * we determine if we want to sample the error or not.\n */\nfunction shouldSampleForBufferEvent(replay, event) {\n if (replay.recordingMode !== 'buffer') {\n return false;\n }\n\n // ignore this error because otherwise we could loop indefinitely with\n // trying to capture replay and failing\n if (event.message === UNABLE_TO_SEND_REPLAY) {\n return false;\n }\n\n // Require the event to be an error event & to have an exception\n if (!event.exception || event.type) {\n return false;\n }\n\n return isSampled(replay.getOptions().errorSampleRate);\n}\n\n/**\n * Returns a listener to be added to `addEventProcessor(listener)`.\n */\nfunction handleGlobalEventListener(replay) {\n return Object.assign(\n (event, hint) => {\n // Do nothing if replay has been disabled or paused\n if (!replay.isEnabled() || replay.isPaused()) {\n return event;\n }\n\n if (isReplayEvent(event)) {\n // Replays have separate set of breadcrumbs, do not include breadcrumbs\n // from core SDK\n delete event.breadcrumbs;\n return event;\n }\n\n // We only want to handle errors, transactions, and feedbacks, nothing else\n if (!isErrorEvent(event) && !isTransactionEvent(event) && !isFeedbackEvent(event)) {\n return event;\n }\n\n // Ensure we do not add replay_id if the session is expired\n const isSessionActive = replay.checkAndHandleExpiredSession();\n if (!isSessionActive) {\n return event;\n }\n\n if (isFeedbackEvent(event)) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n replay.flush();\n event.contexts.feedback.replay_id = replay.getSessionId();\n // Add a replay breadcrumb for this piece of feedback\n addFeedbackBreadcrumb(replay, event);\n return event;\n }\n\n // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb\n // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users\n if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) {\n DEBUG_BUILD && logger.log('Ignoring error from rrweb internals', event);\n return null;\n }\n\n // When in buffer mode, we decide to sample here.\n // Later, in `handleAfterSendEvent`, if the replayId is set, we know that we sampled\n // And convert the buffer session to a full session\n const isErrorEventSampled = shouldSampleForBufferEvent(replay, event);\n\n // Tag errors if it has been sampled in buffer mode, or if it is session mode\n // Only tag transactions if in session mode\n const shouldTagReplayId = isErrorEventSampled || replay.recordingMode === 'session';\n\n if (shouldTagReplayId) {\n event.tags = { ...event.tags, replayId: replay.getSessionId() };\n }\n\n return event;\n },\n { id: 'Replay' },\n );\n}\n\n/**\n * Create a \"span\" for each performance entry.\n */\nfunction createPerformanceSpans(\n replay,\n entries,\n) {\n return entries.map(({ type, start, end, name, data }) => {\n const response = replay.throttledAddEvent({\n type: EventType.Custom,\n timestamp: start,\n data: {\n tag: 'performanceSpan',\n payload: {\n op: type,\n description: name,\n startTimestamp: start,\n endTimestamp: end,\n data,\n },\n },\n });\n\n // If response is a string, it means its either THROTTLED or SKIPPED\n return typeof response === 'string' ? Promise.resolve(null) : response;\n });\n}\n\nfunction handleHistory(handlerData) {\n const { from, to } = handlerData;\n\n const now = Date.now() / 1000;\n\n return {\n type: 'navigation.push',\n start: now,\n end: now,\n name: to,\n data: {\n previous: from,\n },\n };\n}\n\n/**\n * Returns a listener to be added to `addHistoryInstrumentationHandler(listener)`.\n */\nfunction handleHistorySpanListener(replay) {\n return (handlerData) => {\n if (!replay.isEnabled()) {\n return;\n }\n\n const result = handleHistory(handlerData);\n\n if (result === null) {\n return;\n }\n\n // Need to collect visited URLs\n replay.getContext().urls.push(result.name);\n replay.triggerUserActivity();\n\n replay.addUpdate(() => {\n createPerformanceSpans(replay, [result]);\n // Returning false to flush\n return false;\n });\n };\n}\n\n/**\n * Check whether a given request URL should be filtered out. This is so we\n * don't log Sentry ingest requests.\n */\nfunction shouldFilterRequest(replay, url) {\n // If we enabled the `traceInternals` experiment, we want to trace everything\n if (DEBUG_BUILD && replay.getOptions()._experiments.traceInternals) {\n return false;\n }\n\n return isSentryRequestUrl(url, getClient());\n}\n\n/** Add a performance entry breadcrumb */\nfunction addNetworkBreadcrumb(\n replay,\n result,\n) {\n if (!replay.isEnabled()) {\n return;\n }\n\n if (result === null) {\n return;\n }\n\n if (shouldFilterRequest(replay, result.name)) {\n return;\n }\n\n replay.addUpdate(() => {\n createPerformanceSpans(replay, [result]);\n // Returning true will cause `addUpdate` to not flush\n // We do not want network requests to cause a flush. This will prevent\n // recurring/polling requests from keeping the replay session alive.\n return true;\n });\n}\n\n/** Get the size of a body. */\nfunction getBodySize(body) {\n if (!body) {\n return undefined;\n }\n\n const textEncoder = new TextEncoder();\n\n try {\n if (typeof body === 'string') {\n return textEncoder.encode(body).length;\n }\n\n if (body instanceof URLSearchParams) {\n return textEncoder.encode(body.toString()).length;\n }\n\n if (body instanceof FormData) {\n const formDataStr = _serializeFormData(body);\n return textEncoder.encode(formDataStr).length;\n }\n\n if (body instanceof Blob) {\n return body.size;\n }\n\n if (body instanceof ArrayBuffer) {\n return body.byteLength;\n }\n\n // Currently unhandled types: ArrayBufferView, ReadableStream\n } catch (e) {\n // just return undefined\n }\n\n return undefined;\n}\n\n/** Convert a Content-Length header to number/undefined. */\nfunction parseContentLengthHeader(header) {\n if (!header) {\n return undefined;\n }\n\n const size = parseInt(header, 10);\n return isNaN(size) ? undefined : size;\n}\n\n/** Get the string representation of a body. */\nfunction getBodyString(body) {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof URLSearchParams) {\n return [body.toString()];\n }\n\n if (body instanceof FormData) {\n return [_serializeFormData(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\n/** Merge a warning into an existing network request/response. */\nfunction mergeWarning(\n info,\n warning,\n) {\n if (!info) {\n return {\n headers: {},\n size: undefined,\n _meta: {\n warnings: [warning],\n },\n };\n }\n\n const newMeta = { ...info._meta };\n const existingWarnings = newMeta.warnings || [];\n newMeta.warnings = [...existingWarnings, warning];\n\n info._meta = newMeta;\n return info;\n}\n\n/** Convert ReplayNetworkRequestData to a PerformanceEntry. */\nfunction makeNetworkReplayBreadcrumb(\n type,\n data,\n) {\n if (!data) {\n return null;\n }\n\n const { startTimestamp, endTimestamp, url, method, statusCode, request, response } = data;\n\n const result = {\n type,\n start: startTimestamp / 1000,\n end: endTimestamp / 1000,\n name: url,\n data: dropUndefinedKeys({\n method,\n statusCode,\n request,\n response,\n }),\n };\n\n return result;\n}\n\n/** Build the request or response part of a replay network breadcrumb that was skipped. */\nfunction buildSkippedNetworkRequestOrResponse(bodySize) {\n return {\n headers: {},\n size: bodySize,\n _meta: {\n warnings: ['URL_SKIPPED'],\n },\n };\n}\n\n/** Build the request or response part of a replay network breadcrumb. */\nfunction buildNetworkRequestOrResponse(\n headers,\n bodySize,\n body,\n) {\n if (!bodySize && Object.keys(headers).length === 0) {\n return undefined;\n }\n\n if (!bodySize) {\n return {\n headers,\n };\n }\n\n if (!body) {\n return {\n headers,\n size: bodySize,\n };\n }\n\n const info = {\n headers,\n size: bodySize,\n };\n\n const { body: normalizedBody, warnings } = normalizeNetworkBody(body);\n info.body = normalizedBody;\n if (warnings && warnings.length > 0) {\n info._meta = {\n warnings,\n };\n }\n\n return info;\n}\n\n/** Filter a set of headers */\nfunction getAllowedHeaders(headers, allowedHeaders) {\n return Object.entries(headers).reduce((filteredHeaders, [key, value]) => {\n const normalizedKey = key.toLowerCase();\n // Avoid putting empty strings into the headers\n if (allowedHeaders.includes(normalizedKey) && headers[key]) {\n filteredHeaders[normalizedKey] = value;\n }\n return filteredHeaders;\n }, {});\n}\n\nfunction _serializeFormData(formData) {\n // This is a bit simplified, but gives us a decent estimate\n // This converts e.g. { name: 'Anne Smith', age: 13 } to 'name=Anne+Smith&age=13'\n // @ts-expect-error passing FormData to URLSearchParams actually works\n return new URLSearchParams(formData).toString();\n}\n\nfunction normalizeNetworkBody(body)\n\n {\n if (!body || typeof body !== 'string') {\n return {\n body,\n };\n }\n\n const exceedsSizeLimit = body.length > NETWORK_BODY_MAX_SIZE;\n const isProbablyJson = _strIsProbablyJson(body);\n\n if (exceedsSizeLimit) {\n const truncatedBody = body.slice(0, NETWORK_BODY_MAX_SIZE);\n\n if (isProbablyJson) {\n return {\n body: truncatedBody,\n warnings: ['MAYBE_JSON_TRUNCATED'],\n };\n }\n\n return {\n body: `${truncatedBody}…`,\n warnings: ['TEXT_TRUNCATED'],\n };\n }\n\n if (isProbablyJson) {\n try {\n const jsonBody = JSON.parse(body);\n return {\n body: jsonBody,\n };\n } catch (e2) {\n // fall back to just send the body as string\n }\n }\n\n return {\n body,\n };\n}\n\nfunction _strIsProbablyJson(str) {\n const first = str[0];\n const last = str[str.length - 1];\n\n // Simple check: If this does not start & end with {} or [], it's not JSON\n return (first === '[' && last === ']') || (first === '{' && last === '}');\n}\n\n/** Match an URL against a list of strings/Regex. */\nfunction urlMatches(url, urls) {\n const fullUrl = getFullUrl(url);\n\n return stringMatchesSomePattern(fullUrl, urls);\n}\n\n/** exported for tests */\nfunction getFullUrl(url, baseURI = WINDOW.document.baseURI) {\n // Short circuit for common cases:\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith(WINDOW.location.origin)) {\n return url;\n }\n const fixedUrl = new URL(url, baseURI);\n\n // If these do not match, we are not dealing with a relative URL, so just return it\n if (fixedUrl.origin !== new URL(baseURI).origin) {\n return url;\n }\n\n const fullUrl = fixedUrl.href;\n\n // Remove trailing slashes, if they don't match the original URL\n if (!url.endsWith('/') && fullUrl.endsWith('/')) {\n return fullUrl.slice(0, -1);\n }\n\n return fullUrl;\n}\n\n/**\n * Capture a fetch breadcrumb to a replay.\n * This adds additional data (where appropriate).\n */\nasync function captureFetchBreadcrumbToReplay(\n breadcrumb,\n hint,\n options\n\n,\n) {\n try {\n const data = await _prepareFetchData(breadcrumb, hint, options);\n\n // Create a replay performance entry from this breadcrumb\n const result = makeNetworkReplayBreadcrumb('resource.fetch', data);\n addNetworkBreadcrumb(options.replay, result);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to capture fetch breadcrumb');\n }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nfunction enrichFetchBreadcrumb(\n breadcrumb,\n hint,\n) {\n const { input, response } = hint;\n\n const body = input ? _getFetchRequestArgBody(input) : undefined;\n const reqSize = getBodySize(body);\n\n const resSize = response ? parseContentLengthHeader(response.headers.get('content-length')) : undefined;\n\n if (reqSize !== undefined) {\n breadcrumb.data.request_body_size = reqSize;\n }\n if (resSize !== undefined) {\n breadcrumb.data.response_body_size = resSize;\n }\n}\n\nasync function _prepareFetchData(\n breadcrumb,\n hint,\n options,\n) {\n const now = Date.now();\n const { startTimestamp = now, endTimestamp = now } = hint;\n\n const {\n url,\n method,\n status_code: statusCode = 0,\n request_body_size: requestBodySize,\n response_body_size: responseBodySize,\n } = breadcrumb.data;\n\n const captureDetails =\n urlMatches(url, options.networkDetailAllowUrls) && !urlMatches(url, options.networkDetailDenyUrls);\n\n const request = captureDetails\n ? _getRequestInfo(options, hint.input, requestBodySize)\n : buildSkippedNetworkRequestOrResponse(requestBodySize);\n const response = await _getResponseInfo(captureDetails, options, hint.response, responseBodySize);\n\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request,\n response,\n };\n}\n\nfunction _getRequestInfo(\n { networkCaptureBodies, networkRequestHeaders },\n input,\n requestBodySize,\n) {\n const headers = input ? getRequestHeaders(input, networkRequestHeaders) : {};\n\n if (!networkCaptureBodies) {\n return buildNetworkRequestOrResponse(headers, requestBodySize, undefined);\n }\n\n // We only want to transmit string or string-like bodies\n const requestBody = _getFetchRequestArgBody(input);\n const [bodyStr, warning] = getBodyString(requestBody);\n const data = buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr);\n\n if (warning) {\n return mergeWarning(data, warning);\n }\n\n return data;\n}\n\n/** Exported only for tests. */\nasync function _getResponseInfo(\n captureDetails,\n {\n networkCaptureBodies,\n networkResponseHeaders,\n },\n response,\n responseBodySize,\n) {\n if (!captureDetails && responseBodySize !== undefined) {\n return buildSkippedNetworkRequestOrResponse(responseBodySize);\n }\n\n const headers = response ? getAllHeaders(response.headers, networkResponseHeaders) : {};\n\n if (!response || (!networkCaptureBodies && responseBodySize !== undefined)) {\n return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n }\n\n const [bodyText, warning] = await _parseFetchResponseBody(response);\n const result = getResponseData(bodyText, {\n networkCaptureBodies,\n\n responseBodySize,\n captureDetails,\n headers,\n });\n\n if (warning) {\n return mergeWarning(result, warning);\n }\n\n return result;\n}\n\nfunction getResponseData(\n bodyText,\n {\n networkCaptureBodies,\n responseBodySize,\n captureDetails,\n headers,\n }\n\n,\n) {\n try {\n const size =\n bodyText && bodyText.length && responseBodySize === undefined ? getBodySize(bodyText) : responseBodySize;\n\n if (!captureDetails) {\n return buildSkippedNetworkRequestOrResponse(size);\n }\n\n if (networkCaptureBodies) {\n return buildNetworkRequestOrResponse(headers, size, bodyText);\n }\n\n return buildNetworkRequestOrResponse(headers, size, undefined);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize response body');\n // fallback\n return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n }\n}\n\nasync function _parseFetchResponseBody(response) {\n const res = _tryCloneResponse(response);\n\n if (!res) {\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n try {\n const text = await _tryGetResponseText(res);\n return [text];\n } catch (error) {\n if (error instanceof Error && error.message.indexOf('Timeout') > -1) {\n DEBUG_BUILD && logger.warn('Parsing text body from response timed out');\n return [undefined, 'BODY_PARSE_TIMEOUT'];\n }\n\n DEBUG_BUILD && logger.exception(error, 'Failed to get text body from response');\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n}\n\nfunction _getFetchRequestArgBody(fetchArgs = []) {\n // We only support getting the body from the fetch options\n if (fetchArgs.length !== 2 || typeof fetchArgs[1] !== 'object') {\n return undefined;\n }\n\n return (fetchArgs[1] ).body;\n}\n\nfunction getAllHeaders(headers, allowedHeaders) {\n const allHeaders = {};\n\n allowedHeaders.forEach(header => {\n if (headers.get(header)) {\n allHeaders[header] = headers.get(header) ;\n }\n });\n\n return allHeaders;\n}\n\nfunction getRequestHeaders(fetchArgs, allowedHeaders) {\n if (fetchArgs.length === 1 && typeof fetchArgs[0] !== 'string') {\n return getHeadersFromOptions(fetchArgs[0] , allowedHeaders);\n }\n\n if (fetchArgs.length === 2) {\n return getHeadersFromOptions(fetchArgs[1] , allowedHeaders);\n }\n\n return {};\n}\n\nfunction getHeadersFromOptions(\n input,\n allowedHeaders,\n) {\n if (!input) {\n return {};\n }\n\n const headers = input.headers;\n\n if (!headers) {\n return {};\n }\n\n if (headers instanceof Headers) {\n return getAllHeaders(headers, allowedHeaders);\n }\n\n // We do not support this, as it is not really documented (anymore?)\n if (Array.isArray(headers)) {\n return {};\n }\n\n return getAllowedHeaders(headers, allowedHeaders);\n}\n\nfunction _tryCloneResponse(response) {\n try {\n // We have to clone this, as the body can only be read once\n return response.clone();\n } catch (error) {\n // this can throw if the response was already consumed before\n DEBUG_BUILD && logger.exception(error, 'Failed to clone response body');\n }\n}\n\n/**\n * Get the response body of a fetch request, or timeout after 500ms.\n * Fetch can return a streaming body, that may not resolve (or not for a long time).\n * If that happens, we rather abort after a short time than keep waiting for this.\n */\nfunction _tryGetResponseText(response) {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout$3(() => reject(new Error('Timeout while trying to read response body')), 500);\n\n _getResponseText(response)\n .then(\n txt => resolve(txt),\n reason => reject(reason),\n )\n .finally(() => clearTimeout(timeout));\n });\n}\n\nasync function _getResponseText(response) {\n // Force this to be a promise, just to be safe\n // eslint-disable-next-line no-return-await\n return await response.text();\n}\n\n/**\n * Capture an XHR breadcrumb to a replay.\n * This adds additional data (where appropriate).\n */\nasync function captureXhrBreadcrumbToReplay(\n breadcrumb,\n hint,\n options,\n) {\n try {\n const data = _prepareXhrData(breadcrumb, hint, options);\n\n // Create a replay performance entry from this breadcrumb\n const result = makeNetworkReplayBreadcrumb('resource.xhr', data);\n addNetworkBreadcrumb(options.replay, result);\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to capture xhr breadcrumb');\n }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nfunction enrichXhrBreadcrumb(\n breadcrumb,\n hint,\n) {\n const { xhr, input } = hint;\n\n if (!xhr) {\n return;\n }\n\n const reqSize = getBodySize(input);\n const resSize = xhr.getResponseHeader('content-length')\n ? parseContentLengthHeader(xhr.getResponseHeader('content-length'))\n : _getBodySize(xhr.response, xhr.responseType);\n\n if (reqSize !== undefined) {\n breadcrumb.data.request_body_size = reqSize;\n }\n if (resSize !== undefined) {\n breadcrumb.data.response_body_size = resSize;\n }\n}\n\nfunction _prepareXhrData(\n breadcrumb,\n hint,\n options,\n) {\n const now = Date.now();\n const { startTimestamp = now, endTimestamp = now, input, xhr } = hint;\n\n const {\n url,\n method,\n status_code: statusCode = 0,\n request_body_size: requestBodySize,\n response_body_size: responseBodySize,\n } = breadcrumb.data;\n\n if (!url) {\n return null;\n }\n\n if (!xhr || !urlMatches(url, options.networkDetailAllowUrls) || urlMatches(url, options.networkDetailDenyUrls)) {\n const request = buildSkippedNetworkRequestOrResponse(requestBodySize);\n const response = buildSkippedNetworkRequestOrResponse(responseBodySize);\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request,\n response,\n };\n }\n\n const xhrInfo = xhr[SENTRY_XHR_DATA_KEY];\n const networkRequestHeaders = xhrInfo\n ? getAllowedHeaders(xhrInfo.request_headers, options.networkRequestHeaders)\n : {};\n const networkResponseHeaders = getAllowedHeaders(getResponseHeaders(xhr), options.networkResponseHeaders);\n\n const [requestBody, requestWarning] = options.networkCaptureBodies ? getBodyString(input) : [undefined];\n const [responseBody, responseWarning] = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : [undefined];\n\n const request = buildNetworkRequestOrResponse(networkRequestHeaders, requestBodySize, requestBody);\n const response = buildNetworkRequestOrResponse(networkResponseHeaders, responseBodySize, responseBody);\n\n return {\n startTimestamp,\n endTimestamp,\n url,\n method,\n statusCode,\n request: requestWarning ? mergeWarning(request, requestWarning) : request,\n response: responseWarning ? mergeWarning(response, responseWarning) : response,\n };\n}\n\nfunction getResponseHeaders(xhr) {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc, line) => {\n const [key, value] = line.split(': ') ;\n if (value) {\n acc[key.toLowerCase()] = value;\n }\n return acc;\n }, {});\n}\n\nfunction _getXhrResponseBody(xhr) {\n // We collect errors that happen, but only log them if we can't get any response body\n const errors = [];\n\n try {\n return [xhr.responseText];\n } catch (e) {\n errors.push(e);\n }\n\n // Try to manually parse the response body, if responseText fails\n try {\n return _parseXhrResponse(xhr.response, xhr.responseType);\n } catch (e) {\n errors.push(e);\n }\n\n DEBUG_BUILD && logger.warn('Failed to get xhr response body', ...errors);\n\n return [undefined];\n}\n\n/**\n * Get the string representation of the XHR response.\n * Based on MDN, these are the possible types of the response:\n * string\n * ArrayBuffer\n * Blob\n * Document\n * POJO\n *\n * Exported only for tests.\n */\nfunction _parseXhrResponse(\n body,\n responseType,\n) {\n try {\n if (typeof body === 'string') {\n return [body];\n }\n\n if (body instanceof Document) {\n return [body.body.outerHTML];\n }\n\n if (responseType === 'json' && body && typeof body === 'object') {\n return [JSON.stringify(body)];\n }\n\n if (!body) {\n return [undefined];\n }\n } catch (error) {\n DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n return [undefined, 'BODY_PARSE_ERROR'];\n }\n\n DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\nfunction _getBodySize(\n body,\n responseType,\n) {\n try {\n const bodyStr = responseType === 'json' && body && typeof body === 'object' ? JSON.stringify(body) : body;\n return getBodySize(bodyStr);\n } catch (e2) {\n return undefined;\n }\n}\n\n/**\n * This method does two things:\n * - It enriches the regular XHR/fetch breadcrumbs with request/response size data\n * - It captures the XHR/fetch breadcrumbs to the replay\n * (enriching it with further data that is _not_ added to the regular breadcrumbs)\n */\nfunction handleNetworkBreadcrumbs(replay) {\n const client = getClient();\n\n try {\n const {\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders,\n networkResponseHeaders,\n } = replay.getOptions();\n\n const options = {\n replay,\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders,\n networkResponseHeaders,\n };\n\n if (client) {\n client.on('beforeAddBreadcrumb', (breadcrumb, hint) => beforeAddNetworkBreadcrumb(options, breadcrumb, hint));\n }\n } catch (e2) {\n // Do nothing\n }\n}\n\n/** just exported for tests */\nfunction beforeAddNetworkBreadcrumb(\n options,\n breadcrumb,\n hint,\n) {\n if (!breadcrumb.data) {\n return;\n }\n\n try {\n if (_isXhrBreadcrumb(breadcrumb) && _isXhrHint(hint)) {\n // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n // So any async mutations to it will not be reflected in the final breadcrumb\n enrichXhrBreadcrumb(breadcrumb, hint);\n\n // This call should not reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n captureXhrBreadcrumbToReplay(breadcrumb, hint, options);\n }\n\n if (_isFetchBreadcrumb(breadcrumb) && _isFetchHint(hint)) {\n // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n // So any async mutations to it will not be reflected in the final breadcrumb\n enrichFetchBreadcrumb(breadcrumb, hint);\n\n // This call should not reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n captureFetchBreadcrumbToReplay(breadcrumb, hint, options);\n }\n } catch (e) {\n DEBUG_BUILD && logger.exception(e, 'Error when enriching network breadcrumb');\n }\n}\n\nfunction _isXhrBreadcrumb(breadcrumb) {\n return breadcrumb.category === 'xhr';\n}\n\nfunction _isFetchBreadcrumb(breadcrumb) {\n return breadcrumb.category === 'fetch';\n}\n\nfunction _isXhrHint(hint) {\n return hint && hint.xhr;\n}\n\nfunction _isFetchHint(hint) {\n return hint && hint.response;\n}\n\n/**\n * Add global listeners that cannot be removed.\n */\nfunction addGlobalListeners(replay) {\n // Listeners from core SDK //\n const client = getClient();\n\n addClickKeypressInstrumentationHandler(handleDomListener(replay));\n addHistoryInstrumentationHandler(handleHistorySpanListener(replay));\n handleBreadcrumbs(replay);\n handleNetworkBreadcrumbs(replay);\n\n // Tag all (non replay) events that get sent to Sentry with the current\n // replay ID so that we can reference them later in the UI\n const eventProcessor = handleGlobalEventListener(replay);\n addEventProcessor(eventProcessor);\n\n // If a custom client has no hooks yet, we continue to use the \"old\" implementation\n if (client) {\n client.on('beforeSendEvent', handleBeforeSendEvent(replay));\n client.on('afterSendEvent', handleAfterSendEvent(replay));\n client.on('createDsc', (dsc) => {\n const replayId = replay.getSessionId();\n // We do not want to set the DSC when in buffer mode, as that means the replay has not been sent (yet)\n if (replayId && replay.isEnabled() && replay.recordingMode === 'session') {\n // Ensure to check that the session is still active - it could have expired in the meanwhile\n const isSessionActive = replay.checkAndHandleExpiredSession();\n if (isSessionActive) {\n dsc.replay_id = replayId;\n }\n }\n });\n\n client.on('spanStart', span => {\n replay.lastActiveSpan = span;\n });\n\n // We may be missing the initial spanStart due to timing issues,\n // so we capture it on finish again.\n client.on('spanEnd', span => {\n replay.lastActiveSpan = span;\n });\n\n // We want to flush replay\n client.on('beforeSendFeedback', (feedbackEvent, options) => {\n const replayId = replay.getSessionId();\n if (options && options.includeReplay && replay.isEnabled() && replayId) {\n // This should never reject\n if (feedbackEvent.contexts && feedbackEvent.contexts.feedback) {\n feedbackEvent.contexts.feedback.replay_id = replayId;\n }\n }\n });\n }\n}\n\n/**\n * Create a \"span\" for the total amount of memory being used by JS objects\n * (including v8 internal objects).\n */\nasync function addMemoryEntry(replay) {\n // window.performance.memory is a non-standard API and doesn't work on all browsers, so we try-catch this\n try {\n return Promise.all(\n createPerformanceSpans(replay, [\n // @ts-expect-error memory doesn't exist on type Performance as the API is non-standard (we check that it exists above)\n createMemoryEntry(WINDOW.performance.memory),\n ]),\n );\n } catch (error) {\n // Do nothing\n return [];\n }\n}\n\nfunction createMemoryEntry(memoryEntry) {\n const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = memoryEntry;\n // we don't want to use `getAbsoluteTime` because it adds the event time to the\n // time origin, so we get the current timestamp instead\n const time = Date.now() / 1000;\n return {\n type: 'memory',\n name: 'memory',\n start: time,\n end: time,\n data: {\n memory: {\n jsHeapSizeLimit,\n totalJSHeapSize,\n usedJSHeapSize,\n },\n },\n };\n}\n\n/**\n * Heavily simplified debounce function based on lodash.debounce.\n *\n * This function takes a callback function (@param fun) and delays its invocation\n * by @param wait milliseconds. Optionally, a maxWait can be specified in @param options,\n * which ensures that the callback is invoked at least once after the specified max. wait time.\n *\n * @param func the function whose invocation is to be debounced\n * @param wait the minimum time until the function is invoked after it was called once\n * @param options the options object, which can contain the `maxWait` property\n *\n * @returns the debounced version of the function, which needs to be called at least once to start the\n * debouncing process. Subsequent calls will reset the debouncing timer and, in case @paramfunc\n * was already invoked in the meantime, return @param func's return value.\n * The debounced function has two additional properties:\n * - `flush`: Invokes the debounced function immediately and returns its return value\n * - `cancel`: Cancels the debouncing process and resets the debouncing timer\n */\nfunction debounce(func, wait, options) {\n let callbackReturnValue;\n\n let timerId;\n let maxTimerId;\n\n const maxWait = options && options.maxWait ? Math.max(options.maxWait, wait) : 0;\n\n function invokeFunc() {\n cancelTimers();\n callbackReturnValue = func();\n return callbackReturnValue;\n }\n\n function cancelTimers() {\n timerId !== undefined && clearTimeout(timerId);\n maxTimerId !== undefined && clearTimeout(maxTimerId);\n timerId = maxTimerId = undefined;\n }\n\n function flush() {\n if (timerId !== undefined || maxTimerId !== undefined) {\n return invokeFunc();\n }\n return callbackReturnValue;\n }\n\n function debounced() {\n if (timerId) {\n clearTimeout(timerId);\n }\n timerId = setTimeout$3(invokeFunc, wait);\n\n if (maxWait && maxTimerId === undefined) {\n maxTimerId = setTimeout$3(invokeFunc, maxWait);\n }\n\n return callbackReturnValue;\n }\n\n debounced.cancel = cancelTimers;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Handler for recording events.\n *\n * Adds to event buffer, and has varying flushing behaviors if the event was a checkout.\n */\nfunction getHandleRecordingEmit(replay) {\n let hadFirstEvent = false;\n\n return (event, _isCheckout) => {\n // If this is false, it means session is expired, create and a new session and wait for checkout\n if (!replay.checkAndHandleExpiredSession()) {\n DEBUG_BUILD && logger.warn('Received replay event after session expired.');\n\n return;\n }\n\n // `_isCheckout` is only set when the checkout is due to `checkoutEveryNms`\n // We also want to treat the first event as a checkout, so we handle this specifically here\n const isCheckout = _isCheckout || !hadFirstEvent;\n hadFirstEvent = true;\n\n if (replay.clickDetector) {\n updateClickDetectorForRecordingEvent(replay.clickDetector, event);\n }\n\n // The handler returns `true` if we do not want to trigger debounced flush, `false` if we want to debounce flush.\n replay.addUpdate(() => {\n // The session is always started immediately on pageload/init, but for\n // error-only replays, it should reflect the most recent checkout\n // when an error occurs. Clear any state that happens before this current\n // checkout. This needs to happen before `addEvent()` which updates state\n // dependent on this reset.\n if (replay.recordingMode === 'buffer' && isCheckout) {\n replay.setInitialState();\n }\n\n // If the event is not added (e.g. due to being paused, disabled, or out of the max replay duration),\n // Skip all further steps\n if (!addEventSync(replay, event, isCheckout)) {\n // Return true to skip scheduling a debounced flush\n return true;\n }\n\n // Different behavior for full snapshots (type=2), ignore other event types\n // See https://github.com/rrweb-io/rrweb/blob/d8f9290ca496712aa1e7d472549480c4e7876594/packages/rrweb/src/types.ts#L16\n if (!isCheckout) {\n return false;\n }\n\n const session = replay.session;\n\n // Additionally, create a meta event that will capture certain SDK settings.\n // In order to handle buffer mode, this needs to either be done when we\n // receive checkout events or at flush time. We have an experimental mode\n // to perform multiple checkouts a session (the idea is to improve\n // seeking during playback), so also only include if segmentId is 0\n // (handled in `addSettingsEvent`).\n //\n // `isCheckout` is always true, but want to be explicit that it should\n // only be added for checkouts\n addSettingsEvent(replay, isCheckout);\n\n // When in buffer mode, make sure we adjust the session started date to the current earliest event of the buffer\n // this should usually be the timestamp of the checkout event, but to be safe...\n if (replay.recordingMode === 'buffer' && session && replay.eventBuffer) {\n const earliestEvent = replay.eventBuffer.getEarliestTimestamp();\n if (earliestEvent) {\n DEBUG_BUILD &&\n logger.info(`Updating session start time to earliest event in buffer to ${new Date(earliestEvent)}`);\n\n session.started = earliestEvent;\n\n if (replay.getOptions().stickySession) {\n saveSession(session);\n }\n }\n }\n\n // If there is a previousSessionId after a full snapshot occurs, then\n // the replay session was started due to session expiration. The new session\n // is started before triggering a new checkout and contains the id\n // of the previous session. Do not immediately flush in this case\n // to avoid capturing only the checkout and instead the replay will\n // be captured if they perform any follow-up actions.\n if (session && session.previousSessionId) {\n return true;\n }\n\n if (replay.recordingMode === 'session') {\n // If the full snapshot is due to an initial load, we will not have\n // a previous session ID. In this case, we want to buffer events\n // for a set amount of time before flushing. This can help avoid\n // capturing replays of users that immediately close the window.\n\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n void replay.flush();\n }\n\n return true;\n });\n };\n}\n\n/**\n * Exported for tests\n */\nfunction createOptionsEvent(replay) {\n const options = replay.getOptions();\n return {\n type: EventType.Custom,\n timestamp: Date.now(),\n data: {\n tag: 'options',\n payload: {\n shouldRecordCanvas: replay.isRecordingCanvas(),\n sessionSampleRate: options.sessionSampleRate,\n errorSampleRate: options.errorSampleRate,\n useCompressionOption: options.useCompression,\n blockAllMedia: options.blockAllMedia,\n maskAllText: options.maskAllText,\n maskAllInputs: options.maskAllInputs,\n useCompression: replay.eventBuffer ? replay.eventBuffer.type === 'worker' : false,\n networkDetailHasUrls: options.networkDetailAllowUrls.length > 0,\n networkCaptureBodies: options.networkCaptureBodies,\n networkRequestHasHeaders: options.networkRequestHeaders.length > 0,\n networkResponseHasHeaders: options.networkResponseHeaders.length > 0,\n },\n },\n };\n}\n\n/**\n * Add a \"meta\" event that contains a simplified view on current configuration\n * options. This should only be included on the first segment of a recording.\n */\nfunction addSettingsEvent(replay, isCheckout) {\n // Only need to add this event when sending the first segment\n if (!isCheckout || !replay.session || replay.session.segmentId !== 0) {\n return;\n }\n\n addEventSync(replay, createOptionsEvent(replay), false);\n}\n\n/**\n * Reset the `replay_id` field on the DSC.\n */\nfunction resetReplayIdOnDynamicSamplingContext() {\n // Reset DSC on the current scope, if there is one\n const dsc = getCurrentScope().getPropagationContext().dsc;\n if (dsc) {\n delete dsc.replay_id;\n }\n\n // Clear it from frozen DSC on the active span\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n const dsc = getDynamicSamplingContextFromSpan(activeSpan);\n delete (dsc ).replay_id;\n }\n}\n\n/**\n * Create a replay envelope ready to be sent.\n * This includes both the replay event, as well as the recording data.\n */\nfunction createReplayEnvelope(\n replayEvent,\n recordingData,\n dsn,\n tunnel,\n) {\n return createEnvelope(\n createEventEnvelopeHeaders(replayEvent, getSdkMetadataForEnvelopeHeader(replayEvent), tunnel, dsn),\n [\n [{ type: 'replay_event' }, replayEvent],\n [\n {\n type: 'replay_recording',\n // If string then we need to encode to UTF8, otherwise will have\n // wrong size. TextEncoder has similar browser support to\n // MutationObserver, although it does not accept IE11.\n length:\n typeof recordingData === 'string' ? new TextEncoder().encode(recordingData).length : recordingData.length,\n },\n recordingData,\n ],\n ],\n );\n}\n\n/**\n * Prepare the recording data ready to be sent.\n */\nfunction prepareRecordingData({\n recordingData,\n headers,\n}\n\n) {\n let payloadWithSequence;\n\n // XXX: newline is needed to separate sequence id from events\n const replayHeaders = `${JSON.stringify(headers)}\n`;\n\n if (typeof recordingData === 'string') {\n payloadWithSequence = `${replayHeaders}${recordingData}`;\n } else {\n const enc = new TextEncoder();\n // XXX: newline is needed to separate sequence id from events\n const sequence = enc.encode(replayHeaders);\n // Merge the two Uint8Arrays\n payloadWithSequence = new Uint8Array(sequence.length + recordingData.length);\n payloadWithSequence.set(sequence);\n payloadWithSequence.set(recordingData, sequence.length);\n }\n\n return payloadWithSequence;\n}\n\n/**\n * Prepare a replay event & enrich it with the SDK metadata.\n */\nasync function prepareReplayEvent({\n client,\n scope,\n replayId: event_id,\n event,\n}\n\n) {\n const integrations =\n typeof client._integrations === 'object' && client._integrations !== null && !Array.isArray(client._integrations)\n ? Object.keys(client._integrations)\n : undefined;\n\n const eventHint = { event_id, integrations };\n\n client.emit('preprocessEvent', event, eventHint);\n\n const preparedEvent = (await prepareEvent(\n client.getOptions(),\n event,\n eventHint,\n scope,\n client,\n getIsolationScope(),\n )) ;\n\n // If e.g. a global event processor returned null\n if (!preparedEvent) {\n return null;\n }\n\n // This normally happens in browser client \"_prepareEvent\"\n // but since we do not use this private method from the client, but rather the plain import\n // we need to do this manually.\n preparedEvent.platform = preparedEvent.platform || 'javascript';\n\n // extract the SDK name because `client._prepareEvent` doesn't add it to the event\n const metadata = client.getSdkMetadata();\n const { name, version } = (metadata && metadata.sdk) || {};\n\n preparedEvent.sdk = {\n ...preparedEvent.sdk,\n name: name || 'sentry.javascript.unknown',\n version: version || '0.0.0',\n };\n\n return preparedEvent;\n}\n\n/**\n * Send replay attachment using `fetch()`\n */\nasync function sendReplayRequest({\n recordingData,\n replayId,\n segmentId: segment_id,\n eventContext,\n timestamp,\n session,\n}) {\n const preparedRecordingData = prepareRecordingData({\n recordingData,\n headers: {\n segment_id,\n },\n });\n\n const { urls, errorIds, traceIds, initialTimestamp } = eventContext;\n\n const client = getClient();\n const scope = getCurrentScope();\n const transport = client && client.getTransport();\n const dsn = client && client.getDsn();\n\n if (!client || !transport || !dsn || !session.sampled) {\n return resolvedSyncPromise({});\n }\n\n const baseEvent = {\n type: REPLAY_EVENT_NAME,\n replay_start_timestamp: initialTimestamp / 1000,\n timestamp: timestamp / 1000,\n error_ids: errorIds,\n trace_ids: traceIds,\n urls,\n replay_id: replayId,\n segment_id,\n replay_type: session.sampled,\n };\n\n const replayEvent = await prepareReplayEvent({ scope, client, replayId, event: baseEvent });\n\n if (!replayEvent) {\n // Taken from baseclient's `_processEvent` method, where this is handled for errors/transactions\n client.recordDroppedEvent('event_processor', 'replay', baseEvent);\n DEBUG_BUILD && logger.info('An event processor returned `null`, will not send event.');\n return resolvedSyncPromise({});\n }\n\n /*\n For reference, the fully built event looks something like this:\n {\n \"type\": \"replay_event\",\n \"timestamp\": 1670837008.634,\n \"error_ids\": [\n \"errorId\"\n ],\n \"trace_ids\": [\n \"traceId\"\n ],\n \"urls\": [\n \"https://example.com\"\n ],\n \"replay_id\": \"eventId\",\n \"segment_id\": 3,\n \"replay_type\": \"error\",\n \"platform\": \"javascript\",\n \"event_id\": \"eventId\",\n \"environment\": \"production\",\n \"sdk\": {\n \"integrations\": [\n \"BrowserTracing\",\n \"Replay\"\n ],\n \"name\": \"sentry.javascript.browser\",\n \"version\": \"7.25.0\"\n },\n \"sdkProcessingMetadata\": {},\n \"contexts\": {\n },\n }\n */\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete replayEvent.sdkProcessingMetadata;\n\n const envelope = createReplayEnvelope(replayEvent, preparedRecordingData, dsn, client.getOptions().tunnel);\n\n let response;\n\n try {\n response = await transport.send(envelope);\n } catch (err) {\n const error = new Error(UNABLE_TO_SEND_REPLAY);\n\n try {\n // In case browsers don't allow this property to be writable\n // @ts-expect-error This needs lib es2022 and newer\n error.cause = err;\n } catch (e) {\n // nothing to do\n }\n throw error;\n }\n\n // If the status code is invalid, we want to immediately stop & not retry\n if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) {\n throw new TransportStatusCodeError(response.statusCode);\n }\n\n const rateLimits = updateRateLimits({}, response);\n if (isRateLimited(rateLimits, 'replay')) {\n throw new RateLimitError(rateLimits);\n }\n\n return response;\n}\n\n/**\n * This error indicates that the transport returned an invalid status code.\n */\nclass TransportStatusCodeError extends Error {\n constructor(statusCode) {\n super(`Transport returned status code ${statusCode}`);\n }\n}\n\n/**\n * This error indicates that we hit a rate limit API error.\n */\nclass RateLimitError extends Error {\n\n constructor(rateLimits) {\n super('Rate limit hit');\n this.rateLimits = rateLimits;\n }\n}\n\n/**\n * Finalize and send the current replay event to Sentry\n */\nasync function sendReplay(\n replayData,\n retryConfig = {\n count: 0,\n interval: RETRY_BASE_INTERVAL,\n },\n) {\n const { recordingData, onError } = replayData;\n\n // short circuit if there's no events to upload (this shouldn't happen as _runFlush makes this check)\n if (!recordingData.length) {\n return;\n }\n\n try {\n await sendReplayRequest(replayData);\n return true;\n } catch (err) {\n if (err instanceof TransportStatusCodeError || err instanceof RateLimitError) {\n throw err;\n }\n\n // Capture error for every failed replay\n setContext('Replays', {\n _retryCount: retryConfig.count,\n });\n\n if (onError) {\n onError(err);\n }\n\n // If an error happened here, it's likely that uploading the attachment\n // failed, we'll can retry with the same events payload\n if (retryConfig.count >= RETRY_MAX_COUNT) {\n const error = new Error(`${UNABLE_TO_SEND_REPLAY} - max retries exceeded`);\n\n try {\n // In case browsers don't allow this property to be writable\n // @ts-expect-error This needs lib es2022 and newer\n error.cause = err;\n } catch (e) {\n // nothing to do\n }\n\n throw error;\n }\n\n // will retry in intervals of 5, 10, 30\n retryConfig.interval *= ++retryConfig.count;\n\n return new Promise((resolve, reject) => {\n setTimeout$3(async () => {\n try {\n await sendReplay(replayData, retryConfig);\n resolve(true);\n } catch (err) {\n reject(err);\n }\n }, retryConfig.interval);\n });\n }\n}\n\nconst THROTTLED = '__THROTTLED';\nconst SKIPPED = '__SKIPPED';\n\n/**\n * Create a throttled function off a given function.\n * When calling the throttled function, it will call the original function only\n * if it hasn't been called more than `maxCount` times in the last `durationSeconds`.\n *\n * Returns `THROTTLED` if throttled for the first time, after that `SKIPPED`,\n * or else the return value of the original function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction throttle(\n fn,\n maxCount,\n durationSeconds,\n) {\n const counter = new Map();\n\n const _cleanup = (now) => {\n const threshold = now - durationSeconds;\n counter.forEach((_value, key) => {\n if (key < threshold) {\n counter.delete(key);\n }\n });\n };\n\n const _getTotalCount = () => {\n return [...counter.values()].reduce((a, b) => a + b, 0);\n };\n\n let isThrottled = false;\n\n return (...rest) => {\n // Date in second-precision, which we use as basis for the throttling\n const now = Math.floor(Date.now() / 1000);\n\n // First, make sure to delete any old entries\n _cleanup(now);\n\n // If already over limit, do nothing\n if (_getTotalCount() >= maxCount) {\n const wasThrottled = isThrottled;\n isThrottled = true;\n return wasThrottled ? SKIPPED : THROTTLED;\n }\n\n isThrottled = false;\n const count = counter.get(now) || 0;\n counter.set(now, count + 1);\n\n return fn(...rest);\n };\n}\n\n/* eslint-disable max-lines */ // TODO: We might want to split this file up\n\n/**\n * The main replay container class, which holds all the state and methods for recording and sending replays.\n */\nclass ReplayContainer {\n\n /**\n * Recording can happen in one of two modes:\n * - session: Record the whole session, sending it continuously\n * - buffer: Always keep the last 60s of recording, requires:\n * - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs\n * - or calling `flush()` to send the replay\n */\n\n /**\n * The current or last active span.\n * This is only available when performance is enabled.\n */\n\n /**\n * These are here so we can overwrite them in tests etc.\n * @hidden\n */\n\n /** The replay has to be manually started, because no sample rate (neither session or error) was provided. */\n\n /**\n * Options to pass to `rrweb.record()`\n */\n\n /**\n * Timestamp of the last user activity. This lives across sessions.\n */\n\n /**\n * Is the integration currently active?\n */\n\n /**\n * Paused is a state where:\n * - DOM Recording is not listening at all\n * - Nothing will be added to event buffer (e.g. core SDK events)\n */\n\n /**\n * Have we attached listeners to the core SDK?\n * Note we have to track this as there is no way to remove instrumentation handlers.\n */\n\n /**\n * Function to stop recording\n */\n\n /**\n * Internal use for canvas recording options\n */\n\n constructor({\n options,\n recordingOptions,\n }\n\n) {ReplayContainer.prototype.__init.call(this);ReplayContainer.prototype.__init2.call(this);ReplayContainer.prototype.__init3.call(this);ReplayContainer.prototype.__init4.call(this);ReplayContainer.prototype.__init5.call(this);ReplayContainer.prototype.__init6.call(this);\n this.eventBuffer = null;\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n this.recordingMode = 'session';\n this.timeouts = {\n sessionIdlePause: SESSION_IDLE_PAUSE_DURATION,\n sessionIdleExpire: SESSION_IDLE_EXPIRE_DURATION,\n } ;\n this._lastActivity = Date.now();\n this._isEnabled = false;\n this._isPaused = false;\n this._requiresManualStart = false;\n this._hasInitializedCoreListeners = false;\n this._context = {\n errorIds: new Set(),\n traceIds: new Set(),\n urls: [],\n initialTimestamp: Date.now(),\n initialUrl: '',\n };\n\n this._recordingOptions = recordingOptions;\n this._options = options;\n\n this._debouncedFlush = debounce(() => this._flush(), this._options.flushMinDelay, {\n maxWait: this._options.flushMaxDelay,\n });\n\n this._throttledAddEvent = throttle(\n (event, isCheckout) => addEvent(this, event, isCheckout),\n // Max 300 events...\n 300,\n // ... per 5s\n 5,\n );\n\n const { slowClickTimeout, slowClickIgnoreSelectors } = this.getOptions();\n\n const slowClickConfig = slowClickTimeout\n ? {\n threshold: Math.min(SLOW_CLICK_THRESHOLD, slowClickTimeout),\n timeout: slowClickTimeout,\n scrollTimeout: SLOW_CLICK_SCROLL_TIMEOUT,\n ignoreSelector: slowClickIgnoreSelectors ? slowClickIgnoreSelectors.join(',') : '',\n }\n : undefined;\n\n if (slowClickConfig) {\n this.clickDetector = new ClickDetector(this, slowClickConfig);\n }\n\n // Configure replay logger w/ experimental options\n if (DEBUG_BUILD) {\n const experiments = options._experiments;\n logger.setConfig({\n captureExceptions: !!experiments.captureExceptions,\n traceInternals: !!experiments.traceInternals,\n });\n }\n }\n\n /** Get the event context. */\n getContext() {\n return this._context;\n }\n\n /** If recording is currently enabled. */\n isEnabled() {\n return this._isEnabled;\n }\n\n /** If recording is currently paused. */\n isPaused() {\n return this._isPaused;\n }\n\n /**\n * Determine if canvas recording is enabled\n */\n isRecordingCanvas() {\n return Boolean(this._canvas);\n }\n\n /** Get the replay integration options. */\n getOptions() {\n return this._options;\n }\n\n /** A wrapper to conditionally capture exceptions. */\n handleException(error) {\n DEBUG_BUILD && logger.exception(error);\n if (this._options.onError) {\n this._options.onError(error);\n }\n }\n\n /**\n * Initializes the plugin based on sampling configuration. Should not be\n * called outside of constructor.\n */\n initializeSampling(previousSessionId) {\n const { errorSampleRate, sessionSampleRate } = this._options;\n\n // If neither sample rate is > 0, then do nothing - user will need to call one of\n // `start()` or `startBuffering` themselves.\n const requiresManualStart = errorSampleRate <= 0 && sessionSampleRate <= 0;\n\n this._requiresManualStart = requiresManualStart;\n\n if (requiresManualStart) {\n return;\n }\n\n // Otherwise if there is _any_ sample rate set, try to load an existing\n // session, or create a new one.\n this._initializeSessionForSampling(previousSessionId);\n\n if (!this.session) {\n // This should not happen, something wrong has occurred\n DEBUG_BUILD && logger.exception(new Error('Unable to initialize and create session'));\n return;\n }\n\n if (this.session.sampled === false) {\n // This should only occur if `errorSampleRate` is 0 and was unsampled for\n // session-based replay. In this case there is nothing to do.\n return;\n }\n\n // If segmentId > 0, it means we've previously already captured this session\n // In this case, we still want to continue in `session` recording mode\n this.recordingMode = this.session.sampled === 'buffer' && this.session.segmentId === 0 ? 'buffer' : 'session';\n\n DEBUG_BUILD && logger.infoTick(`Starting replay in ${this.recordingMode} mode`);\n\n this._initializeRecording();\n }\n\n /**\n * Start a replay regardless of sampling rate. Calling this will always\n * create a new session. Will log a message if replay is already in progress.\n *\n * Creates or loads a session, attaches listeners to varying events (DOM,\n * _performanceObserver, Recording, Sentry SDK, etc)\n */\n start() {\n if (this._isEnabled && this.recordingMode === 'session') {\n DEBUG_BUILD && logger.info('Recording is already in progress');\n return;\n }\n\n if (this._isEnabled && this.recordingMode === 'buffer') {\n DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n return;\n }\n\n DEBUG_BUILD && logger.infoTick('Starting replay in session mode');\n\n // Required as user activity is initially set in\n // constructor, so if `start()` is called after\n // session idle expiration, a replay will not be\n // created due to an idle timeout.\n this._updateUserActivity();\n\n const session = loadOrCreateSession(\n {\n maxReplayDuration: this._options.maxReplayDuration,\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n },\n {\n stickySession: this._options.stickySession,\n // This is intentional: create a new session-based replay when calling `start()`\n sessionSampleRate: 1,\n allowBuffering: false,\n },\n );\n\n this.session = session;\n\n this._initializeRecording();\n }\n\n /**\n * Start replay buffering. Buffers until `flush()` is called or, if\n * `replaysOnErrorSampleRate` > 0, an error occurs.\n */\n startBuffering() {\n if (this._isEnabled) {\n DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n return;\n }\n\n DEBUG_BUILD && logger.infoTick('Starting replay in buffer mode');\n\n const session = loadOrCreateSession(\n {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n },\n {\n stickySession: this._options.stickySession,\n sessionSampleRate: 0,\n allowBuffering: true,\n },\n );\n\n this.session = session;\n\n this.recordingMode = 'buffer';\n this._initializeRecording();\n }\n\n /**\n * Start recording.\n *\n * Note that this will cause a new DOM checkout\n */\n startRecording() {\n try {\n const canvasOptions = this._canvas;\n\n this._stopRecording = record({\n ...this._recordingOptions,\n // When running in error sampling mode, we need to overwrite `checkoutEveryNms`\n // Without this, it would record forever, until an error happens, which we don't want\n // instead, we'll always keep the last 60 seconds of replay before an error happened\n ...(this.recordingMode === 'buffer'\n ? { checkoutEveryNms: BUFFER_CHECKOUT_TIME }\n : // Otherwise, use experimental option w/ min checkout time of 6 minutes\n // This is to improve playback seeking as there could potentially be\n // less mutations to process in the worse cases.\n //\n // checkout by \"N\" events is probably ideal, but means we have less\n // control about the number of checkouts we make (which generally\n // increases replay size)\n this._options._experiments.continuousCheckout && {\n // Minimum checkout time is 6 minutes\n checkoutEveryNms: Math.max(360000, this._options._experiments.continuousCheckout),\n }),\n emit: getHandleRecordingEmit(this),\n onMutation: this._onMutationHandler,\n ...(canvasOptions\n ? {\n recordCanvas: canvasOptions.recordCanvas,\n getCanvasManager: canvasOptions.getCanvasManager,\n sampling: canvasOptions.sampling,\n dataURLOptions: canvasOptions.dataURLOptions,\n }\n : {}),\n });\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Stops the recording, if it was running.\n *\n * Returns true if it was previously stopped, or is now stopped,\n * otherwise false.\n */\n stopRecording() {\n try {\n if (this._stopRecording) {\n this._stopRecording();\n this._stopRecording = undefined;\n }\n\n return true;\n } catch (err) {\n this.handleException(err);\n return false;\n }\n }\n\n /**\n * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n * does not support a teardown\n */\n async stop({ forceFlush = false, reason } = {}) {\n if (!this._isEnabled) {\n return;\n }\n\n // We can't move `_isEnabled` after awaiting a flush, otherwise we can\n // enter into an infinite loop when `stop()` is called while flushing.\n this._isEnabled = false;\n\n try {\n DEBUG_BUILD && logger.info(`Stopping Replay${reason ? ` triggered by ${reason}` : ''}`);\n\n resetReplayIdOnDynamicSamplingContext();\n\n this._removeListeners();\n this.stopRecording();\n\n this._debouncedFlush.cancel();\n // See comment above re: `_isEnabled`, we \"force\" a flush, ignoring the\n // `_isEnabled` state of the plugin since it was disabled above.\n if (forceFlush) {\n await this._flush({ force: true });\n }\n\n // After flush, destroy event buffer\n this.eventBuffer && this.eventBuffer.destroy();\n this.eventBuffer = null;\n\n // Clear session from session storage, note this means if a new session\n // is started after, it will not have `previousSessionId`\n clearSession(this);\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Pause some replay functionality. See comments for `_isPaused`.\n * This differs from stop as this only stops DOM recording, it is\n * not as thorough of a shutdown as `stop()`.\n */\n pause() {\n if (this._isPaused) {\n return;\n }\n\n this._isPaused = true;\n this.stopRecording();\n\n DEBUG_BUILD && logger.info('Pausing replay');\n }\n\n /**\n * Resumes recording, see notes for `pause().\n *\n * Note that calling `startRecording()` here will cause a\n * new DOM checkout.`\n */\n resume() {\n if (!this._isPaused || !this._checkSession()) {\n return;\n }\n\n this._isPaused = false;\n this.startRecording();\n\n DEBUG_BUILD && logger.info('Resuming replay');\n }\n\n /**\n * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n * Unless `continueRecording` is false, the replay will continue to record and\n * behave as a \"session\"-based replay.\n *\n * Otherwise, queue up a flush.\n */\n async sendBufferedReplayOrFlush({ continueRecording = true } = {}) {\n if (this.recordingMode === 'session') {\n return this.flushImmediate();\n }\n\n const activityTime = Date.now();\n\n DEBUG_BUILD && logger.info('Converting buffer to session');\n\n // Allow flush to complete before resuming as a session recording, otherwise\n // the checkout from `startRecording` may be included in the payload.\n // Prefer to keep the error replay as a separate (and smaller) segment\n // than the session replay.\n await this.flushImmediate();\n\n const hasStoppedRecording = this.stopRecording();\n\n if (!continueRecording || !hasStoppedRecording) {\n return;\n }\n\n // To avoid race conditions where this is called multiple times, we check here again that we are still buffering\n if ((this.recordingMode ) === 'session') {\n return;\n }\n\n // Re-start recording in session-mode\n this.recordingMode = 'session';\n\n // Once this session ends, we do not want to refresh it\n if (this.session) {\n this._updateUserActivity(activityTime);\n this._updateSessionActivity(activityTime);\n this._maybeSaveSession();\n }\n\n this.startRecording();\n }\n\n /**\n * We want to batch uploads of replay events. Save events only if\n * `` milliseconds have elapsed since the last event\n * *OR* if `` milliseconds have elapsed.\n *\n * Accepts a callback to perform side-effects and returns true to stop batch\n * processing and hand back control to caller.\n */\n addUpdate(cb) {\n // We need to always run `cb` (e.g. in the case of `this.recordingMode == 'buffer'`)\n const cbResult = cb();\n\n // If this option is turned on then we will only want to call `flush`\n // explicitly\n if (this.recordingMode === 'buffer') {\n return;\n }\n\n // If callback is true, we do not want to continue with flushing -- the\n // caller will need to handle it.\n if (cbResult === true) {\n return;\n }\n\n // addUpdate is called quite frequently - use _debouncedFlush so that it\n // respects the flush delays and does not flush immediately\n this._debouncedFlush();\n }\n\n /**\n * Updates the user activity timestamp and resumes recording. This should be\n * called in an event handler for a user action that we consider as the user\n * being \"active\" (e.g. a mouse click).\n */\n triggerUserActivity() {\n this._updateUserActivity();\n\n // This case means that recording was once stopped due to inactivity.\n // Ensure that recording is resumed.\n if (!this._stopRecording) {\n // Create a new session, otherwise when the user action is flushed, it\n // will get rejected due to an expired session.\n if (!this._checkSession()) {\n return;\n }\n\n // Note: This will cause a new DOM checkout\n this.resume();\n return;\n }\n\n // Otherwise... recording was never suspended, continue as normalish\n this.checkAndHandleExpiredSession();\n\n this._updateSessionActivity();\n }\n\n /**\n * Updates the user activity timestamp *without* resuming\n * recording. Some user events (e.g. keydown) can be create\n * low-value replays that only contain the keypress as a\n * breadcrumb. Instead this would require other events to\n * create a new replay after a session has expired.\n */\n updateUserActivity() {\n this._updateUserActivity();\n this._updateSessionActivity();\n }\n\n /**\n * Only flush if `this.recordingMode === 'session'`\n */\n conditionalFlush() {\n if (this.recordingMode === 'buffer') {\n return Promise.resolve();\n }\n\n return this.flushImmediate();\n }\n\n /**\n * Flush using debounce flush\n */\n flush() {\n return this._debouncedFlush() ;\n }\n\n /**\n * Always flush via `_debouncedFlush` so that we do not have flushes triggered\n * from calling both `flush` and `_debouncedFlush`. Otherwise, there could be\n * cases of multiple flushes happening closely together.\n */\n flushImmediate() {\n this._debouncedFlush();\n // `.flush` is provided by the debounced function, analogously to lodash.debounce\n return this._debouncedFlush.flush() ;\n }\n\n /**\n * Cancels queued up flushes.\n */\n cancelFlush() {\n this._debouncedFlush.cancel();\n }\n\n /** Get the current session (=replay) ID */\n getSessionId() {\n return this.session && this.session.id;\n }\n\n /**\n * Checks if recording should be stopped due to user inactivity. Otherwise\n * check if session is expired and create a new session if so. Triggers a new\n * full snapshot on new session.\n *\n * Returns true if session is not expired, false otherwise.\n * @hidden\n */\n checkAndHandleExpiredSession() {\n // Prevent starting a new session if the last user activity is older than\n // SESSION_IDLE_PAUSE_DURATION. Otherwise non-user activity can trigger a new\n // session+recording. This creates noisy replays that do not have much\n // content in them.\n if (\n this._lastActivity &&\n isExpired(this._lastActivity, this.timeouts.sessionIdlePause) &&\n this.session &&\n this.session.sampled === 'session'\n ) {\n // Pause recording only for session-based replays. Otherwise, resuming\n // will create a new replay and will conflict with users who only choose\n // to record error-based replays only. (e.g. the resumed replay will not\n // contain a reference to an error)\n this.pause();\n return;\n }\n\n // --- There is recent user activity --- //\n // This will create a new session if expired, based on expiry length\n if (!this._checkSession()) {\n // Check session handles the refreshing itself\n return false;\n }\n\n return true;\n }\n\n /**\n * Capture some initial state that can change throughout the lifespan of the\n * replay. This is required because otherwise they would be captured at the\n * first flush.\n */\n setInitialState() {\n const urlPath = `${WINDOW.location.pathname}${WINDOW.location.hash}${WINDOW.location.search}`;\n const url = `${WINDOW.location.origin}${urlPath}`;\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n // Reset _context as well\n this._clearContext();\n\n this._context.initialUrl = url;\n this._context.initialTimestamp = Date.now();\n this._context.urls.push(url);\n }\n\n /**\n * Add a breadcrumb event, that may be throttled.\n * If it was throttled, we add a custom breadcrumb to indicate that.\n */\n throttledAddEvent(\n event,\n isCheckout,\n ) {\n const res = this._throttledAddEvent(event, isCheckout);\n\n // If this is THROTTLED, it means we have throttled the event for the first time\n // In this case, we want to add a breadcrumb indicating that something was skipped\n if (res === THROTTLED) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.throttled',\n });\n\n this.addUpdate(() => {\n // Return `false` if the event _was_ added, as that means we schedule a flush\n return !addEventSync(this, {\n type: ReplayEventTypeCustom,\n timestamp: breadcrumb.timestamp || 0,\n data: {\n tag: 'breadcrumb',\n payload: breadcrumb,\n metric: true,\n },\n });\n });\n }\n\n return res;\n }\n\n /**\n * This will get the parametrized route name of the current page.\n * This is only available if performance is enabled, and if an instrumented router is used.\n */\n getCurrentRoute() {\n const lastActiveSpan = this.lastActiveSpan || getActiveSpan();\n const lastRootSpan = lastActiveSpan && getRootSpan(lastActiveSpan);\n\n const attributes = (lastRootSpan && spanToJSON(lastRootSpan).data) || {};\n const source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (!lastRootSpan || !source || !['route', 'custom'].includes(source)) {\n return undefined;\n }\n\n return spanToJSON(lastRootSpan).description;\n }\n\n /**\n * Initialize and start all listeners to varying events (DOM,\n * Performance Observer, Recording, Sentry SDK, etc)\n */\n _initializeRecording() {\n this.setInitialState();\n\n // this method is generally called on page load or manually - in both cases\n // we should treat it as an activity\n this._updateSessionActivity();\n\n this.eventBuffer = createEventBuffer({\n useCompression: this._options.useCompression,\n workerUrl: this._options.workerUrl,\n });\n\n this._removeListeners();\n this._addListeners();\n\n // Need to set as enabled before we start recording, as `record()` can trigger a flush with a new checkout\n this._isEnabled = true;\n this._isPaused = false;\n\n this.startRecording();\n }\n\n /**\n * Loads (or refreshes) the current session.\n */\n _initializeSessionForSampling(previousSessionId) {\n // Whenever there is _any_ error sample rate, we always allow buffering\n // Because we decide on sampling when an error occurs, we need to buffer at all times if sampling for errors\n const allowBuffering = this._options.errorSampleRate > 0;\n\n const session = loadOrCreateSession(\n {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n previousSessionId,\n },\n {\n stickySession: this._options.stickySession,\n sessionSampleRate: this._options.sessionSampleRate,\n allowBuffering,\n },\n );\n\n this.session = session;\n }\n\n /**\n * Checks and potentially refreshes the current session.\n * Returns false if session is not recorded.\n */\n _checkSession() {\n // If there is no session yet, we do not want to refresh anything\n // This should generally not happen, but to be safe....\n if (!this.session) {\n return false;\n }\n\n const currentSession = this.session;\n\n if (\n shouldRefreshSession(currentSession, {\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n maxReplayDuration: this._options.maxReplayDuration,\n })\n ) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._refreshSession(currentSession);\n return false;\n }\n\n return true;\n }\n\n /**\n * Refresh a session with a new one.\n * This stops the current session (without forcing a flush, as that would never work since we are expired),\n * and then does a new sampling based on the refreshed session.\n */\n async _refreshSession(session) {\n if (!this._isEnabled) {\n return;\n }\n await this.stop({ reason: 'refresh session' });\n this.initializeSampling(session.id);\n }\n\n /**\n * Adds listeners to record events for the replay\n */\n _addListeners() {\n try {\n WINDOW.document.addEventListener('visibilitychange', this._handleVisibilityChange);\n WINDOW.addEventListener('blur', this._handleWindowBlur);\n WINDOW.addEventListener('focus', this._handleWindowFocus);\n WINDOW.addEventListener('keydown', this._handleKeyboardEvent);\n\n if (this.clickDetector) {\n this.clickDetector.addListeners();\n }\n\n // There is no way to remove these listeners, so ensure they are only added once\n if (!this._hasInitializedCoreListeners) {\n addGlobalListeners(this);\n\n this._hasInitializedCoreListeners = true;\n }\n } catch (err) {\n this.handleException(err);\n }\n\n this._performanceCleanupCallback = setupPerformanceObserver(this);\n }\n\n /**\n * Cleans up listeners that were created in `_addListeners`\n */\n _removeListeners() {\n try {\n WINDOW.document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n\n WINDOW.removeEventListener('blur', this._handleWindowBlur);\n WINDOW.removeEventListener('focus', this._handleWindowFocus);\n WINDOW.removeEventListener('keydown', this._handleKeyboardEvent);\n\n if (this.clickDetector) {\n this.clickDetector.removeListeners();\n }\n\n if (this._performanceCleanupCallback) {\n this._performanceCleanupCallback();\n }\n } catch (err) {\n this.handleException(err);\n }\n }\n\n /**\n * Handle when visibility of the page content changes. Opening a new tab will\n * cause the state to change to hidden because of content of current page will\n * be hidden. Likewise, moving a different window to cover the contents of the\n * page will also trigger a change to a hidden state.\n */\n __init() {this._handleVisibilityChange = () => {\n if (WINDOW.document.visibilityState === 'visible') {\n this._doChangeToForegroundTasks();\n } else {\n this._doChangeToBackgroundTasks();\n }\n };}\n\n /**\n * Handle when page is blurred\n */\n __init2() {this._handleWindowBlur = () => {\n const breadcrumb = createBreadcrumb({\n category: 'ui.blur',\n });\n\n // Do not count blur as a user action -- it's part of the process of them\n // leaving the page\n this._doChangeToBackgroundTasks(breadcrumb);\n };}\n\n /**\n * Handle when page is focused\n */\n __init3() {this._handleWindowFocus = () => {\n const breadcrumb = createBreadcrumb({\n category: 'ui.focus',\n });\n\n // Do not count focus as a user action -- instead wait until they focus and\n // interactive with page\n this._doChangeToForegroundTasks(breadcrumb);\n };}\n\n /** Ensure page remains active when a key is pressed. */\n __init4() {this._handleKeyboardEvent = (event) => {\n handleKeyboardEvent(this, event);\n };}\n\n /**\n * Tasks to run when we consider a page to be hidden (via blurring and/or visibility)\n */\n _doChangeToBackgroundTasks(breadcrumb) {\n if (!this.session) {\n return;\n }\n\n const expired = isSessionExpired(this.session, {\n maxReplayDuration: this._options.maxReplayDuration,\n sessionIdleExpire: this.timeouts.sessionIdleExpire,\n });\n\n if (expired) {\n return;\n }\n\n if (breadcrumb) {\n this._createCustomBreadcrumb(breadcrumb);\n }\n\n // Send replay when the page/tab becomes hidden. There is no reason to send\n // replay if it becomes visible, since no actions we care about were done\n // while it was hidden\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n void this.conditionalFlush();\n }\n\n /**\n * Tasks to run when we consider a page to be visible (via focus and/or visibility)\n */\n _doChangeToForegroundTasks(breadcrumb) {\n if (!this.session) {\n return;\n }\n\n const isSessionActive = this.checkAndHandleExpiredSession();\n\n if (!isSessionActive) {\n // If the user has come back to the page within SESSION_IDLE_PAUSE_DURATION\n // ms, we will re-use the existing session, otherwise create a new\n // session\n DEBUG_BUILD && logger.info('Document has become active, but session has expired');\n return;\n }\n\n if (breadcrumb) {\n this._createCustomBreadcrumb(breadcrumb);\n }\n }\n\n /**\n * Update user activity (across session lifespans)\n */\n _updateUserActivity(_lastActivity = Date.now()) {\n this._lastActivity = _lastActivity;\n }\n\n /**\n * Updates the session's last activity timestamp\n */\n _updateSessionActivity(_lastActivity = Date.now()) {\n if (this.session) {\n this.session.lastActivity = _lastActivity;\n this._maybeSaveSession();\n }\n }\n\n /**\n * Helper to create (and buffer) a replay breadcrumb from a core SDK breadcrumb\n */\n _createCustomBreadcrumb(breadcrumb) {\n this.addUpdate(() => {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.throttledAddEvent({\n type: EventType.Custom,\n timestamp: breadcrumb.timestamp || 0,\n data: {\n tag: 'breadcrumb',\n payload: breadcrumb,\n },\n });\n });\n }\n\n /**\n * Observed performance events are added to `this.performanceEntries`. These\n * are included in the replay event before it is finished and sent to Sentry.\n */\n _addPerformanceEntries() {\n let performanceEntries = createPerformanceEntries(this.performanceEntries).concat(this.replayPerformanceEntries);\n\n this.performanceEntries = [];\n this.replayPerformanceEntries = [];\n\n // If we are manually starting, we want to ensure we only include performance entries\n // that are after the initial timestamp\n // The reason for this is that we may have performance entries from the page load, but may decide to start\n // the replay later on, in which case we do not want to include these entries.\n // without this, manually started replays can have events long before the actual replay recording starts,\n // which messes with the timeline etc.\n if (this._requiresManualStart) {\n const initialTimestampInSeconds = this._context.initialTimestamp / 1000;\n performanceEntries = performanceEntries.filter(entry => entry.start >= initialTimestampInSeconds);\n }\n\n return Promise.all(createPerformanceSpans(this, performanceEntries));\n }\n\n /**\n * Clear _context\n */\n _clearContext() {\n // XXX: `initialTimestamp` and `initialUrl` do not get cleared\n this._context.errorIds.clear();\n this._context.traceIds.clear();\n this._context.urls = [];\n }\n\n /** Update the initial timestamp based on the buffer content. */\n _updateInitialTimestampFromEventBuffer() {\n const { session, eventBuffer } = this;\n // If replay was started manually (=no sample rate was given),\n // We do not want to back-port the initial timestamp\n if (!session || !eventBuffer || this._requiresManualStart) {\n return;\n }\n\n // we only ever update this on the initial segment\n if (session.segmentId) {\n return;\n }\n\n const earliestEvent = eventBuffer.getEarliestTimestamp();\n if (earliestEvent && earliestEvent < this._context.initialTimestamp) {\n this._context.initialTimestamp = earliestEvent;\n }\n }\n\n /**\n * Return and clear _context\n */\n _popEventContext() {\n const _context = {\n initialTimestamp: this._context.initialTimestamp,\n initialUrl: this._context.initialUrl,\n errorIds: Array.from(this._context.errorIds),\n traceIds: Array.from(this._context.traceIds),\n urls: this._context.urls,\n };\n\n this._clearContext();\n\n return _context;\n }\n\n /**\n * Flushes replay event buffer to Sentry.\n *\n * Performance events are only added right before flushing - this is\n * due to the buffered performance observer events.\n *\n * Should never be called directly, only by `flush`\n */\n async _runFlush() {\n const replayId = this.getSessionId();\n\n if (!this.session || !this.eventBuffer || !replayId) {\n DEBUG_BUILD && logger.error('No session or eventBuffer found to flush.');\n return;\n }\n\n await this._addPerformanceEntries();\n\n // Check eventBuffer again, as it could have been stopped in the meanwhile\n if (!this.eventBuffer || !this.eventBuffer.hasEvents) {\n return;\n }\n\n // Only attach memory event if eventBuffer is not empty\n await addMemoryEntry(this);\n\n // Check eventBuffer again, as it could have been stopped in the meanwhile\n if (!this.eventBuffer) {\n return;\n }\n\n // if this changed in the meanwhile, e.g. because the session was refreshed or similar, we abort here\n if (replayId !== this.getSessionId()) {\n return;\n }\n\n try {\n // This uses the data from the eventBuffer, so we need to call this before `finish()\n this._updateInitialTimestampFromEventBuffer();\n\n const timestamp = Date.now();\n\n // Check total duration again, to avoid sending outdated stuff\n // We leave 30s wiggle room to accommodate late flushing etc.\n // This _could_ happen when the browser is suspended during flushing, in which case we just want to stop\n if (timestamp - this._context.initialTimestamp > this._options.maxReplayDuration + 30000) {\n throw new Error('Session is too long, not sending replay');\n }\n\n const eventContext = this._popEventContext();\n // Always increment segmentId regardless of outcome of sending replay\n const segmentId = this.session.segmentId++;\n this._maybeSaveSession();\n\n // Note this empties the event buffer regardless of outcome of sending replay\n const recordingData = await this.eventBuffer.finish();\n\n await sendReplay({\n replayId,\n recordingData,\n segmentId,\n eventContext,\n session: this.session,\n timestamp,\n onError: err => this.handleException(err),\n });\n } catch (err) {\n this.handleException(err);\n\n // This means we retried 3 times and all of them failed,\n // or we ran into a problem we don't want to retry, like rate limiting.\n // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stop({ reason: 'sendReplay' });\n\n const client = getClient();\n\n if (client) {\n const dropReason = err instanceof RateLimitError ? 'ratelimit_backoff' : 'send_error';\n client.recordDroppedEvent(dropReason, 'replay');\n }\n }\n }\n\n /**\n * Flush recording data to Sentry. Creates a lock so that only a single flush\n * can be active at a time. Do not call this directly.\n */\n __init5() {this._flush = async ({\n force = false,\n }\n\n = {}) => {\n if (!this._isEnabled && !force) {\n // This can happen if e.g. the replay was stopped because of exceeding the retry limit\n return;\n }\n\n if (!this.checkAndHandleExpiredSession()) {\n DEBUG_BUILD && logger.error('Attempting to finish replay event after session expired.');\n return;\n }\n\n if (!this.session) {\n // should never happen, as we would have bailed out before\n return;\n }\n\n const start = this.session.started;\n const now = Date.now();\n const duration = now - start;\n\n // A flush is about to happen, cancel any queued flushes\n this._debouncedFlush.cancel();\n\n // If session is too short, or too long (allow some wiggle room over maxReplayDuration), do not send it\n // This _should_ not happen, but it may happen if flush is triggered due to a page activity change or similar\n const tooShort = duration < this._options.minReplayDuration;\n const tooLong = duration > this._options.maxReplayDuration + 5000;\n if (tooShort || tooLong) {\n DEBUG_BUILD &&\n logger.info(\n `Session duration (${Math.floor(duration / 1000)}s) is too ${\n tooShort ? 'short' : 'long'\n }, not sending replay.`,\n );\n\n if (tooShort) {\n this._debouncedFlush();\n }\n return;\n }\n\n const eventBuffer = this.eventBuffer;\n if (eventBuffer && this.session.segmentId === 0 && !eventBuffer.hasCheckout) {\n DEBUG_BUILD && logger.info('Flushing initial segment without checkout.');\n // TODO FN: Evaluate if we want to stop here, or remove this again?\n }\n\n const _flushInProgress = !!this._flushLock;\n\n // this._flushLock acts as a lock so that future calls to `_flush()` will\n // be blocked until current flush is finished (i.e. this promise resolves)\n if (!this._flushLock) {\n this._flushLock = this._runFlush();\n }\n\n try {\n await this._flushLock;\n } catch (err) {\n this.handleException(err);\n } finally {\n this._flushLock = undefined;\n\n if (_flushInProgress) {\n // Wait for previous flush to finish, then call the debounced\n // `_flush()`. It's possible there are other flush requests queued and\n // waiting for it to resolve. We want to reduce all outstanding\n // requests (as well as any new flush requests that occur within a\n // second of the locked flush completing) into a single flush.\n this._debouncedFlush();\n }\n }\n };}\n\n /** Save the session, if it is sticky */\n _maybeSaveSession() {\n if (this.session && this._options.stickySession) {\n saveSession(this.session);\n }\n }\n\n /** Handler for rrweb.record.onMutation */\n __init6() {this._onMutationHandler = (mutations) => {\n const count = mutations.length;\n\n const mutationLimit = this._options.mutationLimit;\n const mutationBreadcrumbLimit = this._options.mutationBreadcrumbLimit;\n const overMutationLimit = mutationLimit && count > mutationLimit;\n\n // Create a breadcrumb if a lot of mutations happen at the same time\n // We can show this in the UI as an information with potential performance improvements\n if (count > mutationBreadcrumbLimit || overMutationLimit) {\n const breadcrumb = createBreadcrumb({\n category: 'replay.mutations',\n data: {\n count,\n limit: overMutationLimit,\n },\n });\n this._createCustomBreadcrumb(breadcrumb);\n }\n\n // Stop replay if over the mutation limit\n if (overMutationLimit) {\n // This should never reject\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.stop({ reason: 'mutationLimit', forceFlush: this.recordingMode === 'session' });\n return false;\n }\n\n // `true` means we use the regular mutation handling by rrweb\n return true;\n };}\n}\n\nfunction getOption(selectors, defaultSelectors) {\n return [\n ...selectors,\n // sentry defaults\n ...defaultSelectors,\n ].join(',');\n}\n\n/**\n * Returns privacy related configuration for use in rrweb\n */\nfunction getPrivacyOptions({ mask, unmask, block, unblock, ignore }) {\n const defaultBlockedElements = ['base[href=\"/\"]'];\n\n const maskSelector = getOption(mask, ['.sentry-mask', '[data-sentry-mask]']);\n const unmaskSelector = getOption(unmask, []);\n\n const options = {\n // We are making the decision to make text and input selectors the same\n maskTextSelector: maskSelector,\n unmaskTextSelector: unmaskSelector,\n\n blockSelector: getOption(block, ['.sentry-block', '[data-sentry-block]', ...defaultBlockedElements]),\n unblockSelector: getOption(unblock, []),\n ignoreSelector: getOption(ignore, ['.sentry-ignore', '[data-sentry-ignore]', 'input[type=\"file\"]']),\n };\n\n return options;\n}\n\n/**\n * Masks an attribute if necessary, otherwise return attribute value as-is.\n */\nfunction maskAttribute({\n el,\n key,\n maskAttributes,\n maskAllText,\n privacyOptions,\n value,\n}) {\n // We only mask attributes if `maskAllText` is true\n if (!maskAllText) {\n return value;\n }\n\n // unmaskTextSelector takes precedence\n if (privacyOptions.unmaskTextSelector && el.matches(privacyOptions.unmaskTextSelector)) {\n return value;\n }\n\n if (\n maskAttributes.includes(key) ||\n // Need to mask `value` attribute for `` if it's a button-like\n // type\n (key === 'value' && el.tagName === 'INPUT' && ['submit', 'button'].includes(el.getAttribute('type') || ''))\n ) {\n return value.replace(/[\\S]/g, '*');\n }\n\n return value;\n}\n\nconst MEDIA_SELECTORS =\n 'img,image,svg,video,object,picture,embed,map,audio,link[rel=\"icon\"],link[rel=\"apple-touch-icon\"]';\n\nconst DEFAULT_NETWORK_HEADERS = ['content-length', 'content-type', 'accept'];\n\nlet _initialized = false;\n\n/**\n * Sentry integration for [Session Replay](https://sentry.io/for/session-replay/).\n *\n * See the [Replay documentation](https://docs.sentry.io/platforms/javascript/guides/session-replay/) for more information.\n *\n * @example\n *\n * ```\n * Sentry.init({\n * dsn: '__DSN__',\n * integrations: [Sentry.replayIntegration()],\n * });\n * ```\n */\nconst replayIntegration = ((options) => {\n return new Replay(options);\n}) ;\n\n/**\n * Replay integration\n *\n * TODO: Rewrite this to be functional integration\n * Exported for tests.\n */\nclass Replay {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'Replay';}\n\n /**\n * @inheritDoc\n */\n\n /**\n * Options to pass to `rrweb.record()`\n */\n\n /**\n * Initial options passed to the replay integration, merged with default values.\n * Note: `sessionSampleRate` and `errorSampleRate` are not required here, as they\n * can only be finally set when setupOnce() is called.\n *\n * @private\n */\n\n constructor({\n flushMinDelay = DEFAULT_FLUSH_MIN_DELAY,\n flushMaxDelay = DEFAULT_FLUSH_MAX_DELAY,\n minReplayDuration = MIN_REPLAY_DURATION,\n maxReplayDuration = MAX_REPLAY_DURATION,\n stickySession = true,\n useCompression = true,\n workerUrl,\n _experiments = {},\n maskAllText = true,\n maskAllInputs = true,\n blockAllMedia = true,\n\n mutationBreadcrumbLimit = 750,\n mutationLimit = 10000,\n\n slowClickTimeout = 7000,\n slowClickIgnoreSelectors = [],\n\n networkDetailAllowUrls = [],\n networkDetailDenyUrls = [],\n networkCaptureBodies = true,\n networkRequestHeaders = [],\n networkResponseHeaders = [],\n\n mask = [],\n maskAttributes = ['title', 'placeholder'],\n unmask = [],\n block = [],\n unblock = [],\n ignore = [],\n maskFn,\n\n beforeAddRecordingEvent,\n beforeErrorSampling,\n onError,\n } = {}) {\n this.name = Replay.id;\n\n const privacyOptions = getPrivacyOptions({\n mask,\n unmask,\n block,\n unblock,\n ignore,\n });\n\n this._recordingOptions = {\n maskAllInputs,\n maskAllText,\n maskInputOptions: { password: true },\n maskTextFn: maskFn,\n maskInputFn: maskFn,\n maskAttributeFn: (key, value, el) =>\n maskAttribute({\n maskAttributes,\n maskAllText,\n privacyOptions,\n key,\n value,\n el,\n }),\n\n ...privacyOptions,\n\n // Our defaults\n slimDOMOptions: 'all',\n inlineStylesheet: true,\n // Disable inline images as it will increase segment/replay size\n inlineImages: false,\n // collect fonts, but be aware that `sentry.io` needs to be an allowed\n // origin for playback\n collectFonts: true,\n errorHandler: (err) => {\n try {\n err.__rrweb__ = true;\n } catch (error) {\n // ignore errors here\n // this can happen if the error is frozen or does not allow mutation for other reasons\n }\n },\n };\n\n this._initialOptions = {\n flushMinDelay,\n flushMaxDelay,\n minReplayDuration: Math.min(minReplayDuration, MIN_REPLAY_DURATION_LIMIT),\n maxReplayDuration: Math.min(maxReplayDuration, MAX_REPLAY_DURATION),\n stickySession,\n useCompression,\n workerUrl,\n blockAllMedia,\n maskAllInputs,\n maskAllText,\n mutationBreadcrumbLimit,\n mutationLimit,\n slowClickTimeout,\n slowClickIgnoreSelectors,\n networkDetailAllowUrls,\n networkDetailDenyUrls,\n networkCaptureBodies,\n networkRequestHeaders: _getMergedNetworkHeaders(networkRequestHeaders),\n networkResponseHeaders: _getMergedNetworkHeaders(networkResponseHeaders),\n beforeAddRecordingEvent,\n beforeErrorSampling,\n onError,\n\n _experiments,\n };\n\n if (this._initialOptions.blockAllMedia) {\n // `blockAllMedia` is a more user friendly option to configure blocking\n // embedded media elements\n this._recordingOptions.blockSelector = !this._recordingOptions.blockSelector\n ? MEDIA_SELECTORS\n : `${this._recordingOptions.blockSelector},${MEDIA_SELECTORS}`;\n }\n\n if (this._isInitialized && isBrowser()) {\n throw new Error('Multiple Sentry Session Replay instances are not supported');\n }\n\n this._isInitialized = true;\n }\n\n /** If replay has already been initialized */\n get _isInitialized() {\n return _initialized;\n }\n\n /** Update _isInitialized */\n set _isInitialized(value) {\n _initialized = value;\n }\n\n /**\n * Setup and initialize replay container\n */\n afterAllSetup(client) {\n if (!isBrowser() || this._replay) {\n return;\n }\n\n this._setup(client);\n this._initialize(client);\n }\n\n /**\n * Start a replay regardless of sampling rate. Calling this will always\n * create a new session. Will log a message if replay is already in progress.\n *\n * Creates or loads a session, attaches listeners to varying events (DOM,\n * PerformanceObserver, Recording, Sentry SDK, etc)\n */\n start() {\n if (!this._replay) {\n return;\n }\n this._replay.start();\n }\n\n /**\n * Start replay buffering. Buffers until `flush()` is called or, if\n * `replaysOnErrorSampleRate` > 0, until an error occurs.\n */\n startBuffering() {\n if (!this._replay) {\n return;\n }\n\n this._replay.startBuffering();\n }\n\n /**\n * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n * does not support a teardown\n */\n stop() {\n if (!this._replay) {\n return Promise.resolve();\n }\n\n return this._replay.stop({ forceFlush: this._replay.recordingMode === 'session' });\n }\n\n /**\n * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n * If replay is not enabled, a new session replay is started.\n * Unless `continueRecording` is false, the replay will continue to record and\n * behave as a \"session\"-based replay.\n *\n * Otherwise, queue up a flush.\n */\n flush(options) {\n if (!this._replay) {\n return Promise.resolve();\n }\n\n // assuming a session should be recorded in this case\n if (!this._replay.isEnabled()) {\n this._replay.start();\n return Promise.resolve();\n }\n\n return this._replay.sendBufferedReplayOrFlush(options);\n }\n\n /**\n * Get the current session ID.\n */\n getReplayId() {\n if (!this._replay || !this._replay.isEnabled()) {\n return;\n }\n\n return this._replay.getSessionId();\n }\n\n /**\n * Get the current recording mode. This can be either `session` or `buffer`.\n *\n * `session`: Recording the whole session, sending it continuously\n * `buffer`: Always keeping the last 60s of recording, requires:\n * - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs\n * - or calling `flush()` to send the replay\n */\n getRecordingMode() {\n if (!this._replay || !this._replay.isEnabled()) {\n return;\n }\n\n return this._replay.recordingMode;\n }\n\n /**\n * Initializes replay.\n */\n _initialize(client) {\n if (!this._replay) {\n return;\n }\n\n this._maybeLoadFromReplayCanvasIntegration(client);\n this._replay.initializeSampling();\n }\n\n /** Setup the integration. */\n _setup(client) {\n // Client is not available in constructor, so we need to wait until setupOnce\n const finalOptions = loadReplayOptionsFromClient(this._initialOptions, client);\n\n this._replay = new ReplayContainer({\n options: finalOptions,\n recordingOptions: this._recordingOptions,\n });\n }\n\n /** Get canvas options from ReplayCanvas integration, if it is also added. */\n _maybeLoadFromReplayCanvasIntegration(client) {\n // To save bundle size, we skip checking for stuff here\n // and instead just try-catch everything - as generally this should all be defined\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n try {\n const canvasIntegration = client.getIntegrationByName('ReplayCanvas')\n\n;\n if (!canvasIntegration) {\n return;\n }\n\n this._replay['_canvas'] = canvasIntegration.getOptions();\n } catch (e) {\n // ignore errors here\n }\n /* eslint-enable @typescript-eslint/no-non-null-assertion */\n }\n}Replay.__initStatic();\n\n/** Parse Replay-related options from SDK options */\nfunction loadReplayOptionsFromClient(initialOptions, client) {\n const opt = client.getOptions() ;\n\n const finalOptions = {\n sessionSampleRate: 0,\n errorSampleRate: 0,\n ...dropUndefinedKeys(initialOptions),\n };\n\n const replaysSessionSampleRate = parseSampleRate(opt.replaysSessionSampleRate);\n const replaysOnErrorSampleRate = parseSampleRate(opt.replaysOnErrorSampleRate);\n\n if (replaysSessionSampleRate == null && replaysOnErrorSampleRate == null) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n 'Replay is disabled because neither `replaysSessionSampleRate` nor `replaysOnErrorSampleRate` are set.',\n );\n });\n }\n\n if (replaysSessionSampleRate != null) {\n finalOptions.sessionSampleRate = replaysSessionSampleRate;\n }\n\n if (replaysOnErrorSampleRate != null) {\n finalOptions.errorSampleRate = replaysOnErrorSampleRate;\n }\n\n return finalOptions;\n}\n\nfunction _getMergedNetworkHeaders(headers) {\n return [...DEFAULT_NETWORK_HEADERS, ...headers.map(header => header.toLowerCase())];\n}\n\n/**\n * This is a small utility to get a type-safe instance of the Replay integration.\n */\nfunction getReplay() {\n const client = getClient();\n return client && client.getIntegrationByName('Replay');\n}\n\nexport { getReplay, replayIntegration };\n//# sourceMappingURL=index.js.map\n","import { propagationContextFromHeaders, generatePropagationContext, logger } from '@sentry/utils';\nimport { getMainCarrier } from '../carrier.js';\nimport { withScope, getCurrentScope, getIsolationScope, getClient } from '../currentScopes.js';\nimport { getAsyncContextStrategy } from '../asyncContext/index.js';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE } from '../semanticAttributes.js';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors.js';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled.js';\nimport { _setSpanForScope, _getSpanForScope } from '../utils/spanOnScope.js';\nimport { spanToJSON, addChildSpanToSpan, spanIsSampled, spanTimeInputToSeconds, getRootSpan } from '../utils/spanUtils.js';\nimport { getDynamicSamplingContextFromSpan, freezeDscOnSpan } from './dynamicSamplingContext.js';\nimport { logSpanStart } from './logSpans.js';\nimport { sampleSpan } from './sampling.js';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan.js';\nimport { SentrySpan } from './sentrySpan.js';\nimport { SPAN_STATUS_ERROR } from './spanstatus.js';\nimport { setCapturedScopesOnSpan } from './utils.js';\n\nconst SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nfunction startSpan(options, callback) {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n return withScope(options.scope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => activeSpan.end(),\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. You'll have to call `span.end()` manually.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nfunction startSpanManual(options, callback) {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n return withScope(options.scope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n function finishAndSetSpan() {\n activeSpan.end();\n }\n\n return handleCallbackErrors(\n () => callback(activeSpan, finishAndSetSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nfunction startInactiveSpan(options) {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback) => withActiveSpan(customParentSpan, callback)\n : (callback) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n\n if (shouldSkipSpan) {\n return new SentryNonRecordingSpan();\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from ``\n * and `` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nconst continueTrace = (\n {\n sentryTrace,\n baggage,\n }\n\n,\n callback,\n) => {\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nfunction withActiveSpan(span, callback) {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nfunction suppressTracing(callback) {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n return callback();\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nfunction startNewTrace(callback) {\n return withScope(scope => {\n scope.setPropagationContext(generatePropagationContext());\n DEBUG_BUILD && logger.info(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}\n\n) {\n if (!hasTracingEnabled()) {\n return new SentryNonRecordingSpan();\n }\n\n const isolationScope = getIsolationScope();\n\n let span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options) {\n const exp = options.experimental || {};\n const initialCtx = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs() {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments, scope, parentSampled) {\n const client = getClient();\n const options = (client && client.getOptions()) || {};\n\n const { name = '', attributes } = spanArguments;\n const [sampled, sampleRate] = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY]\n ? [false]\n : sampleSpan(options, {\n name,\n parentSampled,\n attributes,\n transactionContext: {\n name,\n parentSampled,\n },\n });\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n ...spanArguments.attributes,\n },\n sampled,\n });\n if (sampleRate !== undefined) {\n rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, sampleRate);\n }\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan, scope, spanArguments) {\n const { spanId, traceId } = parentSpan.spanContext();\n const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n const client = getClient();\n if (client) {\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n }\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope) {\n const span = _getSpanForScope(scope) ;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) ;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper(parentSpan) {\n return parentSpan !== undefined\n ? (callback) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback) => callback();\n}\n\nexport { continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan };\n//# sourceMappingURL=trace.js.map\n","import { SDK_VERSION } from '@sentry/utils';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nfunction applySdkMetadata(options, name, names = [name], source = 'npm') {\n const metadata = options._metadata || {};\n\n if (!metadata.sdk) {\n metadata.sdk = {\n name: `sentry.javascript.${name}`,\n packages: names.map(name => ({\n name: `${source}:@sentry/${name}`,\n version: SDK_VERSION,\n })),\n version: SDK_VERSION,\n };\n }\n\n options._metadata = metadata;\n}\n\nexport { applySdkMetadata };\n//# sourceMappingURL=sdkMetadata.js.map\n","import { setContext, init as init$1 } from '@sentry/browser';\nimport { applySdkMetadata } from '@sentry/core';\nimport { version } from 'react';\n\n/**\n * Inits the React SDK\n */\nfunction init(options) {\n const opts = {\n ...options,\n };\n\n applySdkMetadata(opts, 'react');\n setContext('react', { version });\n return init$1(opts);\n}\n\nexport { init };\n//# sourceMappingURL=sdk.js.map\n","import { captureException } from '@sentry/browser';\nimport { isError } from '@sentry/utils';\nimport { version } from 'react';\n\n/**\n * See if React major version is 17+ by parsing version string.\n */\nfunction isAtLeastReact17(reactVersion) {\n const reactMajor = reactVersion.match(/^([^.]+)/);\n return reactMajor !== null && parseInt(reactMajor[0]) >= 17;\n}\n\n/**\n * Recurse through `error.cause` chain to set cause on an error.\n */\nfunction setCause(error, cause) {\n const seenErrors = new WeakSet();\n\n function recurse(error, cause) {\n // If we've already seen the error, there is a recursive loop somewhere in the error's\n // cause chain. Let's just bail out then to prevent a stack overflow.\n if (seenErrors.has(error)) {\n return;\n }\n if (error.cause) {\n seenErrors.add(error);\n return recurse(error.cause, cause);\n }\n error.cause = cause;\n }\n\n recurse(error, cause);\n}\n\n/**\n * Captures an error that was thrown by a React ErrorBoundary or React root.\n *\n * @param error The error to capture.\n * @param errorInfo The errorInfo provided by React.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nfunction captureReactException(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error,\n { componentStack },\n hint,\n) {\n // If on React version >= 17, create stack trace from componentStack param and links\n // to to the original error using `error.cause` otherwise relies on error param for stacktrace.\n // Linking errors requires the `LinkedErrors` integration be enabled.\n // See: https://reactjs.org/blog/2020/08/10/react-v17-rc.html#native-component-stacks\n //\n // Although `componentDidCatch` is typed to accept an `Error` object, it can also be invoked\n // with non-error objects. This is why we need to check if the error is an error-like object.\n // See: https://github.com/getsentry/sentry-javascript/issues/6167\n if (isAtLeastReact17(version) && isError(error) && componentStack) {\n const errorBoundaryError = new Error(error.message);\n errorBoundaryError.name = `React ErrorBoundary ${error.name}`;\n errorBoundaryError.stack = componentStack;\n\n // Using the `LinkedErrors` integration to link the errors together.\n setCause(error, errorBoundaryError);\n }\n\n return captureException(error, {\n ...hint,\n captureContext: {\n contexts: { react: { componentStack } },\n },\n });\n}\n\n/**\n * Creates an error handler that can be used with the `onCaughtError`, `onUncaughtError`,\n * and `onRecoverableError` options in `createRoot` and `hydrateRoot` React DOM methods.\n *\n * @param callback An optional callback that will be called after the error is captured.\n * Use this to add custom handling for errors.\n *\n * @example\n *\n * ```JavaScript\n * const root = createRoot(container, {\n * onCaughtError: Sentry.reactErrorHandler(),\n * onUncaughtError: Sentry.reactErrorHandler((error, errorInfo) => {\n * console.warn('Caught error', error, errorInfo.componentStack);\n * });\n * });\n * ```\n */\nfunction reactErrorHandler(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (error, errorInfo) => {\n const eventId = captureReactException(error, errorInfo);\n if (callback) {\n callback(error, errorInfo, eventId);\n }\n };\n}\n\nexport { captureReactException, isAtLeastReact17, reactErrorHandler, setCause };\n//# sourceMappingURL=error.js.map\n","const REACT_RENDER_OP = 'ui.react.render';\n\nconst REACT_UPDATE_OP = 'ui.react.update';\n\nconst REACT_MOUNT_OP = 'ui.react.mount';\n\nexport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP };\n//# sourceMappingURL=constants.js.map\n","import { startInactiveSpan } from '@sentry/browser';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, withActiveSpan, spanToJSON } from '@sentry/core';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\nimport { REACT_MOUNT_OP, REACT_UPDATE_OP, REACT_RENDER_OP } from './constants.js';\n\nconst UNKNOWN_COMPONENT = 'unknown';\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n static __initStatic() {this.defaultProps = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };}\n\n constructor(props) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n this._mountSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n }\n\n // If a component mounted, we can finish the mount activity.\n componentDidMount() {\n if (this._mountSpan) {\n this._mountSpan.end();\n }\n }\n\n shouldComponentUpdate({ updateProps, includeUpdates = true }) {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = withActiveSpan(this._mountSpan, () => {\n return startInactiveSpan({\n name: `<${this.props.name}>`,\n onlyIfParent: true,\n op: REACT_UPDATE_OP,\n startTime: now,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': this.props.name,\n 'ui.react.changed_props': changedProps,\n },\n });\n });\n }\n }\n\n return true;\n }\n\n componentDidUpdate() {\n if (this._updateSpan) {\n this._updateSpan.end();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n componentWillUnmount() {\n const endTimestamp = timestampInSeconds();\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n const startTime = spanToJSON(this._mountSpan).timestamp;\n withActiveSpan(this._mountSpan, () => {\n const renderSpan = startInactiveSpan({\n onlyIfParent: true,\n name: `<${name}>`,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\n });\n }\n }\n\n render() {\n return this.props.children;\n }\n} Profiler.__initStatic();\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withProfiler(\n WrappedComponent,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options,\n) {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped = (props) => (\n React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props,}\n , React.createElement(WrappedComponent, { ...props,} )\n )\n );\n\n Wrapped.displayName = `profiler(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name,\n options = {\n disabled: false,\n hasRenderSpan: true,\n },\n) {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n return startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return () => {\n if (mountSpan && options.hasRenderSpan) {\n const startTime = spanToJSON(mountSpan).timestamp;\n const endTimestamp = timestampInSeconds();\n\n const renderSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_RENDER_OP,\n startTime,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.react.profiler',\n 'ui.component_name': name,\n },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { Profiler, UNKNOWN_COMPONENT, useProfiler, withProfiler };\n//# sourceMappingURL=profiler.js.map\n","import { getClient, showReportDialog, withScope } from '@sentry/browser';\nimport { logger } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { captureReactException } from './error.js';\n\nconst UNKNOWN_COMPONENT = 'unknown';\n\nconst INITIAL_STATE = {\n componentStack: null,\n error: null,\n eventId: null,\n};\n\n/**\n * A ErrorBoundary component that logs errors to Sentry.\n * NOTE: If you are a Sentry user, and you are seeing this stack frame, it means the\n * Sentry React SDK ErrorBoundary caught an error invoking your application code. This\n * is expected behavior and NOT indicative of a bug with the Sentry React SDK.\n */\nclass ErrorBoundary extends React.Component {\n\n constructor(props) {\n super(props);ErrorBoundary.prototype.__init.call(this);\n this.state = INITIAL_STATE;\n this._openFallbackReportDialog = true;\n\n const client = getClient();\n if (client && props.showDialog) {\n this._openFallbackReportDialog = false;\n this._cleanupHook = client.on('afterSendEvent', event => {\n if (!event.type && this._lastEventId && event.event_id === this._lastEventId) {\n showReportDialog({ ...props.dialogOptions, eventId: this._lastEventId });\n }\n });\n }\n }\n\n componentDidCatch(error, errorInfo) {\n const { componentStack } = errorInfo;\n // TODO(v9): Remove this check and type `componentStack` to be React.ErrorInfo['componentStack'].\n const passedInComponentStack = componentStack == null ? undefined : componentStack;\n\n const { beforeCapture, onError, showDialog, dialogOptions } = this.props;\n withScope(scope => {\n if (beforeCapture) {\n beforeCapture(scope, error, passedInComponentStack);\n }\n\n const eventId = captureReactException(error, errorInfo, { mechanism: { handled: !!this.props.fallback } });\n\n if (onError) {\n onError(error, passedInComponentStack, eventId);\n }\n if (showDialog) {\n this._lastEventId = eventId;\n if (this._openFallbackReportDialog) {\n showReportDialog({ ...dialogOptions, eventId });\n }\n }\n\n // componentDidCatch is used over getDerivedStateFromError\n // so that componentStack is accessible through state.\n this.setState({ error, componentStack, eventId });\n });\n }\n\n componentDidMount() {\n const { onMount } = this.props;\n if (onMount) {\n onMount();\n }\n }\n\n componentWillUnmount() {\n const { error, componentStack, eventId } = this.state;\n const { onUnmount } = this.props;\n if (onUnmount) {\n onUnmount(error, componentStack, eventId);\n }\n\n if (this._cleanupHook) {\n this._cleanupHook();\n this._cleanupHook = undefined;\n }\n }\n\n __init() {this.resetErrorBoundary = () => {\n const { onReset } = this.props;\n const { error, componentStack, eventId } = this.state;\n if (onReset) {\n onReset(error, componentStack, eventId);\n }\n this.setState(INITIAL_STATE);\n };}\n\n render() {\n const { fallback, children } = this.props;\n const state = this.state;\n\n if (state.error) {\n let element = undefined;\n if (typeof fallback === 'function') {\n element = React.createElement(fallback, {\n error: state.error,\n componentStack: state.componentStack ,\n resetError: this.resetErrorBoundary,\n eventId: state.eventId ,\n });\n } else {\n element = fallback;\n }\n\n if (React.isValidElement(element)) {\n return element;\n }\n\n if (fallback) {\n DEBUG_BUILD && logger.warn('fallback did not produce a valid ReactElement');\n }\n\n // Fail gracefully if no fallback provided or is not valid\n return null;\n }\n\n if (typeof children === 'function') {\n return (children )();\n }\n return children;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withErrorBoundary(\n WrappedComponent,\n errorBoundaryOptions,\n) {\n const componentDisplayName = WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped = (props) => (\n React.createElement(ErrorBoundary, { ...errorBoundaryOptions,}\n , React.createElement(WrappedComponent, { ...props,} )\n )\n );\n\n Wrapped.displayName = `errorBoundary(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\nexport { ErrorBoundary, UNKNOWN_COMPONENT, withErrorBoundary };\n//# sourceMappingURL=errorboundary.js.map\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","import * as amplitude from \"@amplitude/analytics-browser\";\n\nconst { VITE_ENVIRONMENT, VITE_AMPLITUDE_API_KEY } = import.meta.env;\n\nconst initAmplitude = () => {\n console.log(\"Amplitude initialized\");\n\n amplitude.init(VITE_AMPLITUDE_API_KEY, undefined, {\n logLevel:\n VITE_ENVIRONMENT === \"development\"\n ? amplitude.Types.LogLevel.Warn\n : amplitude.Types.LogLevel.Warn,\n defaultTracking: {\n sessions: true,\n pageViews: {\n trackHistoryChanges: \"pathOnly\",\n },\n formInteractions: true,\n fileDownloads: true,\n },\n });\n};\n\nconst disableAmplitudeTracking = () => {\n amplitude.setOptOut(true);\n};\n\nexport const handleConsentChangeForAmplitude = () => {\n const cookieYesConsent = window.getCkyConsent ? window.getCkyConsent() : null;\n const consentViaCookieYes =\n cookieYesConsent && cookieYesConsent.categories.analytics;\n const noCmp = !window.getCkyConsent;\n\n if (noCmp) {\n console.log(\"No CMP found\");\n }\n\n if (consentViaCookieYes) {\n initAmplitude(); // enable when turning on CookieYes\n } else {\n disableAmplitudeTracking(); // enable when turning on CookieYes\n }\n};\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport { cohortSliceReducer } from \"~/features/Cohort\";\nimport { dashboardSliceReducer } from \"~/features/Dashboard\";\nimport { mobileDrawerContentSliceReducer } from \"~/features/MobileDrawerContent\";\nimport { modalWithStateSliceReducer } from \"~/features/ModalWithState\";\nimport { programSliceReducer } from \"~/features/Program\";\nimport { api } from \"./api\";\nimport { reducer as authenticationReducer } from \"./authentication\";\nimport { reducer as gitShaReducer } from \"./gitSha\";\nimport { reducer as onboardingReducer } from \"./onboarding\";\n\n// ! Note: Reducers should be imported from a `**/features/**/*` directory.\n// ! It's kind of the point of having Redux -- to manage complex state and/or\n// ! state that is needed across the app.\n// ! For more info about what should and should not go into Redux, see:\n// ! https://redux.js.org/tutorials/essentials/part-2-app-structure#component-state-and-forms\nexport const store = configureStore({\n reducer: {\n authentication: authenticationReducer,\n cohort: cohortSliceReducer,\n dashboard: dashboardSliceReducer,\n gitSha: gitShaReducer,\n mobileDrawerContent: mobileDrawerContentSliceReducer,\n modalWithState: modalWithStateSliceReducer,\n onboarding: onboardingReducer,\n program: programSliceReducer,\n [api.reducerPath]: api.reducer,\n },\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware().concat(api.middleware),\n});\n\nexport type RootState = ReturnType;\nexport type AppDispatch = typeof store.dispatch;\n","import React, { FC, ReactNode } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { ChakraProvider, CSSReset } from \"@chakra-ui/react\";\nimport { ErrorBoundary } from \"@sentry/react\";\nimport { store } from \"~/store/store\";\nimport { customTheme } from \"./theme\";\n\ninterface Props {\n children: ReactNode;\n}\n\nconst { VITE_ENVIRONMENT } = import.meta.env;\n\nexport const AppProvider: FC = ({ children }) => (\n \n \n \n \n \n {children}\n \n \n \n \n);\n","import { FC, useEffect } from \"react\";\nimport {\n BrowserRouter,\n createRoutesFromChildren,\n matchRoutes,\n useLocation,\n useNavigationType,\n} from \"react-router-dom\";\nimport * as Sentry from \"@sentry/react\";\nimport { asyncWithLDProvider } from \"launchdarkly-react-client-sdk\";\nimport { createRoot } from \"react-dom/client\";\nimport { handleConsentChangeForAmplitude } from \"~/utils/amplitude/config\";\nimport { AppProvider } from \"~/utils/AppProvider\";\nimport { App } from \"./App\";\n\nimport \"~/utils/i18next\";\nhandleConsentChangeForAmplitude();\n\nconst { VITE_ENVIRONMENT, VITE_LD_CLIENT_SIDE_ID } = import.meta.env;\n\nSentry.init({\n attachStacktrace: true,\n dsn: \"https://8bd7e5720104422681a430579736b53e@o1325523.ingest.sentry.io/6584786\",\n enabled: VITE_ENVIRONMENT !== \"development\",\n environment: VITE_ENVIRONMENT,\n integrations: [\n Sentry.replayIntegration(),\n Sentry.reactRouterV6BrowserTracingIntegration({\n useEffect,\n useLocation,\n useNavigationType,\n createRoutesFromChildren,\n matchRoutes,\n }),\n ],\n\n // Set tracesSampleRate to 1.0 to capture 100%\n // of transactions for performance monitoring.\n // We recommend adjusting this value in production\n tracesSampleRate: 0.2,\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n});\n\nconst BaseAppComponent: FC = () => (\n \n \n \n \n \n);\n\nconst BaseApp = Sentry.withProfiler(BaseAppComponent);\n\n(async () => {\n const LDProvider = await asyncWithLDProvider({\n clientSideID: VITE_LD_CLIENT_SIDE_ID,\n options: {\n bootstrap: \"localStorage\",\n },\n });\n\n const container = document.getElementById(\"root\");\n const root = createRoot(container!);\n\n root.render(\n \n \n ,\n );\n})();\n"],"names":["applyAggregateErrorsToEvent","exceptionFromErrorImplementation","parser","maxValueLimit","key","limit","event","hint","isInstanceOf","originalException","truncateAggregateExceptions","aggregateExceptionsFromError","error","prevExceptions","exception","exceptionId","newExceptions","applyExceptionGroupFieldsForParentException","newException","newExceptionId","applyExceptionGroupFieldsForChildException","childError","i","source","parentId","exceptions","maxValueLength","truncate","getBreadcrumbLogLevelFromHttpStatusCode","statusCode","SentryError","message","logLevel","addConsoleInstrumentationHandler","handler","type","addHandler","maybeInstrument","instrumentConsole","GLOBAL_OBJ","CONSOLE_LEVELS","level","fill","originalConsoleMethod","originalConsoleMethods","args","triggerHandlers","log","isBrowserBundle","getSDKSource","isNodeEnv","isBrowser","isElectronNodeRenderer","makePromiseBuffer","buffer","isReady","remove","task","add","taskProducer","rejectedSyncPromise","drain","timeout","SyncPromise","resolve","reject","counter","capturedSetTimeout","item","resolvedSyncPromise","validSeverityLevels","severityLevelFromString","createClientReportEnvelope","discarded_events","dsn","timestamp","clientReportItem","dateTimestampInSeconds","createEnvelope","DEFAULT_RETRY_AFTER","parseRetryAfterHeader","header","now","headerDelay","headerDate","disabledUntil","limits","dataCategory","isRateLimited","updateRateLimits","headers","updatedRateLimits","rateLimitHeader","retryAfterHeader","retryAfter","categories","namespaces","delay","category","_nullishCoalesce","lhs","rhsFn","SENTRY_API_VERSION","getBaseApiEndpoint","protocol","port","_getIngestEndpoint","_encodedAuth","sdkInfo","urlEncode","getEnvelopeEndpointWithUrlEncodedAuth","tunnel","getReportDialogEndpoint","dsnLike","dialogOptions","makeDsn","endpoint","encodedOptions","dsnToString","user","installedIntegrations","filterDuplicates","integrations","integrationsByName","currentInstance","name","existingInstance","getIntegrationsToSetup","options","defaultIntegrations","userIntegrations","integration","arrayify","finalIntegrations","debugIndex","debugInstance","setupIntegrations","client","integrationIndex","setupIntegration","afterSetupIntegrations","DEBUG_BUILD","logger","callback","processor","ALREADY_SEEN_ERROR","BaseClient","url","scope","eventId","uuid4","checkOrSetAlreadyCaught","hintWithEventId","currentScope","eventMessage","isParameterizedString","promisedEvent","isPrimitive","capturedSpanScope","session","updateSession","transport","clientFinished","transportFlushed","result","eventProcessor","integrationName","isAlreadyInstalled","env","createEventEnvelope","attachment","addItemToEnvelope","createAttachmentEnvelopeItem","promise","sendResponse","createSessionEnvelope","reason","eventOrCount","count","hook","hooks","cbIndex","rest","callbacks","envelope","crashed","errored","ex","mechanism","sessionNonTerminal","ticked","tick","interval","isolationScope","getIsolationScope","prepareEvent","evt","propagationContext","trace_id","spanId","parentSpanId","dsc","dropUndefinedKeys","dynamicSamplingContext","getDynamicSamplingContextFromClient","finalEvent","sentryError","sampleRate","isTransaction","isTransactionEvent","isError","isErrorEvent","eventType","beforeSendLabel","parsedSampleRate","parseSampleRate","capturedSpanIsolationScope","prepared","processBeforeSend","_validateBeforeSendResult","processedEvent","spanCount","spanCountBefore","spanCountAfter","droppedSpanCount","transactionInfo","value","outcomes","quantity","beforeSendResult","invalidValueError","isThenable","isPlainObject","e","beforeSend","beforeSendTransaction","beforeSendSpan","processedSpans","span","processedSpan","initAndBind","clientClass","consoleSandbox","getCurrentScope","setCurrentClient","DEFAULT_TRANSPORT_BUFFER_SIZE","createTransport","makeRequest","rateLimits","flush","send","filteredEnvelopeItems","forEachEnvelopeItem","envelopeItemTypeToDataCategory","getEventForEnvelopeItem","filteredEnvelope","recordEnvelopeLoss","requestTask","serializeEnvelope","response","isSentryRequestUrl","checkDsn","checkTunnel","removeTrailingSlash","str","applySdkMetadata","names","metadata","SDK_VERSION","DEFAULT_BREADCRUMBS","addBreadcrumb","breadcrumb","getClient","beforeBreadcrumb","maxBreadcrumbs","mergedBreadcrumb","finalBreadcrumb","originalFunctionToString","INTEGRATION_NAME","SETUP_CLIENTS","_functionToStringIntegration","originalFunction","getOriginalFunction","context","functionToStringIntegration","DEFAULT_IGNORE_ERRORS","_inboundFiltersIntegration","_hint","clientOptions","mergedOptions","_mergeOptions","_shouldDropEvent","inboundFiltersIntegration","internalOptions","_isSentryError","getEventDescription","_isIgnoredError","_isUselessError","_isIgnoredTransaction","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","ignoreErrors","_getPossibleEventMessages","stringMatchesSomePattern","ignoreTransactions","denyUrls","allowUrls","possibleMessages","lastException","_getLastValidUrl","frames","frame","_dedupeIntegration","previousEvent","currentEvent","dedupeIntegration","_isSameMessageEvent","_isSameExceptionEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","previousException","_getExceptionFromEvent","currentException","currentFrames","getFramesFromEvent","previousFrames","frameA","frameB","currentFingerprint","previousFingerprint","exceptionFromError","stackParser","parseStackFrames","extractType","extractMessage","eventFromPlainObject","syntheticException","isUnhandledRejection","normalizeDepth","errorFromProp","getErrorPropertyFromObject","extra","normalizeToSize","isEvent","getNonErrorObjectExceptionValue","eventFromError","stacktrace","skipLines","getSkipFirstStackStringLines","framesToPop","getPopFirstTopFrames","reactMinifiedRegexp","isWebAssemblyException","eventFromException","attachStacktrace","eventFromUnknownInput","addExceptionMechanism","eventFromMessage","eventFromString","isDOMError","isDOMException","domException","addExceptionTypeValue","__sentry_template_string__","__sentry_template_values__","keys","extractExceptionKeysForMessage","captureType","getObjectClassName","obj","prototype","prop","createUserFeedbackEnvelope","feedback","createUserFeedbackEnvelopeItem","BrowserClient","opts","sdkSource","WINDOW","DEBOUNCE_DURATION","debounceTimerID","lastCapturedEventType","lastCapturedEventTargetId","addClickKeypressInstrumentationHandler","instrumentDOM","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","target","proto","originalAddEventListener","listener","el","handlers","handlerForType","originalRemoveEventListener","isSimilarToLastCapturedEvent","shouldSkipDOMEvent","globalListener","getEventTarget","addNonEnumerableProperty","cachedImplementations","getNativeImplementation","cached","impl","isNativeFunction","document","sandbox","contentWindow","clearCachedImplementation","setTimeout","makeFetchTransport","nativeFetch","pendingBodySize","pendingCount","request","requestSize","requestOptions","CHROME_PRIORITY","GECKO_PRIORITY","createFrame","filename","func","lineno","colno","UNKNOWN_FUNCTION","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","chromeStackParserFn","line","noFnParts","col","parts","subMatch","extractSafariExtensionDetails","chromeStackLineParser","geckoREgex","geckoEvalRegex","gecko","geckoStackLineParser","defaultStackLineParsers","defaultStackParser","createStackParser","isSafariExtension","isSafariWebExtension","MAX_ALLOWED_STRING_LENGTH","_breadcrumbsIntegration","_options","_getConsoleBreadcrumbHandler","_getDomBreadcrumbHandler","addXhrInstrumentationHandler","_getXhrBreadcrumbHandler","addFetchInstrumentationHandler","_getFetchBreadcrumbHandler","addHistoryInstrumentationHandler","_getHistoryBreadcrumbHandler","_getSentryBreadcrumbHandler","breadcrumbsIntegration","dom","handlerData","componentName","keyAttrs","maxStringLength","element","_isEvent","htmlTreeAsString","getComponentName","safeJoin","startTimestamp","endTimestamp","sentryXhrData","SENTRY_XHR_DATA_KEY","method","status_code","body","data","from","to","parsedLoc","parseUrl","parsedFrom","parsedTo","DEFAULT_EVENT_TARGET","_browserApiErrorsIntegration","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","browserApiErrorsIntegration","original","originalCallback","wrap","getFunctionName","originalSend","xhr","wrapOptions","globalObject","eventName","fn","wrappedEventHandler","originalEventHandler","_globalHandlersIntegration","_installGlobalOnErrorHandler","globalHandlerLog","_installGlobalOnUnhandledRejectionHandler","globalHandlersIntegration","addGlobalErrorInstrumentationHandler","getOptions","shouldIgnoreOnError","msg","column","_enhanceEventWithInitialFrame","captureEvent","addGlobalUnhandledRejectionInstrumentationHandler","_getUnhandledRejectionError","_eventFromRejectionWithPrimitive","ev","ev0","ev0s","ev0sf","isString","getLocationHref","httpContextIntegration","referrer","userAgent","DEFAULT_KEY","DEFAULT_LIMIT","_linkedErrorsIntegration","linkedErrorsIntegration","getDefaultIntegrations","applyDefaultOptions","optionsArg","defaultOptions","shouldShowBrowserExtensionError","windowWithMaybeExtension","extensionKey","extensionObject","runtimeId","href","extensionProtocols","isDedicatedExtensionPage","isNWjs","init","browserOptions","supportsFetch","stackParserFromStackParserOptions","startSessionTracking","showReportDialog","lastEventId","script","onClose","reportDialogClosedMessageHandler","injectionPoint","startSession","captureSession","REPLAY_SESSION_KEY","REPLAY_EVENT_NAME","UNABLE_TO_SEND_REPLAY","SESSION_IDLE_PAUSE_DURATION","SESSION_IDLE_EXPIRE_DURATION","DEFAULT_FLUSH_MIN_DELAY","DEFAULT_FLUSH_MAX_DELAY","BUFFER_CHECKOUT_TIME","RETRY_BASE_INTERVAL","RETRY_MAX_COUNT","NETWORK_BODY_MAX_SIZE","CONSOLE_ARG_MAX_SIZE","SLOW_CLICK_THRESHOLD","SLOW_CLICK_SCROLL_TIMEOUT","REPLAY_MAX_EVENT_BUFFER_SIZE","MIN_REPLAY_DURATION","MIN_REPLAY_DURATION_LIMIT","MAX_REPLAY_DURATION","_nullishCoalesce$1","_optionalChain$5","ops","lastAccessLHS","op","NodeType$1","NodeType","isElement$1","n","isShadowRoot","host","_","_2","isNativeShadowDom","shadowRoot","fixBrowserCompatibilityIssuesInCSS","cssText","escapeImportStatement","rule","statement","stringifyStylesheet","s","rules","stringifyRule","importStringified","isCSSImportRule","isCSSStyleRule","fixSafariColons","cssStringified","regex","Mirror","id","_3","_4","_5","childNode","node","meta","oldNode","createMirror","shouldMaskInput","maskInputOptions","tagName","maskInputValue","isMasked","maskInputFn","text","toLowerCase","toUpperCase","ORIGINAL_ATTRIBUTE_NAME","is2DCanvasBlank","canvas","ctx","chunkSize","x","y","getImageData","originalGetImageData","pixel","getInputType","getInputValue","extractFileExtension","path","baseURL","match","_6","cachedImplementations$1","getImplementation$1","setTimeout$2","clearTimeout$2","_id","tagNameRegex","IGNORED_NODE","genId","getValidTagName","processedTagName","extractOrigin","origin","canvasService","canvasCtx","URL_IN_CSS_REF","URL_PROTOCOL_MATCH","URL_WWW_MATCH","DATA_URI","absoluteToStylesheet","quote1","path1","quote2","path2","path3","filePath","maybeQuote","stack","part","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","getAbsoluteSrcsetString","doc","attributeValue","pos","collectCharacters","regEx","chars","output","absoluteToDoc","descriptorsStr","inParens","c","cachedDocument","getHref","isSVGElement","customHref","a","transformAttribute","maskAttributeFn","ignoreAttribute","_value","_isBlockedElement","blockClass","blockSelector","unblockSelector","eIndex","className","elementClassMatchesRegex","distanceToMatch","matchPredicate","distance","createMatchPredicate","selector","needMaskingText","maskTextClass","maskTextSelector","unmaskTextClass","unmaskTextSelector","maskAllText","autocomplete","maskDistance","unmaskDistance","onceIframeLoaded","iframeEl","iframeLoadTimeout","win","fired","readyState","timer","blankUrl","onceStylesheetLoaded","link","styleSheetLoadTimeout","styleSheetLoaded","serializeNode","mirror","inlineStylesheet","maskTextFn","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","newlyAddedElement","rootId","getRootId","serializeElementNode","serializeTextNode","docId","parentTagName","textContent","isStyle","isScript","isTextarea","_7","_8","_9","err","forceMask","isInputMasked","needBlock","attributes","len","attr","stylesheet","checked","canvasDataURL","blankCanvas","blankCanvasDataURL","image","imageSrc","priorCrossOrigin","recordInlineImage","width","height","isCustomElement","lowerIfExists","maybeAttr","slimDOMExcluded","sn","slimDOMOptions","serializeNodeWithId","skipChild","onSerialize","onIframeLoad","onStylesheetLoad","stylesheetLoadTimeout","preserveWhiteSpace","_serializedNode","serializedNode","recordChild","bypassOptions","childN","serializedChildNode","iframeDoc","serializedIframeNode","serializedLinkNode","snapshot","maskAllInputs","slimDOM","_optionalChain$4","on","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","receiver","throttle$1","wait","previous","remaining","clearTimeout$1","setTimeout$1","hookSetter","d","isRevoked","patch","replacement","wrapped","nowTimestamp","getWindowScroll","_10","_11","_12","_13","_14","getWindowHeight","getWindowWidth","closestElementOfNode","isBlocked","checkAncestors","blockedPredicate","isUnblocked","blockDistance","unblockDistance","isSerialized","isIgnored","isAncestorRemoved","legacy_isTouchEvent","polyfill","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","_18","StyleSheetMirror","newId","getShadowHost","shadowHost","_19","_20","_21","getRootShadowHost","rootShadowHost","shadowHostInDom","inDom","getImplementation","onRequestAnimationFrame","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","PointerTypes","PointerTypes2","_optionalChain$3","isNodeInLinkedList","DoubleLinkedList","position","current","index","moveKey","MutationBuffer","mutations","adds","addedIds","addList","getNextId","ns","nextId","pushAdd","currentN","iframe","childSn","isParentRemoved","isAncestorInSet","candidate","tailNode","_node","unhandledNode","payload","attribute","diffAsStr","unchangedAsStr","m","attributeName","old","pname","newValue","newPriority","nodeId","deepDelete","targetId","addsSet","removes","_isParentRemoved","r","set","_isAncestorInSet","parentNode","errorHandler","registerErrorHandler","unregisterErrorHandler","callbackWrapper","cb","_optionalChain$2","mutationBuffers","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","angularZoneSymbol","observer","initMoveObserver","mousemoveCb","sampling","threshold","callbackThreshold","positions","timeBaseline","wrappedCb","totalOffset","p","updatePosition","clientX","clientY","h","initMouseInteractionObserver","mouseInteractionCb","disableMap","currentPointerType","getHandler","eventKey","pointerType","thisEventKey","initScrollObserver","scrollCb","scrollLeftTop","initViewportResizeObserver","viewportResizeCb","lastH","lastW","updateDimension","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","ignoreSelector","userTriggeredOnInput","eventHandler","userTriggered","isChecked","cbWithDedup","v","lastInputValue","currentWindow","propertyDescriptor","hookProperties","getNestedCSSRulePositions","recurse","childRule","hasNestedCSSRule","getIdAndStyleId","sheet","styleMirror","styleId","initStyleSheetObserver","styleSheetRuleCb","stylesheetManager","insertRule","thisArg","argumentsList","deleteRule","replace","replaceSync","supportedNestedCSSRuleTypes","canMonkeyPatchNestedCSSRule","unmodifiedFunctions","typeKey","initAdoptedStyleSheetObserver","hostId","patchTarget","originalPropertyDescriptor","sheets","_15","_16","initStyleDeclarationObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","property","priority","_17","removeProperty","initMediaInteractionObserver","mediaInteractionCb","currentTime","volume","muted","playbackRate","initFontObserver","fontCb","fontMap","originalFontFace","family","descriptors","fontFace","restoreHandler","initSelectionObserver","param","selectionCb","collapsed","updateSelection","selection","ranges","range","startContainer","startOffset","endContainer","endOffset","initCustomElementObserver","customElementCb","constructor","initObservers","o","_hooks","mutationObserver","mousemoveHandler","mouseInteractionHandler","scrollHandler","viewportResizeHandler","inputHandler","mediaInteractionHandler","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","selectionObserver","customElementObserver","pluginHandlers","plugin","b","_22","_23","CrossOriginIframeMirror","generateIdFn","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","remoteIdToIdMap","map","ids","_optionalChain$1","IframeManagerNoop","IframeManager","crossOriginMessageEvent","transformedEvent","style","iframeMirror","child","ShadowDomManagerNoop","ShadowDomManager","iframeElement","manager","option","CanvasManagerNoop","StylesheetManager","linkEl","adoptedStyleSheetData","styles","ProcessedNodeManager","thisBuffer","buffers","wrappedEmit","_takeFullSnapshot","cleanFrame","_optionalChain","record","emit","checkoutEveryNms","checkoutEveryNth","_maskInputOptions","_slimDOMOptions","maxCanvasSize","packFn","mousemoveWait","recordDOM","recordCrossOriginIframes","recordAfter","collectFonts","plugins","onMutation","getCanvasManager","inEmittingFrame","passEmitsToParent","lastFullSnapshotEvent","incrementalSnapshotCount","isCheckout","buf","exceedCount","exceedTime","takeFullSnapshot","wrappedMutationEmit","wrappedScrollEmit","wrappedCanvasMutationEmit","wrappedAdoptedStyleSheetEmit","iframeManager","processedNodeManager","canvasManager","_getCanvasManager","shadowDomManager","observe","getCanvasManagerFn","PREFIX","_addBreadcrumb","makeReplayLogger","_capture","_trace","_logger","logger$1","captureException","ReplayEventTypeIncrementalSnapshot","ReplayEventTypeCustom","timestampToMs","timestampToS","addBreadcrumbEvent","replay","normalize","INTERACTIVE_SELECTOR","getClosestInteractive","getClickTargetNode","getTargetNode","isEventWithTarget","onWindowOpen","monkeyPatchWindowOpen","originalWindowOpen","IncrementalMutationSources","handleClick","clickDetector","clickBreadcrumb","ClickDetector","slowClickConfig","_addBreadcrumbEvent","cleanupWindowOpen","nowInSeconds","ignoreElement","isClickBreadcrumb","newClick","click","timedOutClicks","hadScroll","hadMutation","isSlowClick","clickCount","timeAfterClickMs","endReason","setTimeout$3","SLOW_CLICK_TAGS","updateClickDetectorForRecordingEvent","isIncrementalEvent","isIncrementalMouseInteraction","createBreadcrumb","ATTRIBUTES_TO_RECORD","getAttributesToRecord","normalizedKey","handleDomListener","handleDom","isClick","getBaseDomBreadcrumb","isElement","getDomTarget","handleKeyboardEvent","getKeyboardBreadcrumb","metaKey","shiftKey","ctrlKey","altKey","isInputElement","hasModifierKey","isCharacterKey","baseBreadcrumb","ENTRY_TYPES","createResourceEntry","createPaintEntry","createNavigationEntry","webVitalHandler","getter","metric","createPerformanceEntries","entries","createPerformanceEntry","entry","entryType","getAbsoluteTime","time","browserPerformanceTimeOrigin","duration","startTime","start","decodedBodySize","domComplete","encodedBodySize","domContentLoadedEventStart","domContentLoadedEventEnd","domInteractive","loadEventStart","loadEventEnd","redirectCount","transferSize","initiatorType","responseEnd","responseStatus","getLargestContentfulPaint","lastEntry","getWebVital","isLayoutShift","getCumulativeLayoutShift","layoutShifts","nodes","nodeIds","getFirstInputDelay","getInteractionToNextPaint","attributions","rating","end","setupPerformanceObserver","addPerformanceEntry","onEntries","clearCallbacks","addPerformanceInstrumentationHandler","addLcpInstrumentationHandler","addClsInstrumentationHandler","addFidInstrumentationHandler","addInpInstrumentationHandler","clearCallback","EventBufferSizeExceededError","EventBufferArray","eventSize","eventsRet","WorkerHandler","worker","arg","EventBufferCompressionWorker","EventBufferProxy","events","hasCheckout","addEventPromises","createEventBuffer","useCompression","customWorkerUrl","_loadWorker","workerUrl","_getWorkerUrl","hasSessionStorage","clearSession","deleteSession","isSampled","makeSession","started","lastActivity","segmentId","sampled","previousSessionId","saveSession","getSessionSampleType","sessionSampleRate","allowBuffering","createSession","stickySession","fetchSession","sessionStringFromStorage","sessionObj","isExpired","initialTime","expiry","targetTime","isSessionExpired","maxReplayDuration","sessionIdleExpire","shouldRefreshSession","loadOrCreateSession","sessionOptions","existingSession","isCustomEvent","addEventSync","shouldAddEvent","_addEvent","addEvent","replayOptions","eventAfterPossibleCallback","maybeApplyCallback","timestampInMs","isReplayEvent","isFeedbackEvent","handleAfterSendEvent","handleTransactionEvent","handleErrorEvent","replayContext","beforeErrorSampling","handleBeforeSendEvent","handleHydrationError","exceptionValue","handleBreadcrumbs","beforeAddBreadcrumb","isBreadcrumbWithCategory","normalizeBreadcrumb","normalizeConsoleBreadcrumb","isTruncated","normalizedArgs","normalizedArg","isRrwebError","addFeedbackBreadcrumb","shouldSampleForBufferEvent","handleGlobalEventListener","createPerformanceSpans","handleHistory","handleHistorySpanListener","shouldFilterRequest","addNetworkBreadcrumb","getBodySize","textEncoder","formDataStr","_serializeFormData","parseContentLengthHeader","size","getBodyString","mergeWarning","info","warning","newMeta","existingWarnings","makeNetworkReplayBreadcrumb","buildSkippedNetworkRequestOrResponse","bodySize","buildNetworkRequestOrResponse","normalizedBody","warnings","normalizeNetworkBody","getAllowedHeaders","allowedHeaders","filteredHeaders","formData","exceedsSizeLimit","isProbablyJson","_strIsProbablyJson","truncatedBody","first","last","urlMatches","urls","fullUrl","getFullUrl","baseURI","fixedUrl","captureFetchBreadcrumbToReplay","_prepareFetchData","enrichFetchBreadcrumb","input","_getFetchRequestArgBody","reqSize","resSize","requestBodySize","responseBodySize","captureDetails","_getRequestInfo","_getResponseInfo","networkCaptureBodies","networkRequestHeaders","getRequestHeaders","requestBody","bodyStr","networkResponseHeaders","getAllHeaders","bodyText","_parseFetchResponseBody","getResponseData","res","_tryCloneResponse","_tryGetResponseText","fetchArgs","allHeaders","getHeadersFromOptions","_getResponseText","txt","captureXhrBreadcrumbToReplay","_prepareXhrData","enrichXhrBreadcrumb","_getBodySize","xhrInfo","getResponseHeaders","requestWarning","responseBody","responseWarning","_getXhrResponseBody","acc","errors","_parseXhrResponse","responseType","handleNetworkBreadcrumbs","networkDetailAllowUrls","networkDetailDenyUrls","beforeAddNetworkBreadcrumb","_isXhrBreadcrumb","_isXhrHint","_isFetchBreadcrumb","_isFetchHint","addGlobalListeners","addEventProcessor","replayId","feedbackEvent","addMemoryEntry","createMemoryEntry","memoryEntry","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","debounce","callbackReturnValue","timerId","maxTimerId","maxWait","invokeFunc","cancelTimers","debounced","getHandleRecordingEmit","hadFirstEvent","_isCheckout","addSettingsEvent","earliestEvent","createOptionsEvent","resetReplayIdOnDynamicSamplingContext","activeSpan","getActiveSpan","getDynamicSamplingContextFromSpan","createReplayEnvelope","replayEvent","recordingData","createEventEnvelopeHeaders","getSdkMetadataForEnvelopeHeader","prepareRecordingData","payloadWithSequence","replayHeaders","sequence","prepareReplayEvent","event_id","eventHint","preparedEvent","version","sendReplayRequest","segment_id","eventContext","preparedRecordingData","errorIds","traceIds","initialTimestamp","baseEvent","TransportStatusCodeError","RateLimitError","sendReplay","replayData","retryConfig","onError","setContext","THROTTLED","SKIPPED","throttle","maxCount","durationSeconds","_cleanup","_getTotalCount","isThrottled","wasThrottled","ReplayContainer","recordingOptions","slowClickTimeout","slowClickIgnoreSelectors","experiments","errorSampleRate","requiresManualStart","canvasOptions","forceFlush","continueRecording","activityTime","hasStoppedRecording","cbResult","urlPath","lastActiveSpan","lastRootSpan","getRootSpan","spanToJSON","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","currentSession","_lastActivity","performanceEntries","initialTimestampInSeconds","eventBuffer","_context","dropReason","force","tooShort","tooLong","_flushInProgress","mutationLimit","mutationBreadcrumbLimit","overMutationLimit","getOption","selectors","defaultSelectors","getPrivacyOptions","mask","unmask","block","unblock","ignore","defaultBlockedElements","maskSelector","unmaskSelector","maskAttribute","maskAttributes","privacyOptions","MEDIA_SELECTORS","DEFAULT_NETWORK_HEADERS","_initialized","replayIntegration","Replay","flushMinDelay","flushMaxDelay","minReplayDuration","_experiments","blockAllMedia","maskFn","beforeAddRecordingEvent","_getMergedNetworkHeaders","finalOptions","loadReplayOptionsFromClient","canvasIntegration","initialOptions","opt","replaysSessionSampleRate","replaysOnErrorSampleRate","withActiveSpan","acs","getAcs","withScope","_setSpanForScope","carrier","getMainCarrier","getAsyncContextStrategy","init$1","isAtLeastReact17","reactVersion","reactMajor","setCause","cause","seenErrors","captureReactException","componentStack","errorBoundaryError","REACT_RENDER_OP","REACT_UPDATE_OP","REACT_MOUNT_OP","UNKNOWN_COMPONENT","Profiler","React.Component","props","disabled","startInactiveSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","updateProps","includeUpdates","changedProps","k","timestampInSeconds","includeRender","renderSpan","withProfiler","WrappedComponent","componentDisplayName","Wrapped","React.createElement","hoistNonReactStatics","INITIAL_STATE","ErrorBoundary","errorInfo","passedInComponentStack","beforeCapture","showDialog","onMount","onUnmount","onReset","fallback","children","state","React.isValidElement","require$$0","createRoot","VITE_ENVIRONMENT","VITE_AMPLITUDE_API_KEY","__vite_import_meta_env__","initAmplitude","amplitude.init","amplitude.Types.LogLevel","disableAmplitudeTracking","amplitude.setOptOut","handleConsentChangeForAmplitude","cookieYesConsent","consentViaCookieYes","store","configureStore","authenticationReducer","cohortSliceReducer","dashboardSliceReducer","gitShaReducer","mobileDrawerContentSliceReducer","modalWithStateSliceReducer","onboardingReducer","programSliceReducer","api","getDefaultMiddleware","AppProvider","jsx","Provider","React","jsxs","ChakraProvider","customTheme","CSSReset","VITE_LD_CLIENT_SIDE_ID","Sentry.init","Sentry.replayIntegration","Sentry.reactRouterV6BrowserTracingIntegration","useEffect","useLocation","useNavigationType","createRoutesFromChildren","matchRoutes","BaseAppComponent","BrowserRouter","App","BaseApp","Sentry.withProfiler","LDProvider","asyncWithLDProvider","container"],"mappings":"66CAMA,SAASA,GACPC,EACAC,EACAC,EAAgB,IAChBC,EACAC,EACAC,EACAC,EACA,CACA,GAAI,CAACD,EAAM,WAAa,CAACA,EAAM,UAAU,QAAU,CAACC,GAAQ,CAACC,GAAaD,EAAK,kBAAmB,KAAK,EACrG,OAIF,MAAME,EACJH,EAAM,UAAU,OAAO,OAAS,EAAIA,EAAM,UAAU,OAAOA,EAAM,UAAU,OAAO,OAAS,CAAC,EAAI,OAG9FG,IACFH,EAAM,UAAU,OAASI,GACvBC,GACEV,EACAC,EACAG,EACAE,EAAK,kBACLH,EACAE,EAAM,UAAU,OAChBG,EACA,CACD,EACDN,CACN,EAEA,CAEA,SAASQ,GACPV,EACAC,EACAG,EACAO,EACAR,EACAS,EACAC,EACAC,EACA,CACA,GAAIF,EAAe,QAAUR,EAAQ,EACnC,OAAOQ,EAGT,IAAIG,EAAgB,CAAC,GAAGH,CAAc,EAGtC,GAAIL,GAAaI,EAAMR,CAAG,EAAG,KAAK,EAAG,CACnCa,GAA4CH,EAAWC,CAAW,EAClE,MAAMG,EAAejB,EAAiCC,EAAQU,EAAMR,CAAG,CAAC,EAClEe,EAAiBH,EAAc,OACrCI,GAA2CF,EAAcd,EAAKe,EAAgBJ,CAAW,EACzFC,EAAgBL,GACdV,EACAC,EACAG,EACAO,EAAMR,CAAG,EACTA,EACA,CAACc,EAAc,GAAGF,CAAa,EAC/BE,EACAC,CACN,CACG,CAID,OAAI,MAAM,QAAQP,EAAM,MAAM,GAC5BA,EAAM,OAAO,QAAQ,CAACS,EAAYC,IAAM,CACtC,GAAId,GAAaa,EAAY,KAAK,EAAG,CACnCJ,GAA4CH,EAAWC,CAAW,EAClE,MAAMG,EAAejB,EAAiCC,EAAQmB,CAAU,EAClEF,EAAiBH,EAAc,OACrCI,GAA2CF,EAAc,UAAUI,CAAC,IAAKH,EAAgBJ,CAAW,EACpGC,EAAgBL,GACdV,EACAC,EACAG,EACAgB,EACAjB,EACA,CAACc,EAAc,GAAGF,CAAa,EAC/BE,EACAC,CACV,CACO,CACP,CAAK,EAGIH,CACT,CAEA,SAASC,GAA4CH,EAAWC,EAAa,CAE3ED,EAAU,UAAYA,EAAU,WAAa,CAAE,KAAM,UAAW,QAAS,IAEzEA,EAAU,UAAY,CACpB,GAAGA,EAAU,UACb,GAAIA,EAAU,OAAS,kBAAoB,CAAE,mBAAoB,EAAI,EACrE,aAAcC,CAClB,CACA,CAEA,SAASK,GACPN,EACAS,EACAR,EACAS,EACA,CAEAV,EAAU,UAAYA,EAAU,WAAa,CAAE,KAAM,UAAW,QAAS,IAEzEA,EAAU,UAAY,CACpB,GAAGA,EAAU,UACb,KAAM,UACN,OAAAS,EACA,aAAcR,EACd,UAAWS,CACf,CACA,CAOA,SAASd,GAA4Be,EAAYC,EAAgB,CAC/D,OAAOD,EAAW,IAAIX,IAChBA,EAAU,QACZA,EAAU,MAAQa,GAASb,EAAU,MAAOY,CAAc,GAErDZ,EACR,CACH,CC3IA,SAASc,GAAwCC,EAAY,CAE3D,GAAIA,IAAe,OAEZ,OAAIA,GAAc,KAAOA,EAAa,IACpC,UACEA,GAAc,IAChB,QAEP,MAEJ,CCbA,MAAMC,WAAoB,KAAM,CAG7B,YAAaC,EAASC,EAAW,OAAQ,CACxC,MAAMD,CAAO,EAAE,KAAK,QAAUA,EAC9B,KAAK,KAAO,WAAW,UAAU,YAAY,KAI7C,OAAO,eAAe,KAAM,WAAW,SAAS,EAChD,KAAK,SAAWC,CACjB,CACH,CCFA,SAASC,GAAiCC,EAAS,CACjD,MAAMC,EAAO,UACbC,GAAWD,EAAMD,CAAO,EACxBG,GAAgBF,EAAMG,EAAiB,CACzC,CAEA,SAASA,IAAoB,CACrB,YAAaC,IAInBC,GAAe,QAAQ,SAAUC,EAAO,CAChCA,KAASF,GAAW,SAI1BG,GAAKH,GAAW,QAASE,EAAO,SAAUE,EAAuB,CAC/D,OAAAC,GAAuBH,CAAK,EAAIE,EAEzB,YAAaE,EAAM,CAExBC,GAAgB,UADI,CAAE,KAAAD,EAAM,MAAAJ,EACU,EAEtC,MAAMM,EAAMH,GAAuBH,CAAK,EACxCM,GAAOA,EAAI,MAAMR,GAAW,QAASM,CAAI,CACjD,CACA,CAAK,CACL,CAAG,CACH,CCnBA,SAASG,IAAkB,CACzB,OAAO,OAAO,0BAA8B,KAAe,CAAC,CAAC,yBAC/D,CAKA,SAASC,IAAe,CAEM,MAAO,KACrC,CCjBA,SAASC,IAAY,CAGnB,MACE,CAACF,GAAiB,GAClB,OAAO,UAAU,SAAS,KAAK,OAAO,QAAY,IAAc,QAAU,CAAC,IAAM,kBAErF,CCdA,SAASG,IAAY,CAEnB,OAAO,OAAO,OAAW,MAAgB,CAACD,GAAW,GAAIE,GAAsB,EACjF,CAGA,SAASA,IAAyB,CAChC,OAEGb,GAAa,UAAY,QAAeA,GAAa,QAAU,OAAS,UAE7E,CCVA,SAASc,GAAkBhD,EAAO,CAChC,MAAMiD,EAAS,CAAA,EAEf,SAASC,GAAU,CACjB,OAAOlD,IAAU,QAAaiD,EAAO,OAASjD,CAC/C,CAQD,SAASmD,EAAOC,EAAM,CACpB,OAAOH,EAAO,OAAOA,EAAO,QAAQG,CAAI,EAAG,CAAC,EAAE,CAAC,GAAK,QAAQ,QAAQ,MAAS,CAC9E,CAYD,SAASC,EAAIC,EAAc,CACzB,GAAI,CAACJ,EAAO,EACV,OAAOK,GAAoB,IAAI9B,GAAY,sDAAsD,CAAC,EAIpG,MAAM2B,EAAOE,IACb,OAAIL,EAAO,QAAQG,CAAI,IAAM,IAC3BH,EAAO,KAAKG,CAAI,EAEbA,EACF,KAAK,IAAMD,EAAOC,CAAI,CAAC,EAIvB,KAAK,KAAM,IACVD,EAAOC,CAAI,EAAE,KAAK,KAAM,IAAM,CAEtC,CAAS,CACT,EACWA,CACR,CAWD,SAASI,EAAMC,EAAS,CACtB,OAAO,IAAIC,GAAY,CAACC,EAASC,IAAW,CAC1C,IAAIC,EAAUZ,EAAO,OAErB,GAAI,CAACY,EACH,OAAOF,EAAQ,EAAI,EAIrB,MAAMG,EAAqB,WAAW,IAAM,CACtCL,GAAWA,EAAU,GACvBE,EAAQ,EAAK,CAEhB,EAAEF,CAAO,EAGVR,EAAO,QAAQc,GAAQ,CAChBC,GAAoBD,CAAI,EAAE,KAAK,IAAM,CACnC,EAAEF,IACL,aAAaC,CAAkB,EAC/BH,EAAQ,EAAI,EAEf,EAAEC,CAAM,CACjB,CAAO,CACP,CAAK,CACF,CAED,MAAO,CACL,EAAGX,EACH,IAAAI,EACA,MAAAG,CACJ,CACA,CCxFA,MAAMS,GAAsB,CAAC,QAAS,QAAS,UAAW,MAAO,OAAQ,OAAO,EAQhF,SAASC,GAAwB9B,EAAO,CACtC,OAAQA,IAAU,OAAS,UAAY6B,GAAoB,SAAS7B,CAAK,EAAIA,EAAQ,KACvF,CCZA,SAAS+B,GACPC,EACAC,EACAC,EACA,CACA,MAAMC,EAAmB,CACvB,CAAE,KAAM,eAAiB,EACzB,CACE,UAAwBC,GAAwB,EAChD,iBAAAJ,CACD,CACL,EACE,OAAOK,GAAeJ,EAAM,CAAE,IAAAA,CAAK,EAAG,GAAI,CAACE,CAAgB,CAAC,CAC9D,CCnBA,MAAMG,GAAsB,GAAK,IAQjC,SAASC,GAAsBC,EAAQC,EAAM,KAAK,IAAG,EAAI,CACvD,MAAMC,EAAc,SAAS,GAAGF,CAAM,GAAI,EAAE,EAC5C,GAAI,CAAC,MAAME,CAAW,EACpB,OAAOA,EAAc,IAGvB,MAAMC,EAAa,KAAK,MAAM,GAAGH,CAAM,EAAE,EACzC,OAAK,MAAMG,CAAU,EAIdL,GAHEK,EAAaF,CAIxB,CASA,SAASG,GAAcC,EAAQC,EAAc,CAC3C,OAAOD,EAAOC,CAAY,GAAKD,EAAO,KAAO,CAC/C,CAKA,SAASE,GAAcF,EAAQC,EAAcL,EAAM,KAAK,IAAG,EAAI,CAC7D,OAAOG,GAAcC,EAAQC,CAAY,EAAIL,CAC/C,CAOA,SAASO,GACPH,EACA,CAAE,WAAAzD,EAAY,QAAA6D,CAAS,EACvBR,EAAM,KAAK,IAAK,EAChB,CACA,MAAMS,EAAoB,CACxB,GAAGL,CACP,EAIQM,EAAkBF,GAAWA,EAAQ,sBAAsB,EAC3DG,EAAmBH,GAAWA,EAAQ,aAAa,EAEzD,GAAIE,EAeF,UAAWvF,KAASuF,EAAgB,KAAI,EAAG,MAAM,GAAG,EAAG,CACrD,KAAM,CAACE,EAAYC,IAAgBC,CAAU,EAAI3F,EAAM,MAAM,IAAK,CAAC,EAC7D8E,EAAc,SAASW,EAAY,EAAE,EACrCG,GAAU,MAAMd,CAAW,EAAkB,GAAdA,GAAoB,IACzD,GAAI,CAACY,EACHJ,EAAkB,IAAMT,EAAMe,MAE9B,WAAWC,KAAYH,EAAW,MAAM,GAAG,EACrCG,IAAa,iBAEX,CAACF,GAAcA,EAAW,MAAM,GAAG,EAAE,SAAS,QAAQ,KACxDL,EAAkBO,CAAQ,EAAIhB,EAAMe,GAGtCN,EAAkBO,CAAQ,EAAIhB,EAAMe,CAI3C,MACQJ,EACTF,EAAkB,IAAMT,EAAMF,GAAsBa,EAAkBX,CAAG,EAChErD,IAAe,MACxB8D,EAAkB,IAAMT,EAAM,GAAK,KAGrC,OAAOS,CACT,CClEA,SAASQ,GAAiBC,EAAKC,EAAO,CAEpC,OAAOD,GAAoBC,EAAK,CAClC,CCrCA,MAAMC,GAAqB,IAG3B,SAASC,GAAmB7B,EAAK,CAC/B,MAAM8B,EAAW9B,EAAI,SAAW,GAAGA,EAAI,QAAQ,IAAM,GAC/C+B,EAAO/B,EAAI,KAAO,IAAIA,EAAI,IAAI,GAAK,GACzC,MAAO,GAAG8B,CAAQ,KAAK9B,EAAI,IAAI,GAAG+B,CAAI,GAAG/B,EAAI,KAAO,IAAIA,EAAI,IAAI,GAAK,EAAE,OACzE,CAGA,SAASgC,GAAmBhC,EAAK,CAC/B,MAAO,GAAG6B,GAAmB7B,CAAG,CAAC,GAAGA,EAAI,SAAS,YACnD,CAGA,SAASiC,GAAajC,EAAKkC,EAAS,CAClC,OAAOC,GAAU,CAGf,WAAYnC,EAAI,UAChB,eAAgB4B,GAChB,GAAIM,GAAW,CAAE,cAAe,GAAGA,EAAQ,IAAI,IAAIA,EAAQ,OAAO,GACtE,CAAG,CACH,CAOA,SAASE,GAAsCpC,EAAKqC,EAAQH,EAAS,CACnE,OAAOG,GAAkB,GAAGL,GAAmBhC,CAAG,CAAC,IAAIiC,GAAajC,EAAKkC,CAAO,CAAC,EACnF,CAGA,SAASI,GACPC,EACAC,EAGA,CACA,MAAMxC,EAAMyC,GAAQF,CAAO,EAC3B,GAAI,CAACvC,EACH,MAAO,GAGT,MAAM0C,EAAW,GAAGb,GAAmB7B,CAAG,CAAC,oBAE3C,IAAI2C,EAAiB,OAAOC,GAAY5C,CAAG,CAAC,GAC5C,UAAWtE,KAAO8G,EAChB,GAAI9G,IAAQ,OAIRA,IAAQ,UAIZ,GAAIA,IAAQ,OAAQ,CAClB,MAAMmH,EAAOL,EAAc,KAC3B,GAAI,CAACK,EACH,SAEEA,EAAK,OACPF,GAAkB,SAAS,mBAAmBE,EAAK,IAAI,CAAC,IAEtDA,EAAK,QACPF,GAAkB,UAAU,mBAAmBE,EAAK,KAAK,CAAC,GAElE,MACMF,GAAkB,IAAI,mBAAmBjH,CAAG,CAAC,IAAI,mBAAmB8G,EAAc9G,CAAG,CAAC,CAAE,GAI5F,MAAO,GAAGgH,CAAQ,IAAIC,CAAc,EACtC,CCzEA,MAAMG,GAAwB,CAAA,EAU9B,SAASC,GAAiBC,EAAc,CACtC,MAAMC,EAAqB,CAAA,EAE3B,OAAAD,EAAa,QAAQE,GAAmB,CACtC,KAAM,CAAE,KAAAC,CAAM,EAAGD,EAEXE,EAAmBH,EAAmBE,CAAI,EAI5CC,GAAoB,CAACA,EAAiB,mBAAqBF,EAAgB,oBAI/ED,EAAmBE,CAAI,EAAID,EAC/B,CAAG,EAEM,OAAO,OAAOD,CAAkB,CACzC,CAGA,SAASI,GAAuBC,EAAS,CACvC,MAAMC,EAAsBD,EAAQ,qBAAuB,GACrDE,EAAmBF,EAAQ,aAGjCC,EAAoB,QAAQE,GAAe,CACzCA,EAAY,kBAAoB,EACpC,CAAG,EAED,IAAIT,EAEA,MAAM,QAAQQ,CAAgB,EAChCR,EAAe,CAAC,GAAGO,EAAqB,GAAGC,CAAgB,EAClD,OAAOA,GAAqB,WACrCR,EAAeU,GAASF,EAAiBD,CAAmB,CAAC,EAE7DP,EAAeO,EAGjB,MAAMI,EAAoBZ,GAAiBC,CAAY,EAMjDY,EAAaD,EAAkB,UAAUF,GAAeA,EAAY,OAAS,OAAO,EAC1F,GAAIG,EAAa,GAAI,CACnB,KAAM,CAACC,CAAa,EAAIF,EAAkB,OAAOC,EAAY,CAAC,EAC9DD,EAAkB,KAAKE,CAAa,CACrC,CAED,OAAOF,CACT,CAQA,SAASG,GAAkBC,EAAQf,EAAc,CAC/C,MAAMgB,EAAmB,CAAA,EAEzB,OAAAhB,EAAa,QAAQS,GAAe,CAE9BA,GACFQ,GAAiBF,EAAQN,EAAaO,CAAgB,CAE5D,CAAG,EAEMA,CACT,CAKA,SAASE,GAAuBH,EAAQf,EAAc,CACpD,UAAWS,KAAeT,EAEpBS,GAAeA,EAAY,eAC7BA,EAAY,cAAcM,CAAM,CAGtC,CAGA,SAASE,GAAiBF,EAAQN,EAAaO,EAAkB,CAC/D,GAAIA,EAAiBP,EAAY,IAAI,EAAG,CACtCU,GAAeC,EAAO,IAAI,yDAAyDX,EAAY,IAAI,EAAE,EACrG,MACD,CAcD,GAbAO,EAAiBP,EAAY,IAAI,EAAIA,EAGjCX,GAAsB,QAAQW,EAAY,IAAI,IAAM,IAAM,OAAOA,EAAY,WAAc,aAC7FA,EAAY,UAAS,EACrBX,GAAsB,KAAKW,EAAY,IAAI,GAIzCA,EAAY,OAAS,OAAOA,EAAY,OAAU,YACpDA,EAAY,MAAMM,CAAM,EAGtB,OAAON,EAAY,iBAAoB,WAAY,CACrD,MAAMY,EAAWZ,EAAY,gBAAgB,KAAKA,CAAW,EAC7DM,EAAO,GAAG,kBAAmB,CAACnI,EAAOC,IAASwI,EAASzI,EAAOC,EAAMkI,CAAM,CAAC,CAC5E,CAED,GAAI,OAAON,EAAY,cAAiB,WAAY,CAClD,MAAMY,EAAWZ,EAAY,aAAa,KAAKA,CAAW,EAEpDa,EAAY,OAAO,OAAO,CAAC1I,EAAOC,IAASwI,EAASzI,EAAOC,EAAMkI,CAAM,EAAG,CAC9E,GAAIN,EAAY,IACtB,CAAK,EAEDM,EAAO,kBAAkBO,CAAS,CACnC,CAEDH,GAAeC,EAAO,IAAI,0BAA0BX,EAAY,IAAI,EAAE,CACxE,CC5HA,MAAMc,GAAqB,8DAiC3B,MAAMC,EAAW,CAkBd,YAAYlB,EAAS,CAcpB,GAbA,KAAK,SAAWA,EAChB,KAAK,cAAgB,GACrB,KAAK,eAAiB,EACtB,KAAK,UAAY,GACjB,KAAK,OAAS,GACd,KAAK,iBAAmB,GAEpBA,EAAQ,IACV,KAAK,KAAOb,GAAQa,EAAQ,GAAG,EAE/Ba,GAAeC,EAAO,KAAK,+CAA+C,EAGxE,KAAK,KAAM,CACb,MAAMK,EAAMrC,GACV,KAAK,KACLkB,EAAQ,OACRA,EAAQ,UAAYA,EAAQ,UAAU,IAAM,MACpD,EACM,KAAK,WAAaA,EAAQ,UAAU,CAClC,OAAQ,KAAK,SAAS,OACtB,mBAAoB,KAAK,mBAAmB,KAAK,IAAI,EACrD,GAAGA,EAAQ,iBACX,IAAAmB,CACR,CAAO,CACF,CACF,CAMA,iBAAiBrI,EAAWP,EAAM6I,EAAO,CACxC,MAAMC,EAAUC,KAGhB,GAAIC,GAAwBzI,CAAS,EACnC+H,OAAAA,GAAeC,EAAO,IAAIG,EAAkB,EACrCI,EAGT,MAAMG,EAAkB,CACtB,SAAUH,EACV,GAAG9I,CACT,EAEI,YAAK,SACH,KAAK,mBAAmBO,EAAW0I,CAAe,EAAE,KAAKlJ,GACvD,KAAK,cAAcA,EAAOkJ,EAAiBJ,CAAK,CACjD,CACP,EAEWI,EAAgB,QACxB,CAKA,eACCzH,EACAU,EACAlC,EACAkJ,EACA,CACA,MAAMD,EAAkB,CACtB,SAAUF,GAAO,EACjB,GAAG/I,CACT,EAEUmJ,EAAeC,GAAsB5H,CAAO,EAAIA,EAAU,OAAOA,CAAO,EAExE6H,EAAgBC,GAAY9H,CAAO,EACrC,KAAK,iBAAiB2H,EAAcjH,EAAO+G,CAAe,EAC1D,KAAK,mBAAmBzH,EAASyH,CAAe,EAEpD,YAAK,SAASI,EAAc,KAAKtJ,GAAS,KAAK,cAAcA,EAAOkJ,EAAiBC,CAAY,CAAC,CAAC,EAE5FD,EAAgB,QACxB,CAKA,aAAalJ,EAAOC,EAAMkJ,EAAc,CACvC,MAAMJ,EAAUC,KAGhB,GAAI/I,GAAQA,EAAK,mBAAqBgJ,GAAwBhJ,EAAK,iBAAiB,EAClFsI,OAAAA,GAAeC,EAAO,IAAIG,EAAkB,EACrCI,EAGT,MAAMG,EAAkB,CACtB,SAAUH,EACV,GAAG9I,CACT,EAGUuJ,GADwBxJ,EAAM,uBAAyB,IACb,kBAEhD,YAAK,SAAS,KAAK,cAAcA,EAAOkJ,EAAiBM,GAAqBL,CAAY,CAAC,EAEpFD,EAAgB,QACxB,CAKA,eAAeO,EAAS,CACjB,OAAOA,EAAQ,SAAY,SAC/BlB,GAAeC,EAAO,KAAK,4DAA4D,GAEvF,KAAK,YAAYiB,CAAO,EAExBC,GAAcD,EAAS,CAAE,KAAM,EAAO,CAAA,EAEzC,CAKA,QAAS,CACR,OAAO,KAAK,IACb,CAKA,YAAa,CACZ,OAAO,KAAK,QACb,CAOA,gBAAiB,CAChB,OAAO,KAAK,SAAS,SACtB,CAKA,cAAe,CACd,OAAO,KAAK,UACb,CAKA,MAAMjG,EAAS,CACd,MAAMmG,EAAY,KAAK,WACvB,OAAIA,GACF,KAAK,KAAK,OAAO,EACV,KAAK,wBAAwBnG,CAAO,EAAE,KAAKoG,GACzCD,EAAU,MAAMnG,CAAO,EAAE,KAAKqG,GAAoBD,GAAkBC,CAAgB,CAC5F,GAEM9F,GAAoB,EAAI,CAElC,CAKA,MAAMP,EAAS,CACd,OAAO,KAAK,MAAMA,CAAO,EAAE,KAAKsG,IAC9B,KAAK,WAAU,EAAG,QAAU,GAC5B,KAAK,KAAK,OAAO,EACVA,EACR,CACF,CAGA,oBAAqB,CACpB,OAAO,KAAK,gBACb,CAGA,kBAAkBC,EAAgB,CACjC,KAAK,iBAAiB,KAAKA,CAAc,CAC1C,CAGA,MAAO,EAEJ,KAAK,WAAY,GAMjB,KAAK,SAAS,aAAa,KAAK,CAAC,CAAE,KAAAxC,CAAI,IAAOA,EAAK,WAAW,WAAW,CAAC,IAE1E,KAAK,mBAAkB,CAE1B,CAOA,qBAAqByC,EAAiB,CACrC,OAAO,KAAK,cAAcA,CAAe,CAC1C,CAKA,eAAenC,EAAa,CAC3B,MAAMoC,EAAqB,KAAK,cAAcpC,EAAY,IAAI,EAG9DQ,GAAiB,KAAMR,EAAa,KAAK,aAAa,EAEjDoC,GACH3B,GAAuB,KAAM,CAACT,CAAW,CAAC,CAE7C,CAKA,UAAU7H,EAAOC,EAAO,GAAI,CAC3B,KAAK,KAAK,kBAAmBD,EAAOC,CAAI,EAExC,IAAIiK,EAAMC,GAAoBnK,EAAO,KAAK,KAAM,KAAK,SAAS,UAAW,KAAK,SAAS,MAAM,EAE7F,UAAWoK,KAAcnK,EAAK,aAAe,CAAA,EAC3CiK,EAAMG,GAAkBH,EAAKI,GAA6BF,CAAU,CAAC,EAGvE,MAAMG,EAAU,KAAK,aAAaL,CAAG,EACjCK,GACFA,EAAQ,KAAKC,GAAgB,KAAK,KAAK,iBAAkBxK,EAAOwK,CAAY,EAAG,IAAI,CAEtF,CAKA,YAAYf,EAAS,CACpB,MAAMS,EAAMO,GAAsBhB,EAAS,KAAK,KAAM,KAAK,SAAS,UAAW,KAAK,SAAS,MAAM,EAInG,KAAK,aAAaS,CAAG,CACtB,CAKA,mBAAmBQ,EAAQ9E,EAAU+E,EAAc,CAClD,GAAI,KAAK,SAAS,kBAAmB,CAGnC,MAAMC,EAAQ,OAAOD,GAAiB,SAAWA,EAAe,EAQ1D7K,EAAM,GAAG4K,CAAM,IAAI9E,CAAQ,GACjC2C,GAAeC,EAAO,IAAI,uBAAuB1I,CAAG,IAAI8K,EAAQ,EAAI,KAAKA,CAAK,UAAY,EAAE,EAAE,EAC9F,KAAK,UAAU9K,CAAG,GAAK,KAAK,UAAUA,CAAG,GAAK,GAAK8K,CACpD,CACF,CAQA,GAAGC,EAAMpC,EAAU,CAClB,MAAMqC,EAAS,KAAK,OAAOD,CAAI,EAAI,KAAK,OAAOA,CAAI,GAAK,CAAA,EAGxD,OAAAC,EAAM,KAAKrC,CAAQ,EAMZ,IAAM,CAEX,MAAMsC,EAAUD,EAAM,QAAQrC,CAAQ,EAClCsC,EAAU,IACZD,EAAM,OAAOC,EAAS,CAAC,CAE/B,CACG,CAKA,KAAKF,KAASG,EAAM,CACnB,MAAMC,EAAY,KAAK,OAAOJ,CAAI,EAC9BI,GACFA,EAAU,QAAQxC,GAAYA,EAAS,GAAGuC,CAAI,CAAC,CAElD,CAKA,aAAaE,EAAU,CAGtB,OAFA,KAAK,KAAK,iBAAkBA,CAAQ,EAEhC,KAAK,cAAgB,KAAK,WACrB,KAAK,WAAW,KAAKA,CAAQ,EAAE,KAAK,KAAMR,IAC/CnC,GAAeC,EAAO,MAAM,gCAAiCkC,CAAM,EAC5DA,EACR,GAGHnC,GAAeC,EAAO,MAAM,oBAAoB,EAEzCzE,GAAoB,CAAA,CAAE,EAC9B,CAKA,oBAAqB,CACpB,KAAM,CAAE,aAAAqD,CAAY,EAAK,KAAK,SAC9B,KAAK,cAAgBc,GAAkB,KAAMd,CAAY,EACzDkB,GAAuB,KAAMlB,CAAY,CAC1C,CAGA,wBAAwBqC,EAASzJ,EAAO,CACvC,IAAImL,EAAU,GACVC,EAAU,GACd,MAAMjK,EAAanB,EAAM,WAAaA,EAAM,UAAU,OAEtD,GAAImB,EAAY,CACdiK,EAAU,GAEV,UAAWC,KAAMlK,EAAY,CAC3B,MAAMmK,EAAYD,EAAG,UACrB,GAAIC,GAAaA,EAAU,UAAY,GAAO,CAC5CH,EAAU,GACV,KACD,CACF,CACF,CAKD,MAAMI,EAAqB9B,EAAQ,SAAW,MACjB8B,GAAsB9B,EAAQ,SAAW,GAAO8B,GAAsBJ,KAGjGzB,GAAcD,EAAS,CACrB,GAAI0B,GAAW,CAAE,OAAQ,WACzB,OAAQ1B,EAAQ,QAAU,OAAO2B,GAAWD,CAAO,CAC3D,CAAO,EACD,KAAK,eAAe1B,CAAO,EAE9B,CAYA,wBAAwBjG,EAAS,CAChC,OAAO,IAAIC,GAAYC,GAAW,CAChC,IAAI8H,EAAS,EACb,MAAMC,EAAO,EAEPC,EAAW,YAAY,IAAM,CAC7B,KAAK,gBAAkB,GACzB,cAAcA,CAAQ,EACtBhI,EAAQ,EAAI,IAEZ8H,GAAUC,EACNjI,GAAWgI,GAAUhI,IACvB,cAAckI,CAAQ,EACtBhI,EAAQ,EAAK,GAGlB,EAAE+H,CAAI,CACb,CAAK,CACF,CAGA,YAAa,CACZ,OAAO,KAAK,aAAa,UAAY,IAAS,KAAK,aAAe,MACnE,CAgBA,cACCzL,EACAC,EACAkJ,EACAwC,EAAiBC,GAAmB,EACpC,CACA,MAAMlE,EAAU,KAAK,aACfN,EAAe,OAAO,KAAK,KAAK,aAAa,EACnD,MAAI,CAACnH,EAAK,cAAgBmH,EAAa,OAAS,IAC9CnH,EAAK,aAAemH,GAGtB,KAAK,KAAK,kBAAmBpH,EAAOC,CAAI,EAEnCD,EAAM,MACT2L,EAAe,eAAe3L,EAAM,UAAYC,EAAK,QAAQ,EAGxD4L,GAAanE,EAAS1H,EAAOC,EAAMkJ,EAAc,KAAMwC,CAAc,EAAE,KAAKG,GAAO,CACxF,GAAIA,IAAQ,KACV,OAAOA,EAGT,MAAMC,EAAqB,CACzB,GAAGJ,EAAe,sBAAuB,EACzC,GAAIxC,EAAeA,EAAa,sBAAqB,EAAK,MAClE,EAGM,GAAI,EADU2C,EAAI,UAAYA,EAAI,SAAS,QAC7BC,EAAoB,CAChC,KAAM,CAAE,QAASC,EAAU,OAAAC,EAAQ,aAAAC,EAAc,IAAAC,CAAK,EAAGJ,EACzDD,EAAI,SAAW,CACb,MAAOM,GAAkB,CACvB,SAAAJ,EACA,QAASC,EACT,eAAgBC,CAC5B,CAAW,EACD,GAAGJ,EAAI,QACjB,EAEQ,MAAMO,EAAyBF,GAAYG,GAAoCN,EAAU,IAAI,EAE7FF,EAAI,sBAAwB,CAC1B,uBAAAO,EACA,GAAGP,EAAI,qBACjB,CACO,CACD,OAAOA,CACb,CAAK,CACF,CAQA,cAAc9L,EAAOC,EAAO,CAAA,EAAI6I,EAAO,CACtC,OAAO,KAAK,cAAc9I,EAAOC,EAAM6I,CAAK,EAAE,KAC5CyD,GACSA,EAAW,SAEpB7B,GAAU,CACR,GAAInC,EAAa,CAGf,MAAMiE,EAAc9B,EAChB8B,EAAY,WAAa,MAC3BhE,EAAO,IAAIgE,EAAY,OAAO,EAE9BhE,EAAO,KAAKgE,CAAW,CAE1B,CAEF,CACP,CACG,CAeA,cAAcxM,EAAOC,EAAMkJ,EAAc,CACxC,MAAMzB,EAAU,KAAK,aACf,CAAE,WAAA+E,CAAY,EAAG/E,EAEjBgF,EAAgBC,GAAmB3M,CAAK,EACxC4M,EAAUC,GAAa7M,CAAK,EAC5B8M,EAAY9M,EAAM,MAAQ,QAC1B+M,EAAkB,0BAA0BD,CAAS,KAKrDE,EAAmB,OAAOP,EAAe,IAAc,OAAYQ,GAAgBR,CAAU,EACnG,GAAIG,GAAW,OAAOI,GAAqB,UAAY,KAAK,OAAQ,EAAGA,EACrE,YAAK,mBAAmB,cAAe,QAAShN,CAAK,EAC9CsD,GACL,IAAI9B,GACF,oFAAoFiL,CAAU,IAC9F,KACD,CACT,EAGI,MAAMxH,EAAe6H,IAAc,eAAiB,SAAWA,EAGzDI,GADwBlN,EAAM,uBAAyB,IACJ,2BAEzD,OAAO,KAAK,cAAcA,EAAOC,EAAMkJ,EAAc+D,CAA0B,EAC5E,KAAKC,GAAY,CAChB,GAAIA,IAAa,KACf,WAAK,mBAAmB,kBAAmBlI,EAAcjF,CAAK,EACxD,IAAIwB,GAAY,2DAA4D,KAAK,EAIzF,GAD4BvB,EAAK,MAASA,EAAK,KAAO,aAAe,GAEnE,OAAOkN,EAGT,MAAMrD,EAASsD,GAAkB,KAAM1F,EAASyF,EAAUlN,CAAI,EAC9D,OAAOoN,GAA0BvD,EAAQiD,CAAe,CAChE,CAAO,EACA,KAAKO,GAAkB,CACtB,GAAIA,IAAmB,KAAM,CAE3B,GADA,KAAK,mBAAmB,cAAerI,EAAcjF,CAAK,EACtD0M,EAAe,CAGjB,MAAMa,EAAY,GAFJvN,EAAM,OAAS,IAED,OAC5B,KAAK,mBAAmB,cAAe,OAAQuN,CAAS,CACzD,CACD,MAAM,IAAI/L,GAAY,GAAGuL,CAAe,2CAA4C,KAAK,CAC1F,CAED,MAAMtD,EAAUN,GAAgBA,EAAa,WAAU,EAKvD,GAJI,CAACuD,GAAiBjD,GACpB,KAAK,wBAAwBA,EAAS6D,CAAc,EAGlDZ,EAAe,CACjB,MAAMc,EACHF,EAAe,uBAAyBA,EAAe,sBAAsB,2BAC9E,EACIG,EAAiBH,EAAe,MAAQA,EAAe,MAAM,OAAS,EAEtEI,EAAmBF,EAAkBC,EACvCC,EAAmB,GACrB,KAAK,mBAAmB,cAAe,OAAQA,CAAgB,CAElE,CAKD,MAAMC,EAAkBL,EAAe,iBACvC,GAAIZ,GAAiBiB,GAAmBL,EAAe,cAAgBtN,EAAM,YAAa,CACxF,MAAMiB,EAAS,SACfqM,EAAe,iBAAmB,CAChC,GAAGK,EACH,OAAA1M,CACZ,CACS,CAED,YAAK,UAAUqM,EAAgBrN,CAAI,EAC5BqN,CACf,CAAO,EACA,KAAK,KAAM5C,GAAU,CACpB,MAAIA,aAAkBlJ,GACdkJ,GAGR,KAAK,iBAAiBA,EAAQ,CAC5B,KAAM,CACJ,WAAY,EACb,EACD,kBAAmBA,CAC7B,CAAS,EACK,IAAIlJ,GACR;AAAA,UAA8HkJ,CAAM,EAC9I,EACA,CAAO,CACJ,CAKA,SAASH,EAAS,CACjB,KAAK,iBACAA,EAAQ,KACXqD,IACE,KAAK,iBACEA,GAETlD,IACE,KAAK,iBACEA,EAEf,CACG,CAKA,gBAAiB,CAChB,MAAMmD,EAAW,KAAK,UACtB,YAAK,UAAY,GACV,OAAO,QAAQA,CAAQ,EAAE,IAAI,CAAC,CAAC/N,EAAKgO,CAAQ,IAAM,CACvD,KAAM,CAACpD,EAAQ9E,CAAQ,EAAI9F,EAAI,MAAM,GAAG,EACxC,MAAO,CACL,OAAA4K,EACA,SAAA9E,EACA,SAAAkI,CACR,CACA,CAAK,CACF,CAKA,gBAAiB,CAChBvF,GAAeC,EAAO,IAAI,sBAAsB,EAEhD,MAAMqF,EAAW,KAAK,iBAEtB,GAAIA,EAAS,SAAW,EAAG,CACzBtF,GAAeC,EAAO,IAAI,qBAAqB,EAC/C,MACD,CAGD,GAAI,CAAC,KAAK,KAAM,CACdD,GAAeC,EAAO,IAAI,yCAAyC,EACnE,MACD,CAEDD,GAAeC,EAAO,IAAI,oBAAqBqF,CAAQ,EAEvD,MAAM3C,EAAWhH,GAA2B2J,EAAU,KAAK,SAAS,QAAU7G,GAAY,KAAK,IAAI,CAAC,EAIpG,KAAK,aAAakE,CAAQ,CAC3B,CAOH,CAKA,SAASmC,GACPU,EACAhB,EACA,CACA,MAAMiB,EAAoB,GAAGjB,CAAe,0CAC5C,GAAIkB,GAAWF,CAAgB,EAC7B,OAAOA,EAAiB,KACtB/N,GAAS,CACP,GAAI,CAACkO,GAAclO,CAAK,GAAKA,IAAU,KACrC,MAAM,IAAIwB,GAAYwM,CAAiB,EAEzC,OAAOhO,CACR,EACDmO,GAAK,CACH,MAAM,IAAI3M,GAAY,GAAGuL,CAAe,kBAAkBoB,CAAC,EAAE,CAC9D,CACP,EACS,GAAI,CAACD,GAAcH,CAAgB,GAAKA,IAAqB,KAClE,MAAM,IAAIvM,GAAYwM,CAAiB,EAEzC,OAAOD,CACT,CAKA,SAASX,GACPjF,EACAT,EACA1H,EACAC,EACA,CACA,KAAM,CAAE,WAAAmO,EAAY,sBAAAC,EAAuB,eAAAC,CAAc,EAAK5G,EAE9D,GAAImF,GAAa7M,CAAK,GAAKoO,EACzB,OAAOA,EAAWpO,EAAOC,CAAI,EAG/B,GAAI0M,GAAmB3M,CAAK,EAAG,CAC7B,GAAIA,EAAM,OAASsO,EAAgB,CACjC,MAAMC,EAAiB,CAAA,EACvB,UAAWC,KAAQxO,EAAM,MAAO,CAC9B,MAAMyO,EAAgBH,EAAeE,CAAI,EACrCC,EACFF,EAAe,KAAKE,CAAa,EAEjCtG,EAAO,mBAAmB,cAAe,MAAM,CAElD,CACDnI,EAAM,MAAQuO,CACf,CAED,GAAIF,EAAuB,CACzB,GAAIrO,EAAM,MAAO,CAGf,MAAMwN,EAAkBxN,EAAM,MAAM,OACpCA,EAAM,sBAAwB,CAC5B,GAAGA,EAAM,sBACT,0BAA2BwN,CACrC,CACO,CACD,OAAOa,EAAsBrO,EAAOC,CAAI,CACzC,CACF,CAED,OAAOD,CACT,CAEA,SAAS6M,GAAa7M,EAAO,CAC3B,OAAOA,EAAM,OAAS,MACxB,CAEA,SAAS2M,GAAmB3M,EAAO,CACjC,OAAOA,EAAM,OAAS,aACxB,CCvyBA,SAAS0O,GACPC,EACAjH,EACA,CACIA,EAAQ,QAAU,KAChBa,EACFC,EAAO,OAAM,EAGboG,GAAe,IAAM,CAEnB,QAAQ,KAAK,8EAA8E,CACnG,CAAO,GAGSC,KACR,OAAOnH,EAAQ,YAAY,EAEjC,MAAMS,EAAS,IAAIwG,EAAYjH,CAAO,EACtC,OAAAoH,GAAiB3G,CAAM,EACvBA,EAAO,KAAI,EACJA,CACT,CAKA,SAAS2G,GAAiB3G,EAAQ,CAChC0G,GAAiB,EAAC,UAAU1G,CAAM,CACpC,CCvCA,MAAM4G,GAAgC,GAQtC,SAASC,GACPtH,EACAuH,EACAjM,EAASD,GACP2E,EAAQ,YAAcqH,EACvB,EACD,CACA,IAAIG,EAAa,CAAA,EACjB,MAAMC,EAAS3L,GAAYR,EAAO,MAAMQ,CAAO,EAE/C,SAAS4L,EAAKlE,EAAU,CACtB,MAAMmE,EAAwB,CAAA,EAc9B,GAXAC,GAAoBpE,EAAU,CAACpH,EAAMjC,IAAS,CAC5C,MAAMoD,EAAesK,GAA+B1N,CAAI,EACxD,GAAIqD,GAAcgK,EAAYjK,CAAY,EAAG,CAC3C,MAAMjF,EAAQwP,GAAwB1L,EAAMjC,CAAI,EAChD6F,EAAQ,mBAAmB,oBAAqBzC,EAAcjF,CAAK,CAC3E,MACQqP,EAAsB,KAAKvL,CAAI,CAEvC,CAAK,EAGGuL,EAAsB,SAAW,EACnC,OAAOtL,GAAoB,CAAA,CAAE,EAI/B,MAAM0L,EAAmBjL,GAAe0G,EAAS,CAAC,EAAGmE,CAAqB,EAGpEK,EAAsBhF,GAAW,CACrC4E,GAAoBG,EAAkB,CAAC3L,EAAMjC,IAAS,CACpD,MAAM7B,EAAQwP,GAAwB1L,EAAMjC,CAAI,EAChD6F,EAAQ,mBAAmBgD,EAAQ6E,GAA+B1N,CAAI,EAAG7B,CAAK,CACtF,CAAO,CACP,EAEU2P,EAAc,IAClBV,EAAY,CAAE,KAAMW,GAAkBH,CAAgB,CAAC,CAAE,EAAE,KACzDI,IAEMA,EAAS,aAAe,SAAcA,EAAS,WAAa,KAAOA,EAAS,YAAc,MAC5FtH,GAAeC,EAAO,KAAK,qCAAqCqH,EAAS,UAAU,iBAAiB,EAGtGX,EAAa/J,GAAiB+J,EAAYW,CAAQ,EAC3CA,GAETvP,GAAS,CACP,MAAAoP,EAAmB,eAAe,EAC5BpP,CACP,CACT,EAEI,OAAO0C,EAAO,IAAI2M,CAAW,EAAE,KAC7B7F,GAAUA,EACVxJ,GAAS,CACP,GAAIA,aAAiBkB,GACnB+G,OAAAA,GAAeC,EAAO,MAAM,+CAA+C,EAC3EkH,EAAmB,gBAAgB,EAC5B3L,GAAoB,CAAA,CAAE,EAE7B,MAAMzD,CAET,CACP,CACG,CAED,MAAO,CACL,KAAA8O,EACA,MAAAD,CACJ,CACA,CAEA,SAASK,GAAwB1L,EAAMjC,EAAM,CAC3C,GAAI,EAAAA,IAAS,SAAWA,IAAS,eAIjC,OAAO,MAAM,QAAQiC,CAAI,EAAKA,EAAO,CAAC,EAAI,MAC5C,CCzFA,SAASgM,GAAmBjH,EAAKV,EAAQ,CACvC,MAAM/D,EAAM+D,GAAUA,EAAO,OAAM,EAC7B1B,EAAS0B,GAAUA,EAAO,WAAU,EAAG,OAC7C,OAAO4H,GAASlH,EAAKzE,CAAG,GAAK4L,GAAYnH,EAAKpC,CAAM,CACtD,CAEA,SAASuJ,GAAYnH,EAAKpC,EAAQ,CAChC,OAAKA,EAIEwJ,GAAoBpH,CAAG,IAAMoH,GAAoBxJ,CAAM,EAHrD,EAIX,CAEA,SAASsJ,GAASlH,EAAKzE,EAAK,CAC1B,OAAOA,EAAMyE,EAAI,SAASzE,EAAI,IAAI,EAAI,EACxC,CAEA,SAAS6L,GAAoBC,EAAK,CAChC,OAAOA,EAAIA,EAAI,OAAS,CAAC,IAAM,IAAMA,EAAI,MAAM,EAAG,EAAE,EAAIA,CAC1D,CCVA,SAASC,GAAiBzI,EAASH,EAAM6I,EAAQ,CAAC7I,CAAI,EAAGtG,EAAS,MAAO,CACvE,MAAMoP,EAAW3I,EAAQ,WAAa,GAEjC2I,EAAS,MACZA,EAAS,IAAM,CACb,KAAM,qBAAqB9I,CAAI,GAC/B,SAAU6I,EAAM,IAAI7I,IAAS,CAC3B,KAAM,GAAGtG,CAAM,YAAYsG,CAAI,GAC/B,QAAS+I,EACjB,EAAQ,EACF,QAASA,EACf,GAGE5I,EAAQ,UAAY2I,CACtB,CCvBA,MAAME,GAAsB,IAQ5B,SAASC,GAAcC,EAAYxQ,EAAM,CACvC,MAAMkI,EAASuI,IACT/E,EAAiBC,KAEvB,GAAI,CAACzD,EAAQ,OAEb,KAAM,CAAE,iBAAAwI,EAAmB,KAAM,eAAAC,EAAiBL,IAAwBpI,EAAO,aAEjF,GAAIyI,GAAkB,EAAG,OAGzB,MAAMC,EAAmB,CAAE,UADTtM,KACoB,GAAGkM,CAAU,EAC7CK,EAAkBH,EACnB/B,GAAe,IAAM+B,EAAiBE,EAAkB5Q,CAAI,CAAC,EAC9D4Q,EAEAC,IAAoB,OAEpB3I,EAAO,MACTA,EAAO,KAAK,sBAAuB2I,EAAiB7Q,CAAI,EAG1D0L,EAAe,cAAcmF,EAAiBF,CAAc,EAC9D,CClCA,IAAIG,GAEJ,MAAMC,GAAmB,mBAEnBC,GAAgB,IAAI,QAEpBC,GAAgC,KAC7B,CACL,KAAMF,GACN,WAAY,CAEVD,GAA2B,SAAS,UAAU,SAI9C,GAAI,CAEF,SAAS,UAAU,SAAW,YAAcxO,EAAM,CAChD,MAAM4O,EAAmBC,GAAoB,IAAI,EAC3CC,EACJJ,GAAc,IAAIP,EAAW,CAAA,GAAMS,IAAqB,OAAYA,EAAmB,KACzF,OAAOJ,GAAyB,MAAMM,EAAS9O,CAAI,CAC7D,CACO,MAAW,CAEX,CACF,EACD,MAAM4F,EAAQ,CACZ8I,GAAc,IAAI9I,EAAQ,EAAI,CAC/B,CACL,GAcMmJ,GAAgDJ,GC1ChDK,GAAwB,CAC5B,oBACA,gDACA,kEACA,wCACA,gDACA,oDACA,gHACA,+CACF,EAIMP,GAAmB,iBACnBQ,GAA8B,CAAC9J,EAAU,MACtC,CACL,KAAMsJ,GACN,aAAahR,EAAOyR,EAAOtJ,EAAQ,CACjC,MAAMuJ,EAAgBvJ,EAAO,aACvBwJ,EAAgBC,GAAclK,EAASgK,CAAa,EAC1D,OAAOG,GAAiB7R,EAAO2R,CAAa,EAAI,KAAO3R,CACxD,CACL,GAGM8R,GAA8CN,GAEpD,SAASI,GACPG,EAAkB,CAAE,EACpBL,EAAgB,CAAE,EAClB,CACA,MAAO,CACL,UAAW,CAAC,GAAIK,EAAgB,WAAa,CAAA,EAAK,GAAIL,EAAc,WAAa,CAAA,CAAG,EACpF,SAAU,CAAC,GAAIK,EAAgB,UAAY,CAAA,EAAK,GAAIL,EAAc,UAAY,CAAA,CAAG,EACjF,aAAc,CACZ,GAAIK,EAAgB,cAAgB,GACpC,GAAIL,EAAc,cAAgB,GAClC,GAAIK,EAAgB,qBAAuB,CAAE,EAAGR,EACjD,EACD,mBAAoB,CAAC,GAAIQ,EAAgB,oBAAsB,CAAA,EAAK,GAAIL,EAAc,oBAAsB,CAAA,CAAG,EAC/G,eAAgBK,EAAgB,iBAAmB,OAAYA,EAAgB,eAAiB,EACpG,CACA,CAEA,SAASF,GAAiB7R,EAAO0H,EAAS,CACxC,OAAIA,EAAQ,gBAAkBsK,GAAehS,CAAK,GAChDuI,GACEC,EAAO,KAAK;AAAA,SAA6DyJ,GAAoBjS,CAAK,CAAC,EAAE,EAChG,IAELkS,GAAgBlS,EAAO0H,EAAQ,YAAY,GAC7Ca,GACEC,EAAO,KACL;AAAA,SAA0EyJ,GAAoBjS,CAAK,CAAC,EAC5G,EACW,IAELmS,GAAgBnS,CAAK,GACvBuI,GACEC,EAAO,KACL;AAAA,SAAuFyJ,GACrFjS,CACV,CAAS,EACT,EACW,IAELoS,GAAsBpS,EAAO0H,EAAQ,kBAAkB,GACzDa,GACEC,EAAO,KACL;AAAA,SAAgFyJ,GAAoBjS,CAAK,CAAC,EAClH,EACW,IAELqS,GAAarS,EAAO0H,EAAQ,QAAQ,GACtCa,GACEC,EAAO,KACL;AAAA,SAAsEyJ,GACpEjS,CACD,CAAA;AAAA,OAAWsS,GAAmBtS,CAAK,CAAC,EAC7C,EACW,IAEJuS,GAAcvS,EAAO0H,EAAQ,SAAS,EASpC,IARLa,GACEC,EAAO,KACL;AAAA,SAA2EyJ,GACzEjS,CACD,CAAA;AAAA,OAAWsS,GAAmBtS,CAAK,CAAC,EAC7C,EACW,GAGX,CAEA,SAASkS,GAAgBlS,EAAOwS,EAAc,CAE5C,OAAIxS,EAAM,MAAQ,CAACwS,GAAgB,CAACA,EAAa,OACxC,GAGFC,GAA0BzS,CAAK,EAAE,KAAKyB,GAAWiR,GAAyBjR,EAAS+Q,CAAY,CAAC,CACzG,CAEA,SAASJ,GAAsBpS,EAAO2S,EAAoB,CACxD,GAAI3S,EAAM,OAAS,eAAiB,CAAC2S,GAAsB,CAACA,EAAmB,OAC7E,MAAO,GAGT,MAAMpL,EAAOvH,EAAM,YACnB,OAAOuH,EAAOmL,GAAyBnL,EAAMoL,CAAkB,EAAI,EACrE,CAEA,SAASN,GAAarS,EAAO4S,EAAU,CAErC,GAAI,CAACA,GAAY,CAACA,EAAS,OACzB,MAAO,GAET,MAAM/J,EAAMyJ,GAAmBtS,CAAK,EACpC,OAAQ6I,EAAc6J,GAAyB7J,EAAK+J,CAAQ,EAA9C,EAChB,CAEA,SAASL,GAAcvS,EAAO6S,EAAW,CAEvC,GAAI,CAACA,GAAa,CAACA,EAAU,OAC3B,MAAO,GAET,MAAMhK,EAAMyJ,GAAmBtS,CAAK,EACpC,OAAQ6I,EAAa6J,GAAyB7J,EAAKgK,CAAS,EAA9C,EAChB,CAEA,SAASJ,GAA0BzS,EAAO,CACxC,MAAM8S,EAAmB,CAAA,EAErB9S,EAAM,SACR8S,EAAiB,KAAK9S,EAAM,OAAO,EAGrC,IAAI+S,EACJ,GAAI,CAEFA,EAAgB/S,EAAM,UAAU,OAAOA,EAAM,UAAU,OAAO,OAAS,CAAC,CACzE,MAAW,CAEX,CAED,OAAI+S,GACEA,EAAc,QAChBD,EAAiB,KAAKC,EAAc,KAAK,EACrCA,EAAc,MAChBD,EAAiB,KAAK,GAAGC,EAAc,IAAI,KAAKA,EAAc,KAAK,EAAE,GAKpED,CACT,CAEA,SAASd,GAAehS,EAAO,CAC7B,GAAI,CAEF,OAAOA,EAAM,UAAU,OAAO,CAAC,EAAE,OAAS,aAC3C,MAAW,CAEX,CACD,MAAO,EACT,CAEA,SAASgT,GAAiBC,EAAS,GAAI,CACrC,QAASjS,EAAIiS,EAAO,OAAS,EAAGjS,GAAK,EAAGA,IAAK,CAC3C,MAAMkS,EAAQD,EAAOjS,CAAC,EAEtB,GAAIkS,GAASA,EAAM,WAAa,eAAiBA,EAAM,WAAa,gBAClE,OAAOA,EAAM,UAAY,IAE5B,CAED,OAAO,IACT,CAEA,SAASZ,GAAmBtS,EAAO,CACjC,GAAI,CACF,IAAIiT,EACJ,GAAI,CAEFA,EAASjT,EAAM,UAAU,OAAO,CAAC,EAAE,WAAW,MAC/C,MAAW,CAEX,CACD,OAAOiT,EAASD,GAAiBC,CAAM,EAAI,IAC5C,MAAY,CACX1K,OAAAA,GAAeC,EAAO,MAAM,gCAAgCyJ,GAAoBjS,CAAK,CAAC,EAAE,EACjF,IACR,CACH,CAEA,SAASmS,GAAgBnS,EAAO,CAO9B,OANIA,EAAM,MAMN,CAACA,EAAM,WAAa,CAACA,EAAM,UAAU,QAAUA,EAAM,UAAU,OAAO,SAAW,EAC5E,GAKP,CAACA,EAAM,SAEP,CAACA,EAAM,UAAU,OAAO,KAAK4N,GAASA,EAAM,YAAeA,EAAM,MAAQA,EAAM,OAAS,SAAYA,EAAM,KAAK,CAEnH,CCtNA,MAAMoD,GAAmB,SAEnBmC,GAAsB,IAAM,CAChC,IAAIC,EAEJ,MAAO,CACL,KAAMpC,GACN,aAAaqC,EAAc,CAGzB,GAAIA,EAAa,KACf,OAAOA,EAIT,GAAI,CACF,GAAIxB,GAAiBwB,EAAcD,CAAa,EAC9C7K,OAAAA,GAAeC,EAAO,KAAK,sEAAsE,EAC1F,IAEjB,MAAoB,CAAE,CAEhB,OAAQ4K,EAAgBC,CACzB,CACL,CACA,EAKMC,GAAsCH,GAG5C,SAAStB,GAAiBwB,EAAcD,EAAe,CACrD,OAAKA,EAID,GAAAG,GAAoBF,EAAcD,CAAa,GAI/CI,GAAsBH,EAAcD,CAAa,GAP5C,EAYX,CAEA,SAASG,GAAoBF,EAAcD,EAAe,CACxD,MAAMK,EAAiBJ,EAAa,QAC9BK,EAAkBN,EAAc,QAoBtC,MAjBI,GAACK,GAAkB,CAACC,GAKnBD,GAAkB,CAACC,GAAqB,CAACD,GAAkBC,GAI5DD,IAAmBC,GAInB,CAACC,GAAmBN,EAAcD,CAAa,GAI/C,CAACQ,GAAkBP,EAAcD,CAAa,EAKpD,CAEA,SAASI,GAAsBH,EAAcD,EAAe,CAC1D,MAAMS,EAAoBC,GAAuBV,CAAa,EACxDW,EAAmBD,GAAuBT,CAAY,EAc5D,MAZI,GAACQ,GAAqB,CAACE,GAIvBF,EAAkB,OAASE,EAAiB,MAAQF,EAAkB,QAAUE,EAAiB,OAIjG,CAACJ,GAAmBN,EAAcD,CAAa,GAI/C,CAACQ,GAAkBP,EAAcD,CAAa,EAKpD,CAEA,SAASQ,GAAkBP,EAAcD,EAAe,CACtD,IAAIY,EAAgBC,GAAmBZ,CAAY,EAC/Ca,EAAiBD,GAAmBb,CAAa,EAGrD,GAAI,CAACY,GAAiB,CAACE,EACrB,MAAO,GAYT,GARKF,GAAiB,CAACE,GAAoB,CAACF,GAAiBE,IAI7DF,EAAgBA,EAChBE,EAAiBA,EAGbA,EAAe,SAAWF,EAAc,QAC1C,MAAO,GAIT,QAAShT,EAAI,EAAGA,EAAIkT,EAAe,OAAQlT,IAAK,CAE9C,MAAMmT,EAASD,EAAelT,CAAC,EAEzBoT,EAASJ,EAAchT,CAAC,EAE9B,GACEmT,EAAO,WAAaC,EAAO,UAC3BD,EAAO,SAAWC,EAAO,QACzBD,EAAO,QAAUC,EAAO,OACxBD,EAAO,WAAaC,EAAO,SAE3B,MAAO,EAEV,CAED,MAAO,EACT,CAEA,SAAST,GAAmBN,EAAcD,EAAe,CACvD,IAAIiB,EAAqBhB,EAAa,YAClCiB,EAAsBlB,EAAc,YAGxC,GAAI,CAACiB,GAAsB,CAACC,EAC1B,MAAO,GAIT,GAAKD,GAAsB,CAACC,GAAyB,CAACD,GAAsBC,EAC1E,MAAO,GAGTD,EAAqBA,EACrBC,EAAsBA,EAGtB,GAAI,CACF,OAAUD,EAAmB,KAAK,EAAE,IAAMC,EAAoB,KAAK,EAAE,CACtE,MAAa,CACZ,MAAO,EACR,CACH,CAEA,SAASR,GAAuB9T,EAAO,CACrC,OAAOA,EAAM,WAAaA,EAAM,UAAU,QAAUA,EAAM,UAAU,OAAO,CAAC,CAC9E,CCxKA,SAASuU,GAAmBC,EAAanJ,EAAI,CAE3C,MAAM4H,EAASwB,GAAiBD,EAAanJ,CAAE,EAEzC7K,EAAY,CAChB,KAAMkU,GAAYrJ,CAAE,EACpB,MAAOsJ,GAAetJ,CAAE,CAC5B,EAEE,OAAI4H,EAAO,SACTzS,EAAU,WAAa,CAAE,OAAAyS,IAGvBzS,EAAU,OAAS,QAAaA,EAAU,QAAU,KACtDA,EAAU,MAAQ,8BAGbA,CACT,CAEA,SAASoU,GACPJ,EACAhU,EACAqU,EACAC,EACA,CACA,MAAM3M,EAASuI,IACTqE,EAAiB5M,GAAUA,EAAO,WAAU,EAAG,eAG/C6M,EAAgBC,GAA2BzU,CAAS,EAEpD0U,EAAQ,CACZ,eAAgBC,GAAgB3U,EAAWuU,CAAc,CAC7D,EAEE,GAAIC,EACF,MAAO,CACL,UAAW,CACT,OAAQ,CAACT,GAAmBC,EAAaQ,CAAa,CAAC,CACxD,EACD,MAAAE,CACN,EAGE,MAAMlV,EAAQ,CACZ,UAAW,CACT,OAAQ,CACN,CACE,KAAMoV,GAAQ5U,CAAS,EAAIA,EAAU,YAAY,KAAOsU,EAAuB,qBAAuB,QACtG,MAAOO,GAAgC7U,EAAW,CAAE,qBAAAsU,CAAoB,CAAE,CAC3E,CACF,CACF,EACD,MAAAI,CACJ,EAEE,GAAIL,EAAoB,CACtB,MAAM5B,EAASwB,GAAiBD,EAAaK,CAAkB,EAC3D5B,EAAO,SAGTjT,EAAM,UAAU,OAAO,CAAC,EAAE,WAAa,CAAE,OAAAiT,GAE5C,CAED,OAAOjT,CACT,CAEA,SAASsV,GAAed,EAAanJ,EAAI,CACvC,MAAO,CACL,UAAW,CACT,OAAQ,CAACkJ,GAAmBC,EAAanJ,CAAE,CAAC,CAC7C,CACL,CACA,CAGA,SAASoJ,GACPD,EACAnJ,EACA,CAIA,MAAMkK,EAAalK,EAAG,YAAcA,EAAG,OAAS,GAE1CmK,EAAYC,GAA6BpK,CAAE,EAC3CqK,EAAcC,GAAqBtK,CAAE,EAE3C,GAAI,CACF,OAAOmJ,EAAYe,EAAYC,EAAWE,CAAW,CACtD,MAAW,CAEX,CAED,MAAO,EACT,CAGA,MAAME,GAAsB,8BAO5B,SAASH,GAA6BpK,EAAI,CACxC,OAAIA,GAAMuK,GAAoB,KAAKvK,EAAG,OAAO,EACpC,EAGF,CACT,CAUA,SAASsK,GAAqBtK,EAAI,CAChC,OAAI,OAAOA,EAAG,aAAgB,SACrBA,EAAG,YAGL,CACT,CAIA,SAASwK,GAAuBrV,EAAW,CAGzC,OAAI,OAAO,YAAgB,KAAe,OAAO,YAAY,UAAc,IAElEA,aAAqB,YAAY,UAEjC,EAEX,CAOA,SAASkU,GAAYrJ,EAAI,CACvB,MAAM9D,EAAO8D,GAAMA,EAAG,KAItB,MAAI,CAAC9D,GAAQsO,GAAuBxK,CAAE,EAEXA,EAAG,SAAW,MAAM,QAAQA,EAAG,OAAO,GAAKA,EAAG,QAAQ,QAAU,EAC/DA,EAAG,QAAQ,CAAC,EAAI,wBAGrC9D,CACT,CAOA,SAASoN,GAAetJ,EAAI,CAC1B,MAAM5J,EAAU4J,GAAMA,EAAG,QAEzB,OAAK5J,EAIDA,EAAQ,OAAS,OAAOA,EAAQ,MAAM,SAAY,SAC7CA,EAAQ,MAAM,QAInBoU,GAAuBxK,CAAE,GAAK,MAAM,QAAQA,EAAG,OAAO,GAAKA,EAAG,QAAQ,QAAU,EAC3EA,EAAG,QAAQ,CAAC,EAGd5J,EAZE,kBAaX,CAMA,SAASqU,GACPtB,EACAhU,EACAP,EACA8V,EACA,CACA,MAAMlB,EAAsB5U,GAAQA,EAAK,oBAAuB,OAC1DD,EAAQgW,GAAsBxB,EAAahU,EAAWqU,EAAoBkB,CAAgB,EAChG,OAAAE,GAAsBjW,CAAK,EAC3BA,EAAM,MAAQ,QACVC,GAAQA,EAAK,WACfD,EAAM,SAAWC,EAAK,UAEjB8D,GAAoB/D,CAAK,CAClC,CAMA,SAASkW,GACP1B,EACA/S,EACAU,EAAQ,OACRlC,EACA8V,EACA,CACA,MAAMlB,EAAsB5U,GAAQA,EAAK,oBAAuB,OAC1DD,EAAQmW,GAAgB3B,EAAa/S,EAASoT,EAAoBkB,CAAgB,EACxF,OAAA/V,EAAM,MAAQmC,EACVlC,GAAQA,EAAK,WACfD,EAAM,SAAWC,EAAK,UAEjB8D,GAAoB/D,CAAK,CAClC,CAKA,SAASgW,GACPxB,EACAhU,EACAqU,EACAkB,EACAjB,EACA,CACA,IAAI9U,EAEJ,GAAI6M,GAAarM,CAAS,GAAOA,EAAY,MAG3C,OAAO8U,GAAed,EADHhU,EAC2B,KAAK,EAUrD,GAAI4V,GAAW5V,CAAS,GAAK6V,GAAe7V,CAAS,EAAI,CACvD,MAAM8V,EAAe9V,EAErB,GAAI,UAAYA,EACdR,EAAQsV,GAAed,EAAahU,OAC/B,CACL,MAAM+G,EAAO+O,EAAa,OAASF,GAAWE,CAAY,EAAI,WAAa,gBACrE7U,EAAU6U,EAAa,QAAU,GAAG/O,CAAI,KAAK+O,EAAa,OAAO,GAAK/O,EAC5EvH,EAAQmW,GAAgB3B,EAAa/S,EAASoT,EAAoBkB,CAAgB,EAClFQ,GAAsBvW,EAAOyB,CAAO,CACrC,CACD,MAAI,SAAU6U,IAEZtW,EAAM,KAAO,CAAE,GAAGA,EAAM,KAAM,oBAAqB,GAAGsW,EAAa,IAAI,KAGlEtW,CACR,CACD,OAAI4M,GAAQpM,CAAS,EAEZ8U,GAAed,EAAahU,CAAS,EAE1C0N,GAAc1N,CAAS,GAAK4U,GAAQ5U,CAAS,GAK/CR,EAAQ4U,GAAqBJ,EADLhU,EACmCqU,EAAoBC,CAAoB,EACnGmB,GAAsBjW,EAAO,CAC3B,UAAW,EACjB,CAAK,EACMA,IAYTA,EAAQmW,GAAgB3B,EAAahU,EAAYqU,EAAoBkB,CAAgB,EACrFQ,GAAsBvW,EAAO,GAAGQ,CAAS,EAAa,EACtDyV,GAAsBjW,EAAO,CAC3B,UAAW,EACf,CAAG,EAEMA,EACT,CAEA,SAASmW,GACP3B,EACA/S,EACAoT,EACAkB,EACA,CACA,MAAM/V,EAAQ,CAAA,EAEd,GAAI+V,GAAoBlB,EAAoB,CAC1C,MAAM5B,EAASwB,GAAiBD,EAAaK,CAAkB,EAC3D5B,EAAO,SACTjT,EAAM,UAAY,CAChB,OAAQ,CAAC,CAAE,MAAOyB,EAAS,WAAY,CAAE,OAAAwR,CAAM,EAAI,CAC3D,EAEG,CAED,GAAI5J,GAAsB5H,CAAO,EAAG,CAClC,KAAM,CAAE,2BAAA+U,EAA4B,2BAAAC,CAA4B,EAAGhV,EAEnE,OAAAzB,EAAM,SAAW,CACf,QAASwW,EACT,OAAQC,CACd,EACWzW,CACR,CAED,OAAAA,EAAM,QAAUyB,EACTzB,CACT,CAEA,SAASqV,GACP7U,EACA,CAAE,qBAAAsU,CAAsB,EACxB,CACA,MAAM4B,EAAOC,GAA+BnW,CAAS,EAC/CoW,EAAc9B,EAAuB,oBAAsB,YAIjE,OAAIjI,GAAarM,CAAS,EACjB,oCAAoCoW,CAAW,mBAAmBpW,EAAU,OAAO,KAGxF4U,GAAQ5U,CAAS,EAEZ,WADWqW,GAAmBrW,CAAS,CACnB,YAAYA,EAAU,IAAI,iBAAiBoW,CAAW,GAG5E,sBAAsBA,CAAW,eAAeF,CAAI,EAC7D,CAEA,SAASG,GAAmBC,EAAK,CAC/B,GAAI,CACF,MAAMC,EAAY,OAAO,eAAeD,CAAG,EAC3C,OAAOC,EAAYA,EAAU,YAAY,KAAO,MACjD,MAAW,CAEX,CACH,CAGA,SAAS9B,GAA2B6B,EAAK,CACvC,UAAWE,KAAQF,EACjB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAKE,CAAI,EAAG,CACnD,MAAMpJ,EAAQkJ,EAAIE,CAAI,EACtB,GAAIpJ,aAAiB,MACnB,OAAOA,CAEV,CAIL,CC1XA,SAASqJ,GACPC,EACA,CACE,SAAA7G,EACA,OAAA5J,EACA,IAAArC,CACD,EAGD,CACA,MAAMgB,EAAU,CACd,SAAU8R,EAAS,SACnB,QAAS,IAAI,KAAM,EAAC,YAAa,EACjC,GAAI7G,GACFA,EAAS,KAAO,CACd,IAAK,CACH,KAAMA,EAAS,IAAI,KACnB,QAASA,EAAS,IAAI,OACvB,CACT,EACI,GAAI,CAAC,CAAC5J,GAAU,CAAC,CAACrC,GAAO,CAAE,IAAK4C,GAAY5C,CAAG,EACnD,EACQN,EAAOqT,GAA+BD,CAAQ,EAEpD,OAAO1S,GAAeY,EAAS,CAACtB,CAAI,CAAC,CACvC,CAEA,SAASqT,GAA+BD,EAAU,CAIhD,MAAO,CAHiB,CACtB,KAAM,aACV,EAC2BA,CAAQ,CACnC,CCnBA,MAAME,WAAsBxO,EAAW,CAMpC,YAAYlB,EAAS,CACpB,MAAM2P,EAAO,CAEX,2BAA4B,GAC5B,GAAG3P,CACT,EACU4P,EAAYC,EAAO,mBAAqB5U,GAAY,EAC1DwN,GAAiBkH,EAAM,UAAW,CAAC,SAAS,EAAGC,CAAS,EAExD,MAAMD,CAAI,EAENA,EAAK,mBAAqBE,EAAO,UACnCA,EAAO,SAAS,iBAAiB,mBAAoB,IAAM,CACrDA,EAAO,SAAS,kBAAoB,UACtC,KAAK,eAAc,CAE7B,CAAO,CAEJ,CAKA,mBAAmB/W,EAAWP,EAAM,CACnC,OAAO6V,GAAmB,KAAK,SAAS,YAAatV,EAAWP,EAAM,KAAK,SAAS,gBAAgB,CACrG,CAKA,iBACCwB,EACAU,EAAQ,OACRlC,EACA,CACA,OAAOiW,GAAiB,KAAK,SAAS,YAAazU,EAASU,EAAOlC,EAAM,KAAK,SAAS,gBAAgB,CACxG,CAOA,oBAAoBiX,EAAU,CAC7B,GAAI,CAAC,KAAK,aAAc,CACtB3O,IAAeC,EAAO,KAAK,kDAAkD,EAC7E,MACD,CAED,MAAM0C,EAAW+L,GAA2BC,EAAU,CACpD,SAAU,KAAK,eAAgB,EAC/B,IAAK,KAAK,OAAQ,EAClB,OAAQ,KAAK,WAAU,EAAG,MAChC,CAAK,EAID,KAAK,aAAahM,CAAQ,CAC3B,CAKA,cAAclL,EAAOC,EAAM6I,EAAO,CACjC,OAAA9I,EAAM,SAAWA,EAAM,UAAY,aAC5B,MAAM,cAAcA,EAAOC,EAAM6I,CAAK,CAC9C,CACH,CCxFA,MAAM0O,GAAoB,IAE1B,IAAIC,GACAC,GACAC,GAQJ,SAASC,GAAuChW,EAAS,CACvD,MAAMC,EAAO,MACbC,GAAWD,EAAMD,CAAO,EACxBG,GAAgBF,EAAMgW,EAAa,CACrC,CAGA,SAASA,IAAgB,CACvB,GAAI,CAACN,GAAO,SACV,OAMF,MAAMO,EAAoBtV,GAAgB,KAAK,KAAM,KAAK,EACpDuV,EAAwBC,GAAoBF,EAAmB,EAAI,EACzEP,GAAO,SAAS,iBAAiB,QAASQ,EAAuB,EAAK,EACtER,GAAO,SAAS,iBAAiB,WAAYQ,EAAuB,EAAK,EAOzE,CAAC,cAAe,MAAM,EAAE,QAASE,GAAW,CAE1C,MAAMC,EAASX,GAASU,CAAM,GAAMV,GAASU,CAAM,EAAE,UAEjD,CAACC,GAAS,CAACA,EAAM,gBAAkB,CAACA,EAAM,eAAe,kBAAkB,IAI/E9V,GAAK8V,EAAO,mBAAoB,SAAUC,EAA0B,CAClE,OAAO,SAELtW,EACAuW,EACA1Q,EACA,CACA,GAAI7F,IAAS,SAAWA,GAAQ,WAC9B,GAAI,CACF,MAAMwW,EAAK,KACLC,EAAYD,EAAG,oCAAsCA,EAAG,qCAAuC,CAAA,EAC/FE,EAAkBD,EAASzW,CAAI,EAAIyW,EAASzW,CAAI,GAAK,CAAE,SAAU,CAAC,EAExE,GAAI,CAAC0W,EAAe,QAAS,CAC3B,MAAM3W,EAAUoW,GAAoBF,CAAiB,EACrDS,EAAe,QAAU3W,EACzBuW,EAAyB,KAAK,KAAMtW,EAAMD,EAAS8F,CAAO,CAC3D,CAED6Q,EAAe,UAChB,MAAW,CAGX,CAGH,OAAOJ,EAAyB,KAAK,KAAMtW,EAAMuW,EAAU1Q,CAAO,CAC1E,CACA,CAAK,EAEDtF,GACE8V,EACA,sBACA,SAAUM,EAA6B,CACrC,OAAO,SAEL3W,EACAuW,EACA1Q,EACA,CACA,GAAI7F,IAAS,SAAWA,GAAQ,WAC9B,GAAI,CACF,MAAMwW,EAAK,KACLC,EAAWD,EAAG,qCAAuC,GACrDE,EAAiBD,EAASzW,CAAI,EAEhC0W,IACFA,EAAe,WAEXA,EAAe,UAAY,IAC7BC,EAA4B,KAAK,KAAM3W,EAAM0W,EAAe,QAAS7Q,CAAO,EAC5E6Q,EAAe,QAAU,OACzB,OAAOD,EAASzW,CAAI,GAIlB,OAAO,KAAKyW,CAAQ,EAAE,SAAW,GACnC,OAAOD,EAAG,oCAGf,MAAW,CAGX,CAGH,OAAOG,EAA4B,KAAK,KAAM3W,EAAMuW,EAAU1Q,CAAO,CAC/E,CACO,CACP,EACA,CAAG,CACH,CAKA,SAAS+Q,GAA6BzY,EAAO,CAE3C,GAAIA,EAAM,OAAS0X,GACjB,MAAO,GAGT,GAAI,CAGF,GAAI,CAAC1X,EAAM,QAAWA,EAAM,OAAS,YAAc2X,GACjD,MAAO,EAEV,MAAW,CAGX,CAKD,MAAO,EACT,CAMA,SAASe,GAAmB5L,EAAWmL,EAAQ,CAE7C,OAAInL,IAAc,WACT,GAGL,CAACmL,GAAU,CAACA,EAAO,QACd,GAKL,EAAAA,EAAO,UAAY,SAAWA,EAAO,UAAY,YAAcA,EAAO,kBAK5E,CAKA,SAASD,GACPpW,EACA+W,EAAiB,GACjB,CACA,OAAQ3Y,GAAU,CAIhB,GAAI,CAACA,GAASA,EAAM,gBAClB,OAGF,MAAMiY,EAASW,GAAe5Y,CAAK,EAGnC,GAAI0Y,GAAmB1Y,EAAM,KAAMiY,CAAM,EACvC,OAIFY,GAAyB7Y,EAAO,kBAAmB,EAAI,EAEnDiY,GAAU,CAACA,EAAO,WAEpBY,GAAyBZ,EAAQ,YAAajP,GAAO,CAAA,EAGvD,MAAMzB,EAAOvH,EAAM,OAAS,WAAa,QAAUA,EAAM,KAKpDyY,GAA6BzY,CAAK,IAErC4B,EADoB,CAAE,MAAA5B,EAAO,KAAAuH,EAAM,OAAQoR,CAAc,CACtC,EACnBjB,GAAwB1X,EAAM,KAC9B2X,GAA4BM,EAASA,EAAO,UAAY,QAI1D,aAAaR,EAAe,EAC5BA,GAAkBF,GAAO,WAAW,IAAM,CACxCI,GAA4B,OAC5BD,GAAwB,MACzB,EAAEF,EAAiB,CACxB,CACA,CAEA,SAASoB,GAAe5Y,EAAO,CAC7B,GAAI,CACF,OAAOA,EAAM,MACd,MAAW,CAGV,OAAO,IACR,CACH,CC3NA,MAAM8Y,GAAwB,CAAA,EAW9B,SAASC,GACPxR,EACA,CACA,MAAMyR,EAASF,GAAsBvR,CAAI,EACzC,GAAIyR,EACF,OAAOA,EAGT,IAAIC,EAAO1B,GAAOhQ,CAAI,EAGtB,GAAI2R,GAAiBD,CAAI,EACvB,OAAQH,GAAsBvR,CAAI,EAAI0R,EAAK,KAAK1B,EAAM,EAGxD,MAAM4B,EAAW5B,GAAO,SAExB,GAAI4B,GAAY,OAAOA,EAAS,eAAkB,WAChD,GAAI,CACF,MAAMC,EAAUD,EAAS,cAAc,QAAQ,EAC/CC,EAAQ,OAAS,GACjBD,EAAS,KAAK,YAAYC,CAAO,EACjC,MAAMC,EAAgBD,EAAQ,cAC1BC,GAAiBA,EAAc9R,CAAI,IACrC0R,EAAOI,EAAc9R,CAAI,GAE3B4R,EAAS,KAAK,YAAYC,CAAO,CAClC,OAAQjL,EAAG,CAEV5F,IAAeC,EAAO,KAAK,uCAAuCjB,CAAI,6BAA6BA,CAAI,KAAM4G,CAAC,CAC/G,CAKH,OAAK8K,IAIGH,GAAsBvR,CAAI,EAAI0R,EAAK,KAAK1B,EAAM,EACxD,CAGA,SAAS+B,GAA0B/R,EAAM,CACvCuR,GAAsBvR,CAAI,EAAI,MAChC,CAiDA,SAASgS,MAAcvO,EAAM,CAC3B,OAAO+N,GAAwB,YAAY,EAAE,GAAG/N,CAAI,CACtD,CC9GA,SAASwO,GACP9R,EACA+R,EAAcV,GAAwB,OAAO,EAC7C,CACA,IAAIW,EAAkB,EAClBC,EAAe,EAEnB,SAAS1K,EAAY2K,EAAS,CAC5B,MAAMC,EAAcD,EAAQ,KAAK,OACjCF,GAAmBG,EACnBF,IAEA,MAAMG,EAAiB,CACrB,KAAMF,EAAQ,KACd,OAAQ,OACR,eAAgB,SAChB,QAASlS,EAAQ,QAYjB,UAAWgS,GAAmB,KAASC,EAAe,GACtD,GAAGjS,EAAQ,YACjB,EAEI,GAAI,CAAC+R,EACH,OAAAH,GAA0B,OAAO,EAC1BhW,GAAoB,mCAAmC,EAGhE,GAAI,CAEF,OAAOmW,EAAY/R,EAAQ,IAAKoS,CAAc,EAAE,KAAKjK,IACnD6J,GAAmBG,EACnBF,IACO,CACL,WAAY9J,EAAS,OACrB,QAAS,CACP,uBAAwBA,EAAS,QAAQ,IAAI,sBAAsB,EACnE,cAAeA,EAAS,QAAQ,IAAI,aAAa,CAClD,CACX,EACO,CACF,OAAQ1B,EAAG,CACV,OAAAmL,GAA0B,OAAO,EACjCI,GAAmBG,EACnBF,IACOrW,GAAoB6K,CAAC,CAC7B,CACF,CAED,OAAOa,GAAgBtH,EAASuH,CAAW,CAC7C,CC9DA,MAAM8K,GAAkB,GAElBC,GAAiB,GAEvB,SAASC,GAAYC,EAAUC,EAAMC,EAAQC,EAAO,CAClD,MAAMnH,EAAQ,CACZ,SAAAgH,EACA,SAAUC,IAAS,cAAgBG,GAAmBH,EACtD,OAAQ,EACZ,EAEE,OAAIC,IAAW,SACblH,EAAM,OAASkH,GAGbC,IAAU,SACZnH,EAAM,MAAQmH,GAGTnH,CACT,CAKA,MAAMqH,GAAsB,yCAGtBC,GACJ,6IAEIC,GAAkB,gCAKlBC,GAAsBC,GAAQ,CAElC,MAAMC,EAAYL,GAAoB,KAAKI,CAAI,EAE/C,GAAIC,EAAW,CACb,KAAM,CAAG,CAAAV,EAAUS,EAAME,CAAG,EAAID,EAChC,OAAOX,GAAYC,EAAUI,GAAkB,CAACK,EAAM,CAACE,CAAG,CAC3D,CAED,MAAMC,EAAQN,GAAY,KAAKG,CAAI,EAEnC,GAAIG,EAAO,CAGT,GAFeA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAE,QAAQ,MAAM,IAAM,EAE5C,CACV,MAAMC,EAAWN,GAAgB,KAAKK,EAAM,CAAC,CAAC,EAE1CC,IAEFD,EAAM,CAAC,EAAIC,EAAS,CAAC,EACrBD,EAAM,CAAC,EAAIC,EAAS,CAAC,EACrBD,EAAM,CAAC,EAAIC,EAAS,CAAC,EAExB,CAID,KAAM,CAACZ,EAAMD,CAAQ,EAAIc,GAA8BF,EAAM,CAAC,GAAKR,GAAkBQ,EAAM,CAAC,CAAC,EAE7F,OAAOb,GAAYC,EAAUC,EAAMW,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,OAAWA,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,MAAS,CACtG,CAGH,EAEMG,GAAwB,CAAClB,GAAiBW,EAAmB,EAK7DQ,GACJ,uIACIC,GAAiB,gDAEjBC,GAAQT,GAAQ,CACpB,MAAMG,EAAQI,GAAW,KAAKP,CAAI,EAElC,GAAIG,EAAO,CAET,GADeA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAE,QAAQ,SAAS,EAAI,GAC7C,CACV,MAAMC,EAAWI,GAAe,KAAKL,EAAM,CAAC,CAAC,EAEzCC,IAEFD,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAK,OACvBA,EAAM,CAAC,EAAIC,EAAS,CAAC,EACrBD,EAAM,CAAC,EAAIC,EAAS,CAAC,EACrBD,EAAM,CAAC,EAAI,GAEd,CAED,IAAIZ,EAAWY,EAAM,CAAC,EAClBX,EAAOW,EAAM,CAAC,GAAKR,GACvB,OAACH,EAAMD,CAAQ,EAAIc,GAA8Bb,EAAMD,CAAQ,EAExDD,GAAYC,EAAUC,EAAMW,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,OAAWA,EAAM,CAAC,EAAI,CAACA,EAAM,CAAC,EAAI,MAAS,CACtG,CAGH,EAEMO,GAAuB,CAACrB,GAAgBoB,EAAK,EAiC7CE,GAA0B,CAACL,GAAuBI,EAAoB,EAEtEE,GAAqBC,GAAkB,GAAGF,EAAuB,EAsBjEN,GAAgC,CAACb,EAAMD,IAAa,CACxD,MAAMuB,EAAoBtB,EAAK,QAAQ,kBAAkB,IAAM,GACzDuB,EAAuBvB,EAAK,QAAQ,sBAAsB,IAAM,GAEtE,OAAOsB,GAAqBC,EACxB,CACEvB,EAAK,QAAQ,GAAG,IAAM,GAAMA,EAAK,MAAM,GAAG,EAAE,CAAC,EAAMG,GACnDmB,EAAoB,oBAAoBvB,CAAQ,GAAK,wBAAwBA,CAAQ,EACtF,EACD,CAACC,EAAMD,CAAQ,CACrB,EC3KMyB,GAA4B,KAE5B3K,GAAmB,cAEnB4K,GAA2B,CAAClU,EAAU,KAAO,CACjD,MAAMmU,EAAW,CACf,QAAS,GACT,IAAK,GACL,MAAO,GACP,QAAS,GACT,OAAQ,GACR,IAAK,GACL,GAAGnU,CACP,EAEE,MAAO,CACL,KAAMsJ,GACN,MAAM7I,EAAQ,CACR0T,EAAS,SACXla,GAAiCma,GAA6B3T,CAAM,CAAC,EAEnE0T,EAAS,KACXjE,GAAuCmE,GAAyB5T,EAAQ0T,EAAS,GAAG,CAAC,EAEnFA,EAAS,KACXG,GAA6BC,GAAyB9T,CAAM,CAAC,EAE3D0T,EAAS,OACXK,GAA+BC,GAA2BhU,CAAM,CAAC,EAE/D0T,EAAS,SACXO,GAAiCC,GAA6BlU,CAAM,CAAC,EAEnE0T,EAAS,QACX1T,EAAO,GAAG,kBAAmBmU,GAA4BnU,CAAM,CAAC,CAEnE,CACL,CACA,EAEMoU,GAA2CX,GAKjD,SAASU,GAA4BnU,EAAQ,CAC3C,OAAO,SAA6BnI,EAAO,CACrC0Q,EAAW,IAAKvI,GAIpBqI,GACE,CACE,SAAU,UAAUxQ,EAAM,OAAS,cAAgB,cAAgB,OAAO,GAC1E,SAAUA,EAAM,SAChB,MAAOA,EAAM,MACb,QAASiS,GAAoBjS,CAAK,CACnC,EACD,CACE,MAAAA,CACD,CACP,CACA,CACA,CAMA,SAAS+b,GACP5T,EACAqU,EACA,CACA,OAAO,SAA6BC,EAAa,CAC/C,GAAI/L,EAAW,IAAKvI,EAClB,OAGF,IAAI8P,EACAyE,EACAC,EAAW,OAAOH,GAAQ,SAAWA,EAAI,mBAAqB,OAE9DI,EACF,OAAOJ,GAAQ,UAAY,OAAOA,EAAI,iBAAoB,SAAWA,EAAI,gBAAkB,OACzFI,GAAmBA,EAAkBjB,KACvCpT,IACEC,EAAO,KACL,yCAAyCmT,EAAyB,oBAAoBiB,CAAe,oCAAoCjB,EAAyB,WAC5K,EACMiB,EAAkBjB,IAGhB,OAAOgB,GAAa,WACtBA,EAAW,CAACA,CAAQ,GAItB,GAAI,CACF,MAAM3c,EAAQyc,EAAY,MACpBI,EAAUC,GAAS9c,CAAK,EAAIA,EAAM,OAASA,EAEjDiY,EAAS8E,GAAiBF,EAAS,CAAE,SAAAF,EAAU,gBAAAC,CAAiB,CAAA,EAChEF,EAAgBM,GAAiBH,CAAO,CACzC,MAAW,CACV5E,EAAS,WACV,CAED,GAAIA,EAAO,SAAW,EACpB,OAGF,MAAMxH,EAAa,CACjB,SAAU,MAAMgM,EAAY,IAAI,GAChC,QAASxE,CACf,EAEQyE,IACFjM,EAAW,KAAO,CAAE,oBAAqBiM,CAAa,GAGxDlM,GAAcC,EAAY,CACxB,MAAOgM,EAAY,MACnB,KAAMA,EAAY,KAClB,OAAQA,EAAY,MAC1B,CAAK,CACL,CACA,CAKA,SAASX,GAA6B3T,EAAQ,CAC5C,OAAO,SAA4BsU,EAAa,CAC9C,GAAI/L,EAAW,IAAKvI,EAClB,OAGF,MAAMsI,EAAa,CACjB,SAAU,UACV,KAAM,CACJ,UAAWgM,EAAY,KACvB,OAAQ,SACT,EACD,MAAOxY,GAAwBwY,EAAY,KAAK,EAChD,QAASQ,GAASR,EAAY,KAAM,GAAG,CAC7C,EAEI,GAAIA,EAAY,QAAU,SACxB,GAAIA,EAAY,KAAK,CAAC,IAAM,GAC1BhM,EAAW,QAAU,qBAAqBwM,GAASR,EAAY,KAAK,MAAM,CAAC,EAAG,GAAG,GAAK,gBAAgB,GACtGhM,EAAW,KAAK,UAAYgM,EAAY,KAAK,MAAM,CAAC,MAGpD,QAIJjM,GAAcC,EAAY,CACxB,MAAOgM,EAAY,KACnB,MAAOA,EAAY,KACzB,CAAK,CACL,CACA,CAKA,SAASR,GAAyB9T,EAAQ,CACxC,OAAO,SAAwBsU,EAAa,CAC1C,GAAI/L,EAAW,IAAKvI,EAClB,OAGF,KAAM,CAAE,eAAA+U,EAAgB,aAAAC,CAAc,EAAGV,EAEnCW,EAAgBX,EAAY,IAAIY,EAAmB,EAGzD,GAAI,CAACH,GAAkB,CAACC,GAAgB,CAACC,EACvC,OAGF,KAAM,CAAE,OAAAE,EAAQ,IAAAzU,EAAK,YAAA0U,EAAa,KAAAC,CAAI,EAAKJ,EAErCK,EAAO,CACX,OAAAH,EACA,IAAAzU,EACA,YAAA0U,CACN,EAEUtd,EAAO,CACX,IAAKwc,EAAY,IACjB,MAAOe,EACP,eAAAN,EACA,aAAAC,CACN,EAEUhb,EAAQb,GAAwCic,CAAW,EAEjE/M,GACE,CACE,SAAU,MACV,KAAAiN,EACA,KAAM,OACN,MAAAtb,CACD,EACDlC,CACN,CACA,CACA,CAKA,SAASkc,GAA2BhU,EAAQ,CAC1C,OAAO,SAA0BsU,EAAa,CAC5C,GAAI/L,EAAW,IAAKvI,EAClB,OAGF,KAAM,CAAE,eAAA+U,EAAgB,aAAAC,CAAc,EAAGV,EAGzC,GAAKU,GAID,EAAAV,EAAY,UAAU,IAAI,MAAM,YAAY,GAAKA,EAAY,UAAU,SAAW,QAKtF,GAAIA,EAAY,MAAO,CACrB,MAAMgB,EAAOhB,EAAY,UACnBxc,EAAO,CACX,KAAMwc,EAAY,MAClB,MAAOA,EAAY,KACnB,eAAAS,EACA,aAAAC,CACR,EAEM3M,GACE,CACE,SAAU,QACV,KAAAiN,EACA,MAAO,QACP,KAAM,MACP,EACDxd,CACR,CACA,KAAW,CACL,MAAM4P,EAAW4M,EAAY,SACvBgB,EAAO,CACX,GAAGhB,EAAY,UACf,YAAa5M,GAAYA,EAAS,MAC1C,EACY5P,EAAO,CACX,MAAOwc,EAAY,KACnB,SAAA5M,EACA,eAAAqN,EACA,aAAAC,CACR,EACYhb,EAAQb,GAAwCmc,EAAK,WAAW,EAEtEjN,GACE,CACE,SAAU,QACV,KAAAiN,EACA,KAAM,OACN,MAAAtb,CACD,EACDlC,CACR,CACK,CACL,CACA,CAKA,SAASoc,GAA6BlU,EAAQ,CAC5C,OAAO,SAA4BsU,EAAa,CAC9C,GAAI/L,EAAW,IAAKvI,EAClB,OAGF,IAAIuV,EAAOjB,EAAY,KACnBkB,EAAKlB,EAAY,GACrB,MAAMmB,EAAYC,GAAStG,EAAO,SAAS,IAAI,EAC/C,IAAIuG,EAAaJ,EAAOG,GAASH,CAAI,EAAI,OACzC,MAAMK,EAAWF,GAASF,CAAE,GAGxB,CAACG,GAAc,CAACA,EAAW,QAC7BA,EAAaF,GAKXA,EAAU,WAAaG,EAAS,UAAYH,EAAU,OAASG,EAAS,OAC1EJ,EAAKI,EAAS,UAEZH,EAAU,WAAaE,EAAW,UAAYF,EAAU,OAASE,EAAW,OAC9EJ,EAAOI,EAAW,UAGpBtN,GAAc,CACZ,SAAU,aACV,KAAM,CACJ,KAAAkN,EACA,GAAAC,CACD,CACP,CAAK,CACL,CACA,CAEA,SAASb,GAAS9c,EAAO,CACvB,MAAO,CAAC,CAACA,GAAS,CAAC,CAAEA,EAAQ,MAC/B,CCjUA,MAAMge,GAAuB,CAC3B,cACA,SACA,OACA,mBACA,iBACA,mBACA,oBACA,kBACA,cACA,aACA,qBACA,cACA,aACA,iBACA,eACA,kBACA,cACA,cACA,eACA,qBACA,SACA,eACA,YACA,eACA,gBACA,YACA,kBACA,SACA,iBACA,4BACA,sBACF,EAEMhN,GAAmB,mBAEnBiN,GAAgC,CAACvW,EAAU,KAAO,CACtD,MAAMmU,EAAW,CACf,eAAgB,GAChB,YAAa,GACb,sBAAuB,GACvB,YAAa,GACb,WAAY,GACZ,GAAGnU,CACP,EAEE,MAAO,CACL,KAAMsJ,GAGN,WAAY,CACN6K,EAAS,YACXzZ,GAAKmV,EAAQ,aAAc2G,EAAiB,EAG1CrC,EAAS,aACXzZ,GAAKmV,EAAQ,cAAe2G,EAAiB,EAG3CrC,EAAS,uBACXzZ,GAAKmV,EAAQ,wBAAyB4G,EAAQ,EAG5CtC,EAAS,gBAAkB,mBAAoBtE,GACjDnV,GAAK,eAAe,UAAW,OAAQgc,EAAQ,EAGjD,MAAMC,EAAoBxC,EAAS,YAC/BwC,IACkB,MAAM,QAAQA,CAAiB,EAAIA,EAAoBL,IAC/D,QAAQM,EAAgB,CAEvC,CACL,CACA,EAKMC,GAAgDN,GAEtD,SAASC,GAAkBM,EAAU,CAEnC,OAAO,YAAcjc,EAAM,CACzB,MAAMkc,EAAmBlc,EAAK,CAAC,EAC/B,OAAAA,EAAK,CAAC,EAAImc,GAAKD,EAAkB,CAC/B,UAAW,CACT,KAAM,CAAE,SAAUE,GAAgBH,CAAQ,CAAG,EAC7C,QAAS,GACT,KAAM,YACP,CACP,CAAK,EACMA,EAAS,MAAM,KAAMjc,CAAI,CACpC,CACA,CAGA,SAAS4b,GAASK,EAAU,CAE1B,OAAO,SAAW/V,EAAU,CAE1B,OAAO+V,EAAS,MAAM,KAAM,CAC1BE,GAAKjW,EAAU,CACb,UAAW,CACT,KAAM,CACJ,SAAU,wBACV,QAASkW,GAAgBH,CAAQ,CAClC,EACD,QAAS,GACT,KAAM,YACP,CACT,CAAO,CACP,CAAK,CACL,CACA,CAEA,SAASJ,GAASQ,EAAc,CAE9B,OAAO,YAAcrc,EAAM,CAEzB,MAAMsc,EAAM,KAGZ,MAF4B,CAAC,SAAU,UAAW,aAAc,oBAAoB,EAEhE,QAAQ7H,GAAQ,CAC9BA,KAAQ6H,GAAO,OAAOA,EAAI7H,CAAI,GAAM,YAEtC5U,GAAKyc,EAAK7H,EAAM,SAAUwH,EAAU,CAClC,MAAMM,EAAc,CAClB,UAAW,CACT,KAAM,CACJ,SAAU9H,EACV,QAAS2H,GAAgBH,CAAQ,CAClC,EACD,QAAS,GACT,KAAM,YACP,CACb,EAGgBrN,EAAmBC,GAAoBoN,CAAQ,EACrD,OAAIrN,IACF2N,EAAY,UAAU,KAAK,QAAUH,GAAgBxN,CAAgB,GAIhEuN,GAAKF,EAAUM,CAAW,CAC3C,CAAS,CAET,CAAK,EAEMF,EAAa,MAAM,KAAMrc,CAAI,CACxC,CACA,CAEA,SAAS+b,GAAiBrG,EAAQ,CAEhC,MAAM8G,EAAexH,EAEfW,EAAQ6G,EAAa9G,CAAM,GAAK8G,EAAa9G,CAAM,EAAE,UAGvD,CAACC,GAAS,CAACA,EAAM,gBAAkB,CAACA,EAAM,eAAe,kBAAkB,IAI/E9V,GAAK8V,EAAO,mBAAoB,SAAUsG,EAE3C,CACG,OAAO,SAGLQ,EACAC,EACAvX,EACA,CACA,GAAI,CACE,OAAOuX,EAAG,aAAgB,aAO5BA,EAAG,YAAcP,GAAKO,EAAG,YAAa,CACpC,UAAW,CACT,KAAM,CACJ,SAAU,cACV,QAASN,GAAgBM,CAAE,EAC3B,OAAAhH,CACD,EACD,QAAS,GACT,KAAM,YACP,CACb,CAAW,EAEJ,MAAa,CAEb,CAED,OAAOuG,EAAS,MAAM,KAAM,CAC1BQ,EAEAN,GAAKO,EAAK,CACR,UAAW,CACT,KAAM,CACJ,SAAU,mBACV,QAASN,GAAgBM,CAAE,EAC3B,OAAAhH,CACD,EACD,QAAS,GACT,KAAM,YACP,CACX,CAAS,EACDvQ,CACR,CAAO,CACP,CACA,CAAG,EAEDtF,GACE8V,EACA,sBACA,SACEM,EAEA,CACA,OAAO,SAGLwG,EACAC,EACAvX,EACA,CAkBA,MAAMwX,EAAsBD,EAC5B,GAAI,CACF,MAAME,EAAuBD,GAAuBA,EAAoB,mBACpEC,GACF3G,EAA4B,KAAK,KAAMwG,EAAWG,EAAsBzX,CAAO,CAElF,MAAW,CAEX,CACD,OAAO8Q,EAA4B,KAAK,KAAMwG,EAAWE,EAAqBxX,CAAO,CAC7F,CACK,CACL,EACA,CCpQA,MAAMsJ,GAAmB,iBAEnBoO,GAA8B,CAAC1X,EAAU,KAAO,CACpD,MAAMmU,EAAW,CACf,QAAS,GACT,qBAAsB,GACtB,GAAGnU,CACP,EAEE,MAAO,CACL,KAAMsJ,GACN,WAAY,CACV,MAAM,gBAAkB,EACzB,EACD,MAAM7I,EAAQ,CACR0T,EAAS,UACXwD,GAA6BlX,CAAM,EACnCmX,GAAiB,SAAS,GAExBzD,EAAS,uBACX0D,GAA0CpX,CAAM,EAChDmX,GAAiB,sBAAsB,EAE1C,CACL,CACA,EAEME,GAA8CJ,GAEpD,SAASC,GAA6BlX,EAAQ,CAC5CsX,GAAqChC,GAAQ,CAC3C,KAAM,CAAE,YAAAjJ,EAAa,iBAAAuB,CAAkB,EAAG2J,GAAU,EAEpD,GAAIhP,EAAW,IAAKvI,GAAUwX,KAC5B,OAGF,KAAM,CAAE,IAAAC,EAAK,IAAA/W,EAAK,KAAA8R,EAAM,OAAAkF,EAAQ,MAAAvf,CAAO,EAAGmd,EAEpCzd,EAAQ8f,GACZ9J,GAAsBxB,EAAalU,GAASsf,EAAK,OAAW7J,EAAkB,EAAK,EACnFlN,EACA8R,EACAkF,CACN,EAEI7f,EAAM,MAAQ,QAEd+f,GAAa/f,EAAO,CAClB,kBAAmBM,EACnB,UAAW,CACT,QAAS,GACT,KAAM,SACP,CACP,CAAK,CACL,CAAG,CACH,CAEA,SAASif,GAA0CpX,EAAQ,CACzD6X,GAAkD7R,GAAK,CACrD,KAAM,CAAE,YAAAqG,EAAa,iBAAAuB,CAAkB,EAAG2J,GAAU,EAEpD,GAAIhP,EAAW,IAAKvI,GAAUwX,KAC5B,OAGF,MAAMrf,EAAQ2f,GAA4B9R,GAEpCnO,EAAQuJ,GAAYjJ,CAAK,EAC3B4f,GAAiC5f,CAAK,EACtC0V,GAAsBxB,EAAalU,EAAO,OAAWyV,EAAkB,EAAI,EAE/E/V,EAAM,MAAQ,QAEd+f,GAAa/f,EAAO,CAClB,kBAAmBM,EACnB,UAAW,CACT,QAAS,GACT,KAAM,sBACP,CACP,CAAK,CACL,CAAG,CACH,CAEA,SAAS2f,GAA4B3f,EAAO,CAC1C,GAAIiJ,GAAYjJ,CAAK,EACnB,OAAOA,EAIT,GAAI,CAIF,GAAI,WAAaA,EACf,OAAQA,EAAQ,OAQlB,GAAI,WAAaA,GAAW,WAAaA,EAAQ,OAC/C,OAAQA,EAAQ,OAAO,MAE7B,MAAe,CAAE,CAEf,OAAOA,CACT,CAQA,SAAS4f,GAAiCxV,EAAQ,CAChD,MAAO,CACL,UAAW,CACT,OAAQ,CACN,CACE,KAAM,qBAEN,MAAO,oDAAoD,OAAOA,CAAM,CAAC,EAC1E,CACF,CACF,CACL,CACA,CAGA,SAASoV,GAA8B9f,EAAO6I,EAAK8R,EAAMkF,EAAQ,CAE/D,MAAM1R,EAAKnO,EAAM,UAAYA,EAAM,WAAa,CAAA,EAE1CmgB,EAAMhS,EAAE,OAASA,EAAE,QAAU,CAAA,EAE7BiS,EAAOD,EAAG,CAAC,EAAIA,EAAG,CAAC,GAAK,CAAA,EAExBE,EAAQD,EAAI,WAAaA,EAAI,YAAc,CAAA,EAE3CE,EAASD,EAAK,OAASA,EAAK,QAAU,CAAA,EAEtChG,EAAQ,MAAM,SAASwF,EAAQ,EAAE,CAAC,EAAI,OAAYA,EAClDzF,EAAS,MAAM,SAASO,EAAM,EAAE,CAAC,EAAI,OAAYA,EACjDT,EAAWqG,GAAS1X,CAAG,GAAKA,EAAI,OAAS,EAAIA,EAAM2X,KAGzD,OAAIF,EAAM,SAAW,GACnBA,EAAM,KAAK,CACT,MAAAjG,EACA,SAAAH,EACA,SAAUI,GACV,OAAQ,GACR,OAAAF,CACN,CAAK,EAGIpa,CACT,CAEA,SAASsf,GAAiBzd,EAAM,CAC9B0G,IAAeC,EAAO,IAAI,4BAA4B3G,CAAI,EAAE,CAC9D,CAEA,SAAS6d,IAAa,CACpB,MAAMvX,EAASuI,IAKf,OAJiBvI,GAAUA,EAAO,WAAU,GAAO,CACjD,YAAa,IAAM,CAAE,EACrB,iBAAkB,EACtB,CAEA,CC5KA,MAAMsY,GAA2C,KACxC,CACL,KAAM,cACN,gBAAgBzgB,EAAO,CAErB,GAAI,CAACuX,EAAO,WAAa,CAACA,EAAO,UAAY,CAACA,EAAO,SACnD,OAIF,MAAM1O,EAAO7I,EAAM,SAAWA,EAAM,QAAQ,KAASuX,EAAO,UAAYA,EAAO,SAAS,KAClF,CAAE,SAAAmJ,CAAU,EAAGnJ,EAAO,UAAY,CAAA,EAClC,CAAE,UAAAoJ,CAAW,EAAGpJ,EAAO,WAAa,CAAA,EAEpCnS,EAAU,CACd,GAAIpF,EAAM,SAAWA,EAAM,QAAQ,QACnC,GAAI0gB,GAAY,CAAE,QAASA,GAC3B,GAAIC,GAAa,CAAE,aAAcA,EACzC,EACY/G,EAAU,CAAE,GAAG5Z,EAAM,QAAS,GAAI6I,GAAO,CAAE,IAAAA,CAAG,EAAK,QAAAzD,GAEzDpF,EAAM,QAAU4Z,CACjB,CACL,GC1BMgH,GAAc,QACdC,GAAgB,EAEhB7P,GAAmB,eAEnB8P,GAA4B,CAACpZ,EAAU,KAAO,CAClD,MAAM3H,EAAQ2H,EAAQ,OAASmZ,GACzB/gB,EAAM4H,EAAQ,KAAOkZ,GAE3B,MAAO,CACL,KAAM5P,GACN,gBAAgBhR,EAAOC,EAAMkI,EAAQ,CACnC,MAAMT,EAAUS,EAAO,aAEvBzI,GAEE6U,GACA7M,EAAQ,YACRA,EAAQ,eACR5H,EACAC,EACAC,EACAC,CACR,CACK,CACL,CACA,EAKM8gB,GAA4CD,GCpBlD,SAASE,GAAuBnF,EAAU,CAKxC,MAAO,CACL/J,GAA2B,EAC3BR,GAA6B,EAC7BiN,GAA6B,EAC7BhC,GAAwB,EACxBiD,GAA2B,EAC3BuB,GAAyB,EACzBzN,GAAmB,EACnBmN,GAAwB,CAC5B,CACA,CAEA,SAASQ,GAAoBC,EAAa,GAAI,CAC5C,MAAMC,EAAiB,CACrB,oBAAqBH,GAAwB,EAC7C,QACE,OAAO,oBAAuB,SAC1B,mBACAzJ,EAAO,gBAAkBA,EAAO,eAAe,GAC7CA,EAAO,eAAe,GACtB,OACR,oBAAqB,GACrB,kBAAmB,EACvB,EAME,OAAI2J,EAAW,qBAAuB,MACpC,OAAOA,EAAW,oBAGb,CAAE,GAAGC,EAAgB,GAAGD,EACjC,CAEA,SAASE,IAAkC,CACzC,MAAMC,EACJ,OAAO9J,EAAO,OAAW,KAAgBA,EAC3C,GAAI,CAAC8J,EAEH,MAAO,GAGT,MAAMC,EAAeD,EAAyB,OAAS,SAAW,UAC5DE,EAAkBF,EAAyBC,CAAY,EAEvDE,EAAYD,GAAmBA,EAAgB,SAAWA,EAAgB,QAAQ,GAClFE,EAAQlK,EAAO,UAAYA,EAAO,SAAS,MAAS,GAEpDmK,EAAqB,CAAC,oBAAqB,iBAAkB,wBAAyB,uBAAuB,EAG7GC,EACJ,CAAC,CAACH,GAAajK,IAAWA,EAAO,KAAOmK,EAAmB,KAAKxb,GAAYub,EAAK,WAAW,GAAGvb,CAAQ,IAAI,CAAC,EAIxG0b,EAAS,OAAOP,EAAyB,GAAO,IAEtD,MAAO,CAAC,CAACG,GAAa,CAACG,GAA4B,CAACC,CACtD,CAoDA,SAASC,GAAKC,EAAiB,GAAI,CACjC,MAAMpa,EAAUuZ,GAAoBa,CAAc,EAElD,GAAI,CAACpa,EAAQ,2BAA6B0Z,KAAmC,CAC3ExS,GAAe,IAAM,CAEnB,QAAQ,MACN,uJACR,CACA,CAAK,EACD,MACD,CAEGrG,KACGwZ,GAAa,GAChBvZ,EAAO,KACL,oIACR,GAGE,MAAMkJ,EAAgB,CACpB,GAAGhK,EACH,YAAasa,GAAkCta,EAAQ,aAAe6T,EAAkB,EACxF,aAAc9T,GAAuBC,CAAO,EAC5C,UAAWA,EAAQ,WAAa8R,EACpC,EAEQrR,EAASuG,GAAY0I,GAAe1F,CAAa,EAEvD,OAAIhK,EAAQ,qBACVua,KAGK9Z,CACT,CAWA,SAAS+Z,GAAiBxa,EAAU,GAAI,CAEtC,GAAI,CAAC6P,EAAO,SAAU,CACpBhP,IAAeC,EAAO,MAAM,sDAAsD,EAClF,MACD,CAED,MAAMM,EAAQ+F,KACR1G,EAASW,EAAM,YACf1E,EAAM+D,GAAUA,EAAO,OAAM,EAEnC,GAAI,CAAC/D,EAAK,CACRmE,IAAeC,EAAO,MAAM,8CAA8C,EAC1E,MACD,CASD,GAPIM,IACFpB,EAAQ,KAAO,CACb,GAAGoB,EAAM,QAAS,EAClB,GAAGpB,EAAQ,IACjB,GAGM,CAACA,EAAQ,QAAS,CACpB,MAAMqB,EAAUoZ,KACZpZ,IACFrB,EAAQ,QAAUqB,EAErB,CAED,MAAMqZ,EAAS7K,EAAO,SAAS,cAAc,QAAQ,EACrD6K,EAAO,MAAQ,GACfA,EAAO,YAAc,YACrBA,EAAO,IAAM1b,GAAwBtC,EAAKsD,CAAO,EAE7CA,EAAQ,SACV0a,EAAO,OAAS1a,EAAQ,QAG1B,KAAM,CAAE,QAAA2a,CAAS,EAAG3a,EACpB,GAAI2a,EAAS,CACX,MAAMC,EAAoCtiB,GAAU,CAClD,GAAIA,EAAM,OAAS,iCACjB,GAAI,CACFqiB,GACV,QAAkB,CACR9K,EAAO,oBAAoB,UAAW+K,CAAgC,CACvE,CAET,EACI/K,EAAO,iBAAiB,UAAW+K,CAAgC,CACpE,CAED,MAAMC,EAAiBhL,EAAO,SAAS,MAAQA,EAAO,SAAS,KAC3DgL,EACFA,EAAe,YAAYH,CAAM,EAEjC7Z,IAAeC,EAAO,MAAM,+DAA+D,CAE/F,CAqBA,SAASyZ,IAAuB,CAC9B,GAAI,OAAO1K,EAAO,SAAa,IAAa,CAC1ChP,IAAeC,EAAO,KAAK,oFAAoF,EAC/G,MACD,CAMDga,GAAa,CAAE,eAAgB,EAAI,CAAE,EACrCC,KAGArG,GAAiC,CAAC,CAAE,KAAAsB,EAAM,GAAAC,KAAS,CAE7CD,IAAS,QAAaA,IAASC,IACjC6E,GAAa,CAAE,eAAgB,EAAI,CAAE,EACrCC,KAEN,CAAG,CACH,CC9QA,MAAMlL,EAAStV,GAETygB,GAAqB,sBACrBC,GAAoB,eACpBC,GAAwB,wBAGxBC,GAA8B,IAG9BC,GAA+B,IAG/BC,GAA0B,IAG1BC,GAA0B,KAG1BC,GAAuB,IAEvBC,GAAsB,IACtBC,GAAkB,EAGlBC,GAAwB,KAGxBC,GAAuB,IAGvBC,GAAuB,IAEvBC,GAA4B,IAG5BC,GAA+B,IAG/BC,GAAsB,KAEtBC,GAA4B,KAG5BC,GAAsB,KAE5B,SAASC,GAAmB9d,EAAKC,EAAO,CAAE,OAAID,GAA2CC,EAAK,CAAK,CAAE,SAAS8d,GAAiBC,EAAK,CAAE,IAAIC,EAA+BnW,EAAQkW,EAAI,CAAC,EAAO9iB,EAAI,EAAG,KAAOA,EAAI8iB,EAAI,QAAQ,CAAE,MAAME,EAAKF,EAAI9iB,CAAC,EAASie,EAAK6E,EAAI9iB,EAAI,CAAC,EAAW,GAARA,GAAK,GAAQgjB,IAAO,kBAAoBA,IAAO,iBAAmBpW,GAAS,KAAQ,OAAwBoW,IAAO,UAAYA,IAAO,kBAAoBD,EAAgBnW,EAAOA,EAAQqR,EAAGrR,CAAK,IAAcoW,IAAO,QAAUA,IAAO,kBAAkBpW,EAAQqR,EAAG,IAAI1c,IAASqL,EAAM,KAAKmW,EAAe,GAAGxhB,CAAI,CAAC,EAAGwhB,EAAgB,OAAY,CAAG,OAAOnW,CAAQ,CAAA,IAAIqW,GAC7mB,SAAUC,EAAU,CACjBA,EAASA,EAAS,SAAc,CAAC,EAAI,WACrCA,EAASA,EAAS,aAAkB,CAAC,EAAI,eACzCA,EAASA,EAAS,QAAa,CAAC,EAAI,UACpCA,EAASA,EAAS,KAAU,CAAC,EAAI,OACjCA,EAASA,EAAS,MAAW,CAAC,EAAI,QAClCA,EAASA,EAAS,QAAa,CAAC,EAAI,SACxC,GAAGD,IAAeA,EAAa,CAAE,EAAC,EAElC,SAASE,GAAYC,EAAG,CACpB,OAAOA,EAAE,WAAaA,EAAE,YAC5B,CACA,SAASC,GAAaD,EAAG,CACrB,MAAME,EAAOT,GAAiB,CAACO,EAAG,iBAAkBG,GAAKA,EAAE,IAAI,CAAC,EAChE,OAAeV,GAAiB,CAACS,EAAM,iBAAkBE,GAAMA,EAAG,UAAU,CAAC,IAAMJ,CACvF,CACA,SAASK,GAAkBC,EAAY,CACnC,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAU,IAAM,qBAC1D,CACA,SAASC,GAAmCC,EAAS,CACjD,OAAIA,EAAQ,SAAS,yBAAyB,GAC1C,CAACA,EAAQ,SAAS,iCAAiC,IACnDA,EAAUA,EAAQ,QAAQ,8BAA+B,wDAAwD,GAE9GA,CACX,CACA,SAASC,GAAsBC,EAAM,CACjC,KAAM,CAAE,QAAAF,CAAS,EAAGE,EACpB,GAAIF,EAAQ,MAAM,GAAG,EAAE,OAAS,EAC5B,OAAOA,EACX,MAAMG,EAAY,CAAC,UAAW,OAAO,KAAK,UAAUD,EAAK,IAAI,CAAC,GAAG,EACjE,OAAIA,EAAK,YAAc,GACnBC,EAAU,KAAK,OAAO,EAEjBD,EAAK,WACVC,EAAU,KAAK,SAASD,EAAK,SAAS,GAAG,EAEzCA,EAAK,cACLC,EAAU,KAAK,YAAYD,EAAK,YAAY,GAAG,EAE/CA,EAAK,MAAM,QACXC,EAAU,KAAKD,EAAK,MAAM,SAAS,EAEhCC,EAAU,KAAK,GAAG,EAAI,GACjC,CACA,SAASC,GAAoBC,EAAG,CAC5B,GAAI,CACA,MAAMC,EAAQD,EAAE,OAASA,EAAE,SAC3B,OAAOC,EACDP,GAAmC,MAAM,KAAKO,EAAOC,EAAa,EAAE,KAAK,EAAE,CAAC,EAC5E,IACT,MACa,CACV,OAAO,IACV,CACL,CACA,SAASA,GAAcL,EAAM,CACzB,IAAIM,EACJ,GAAIC,GAAgBP,CAAI,EACpB,GAAI,CACAM,EACIJ,GAAoBF,EAAK,UAAU,GAC/BD,GAAsBC,CAAI,CACrC,MACa,CACb,SAEIQ,GAAeR,CAAI,GAAKA,EAAK,aAAa,SAAS,GAAG,EAC3D,OAAOS,GAAgBT,EAAK,OAAO,EAEvC,OAAOM,GAAqBN,EAAK,OACrC,CACA,SAASS,GAAgBC,EAAgB,CACrC,MAAMC,EAAQ,uCACd,OAAOD,EAAe,QAAQC,EAAO,QAAQ,CACjD,CACA,SAASJ,GAAgBP,EAAM,CAC3B,MAAO,eAAgBA,CAC3B,CACA,SAASQ,GAAeR,EAAM,CAC1B,MAAO,iBAAkBA,CAC7B,CACA,MAAMY,EAAO,CACT,aAAc,CACV,KAAK,UAAY,IAAI,IACrB,KAAK,YAAc,IAAI,OAC1B,CACD,MAAMtB,EAAG,CACL,GAAI,CAACA,EACD,MAAO,GACX,MAAMuB,EAAK9B,GAAiB,CAAC,KAAM,SAAU+B,GAAMA,EAAG,QAAS,OAAQC,GAAMA,EAAGzB,CAAC,EAAG,iBAAkB0B,GAAMA,EAAG,EAAE,CAAC,EAClH,OAAOlC,GAAmB+B,EAAI,IAAQ,EAAG,CAC5C,CACD,QAAQA,EAAI,CACR,OAAO,KAAK,UAAU,IAAIA,CAAE,GAAK,IACpC,CACD,QAAS,CACL,OAAO,MAAM,KAAK,KAAK,UAAU,KAAM,CAAA,CAC1C,CACD,QAAQvB,EAAG,CACP,OAAO,KAAK,YAAY,IAAIA,CAAC,GAAK,IACrC,CACD,kBAAkBA,EAAG,CACjB,MAAMuB,EAAK,KAAK,MAAMvB,CAAC,EACvB,KAAK,UAAU,OAAOuB,CAAE,EACpBvB,EAAE,YACFA,EAAE,WAAW,QAAS2B,GAAc,KAAK,kBAAkBA,CAAS,CAAC,CAE5E,CACD,IAAIJ,EAAI,CACJ,OAAO,KAAK,UAAU,IAAIA,CAAE,CAC/B,CACD,QAAQK,EAAM,CACV,OAAO,KAAK,YAAY,IAAIA,CAAI,CACnC,CACD,IAAI5B,EAAG6B,EAAM,CACT,MAAMN,EAAKM,EAAK,GAChB,KAAK,UAAU,IAAIN,EAAIvB,CAAC,EACxB,KAAK,YAAY,IAAIA,EAAG6B,CAAI,CAC/B,CACD,QAAQN,EAAI,EAAG,CACX,MAAMO,EAAU,KAAK,QAAQP,CAAE,EAC/B,GAAIO,EAAS,CACT,MAAMD,EAAO,KAAK,YAAY,IAAIC,CAAO,EACrCD,GACA,KAAK,YAAY,IAAI,EAAGA,CAAI,CACnC,CACD,KAAK,UAAU,IAAIN,EAAI,CAAC,CAC3B,CACD,OAAQ,CACJ,KAAK,UAAY,IAAI,IACrB,KAAK,YAAc,IAAI,OAC1B,CACL,CACA,SAASQ,IAAe,CACpB,OAAO,IAAIT,EACf,CACA,SAASU,GAAgB,CAAE,iBAAAC,EAAkB,QAAAC,EAAS,KAAAzkB,CAAI,EAAK,CAC3D,OAAIykB,IAAY,WACZA,EAAU,UAEP,GAAQD,EAAiBC,EAAQ,YAAW,CAAE,GAChDzkB,GAAQwkB,EAAiBxkB,CAAI,GAC9BA,IAAS,YACRykB,IAAY,SAAW,CAACzkB,GAAQwkB,EAAiB,KAC1D,CACA,SAASE,GAAe,CAAE,SAAAC,EAAU,QAAA3J,EAAS,MAAAjP,EAAO,YAAA6Y,CAAW,EAAK,CAChE,IAAIC,EAAO9Y,GAAS,GACpB,OAAK4Y,GAGDC,IACAC,EAAOD,EAAYC,EAAM7J,CAAO,GAE7B,IAAI,OAAO6J,EAAK,MAAM,GALlBA,CAMf,CACA,SAASC,GAAYzW,EAAK,CACtB,OAAOA,EAAI,aACf,CACA,SAAS0W,GAAY1W,EAAK,CACtB,OAAOA,EAAI,aACf,CACA,MAAM2W,GAA0B,qBAChC,SAASC,GAAgBC,EAAQ,CAC7B,MAAMC,EAAMD,EAAO,WAAW,IAAI,EAClC,GAAI,CAACC,EACD,MAAO,GACX,MAAMC,EAAY,GAClB,QAASC,EAAI,EAAGA,EAAIH,EAAO,MAAOG,GAAKD,EACnC,QAASE,EAAI,EAAGA,EAAIJ,EAAO,OAAQI,GAAKF,EAAW,CAC/C,MAAMG,EAAeJ,EAAI,aACnBK,EAAuBR,MAA2BO,EAClDA,EAAaP,EAAuB,EACpCO,EAEN,GADoB,IAAI,YAAYC,EAAqB,KAAKL,EAAKE,EAAGC,EAAG,KAAK,IAAIF,EAAWF,EAAO,MAAQG,CAAC,EAAG,KAAK,IAAID,EAAWF,EAAO,OAASI,CAAC,CAAC,EAAE,KAAK,MAAM,EACnJ,KAAMG,GAAUA,IAAU,CAAC,EACvC,MAAO,EACd,CAEL,MAAO,EACX,CACA,SAASC,GAAa1K,EAAS,CAC3B,MAAMhb,EAAOgb,EAAQ,KACrB,OAAOA,EAAQ,aAAa,qBAAqB,EAC3C,WACAhb,EAEM8kB,GAAY9kB,CAAI,EAClB,IACd,CACA,SAAS2lB,GAAcnP,EAAIiO,EAASzkB,EAAM,CACtC,OAAIykB,IAAY,UAAYzkB,IAAS,SAAWA,IAAS,YAC9CwW,EAAG,aAAa,OAAO,GAAK,GAEhCA,EAAG,KACd,CACA,SAASoP,GAAqBC,EAAMC,EAAS,CACzC,IAAI9e,EACJ,GAAI,CACAA,EAAM,IAAI,IAAI6e,EAAM9D,GAAmB+D,EAAS,IAAQ,OAAO,SAAS,IAAK,CAAC,CACjF,MACW,CACR,OAAO,IACV,CACD,MAAMlC,EAAQ,sBACRmC,EAAQ/e,EAAI,SAAS,MAAM4c,CAAK,EACtC,OAAO7B,GAAmBC,GAAiB,CAAC+D,EAAO,iBAAkBC,GAAMA,EAAG,CAAC,CAAC,CAAC,EAAG,IAAQ,IAAK,CACrG,CACA,MAAMC,GAA0B,CAAA,EAChC,SAASC,GAAoBxgB,EAAM,CAC/B,MAAMyR,EAAS8O,GAAwBvgB,CAAI,EAC3C,GAAIyR,EACA,OAAOA,EAEX,MAAMG,EAAW,OAAO,SACxB,IAAIF,EAAO,OAAO1R,CAAI,EACtB,GAAI4R,GAAY,OAAOA,EAAS,eAAkB,WAC9C,GAAI,CACA,MAAMC,EAAUD,EAAS,cAAc,QAAQ,EAC/CC,EAAQ,OAAS,GACjBD,EAAS,KAAK,YAAYC,CAAO,EACjC,MAAMC,EAAgBD,EAAQ,cAC1BC,GAAiBA,EAAc9R,CAAI,IACnC0R,EACII,EAAc9R,CAAI,GAE1B4R,EAAS,KAAK,YAAYC,CAAO,CACpC,MACS,CACT,CAEL,OAAQ0O,GAAwBvgB,CAAI,EAAI0R,EAAK,KAAK,MAAM,CAC5D,CACA,SAAS+O,MAAgBhd,EAAM,CAC3B,OAAO+c,GAAoB,YAAY,EAAE,GAAG/c,CAAI,CACpD,CACA,SAASid,MAAkBjd,EAAM,CAC7B,OAAO+c,GAAoB,cAAc,EAAE,GAAG/c,CAAI,CACtD,CAEA,IAAIkd,GAAM,EACV,MAAMC,GAAe,IAAI,OAAO,cAAc,EACxCC,GAAe,GACrB,SAASC,IAAQ,CACb,OAAOH,IACX,CACA,SAASI,GAAgBzL,EAAS,CAC9B,GAAIA,aAAmB,gBACnB,MAAO,OAEX,MAAM0L,EAAmB5B,GAAY9J,EAAQ,OAAO,EACpD,OAAIsL,GAAa,KAAKI,CAAgB,EAC3B,MAEJA,CACX,CACA,SAASC,GAAc3f,EAAK,CACxB,IAAI4f,EAAS,GACb,OAAI5f,EAAI,QAAQ,IAAI,EAAI,GACpB4f,EAAS5f,EAAI,MAAM,GAAG,EAAE,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAG5C4f,EAAS5f,EAAI,MAAM,GAAG,EAAE,CAAC,EAE7B4f,EAASA,EAAO,MAAM,GAAG,EAAE,CAAC,EACrBA,CACX,CACA,IAAIC,GACAC,GACJ,MAAMC,GAAiB,6CACjBC,GAAqB,sBACrBC,GAAgB,YAChBC,GAAW,wBACjB,SAASC,GAAqBpE,EAASnD,EAAM,CACzC,OAAQmD,GAAW,IAAI,QAAQgE,GAAgB,CAACH,EAAQQ,EAAQC,EAAOC,EAAQC,EAAOC,IAAU,CAC5F,MAAMC,EAAWJ,GAASE,GAASC,EAC7BE,EAAaN,GAAUE,GAAU,GACvC,GAAI,CAACG,EACD,OAAOb,EAEX,GAAII,GAAmB,KAAKS,CAAQ,GAAKR,GAAc,KAAKQ,CAAQ,EAChE,MAAO,OAAOC,CAAU,GAAGD,CAAQ,GAAGC,CAAU,IAEpD,GAAIR,GAAS,KAAKO,CAAQ,EACtB,MAAO,OAAOC,CAAU,GAAGD,CAAQ,GAAGC,CAAU,IAEpD,GAAID,EAAS,CAAC,IAAM,IAChB,MAAO,OAAOC,CAAU,GAAGf,GAAc/G,CAAI,EAAI6H,CAAQ,GAAGC,CAAU,IAE1E,MAAMC,EAAQ/H,EAAK,MAAM,GAAG,EACtB3G,EAAQwO,EAAS,MAAM,GAAG,EAChCE,EAAM,IAAG,EACT,UAAWC,KAAQ3O,EACX2O,IAAS,MAGJA,IAAS,KACdD,EAAM,IAAG,EAGTA,EAAM,KAAKC,CAAI,GAGvB,MAAO,OAAOF,CAAU,GAAGC,EAAM,KAAK,GAAG,CAAC,GAAGD,CAAU,GAC/D,CAAK,CACL,CACA,MAAMG,GAAoB,qBACpBC,GAA0B,qBAChC,SAASC,GAAwBC,EAAKC,EAAgB,CAClD,GAAIA,EAAe,KAAM,IAAK,GAC1B,OAAOA,EAEX,IAAIC,EAAM,EACV,SAASC,EAAkBC,EAAO,CAC9B,IAAIC,EACJ,MAAMtC,EAAQqC,EAAM,KAAKH,EAAe,UAAUC,CAAG,CAAC,EACtD,OAAInC,GACAsC,EAAQtC,EAAM,CAAC,EACfmC,GAAOG,EAAM,OACNA,GAEJ,EACV,CACD,MAAMC,EAAS,CAAA,EACf,KACIH,EAAkBL,EAAuB,EACrC,EAAAI,GAAOD,EAAe,SAFjB,CAKT,IAAIjhB,EAAMmhB,EAAkBN,EAAiB,EAC7C,GAAI7gB,EAAI,MAAM,EAAE,IAAM,IAClBA,EAAMuhB,GAAcP,EAAKhhB,EAAI,UAAU,EAAGA,EAAI,OAAS,CAAC,CAAC,EACzDshB,EAAO,KAAKthB,CAAG,MAEd,CACD,IAAIwhB,EAAiB,GACrBxhB,EAAMuhB,GAAcP,EAAKhhB,CAAG,EAC5B,IAAIyhB,EAAW,GACf,OAAa,CACT,MAAMC,EAAIT,EAAe,OAAOC,CAAG,EACnC,GAAIQ,IAAM,GAAI,CACVJ,EAAO,MAAMthB,EAAMwhB,GAAgB,KAAM,CAAA,EACzC,KACH,SACSC,EAWFC,IAAM,MACND,EAAW,YAXXC,IAAM,IAAK,CACXR,GAAO,EACPI,EAAO,MAAMthB,EAAMwhB,GAAgB,KAAM,CAAA,EACzC,KACH,MACQE,IAAM,MACXD,EAAW,IAQnBD,GAAkBE,EAClBR,GAAO,CACV,CACJ,CACJ,CACD,OAAOI,EAAO,KAAK,IAAI,CAC3B,CACA,MAAMK,GAAiB,IAAI,QAC3B,SAASJ,GAAcP,EAAKC,EAAgB,CACxC,MAAI,CAACA,GAAkBA,EAAe,KAAI,IAAO,GACtCA,EAEJW,GAAQZ,EAAKC,CAAc,CACtC,CACA,SAASY,GAAarS,EAAI,CACtB,MAAO,GAAQA,EAAG,UAAY,OAASA,EAAG,gBAC9C,CACA,SAASoS,GAAQZ,EAAKc,EAAY,CAC9B,IAAIC,EAAIJ,GAAe,IAAIX,CAAG,EAK9B,GAJKe,IACDA,EAAIf,EAAI,cAAc,GAAG,EACzBW,GAAe,IAAIX,EAAKe,CAAC,GAEzB,CAACD,EACDA,EAAa,WAERA,EAAW,WAAW,OAAO,GAAKA,EAAW,WAAW,OAAO,EACpE,OAAOA,EAEX,OAAAC,EAAE,aAAa,OAAQD,CAAU,EAC1BC,EAAE,IACb,CACA,SAASC,GAAmBhB,EAAKvD,EAAS/e,EAAMqG,EAAOiP,EAASiO,EAAiB,CAC7E,OAAKld,IAGDrG,IAAS,OACRA,IAAS,QAAU,EAAE+e,IAAY,OAAS1Y,EAAM,CAAC,IAAM,MAGnDrG,IAAS,cAAgBqG,EAAM,CAAC,IAAM,KAGtCrG,IAAS,eACb+e,IAAY,SAAWA,IAAY,MAAQA,IAAY,MANjD8D,GAAcP,EAAKjc,CAAK,EAS1BrG,IAAS,SACPqiB,GAAwBC,EAAKjc,CAAK,EAEpCrG,IAAS,QACPyhB,GAAqBpb,EAAO6c,GAAQZ,CAAG,CAAC,EAE1CvD,IAAY,UAAY/e,IAAS,OAC/B6iB,GAAcP,EAAKjc,CAAK,EAE/B,OAAOkd,GAAoB,WACpBA,EAAgBvjB,EAAMqG,EAAOiP,CAAO,EAExCjP,EACX,CACA,SAASmd,GAAgBzE,EAAS/e,EAAMyjB,EAAQ,CAC5C,OAAQ1E,IAAY,SAAWA,IAAY,UAAY/e,IAAS,UACpE,CACA,SAAS0jB,GAAkBpO,EAASqO,EAAYC,EAAeC,EAAiB,CAC5E,GAAI,CACA,GAAIA,GAAmBvO,EAAQ,QAAQuO,CAAe,EAClD,MAAO,GAEX,GAAI,OAAOF,GAAe,UACtB,GAAIrO,EAAQ,UAAU,SAASqO,CAAU,EACrC,MAAO,OAIX,SAASG,EAASxO,EAAQ,UAAU,OAAQwO,KAAW,CACnD,MAAMC,EAAYzO,EAAQ,UAAUwO,CAAM,EAC1C,GAAIH,EAAW,KAAKI,CAAS,EACzB,MAAO,EAEd,CAEL,GAAIH,EACA,OAAOtO,EAAQ,QAAQsO,CAAa,CAE3C,MACS,CACT,CACD,MAAO,EACX,CACA,SAASI,GAAyBlT,EAAIoN,EAAO,CACzC,QAAS4F,EAAShT,EAAG,UAAU,OAAQgT,KAAW,CAC9C,MAAMC,EAAYjT,EAAG,UAAUgT,CAAM,EACrC,GAAI5F,EAAM,KAAK6F,CAAS,EACpB,MAAO,EAEd,CACD,MAAO,EACX,CACA,SAASE,GAAgBxF,EAAMyF,EAAgB1rB,EAAQ,IAAU2rB,EAAW,EAAG,CAK3E,MAJI,CAAC1F,GAEDA,EAAK,WAAaA,EAAK,cAEvB0F,EAAW3rB,EACJ,GACP0rB,EAAezF,CAAI,EACZ0F,EACJF,GAAgBxF,EAAK,WAAYyF,EAAgB1rB,EAAO2rB,EAAW,CAAC,CAC/E,CACA,SAASC,GAAqBL,EAAWM,EAAU,CAC/C,OAAQ5F,GAAS,CACb,MAAM3N,EAAK2N,EACX,GAAI3N,IAAO,KACP,MAAO,GACX,GAAI,CACA,GAAIiT,GACA,GAAI,OAAOA,GAAc,UACrB,GAAIjT,EAAG,QAAQ,IAAIiT,CAAS,EAAE,EAC1B,MAAO,WAENC,GAAyBlT,EAAIiT,CAAS,EAC3C,MAAO,GAGf,MAAI,GAAAM,GAAYvT,EAAG,QAAQuT,CAAQ,EAGtC,MACU,CACP,MAAO,EACV,CACT,CACA,CACA,SAASC,GAAgB7F,EAAM8F,EAAeC,EAAkBC,EAAiBC,EAAoBC,EAAa,CAC9G,GAAI,CACA,MAAM7T,EAAK2N,EAAK,WAAaA,EAAK,aAC5BA,EACAA,EAAK,cACX,GAAI3N,IAAO,KACP,MAAO,GACX,GAAIA,EAAG,UAAY,QAAS,CACxB,MAAM8T,EAAe9T,EAAG,aAAa,cAAc,EAUnD,GATqC,CACjC,mBACA,eACA,YACA,SACA,eACA,cACA,QAChB,EAC6C,SAAS8T,CAAY,EAClD,MAAO,EAEd,CACD,IAAIC,EAAe,GACfC,EAAiB,GACrB,GAAIH,EAAa,CAEb,GADAG,EAAiBb,GAAgBnT,EAAIsT,GAAqBK,EAAiBC,CAAkB,CAAC,EAC1FI,EAAiB,EACjB,MAAO,GAEXD,EAAeZ,GAAgBnT,EAAIsT,GAAqBG,EAAeC,CAAgB,EAAGM,GAAkB,EAAIA,EAAiB,GAAQ,CAC5I,KACI,CAED,GADAD,EAAeZ,GAAgBnT,EAAIsT,GAAqBG,EAAeC,CAAgB,CAAC,EACpFK,EAAe,EACf,MAAO,GAEXC,EAAiBb,GAAgBnT,EAAIsT,GAAqBK,EAAiBC,CAAkB,EAAGG,GAAgB,EAAIA,EAAe,GAAQ,CAC9I,CACD,OAAOA,GAAgB,EACjBC,GAAkB,EACdD,GAAgBC,EAChB,GACJA,GAAkB,EACd,GACA,CAAC,CAACH,CACf,MACS,CACT,CACD,MAAO,CAAC,CAACA,CACb,CACA,SAASI,GAAiBC,EAAUnU,EAAUoU,EAAmB,CAC7D,MAAMC,EAAMF,EAAS,cACrB,GAAI,CAACE,EACD,OAEJ,IAAIC,EAAQ,GACRC,EACJ,GAAI,CACAA,EAAaF,EAAI,SAAS,UAC7B,MACa,CACV,MACH,CACD,GAAIE,IAAe,WAAY,CAC3B,MAAMC,EAAQ5E,GAAa,IAAM,CACxB0E,IACDtU,IACAsU,EAAQ,GAEf,EAAEF,CAAiB,EACpBD,EAAS,iBAAiB,OAAQ,IAAM,CACpCtE,GAAe2E,CAAK,EACpBF,EAAQ,GACRtU,GACZ,CAAS,EACD,MACH,CACD,MAAMyU,EAAW,cACjB,GAAIJ,EAAI,SAAS,OAASI,GACtBN,EAAS,MAAQM,GACjBN,EAAS,MAAQ,GACjB,OAAAvE,GAAa5P,EAAU,CAAC,EACjBmU,EAAS,iBAAiB,OAAQnU,CAAQ,EAErDmU,EAAS,iBAAiB,OAAQnU,CAAQ,CAC9C,CACA,SAAS0U,GAAqBC,EAAM3U,EAAU4U,EAAuB,CACjE,IAAIN,EAAQ,GACRO,EACJ,GAAI,CACAA,EAAmBF,EAAK,KAC3B,MACa,CACV,MACH,CACD,GAAIE,EACA,OACJ,MAAML,EAAQ5E,GAAa,IAAM,CACxB0E,IACDtU,IACAsU,EAAQ,GAEf,EAAEM,CAAqB,EACxBD,EAAK,iBAAiB,OAAQ,IAAM,CAChC9E,GAAe2E,CAAK,EACpBF,EAAQ,GACRtU,GACR,CAAK,CACL,CACA,SAAS8U,GAAc9I,EAAG1c,EAAS,CAC/B,KAAM,CAAE,IAAAmiB,EAAK,OAAAsD,EAAQ,WAAAjC,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,YAAAc,EAAa,gBAAApB,EAAiB,cAAAgB,EAAe,gBAAAE,EAAiB,iBAAAD,EAAkB,mBAAAE,EAAoB,iBAAAmB,EAAkB,iBAAA/G,EAAmB,GAAI,WAAAgH,EAAY,YAAA5G,EAAa,eAAA6G,EAAiB,CAAE,EAAE,aAAAC,EAAc,aAAAC,EAAc,gBAAAC,EAAiB,kBAAAC,EAAoB,EAAK,EAAMhmB,EAClUimB,EAASC,GAAU/D,EAAKsD,CAAM,EACpC,OAAQ/I,EAAE,SAAQ,CACd,KAAKA,EAAE,cACH,OAAIA,EAAE,aAAe,aACV,CACH,KAAMH,EAAW,SACjB,WAAY,CAAE,EACd,WAAYG,EAAE,UAClC,EAGuB,CACH,KAAMH,EAAW,SACjB,WAAY,CAAE,CAClC,EAEQ,KAAKG,EAAE,mBACH,MAAO,CACH,KAAMH,EAAW,aACjB,KAAMG,EAAE,KACR,SAAUA,EAAE,SACZ,SAAUA,EAAE,SACZ,OAAAuJ,CAChB,EACQ,KAAKvJ,EAAE,aACH,OAAOyJ,GAAqBzJ,EAAG,CAC3B,IAAAyF,EACA,WAAAqB,EACA,cAAAC,EACA,gBAAAC,EACA,iBAAAgC,EACA,gBAAAtC,EACA,iBAAAzE,EACA,YAAAI,EACA,eAAA6G,EACA,aAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,OAAAC,EACA,YAAAzB,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,CAChB,CAAa,EACL,KAAK7H,EAAE,UACH,OAAO0J,GAAkB1J,EAAG,CACxB,IAAAyF,EACA,YAAAqC,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,WAAAoB,EACA,iBAAAhH,EACA,YAAAI,EACA,OAAAkH,CAChB,CAAa,EACL,KAAKvJ,EAAE,mBACH,MAAO,CACH,KAAMH,EAAW,MACjB,YAAa,GACb,OAAA0J,CAChB,EACQ,KAAKvJ,EAAE,aACH,MAAO,CACH,KAAMH,EAAW,QACjB,YAAaG,EAAE,aAAe,GAC9B,OAAAuJ,CAChB,EACQ,QACI,MAAO,EACd,CACL,CACA,SAASC,GAAU/D,EAAKsD,EAAQ,CAC5B,GAAI,CAACA,EAAO,QAAQtD,CAAG,EACnB,OACJ,MAAMkE,EAAQZ,EAAO,MAAMtD,CAAG,EAC9B,OAAOkE,IAAU,EAAI,OAAYA,CACrC,CACA,SAASD,GAAkB1J,EAAG1c,EAAS,CACnC,KAAM,CAAE,YAAAwkB,EAAa,cAAAJ,EAAe,gBAAAE,EAAiB,iBAAAD,EAAkB,mBAAAE,EAAoB,WAAAoB,EAAY,iBAAAhH,EAAkB,YAAAI,EAAa,OAAAkH,CAAM,EAAMjmB,EAC5IsmB,EAAgB5J,EAAE,YAAcA,EAAE,WAAW,QACnD,IAAI6J,EAAc7J,EAAE,YACpB,MAAM8J,EAAUF,IAAkB,QAAU,GAAO,OAC7CG,EAAWH,IAAkB,SAAW,GAAO,OAC/CI,EAAaJ,IAAkB,WAAa,GAAO,OACzD,GAAIE,GAAWD,EAAa,CACxB,GAAI,CACI7J,EAAE,aAAeA,EAAE,iBAEdP,GAAiB,CAACO,EAAG,SAAUiK,GAAMA,EAAG,WAAY,SAAUC,GAAMA,EAAG,MAAO,iBAAkBC,GAAMA,EAAG,QAAQ,CAAC,IACvHN,EAAcjJ,GAAoBZ,EAAE,WAAW,KAAK,EAE3D,OACMoK,EAAK,CACR,QAAQ,KAAK,wDAAwDA,CAAG,GAAIpK,CAAC,CAChF,CACD6J,EAAcjF,GAAqBiF,EAAaxD,GAAQ/iB,EAAQ,GAAG,CAAC,CACvE,CACGymB,IACAF,EAAc,sBAElB,MAAMQ,EAAY5C,GAAgBzH,EAAG0H,EAAeC,EAAkBC,EAAiBC,EAAoBC,CAAW,EAWtH,GAVI,CAACgC,GAAW,CAACC,GAAY,CAACC,GAAcH,GAAeQ,IACvDR,EAAcZ,EACRA,EAAWY,EAAa7J,EAAE,aAAa,EACvC6J,EAAY,QAAQ,QAAS,GAAG,GAEtCG,GAAcH,IAAgB5H,EAAiB,UAAYoI,KAC3DR,EAAcxH,EACRA,EAAYwH,EAAa7J,EAAE,UAAU,EACrC6J,EAAY,QAAQ,QAAS,GAAG,GAEtCD,IAAkB,UAAYC,EAAa,CAC3C,MAAMS,EAAgBtI,GAAgB,CAClC,KAAM,KACN,QAAS4H,EACT,iBAAA3H,CACZ,CAAS,EACD4H,EAAc1H,GAAe,CACzB,SAAUsF,GAAgBzH,EAAG0H,EAAeC,EAAkBC,EAAiBC,EAAoByC,CAAa,EAChH,QAAStK,EACT,MAAO6J,EACP,YAAAxH,CACZ,CAAS,CACJ,CACD,MAAO,CACH,KAAMxC,EAAW,KACjB,YAAagK,GAAe,GAC5B,QAAAC,EACA,OAAAP,CACR,CACA,CACA,SAASE,GAAqBzJ,EAAG1c,EAAS,CACtC,KAAM,CAAE,IAAAmiB,EAAK,WAAAqB,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,iBAAAgC,EAAkB,iBAAA/G,EAAmB,GAAI,gBAAAyE,EAAiB,YAAArE,EAAa,eAAA6G,EAAiB,CAAE,EAAE,aAAAC,EAAc,aAAAC,EAAc,gBAAAC,EAAiB,kBAAAC,EAAoB,GAAO,OAAAC,EAAQ,YAAAzB,EAAa,cAAAJ,EAAe,gBAAAE,EAAiB,iBAAAD,EAAkB,mBAAAE,CAAkB,EAAMvkB,EACtTinB,EAAY1D,GAAkB7G,EAAG8G,EAAYC,EAAeC,CAAe,EAC3E9E,EAAUgC,GAAgBlE,CAAC,EACjC,IAAIwK,EAAa,CAAA,EACjB,MAAMC,EAAMzK,EAAE,WAAW,OACzB,QAASpjB,EAAI,EAAGA,EAAI6tB,EAAK7tB,IAAK,CAC1B,MAAM8tB,EAAO1K,EAAE,WAAWpjB,CAAC,EACvB8tB,EAAK,MAAQ,CAAC/D,GAAgBzE,EAASwI,EAAK,KAAMA,EAAK,KAAK,IAC5DF,EAAWE,EAAK,IAAI,EAAIjE,GAAmBhB,EAAKvD,EAASK,GAAYmI,EAAK,IAAI,EAAGA,EAAK,MAAO1K,EAAG0G,CAAe,EAEtH,CACD,GAAIxE,IAAY,QAAU8G,EAAkB,CACxC,MAAM2B,EAAa,MAAM,KAAKlF,EAAI,WAAW,EAAE,KAAM5E,GAC1CA,EAAE,OAASb,EAAE,IACvB,EACD,IAAIQ,EAAU,KACVmK,IACAnK,EAAUI,GAAoB+J,CAAU,GAExCnK,IACA,OAAOgK,EAAW,IAClB,OAAOA,EAAW,KAClBA,EAAW,SAAW5F,GAAqBpE,EAASmK,EAAW,IAAI,EAE1E,CACD,GAAIzI,IAAY,SACZlC,EAAE,OACF,EAAEA,EAAE,WAAaA,EAAE,aAAe,IAAI,KAAM,EAAC,OAAQ,CACrD,MAAMQ,EAAUI,GAAoBZ,EAAE,KAAK,EACvCQ,IACAgK,EAAW,SAAW5F,GAAqBpE,EAAS6F,GAAQZ,CAAG,CAAC,EAEvE,CACD,GAAIvD,IAAY,SACZA,IAAY,YACZA,IAAY,UACZA,IAAY,SAAU,CACtB,MAAMjO,EAAK+L,EACLviB,EAAO0lB,GAAalP,CAAE,EACtBzK,EAAQ4Z,GAAcnP,EAAIuO,GAAYN,CAAO,EAAGzkB,CAAI,EACpDmtB,EAAU3W,EAAG,QACnB,GAAIxW,IAAS,UAAYA,IAAS,UAAY+L,EAAO,CACjD,MAAM6gB,EAAY5C,GAAgBxT,EAAIyT,EAAeC,EAAkBC,EAAiBC,EAAoB7F,GAAgB,CACxH,KAAAvkB,EACA,QAAS+kB,GAAYN,CAAO,EAC5B,iBAAAD,CACH,CAAA,CAAC,EACFuI,EAAW,MAAQrI,GAAe,CAC9B,SAAUkI,EACV,QAASpW,EACT,MAAAzK,EACA,YAAA6Y,CAChB,CAAa,CACJ,CACGuI,IACAJ,EAAW,QAAUI,EAE5B,CASD,GARI1I,IAAY,WACRlC,EAAE,UAAY,CAACiC,EAAiB,OAChCuI,EAAW,SAAW,GAGtB,OAAOA,EAAW,UAGtBtI,IAAY,UAAYkH,GACxB,GAAIpJ,EAAE,YAAc,KACX0C,GAAgB1C,CAAC,IAClBwK,EAAW,WAAaxK,EAAE,UAAUkJ,EAAe,KAAMA,EAAe,OAAO,WAG9E,EAAE,cAAelJ,GAAI,CAC1B,MAAM6K,EAAgB7K,EAAE,UAAUkJ,EAAe,KAAMA,EAAe,OAAO,EACvE4B,EAAcrF,EAAI,cAAc,QAAQ,EAC9CqF,EAAY,MAAQ9K,EAAE,MACtB8K,EAAY,OAAS9K,EAAE,OACvB,MAAM+K,EAAqBD,EAAY,UAAU5B,EAAe,KAAMA,EAAe,OAAO,EACxF2B,IAAkBE,IAClBP,EAAW,WAAaK,EAE/B,EAEL,GAAI3I,IAAY,OAASiH,EAAc,CAC9B7E,KACDA,GAAgBmB,EAAI,cAAc,QAAQ,EAC1ClB,GAAYD,GAAc,WAAW,IAAI,GAE7C,MAAM0G,EAAQhL,EACRiL,EAAWD,EAAM,YAAcA,EAAM,aAAa,KAAK,GAAK,gBAC5DE,EAAmBF,EAAM,YACzBG,EAAoB,IAAM,CAC5BH,EAAM,oBAAoB,OAAQG,CAAiB,EACnD,GAAI,CACA7G,GAAc,MAAQ0G,EAAM,aAC5B1G,GAAc,OAAS0G,EAAM,cAC7BzG,GAAU,UAAUyG,EAAO,EAAG,CAAC,EAC/BR,EAAW,WAAalG,GAAc,UAAU4E,EAAe,KAAMA,EAAe,OAAO,CAC9F,OACMkB,EAAK,CACR,GAAIY,EAAM,cAAgB,YAAa,CACnCA,EAAM,YAAc,YAChBA,EAAM,UAAYA,EAAM,eAAiB,EACzCG,IAEAH,EAAM,iBAAiB,OAAQG,CAAiB,EACpD,MACH,MAEG,QAAQ,KAAK,yBAAyBF,CAAQ,YAAYb,CAAG,EAAE,CAEtE,CACGY,EAAM,cAAgB,cACtBE,EACOV,EAAW,YAAcU,EAC1BF,EAAM,gBAAgB,aAAa,EAEzD,EACYA,EAAM,UAAYA,EAAM,eAAiB,EACzCG,IAEAH,EAAM,iBAAiB,OAAQG,CAAiB,CACvD,CAeD,IAdIjJ,IAAY,SAAWA,IAAY,WACnCsI,EAAW,cAAgBxK,EAAE,OACvB,SACA,SACNwK,EAAW,oBAAsBxK,EAAE,aAElCsJ,IACGtJ,EAAE,aACFwK,EAAW,cAAgBxK,EAAE,YAE7BA,EAAE,YACFwK,EAAW,aAAexK,EAAE,YAGhCuK,EAAW,CACX,KAAM,CAAE,MAAAa,EAAO,OAAAC,CAAQ,EAAGrL,EAAE,sBAAqB,EACjDwK,EAAa,CACT,MAAOA,EAAW,MAClB,SAAU,GAAGY,CAAK,KAClB,UAAW,GAAGC,CAAM,IAChC,CACK,CACGnJ,IAAY,UAAY,CAACmH,EAAgBmB,EAAW,GAAG,IACnD,CAACD,GAAa,CAACvK,EAAE,kBACjBwK,EAAW,OAASA,EAAW,KAEnC,OAAOA,EAAW,KAEtB,IAAIc,EACJ,GAAI,CACI,eAAe,IAAIpJ,CAAO,IAC1BoJ,EAAkB,GACzB,MACS,CACT,CACD,MAAO,CACH,KAAMzL,EAAW,QACjB,QAAAqC,EACA,WAAAsI,EACA,WAAY,CAAE,EACd,MAAOlE,GAAatG,CAAC,GAAK,OAC1B,UAAAuK,EACA,OAAAhB,EACA,SAAU+B,CAClB,CACA,CACA,SAASC,EAAcC,EAAW,CAC9B,OAA+BA,GAAc,KAClC,GAGAA,EAAU,aAEzB,CACA,SAASC,GAAgBC,EAAIC,EAAgB,CACzC,GAAIA,EAAe,SAAWD,EAAG,OAAS7L,EAAW,QACjD,MAAO,GAEN,GAAI6L,EAAG,OAAS7L,EAAW,QAAS,CACrC,GAAI8L,EAAe,SACdD,EAAG,UAAY,UACXA,EAAG,UAAY,SACXA,EAAG,WAAW,MAAQ,WACnBA,EAAG,WAAW,MAAQ,kBAC1BA,EAAG,WAAW,KAAO,UACxBA,EAAG,UAAY,QACZA,EAAG,WAAW,MAAQ,YACtB,OAAOA,EAAG,WAAW,MAAS,UAC9BrI,GAAqBqI,EAAG,WAAW,IAAI,IAAM,MACrD,MAAO,GAEN,GAAIC,EAAe,cAClBD,EAAG,UAAY,QAAUA,EAAG,WAAW,MAAQ,iBAC5CA,EAAG,UAAY,SACXH,EAAcG,EAAG,WAAW,IAAI,EAAE,MAAM,mCAAmC,GACxEH,EAAcG,EAAG,WAAW,IAAI,IAAM,oBACtCH,EAAcG,EAAG,WAAW,GAAG,IAAM,QACrCH,EAAcG,EAAG,WAAW,GAAG,IAAM,oBACrCH,EAAcG,EAAG,WAAW,GAAG,IAAM,kBACjD,MAAO,GAEN,GAAIA,EAAG,UAAY,OAAQ,CAC5B,GAAIC,EAAe,sBACfJ,EAAcG,EAAG,WAAW,IAAI,EAAE,MAAM,wBAAwB,EAChE,MAAO,GAEN,GAAIC,EAAe,iBACnBJ,EAAcG,EAAG,WAAW,QAAQ,EAAE,MAAM,mBAAmB,GAC5DH,EAAcG,EAAG,WAAW,IAAI,EAAE,MAAM,gBAAgB,GACxDH,EAAcG,EAAG,WAAW,IAAI,IAAM,aAC1C,MAAO,GAEN,GAAIC,EAAe,iBACnBJ,EAAcG,EAAG,WAAW,IAAI,IAAM,UACnCH,EAAcG,EAAG,WAAW,IAAI,IAAM,aACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,WAC1C,MAAO,GAEN,GAAIC,EAAe,mBACpBD,EAAG,WAAW,YAAY,IAAM,OAChC,MAAO,GAEN,GAAIC,EAAe,qBACnBJ,EAAcG,EAAG,WAAW,IAAI,IAAM,UACnCH,EAAcG,EAAG,WAAW,IAAI,IAAM,aACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,aACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,aACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,UACtCH,EAAcG,EAAG,WAAW,QAAQ,EAAE,MAAM,WAAW,GACvDH,EAAcG,EAAG,WAAW,QAAQ,EAAE,MAAM,WAAW,GAC3D,MAAO,GAEN,GAAIC,EAAe,uBACnBJ,EAAcG,EAAG,WAAW,IAAI,IAAM,4BACnCH,EAAcG,EAAG,WAAW,IAAI,IAAM,uBACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,cACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,mBACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,aACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,gBACtCH,EAAcG,EAAG,WAAW,IAAI,IAAM,8BAC1C,MAAO,EAEd,CACJ,CACD,MAAO,EACX,CACA,SAASE,GAAoB5L,EAAG1c,EAAS,CACrC,KAAM,CAAE,IAAAmiB,EAAK,OAAAsD,EAAQ,WAAAjC,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,YAAAc,EAAa,cAAAJ,EAAe,gBAAAE,EAAiB,iBAAAD,EAAkB,mBAAAE,EAAoB,UAAAgE,EAAY,GAAO,iBAAA7C,EAAmB,GAAM,iBAAA/G,EAAmB,CAAA,EAAI,gBAAAyE,EAAiB,WAAAuC,EAAY,YAAA5G,EAAa,eAAAsJ,EAAgB,eAAAzC,EAAiB,CAAE,EAAE,aAAAC,EAAe,GAAO,aAAAC,EAAe,GAAO,YAAA0C,EAAa,aAAAC,EAAc,kBAAA3D,EAAoB,IAAM,iBAAA4D,EAAkB,sBAAAC,EAAwB,IAAM,gBAAA5C,EAAkB,IAAM,GAAO,kBAAAC,EAAoB,EAAQ,EAAGhmB,EACrf,GAAI,CAAE,mBAAA4oB,EAAqB,EAAM,EAAG5oB,EACpC,MAAM6oB,EAAkBrD,GAAc9I,EAAG,CACrC,IAAAyF,EACA,OAAAsD,EACA,WAAAjC,EACA,cAAAC,EACA,YAAAe,EACA,gBAAAd,EACA,cAAAU,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,iBAAAmB,EACA,iBAAA/G,EACA,gBAAAyE,EACA,WAAAuC,EACA,YAAA5G,EACA,eAAA6G,EACA,aAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,kBAAAC,CACR,CAAK,EACD,GAAI,CAAC6C,EACD,eAAQ,KAAKnM,EAAG,gBAAgB,EACzB,KAEX,IAAIuB,GACAwH,EAAO,QAAQ/I,CAAC,EAChBuB,GAAKwH,EAAO,MAAM/I,CAAC,EAEdyL,GAAgBU,EAAiBR,CAAc,GACnD,CAACO,GACEC,EAAgB,OAAStM,EAAW,MACpC,CAACsM,EAAgB,SACjB,CAACA,EAAgB,YAAY,QAAQ,cAAe,EAAE,EAAE,OAC5D5K,GAAKyC,GAGLzC,GAAK0C,GAAK,EAEd,MAAMmI,EAAiB,OAAO,OAAOD,EAAiB,CAAE,GAAA5K,EAAE,CAAE,EAE5D,GADAwH,EAAO,IAAI/I,EAAGoM,CAAc,EACxB7K,KAAOyC,GACP,OAAO,KAEP8H,GACAA,EAAY9L,CAAC,EAEjB,IAAIqM,EAAc,CAACR,EACnB,GAAIO,EAAe,OAASvM,EAAW,QAAS,CAC5CwM,EAAcA,GAAe,CAACD,EAAe,UAC7C,OAAOA,EAAe,UACtB,MAAM9L,EAAaN,EAAE,WACjBM,GAAcD,GAAkBC,CAAU,IAC1C8L,EAAe,aAAe,GACrC,CACD,IAAKA,EAAe,OAASvM,EAAW,UACpCuM,EAAe,OAASvM,EAAW,UACnCwM,EAAa,CACTV,EAAe,gBACfS,EAAe,OAASvM,EAAW,SACnCuM,EAAe,UAAY,SAC3BF,EAAqB,IAEzB,MAAMI,EAAgB,CAClB,IAAA7G,EACA,OAAAsD,EACA,WAAAjC,EACA,cAAAC,EACA,YAAAe,EACA,gBAAAd,EACA,cAAAU,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,UAAAgE,EACA,iBAAA7C,EACA,iBAAA/G,EACA,gBAAAyE,EACA,WAAAuC,EACA,YAAA5G,EACA,eAAAsJ,EACA,eAAAzC,EACA,aAAAC,EACA,aAAAC,EACA,mBAAA8C,EACA,YAAAJ,EACA,aAAAC,EACA,kBAAA3D,EACA,iBAAA4D,EACA,sBAAAC,EACA,gBAAA5C,CACZ,EACQ,UAAWkD,MAAU,MAAM,KAAKvM,EAAE,UAAU,EAAG,CAC3C,MAAMwM,GAAsBZ,GAAoBW,GAAQD,CAAa,EACjEE,IACAJ,EAAe,WAAW,KAAKI,EAAmB,CAEzD,CACD,GAAIzM,GAAYC,CAAC,GAAKA,EAAE,WACpB,UAAWuM,MAAU,MAAM,KAAKvM,EAAE,WAAW,UAAU,EAAG,CACtD,MAAMwM,GAAsBZ,GAAoBW,GAAQD,CAAa,EACjEE,KACAnM,GAAkBL,EAAE,UAAU,IACzBwM,GAAoB,SAAW,IACpCJ,EAAe,WAAW,KAAKI,EAAmB,EAEzD,CAER,CACD,OAAIxM,EAAE,YACFC,GAAaD,EAAE,UAAU,GACzBK,GAAkBL,EAAE,UAAU,IAC9BoM,EAAe,SAAW,IAE1BA,EAAe,OAASvM,EAAW,SACnCuM,EAAe,UAAY,UAC3BlE,GAAiBlI,EAAG,IAAM,CACtB,MAAMyM,EAAYzM,EAAE,gBACpB,GAAIyM,GAAaV,EAAc,CAC3B,MAAMW,GAAuBd,GAAoBa,EAAW,CACxD,IAAKA,EACL,OAAA1D,EACA,WAAAjC,EACA,cAAAC,EACA,gBAAAC,EACA,YAAAc,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,UAAW,GACX,iBAAAmB,EACA,iBAAA/G,EACA,gBAAAyE,EACA,WAAAuC,EACA,YAAA5G,EACA,eAAAsJ,EACA,eAAAzC,EACA,aAAAC,EACA,aAAAC,EACA,mBAAA8C,EACA,YAAAJ,EACA,aAAAC,EACA,kBAAA3D,EACA,iBAAA4D,EACA,sBAAAC,EACA,gBAAA5C,CACpB,CAAiB,EACGqD,IACAX,EAAa/L,EAAG0M,EAAoB,CAE3C,CACJ,EAAEtE,CAAiB,EAEpBgE,EAAe,OAASvM,EAAW,SACnCuM,EAAe,UAAY,QAC3B,OAAOA,EAAe,WAAW,KAAQ,WACxCA,EAAe,WAAW,MAAQ,cAC9BA,EAAe,WAAW,MAAQ,WAC/B,OAAOA,EAAe,WAAW,MAAS,UAC1C/I,GAAqB+I,EAAe,WAAW,IAAI,IAAM,QACjE1D,GAAqB1I,EAAG,IAAM,CAC1B,GAAIgM,EAAkB,CAClB,MAAMW,EAAqBf,GAAoB5L,EAAG,CAC9C,IAAAyF,EACA,OAAAsD,EACA,WAAAjC,EACA,cAAAC,EACA,gBAAAC,EACA,YAAAc,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,UAAW,GACX,iBAAAmB,EACA,iBAAA/G,EACA,gBAAAyE,EACA,WAAAuC,EACA,YAAA5G,EACA,eAAAsJ,EACA,eAAAzC,EACA,aAAAC,EACA,aAAAC,EACA,mBAAA8C,EACA,YAAAJ,EACA,aAAAC,EACA,kBAAA3D,EACA,iBAAA4D,EACA,sBAAAC,EACA,gBAAA5C,CACpB,CAAiB,EACGsD,GACAX,EAAiBhM,EAAG2M,CAAkB,CAE7C,CACJ,EAAEV,CAAqB,EAErBG,CACX,CACA,SAASQ,GAAS5M,EAAG1c,EAAS,CAC1B,KAAM,CAAE,OAAAylB,EAAS,IAAIzH,GAAU,WAAAwF,EAAa,WAAY,cAAAC,EAAgB,KAAM,gBAAAC,EAAkB,KAAM,YAAAc,EAAc,GAAO,cAAAJ,EAAgB,UAAW,gBAAAE,EAAkB,KAAM,iBAAAD,EAAmB,KAAM,mBAAAE,EAAqB,KAAM,iBAAAmB,EAAmB,GAAM,aAAAG,EAAe,GAAO,aAAAC,EAAe,GAAO,cAAAyD,EAAgB,GAAO,gBAAAnG,EAAiB,WAAAuC,EAAY,YAAA5G,EAAa,QAAAyK,EAAU,GAAO,eAAA5D,EAAgB,mBAAAgD,EAAoB,YAAAJ,EAAa,aAAAC,EAAc,kBAAA3D,EAAmB,iBAAA4D,EAAkB,sBAAAC,EAAuB,gBAAA5C,EAAkB,IAAM,EAAK,EAAM/lB,GAAW,GAuCliB,OAAOsoB,GAAoB5L,EAAG,CAC1B,IAAKA,EACL,OAAA+I,EACA,WAAAjC,EACA,cAAAC,EACA,gBAAAC,EACA,YAAAc,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,UAAW,GACX,iBAAAmB,EACA,iBAnDqB6D,IAAkB,GACrC,CACE,MAAO,GACP,KAAM,GACN,iBAAkB,GAClB,MAAO,GACP,MAAO,GACP,OAAQ,GACR,MAAO,GACP,OAAQ,GACR,IAAK,GACL,KAAM,GACN,KAAM,GACN,IAAK,GACL,KAAM,GACN,SAAU,GACV,OAAQ,EACX,EACCA,IAAkB,GACd,CAAE,EACFA,EAgCN,gBAAAnG,EACA,WAAAuC,EACA,YAAA5G,EACA,eAlCmByK,IAAY,IAAQA,IAAY,MAE/C,CACI,OAAQ,GACR,QAAS,GACT,YAAa,GACb,eAAgB,GAChB,qBAAsBA,IAAY,MAClC,eAAgB,GAChB,eAAgB,GAChB,kBAAmB,GACnB,mBAAoB,GACpB,qBAAsB,EACzB,EACHA,IAAY,GACR,CAAE,EACFA,EAmBN,eAAA5D,EACA,aAAAC,EACA,aAAAC,EACA,mBAAA8C,EACA,YAAAJ,EACA,aAAAC,EACA,kBAAA3D,EACA,iBAAA4D,EACA,sBAAAC,EACA,gBAAA5C,EACA,kBAAmB,EAC3B,CAAK,CACL,CAEA,SAAS0D,GAAiBrN,EAAK,CAAE,IAAIC,EAA+BnW,EAAQkW,EAAI,CAAC,EAAO9iB,EAAI,EAAG,KAAOA,EAAI8iB,EAAI,QAAQ,CAAE,MAAME,EAAKF,EAAI9iB,CAAC,EAASie,EAAK6E,EAAI9iB,EAAI,CAAC,EAAW,GAARA,GAAK,GAAQgjB,IAAO,kBAAoBA,IAAO,iBAAmBpW,GAAS,KAAQ,OAAwBoW,IAAO,UAAYA,IAAO,kBAAoBD,EAAgBnW,EAAOA,EAAQqR,EAAGrR,CAAK,IAAcoW,IAAO,QAAUA,IAAO,kBAAkBpW,EAAQqR,EAAG,IAAI1c,IAASqL,EAAM,KAAKmW,EAAe,GAAGxhB,CAAI,CAAC,EAAGwhB,EAAgB,OAAc,CAAC,OAAOnW,CAAQ,CACrgB,SAASwjB,EAAGvvB,EAAMod,EAAIhH,EAAS,SAAU,CACrC,MAAMvQ,EAAU,CAAE,QAAS,GAAM,QAAS,EAAI,EAC9C,OAAAuQ,EAAO,iBAAiBpW,EAAMod,EAAIvX,CAAO,EAClC,IAAMuQ,EAAO,oBAAoBpW,EAAMod,EAAIvX,CAAO,CAC7D,CACA,MAAM2pB,GAAiC;AAAA;AAAA,8EAKvC,IAAIC,GAAU,CACV,IAAK,CAAE,EACP,OAAQ,CACJ,eAAQ,MAAMD,EAA8B,EACrC,EACV,EACD,SAAU,CACN,eAAQ,MAAMA,EAA8B,EACrC,IACV,EACD,mBAAoB,CAChB,QAAQ,MAAMA,EAA8B,CAC/C,EACD,KAAM,CACF,eAAQ,MAAMA,EAA8B,EACrC,EACV,EACD,OAAQ,CACJ,QAAQ,MAAMA,EAA8B,CAC/C,CACL,EACI,OAAO,OAAW,KAAe,OAAO,OAAS,OAAO,UACxDC,GAAU,IAAI,MAAMA,GAAS,CACzB,IAAIrZ,EAAQjB,EAAMua,EAAU,CACxB,OAAIva,IAAS,OACT,QAAQ,MAAMqa,EAA8B,EAEzC,QAAQ,IAAIpZ,EAAQjB,EAAMua,CAAQ,CAC5C,CACT,CAAK,GAEL,SAASC,GAAWrX,EAAMsX,EAAM/pB,EAAU,CAAA,EAAI,CAC1C,IAAIlE,EAAU,KACVkuB,EAAW,EACf,OAAO,YAAanvB,EAAM,CACtB,MAAMqC,EAAM,KAAK,MACb,CAAC8sB,GAAYhqB,EAAQ,UAAY,KACjCgqB,EAAW9sB,GAEf,MAAM+sB,EAAYF,GAAQ7sB,EAAM8sB,GAC1BrgB,EAAU,KACZsgB,GAAa,GAAKA,EAAYF,GAC1BjuB,IACAouB,GAAepuB,CAAO,EACtBA,EAAU,MAEdkuB,EAAW9sB,EACXuV,EAAK,MAAM9I,EAAS9O,CAAI,GAEnB,CAACiB,GAAWkE,EAAQ,WAAa,KACtClE,EAAUquB,GAAa,IAAM,CACzBH,EAAWhqB,EAAQ,UAAY,GAAQ,EAAI,KAAK,MAChDlE,EAAU,KACV2W,EAAK,MAAM9I,EAAS9O,CAAI,CAC3B,EAAEovB,CAAS,EAExB,CACA,CACA,SAASG,GAAW7Z,EAAQnY,EAAKiyB,EAAGC,EAAWvF,EAAM,OAAQ,CACzD,MAAMjO,EAAWiO,EAAI,OAAO,yBAAyBxU,EAAQnY,CAAG,EAChE,OAAA2sB,EAAI,OAAO,eAAexU,EAAQnY,EAAKkyB,EACjCD,EACA,CACE,IAAInkB,EAAO,CACPikB,GAAa,IAAM,CACfE,EAAE,IAAI,KAAK,KAAMnkB,CAAK,CACzB,EAAE,CAAC,EACA4Q,GAAYA,EAAS,KACrBA,EAAS,IAAI,KAAK,KAAM5Q,CAAK,CAEpC,CACb,CAAS,EACE,IAAMkkB,GAAW7Z,EAAQnY,EAAK0e,GAAY,CAAA,EAAI,EAAI,CAC7D,CACA,SAASyT,GAAMhxB,EAAQsG,EAAM2qB,EAAa,CACtC,GAAI,CACA,GAAI,EAAE3qB,KAAQtG,GACV,MAAO,IAAM,CACzB,EAEQ,MAAMud,EAAWvd,EAAOsG,CAAI,EACtB4qB,EAAUD,EAAY1T,CAAQ,EACpC,OAAI,OAAO2T,GAAY,aACnBA,EAAQ,UAAYA,EAAQ,WAAa,CAAA,EACzC,OAAO,iBAAiBA,EAAS,CAC7B,mBAAoB,CAChB,WAAY,GACZ,MAAO3T,CACV,CACjB,CAAa,GAELvd,EAAOsG,CAAI,EAAI4qB,EACR,IAAM,CACTlxB,EAAOsG,CAAI,EAAIiX,CAC3B,CACK,MACU,CACP,MAAO,IAAM,CACrB,CACK,CACL,CACA,IAAI4T,GAAe,KAAK,IAClB,iBAAiB,KAAK,KAAK,IAAG,EAAG,SAAU,CAAA,IAC7CA,GAAe,IAAM,IAAI,KAAM,EAAC,QAAO,GAE3C,SAASC,GAAgB5F,EAAK,CAC1B,MAAM5C,EAAM4C,EAAI,SAChB,MAAO,CACH,KAAM5C,EAAI,iBACJA,EAAI,iBAAiB,WACrB4C,EAAI,cAAgB,OAChBA,EAAI,YACJ0E,GAAiB,CAACtH,EAAK,iBAAkBtF,GAAKA,EAAE,gBAAiB,SAAUC,GAAMA,EAAG,UAAU,CAAC,GAC7F2M,GAAiB,CAACtH,EAAK,iBAAkBjE,GAAMA,EAAG,KAAM,iBAAkBC,GAAMA,EAAG,cAAe,iBAAkBC,GAAMA,EAAG,UAAU,CAAC,GACxIqL,GAAiB,CAACtH,EAAK,iBAAkBhC,GAAMA,EAAG,KAAM,iBAAkBwG,GAAMA,EAAG,UAAU,CAAC,GAC9F,EACZ,IAAKxE,EAAI,iBACHA,EAAI,iBAAiB,UACrB4C,EAAI,cAAgB,OAChBA,EAAI,YACJ0E,GAAiB,CAACtH,EAAK,iBAAkByE,GAAMA,EAAG,gBAAiB,SAAUC,GAAMA,EAAG,SAAS,CAAC,GAC9F4C,GAAiB,CAACtH,EAAK,iBAAkByI,GAAOA,EAAI,KAAM,iBAAkBC,GAAOA,EAAI,cAAe,iBAAkBC,GAAOA,EAAI,SAAS,CAAC,GAC7IrB,GAAiB,CAACtH,EAAK,iBAAkB4I,GAAOA,EAAI,KAAM,iBAAkBC,GAAOA,EAAI,SAAS,CAAC,GACjG,CACpB,CACA,CACA,SAASC,IAAkB,CACvB,OAAQ,OAAO,aACV,SAAS,iBAAmB,SAAS,gBAAgB,cACrD,SAAS,MAAQ,SAAS,KAAK,YACxC,CACA,SAASC,IAAiB,CACtB,OAAQ,OAAO,YACV,SAAS,iBAAmB,SAAS,gBAAgB,aACrD,SAAS,MAAQ,SAAS,KAAK,WACxC,CACA,SAASC,GAAqB7M,EAAM,CAChC,OAAKA,EAGMA,EAAK,WAAaA,EAAK,aAC5BA,EACAA,EAAK,cAJA,IAMf,CACA,SAAS8M,EAAU9M,EAAMkF,EAAYC,EAAeC,EAAiB2H,EAAgB,CACjF,GAAI,CAAC/M,EACD,MAAO,GAEX,MAAM3N,EAAKwa,GAAqB7M,CAAI,EACpC,GAAI,CAAC3N,EACD,MAAO,GAEX,MAAM2a,EAAmBrH,GAAqBT,EAAYC,CAAa,EACvE,GAAI,CAAC4H,EAAgB,CACjB,MAAME,EAAc7H,GAAmB/S,EAAG,QAAQ+S,CAAe,EACjE,OAAO4H,EAAiB3a,CAAE,GAAK,CAAC4a,CACnC,CACD,MAAMC,EAAgB1H,GAAgBnT,EAAI2a,CAAgB,EAC1D,IAAIG,EAAkB,GACtB,OAAID,EAAgB,EACT,IAEP9H,IACA+H,EAAkB3H,GAAgBnT,EAAIsT,GAAqB,KAAMP,CAAe,CAAC,GAEjF8H,EAAgB,IAAMC,EAAkB,EACjC,GAEJD,EAAgBC,EAC3B,CACA,SAASC,GAAahP,EAAG+I,EAAQ,CAC7B,OAAOA,EAAO,MAAM/I,CAAC,IAAM,EAC/B,CACA,SAASiP,GAAUjP,EAAG+I,EAAQ,CAC1B,OAAOA,EAAO,MAAM/I,CAAC,IAAMgE,EAC/B,CACA,SAASkL,GAAkBrb,EAAQkV,EAAQ,CACvC,GAAI9I,GAAapM,CAAM,EACnB,MAAO,GAEX,MAAM0N,EAAKwH,EAAO,MAAMlV,CAAM,EAC9B,OAAKkV,EAAO,IAAIxH,CAAE,EAGd1N,EAAO,YACPA,EAAO,WAAW,WAAaA,EAAO,cAC/B,GAENA,EAAO,WAGLqb,GAAkBrb,EAAO,WAAYkV,CAAM,EAFvC,GAPA,EAUf,CACA,SAASoG,GAAoBvzB,EAAO,CAChC,MAAO,EAAQA,EAAM,cACzB,CACA,SAASwzB,GAAS/G,EAAM,OAAQ,CACxB,aAAcA,GAAO,CAACA,EAAI,SAAS,UAAU,UAC7CA,EAAI,SAAS,UAAU,QAAU,MAAM,UAClC,SAEL,iBAAkBA,GAAO,CAACA,EAAI,aAAa,UAAU,UACrDA,EAAI,aAAa,UAAU,QAAU,MAAM,UACtC,SAEJ,KAAK,UAAU,WAChB,KAAK,UAAU,SAAW,IAAIlqB,IAAS,CACnC,IAAIyjB,EAAOzjB,EAAK,CAAC,EACjB,GAAI,EAAE,KAAKA,GACP,MAAM,IAAI,UAAU,wBAAwB,EAEhD,EACI,IAAI,OAASyjB,EACT,MAAO,SAELA,EAAOA,GAAQA,EAAK,YAC9B,MAAO,EACnB,EAEA,CACA,SAASyN,GAAmBrP,EAAG+I,EAAQ,CACnC,MAAO,GAAQ/I,EAAE,WAAa,UAAY+I,EAAO,QAAQ/I,CAAC,EAC9D,CACA,SAASsP,GAAuBtP,EAAG+I,EAAQ,CACvC,MAAO,GAAQ/I,EAAE,WAAa,QAC1BA,EAAE,WAAaA,EAAE,cACjBA,EAAE,cACFA,EAAE,aAAa,KAAK,IAAM,cAC1B+I,EAAO,QAAQ/I,CAAC,EACxB,CACA,SAASuP,GAAcvP,EAAG,CACtB,MAAO,EAAQ+M,GAAiB,CAAC/M,EAAG,iBAAkBwP,GAAOA,EAAI,UAAU,CAAC,CAChF,CACA,MAAMC,EAAiB,CACnB,aAAc,CACV,KAAK,GAAK,EACV,KAAK,WAAa,IAAI,QACtB,KAAK,WAAa,IAAI,GACzB,CACD,MAAM9E,EAAY,CACd,OAAOlpB,GAAiB,KAAK,WAAW,IAAIkpB,CAAU,EAAG,IAAQ,EAAG,CACvE,CACD,IAAIA,EAAY,CACZ,OAAO,KAAK,WAAW,IAAIA,CAAU,CACxC,CACD,IAAIA,EAAYpJ,EAAI,CAChB,GAAI,KAAK,IAAIoJ,CAAU,EACnB,OAAO,KAAK,MAAMA,CAAU,EAChC,IAAI+E,EACJ,OAAInO,IAAO,OACPmO,EAAQ,KAAK,KAGbA,EAAQnO,EACZ,KAAK,WAAW,IAAIoJ,EAAY+E,CAAK,EACrC,KAAK,WAAW,IAAIA,EAAO/E,CAAU,EAC9B+E,CACV,CACD,SAASnO,EAAI,CACT,OAAO,KAAK,WAAW,IAAIA,CAAE,GAAK,IACrC,CACD,OAAQ,CACJ,KAAK,WAAa,IAAI,QACtB,KAAK,WAAa,IAAI,IACtB,KAAK,GAAK,CACb,CACD,YAAa,CACT,OAAO,KAAK,IACf,CACL,CACA,SAASoO,GAAc3P,EAAG,CACtB,IAAI4P,EAAa,KACjB,OAAI7C,GAAiB,CAAC/M,EAAG,SAAU6P,GAAOA,EAAI,YAAa,eAAgBC,GAAOA,EAAG,EAAI,iBAAkBC,GAAOA,EAAI,QAAQ,CAAC,IAAM,KAAK,wBACtI/P,EAAE,YAAW,EAAG,OAChB4P,EAAa5P,EAAE,YAAa,EAAC,MAC1B4P,CACX,CACA,SAASI,GAAkBhQ,EAAG,CAC1B,IAAIiQ,EAAiBjQ,EACjB4P,EACJ,KAAQA,EAAaD,GAAcM,CAAc,GAC7CA,EAAiBL,EACrB,OAAOK,CACX,CACA,SAASC,GAAgBlQ,EAAG,CACxB,MAAMyF,EAAMzF,EAAE,cACd,GAAI,CAACyF,EACD,MAAO,GACX,MAAMmK,EAAaI,GAAkBhQ,CAAC,EACtC,OAAOyF,EAAI,SAASmK,CAAU,CAClC,CACA,SAASO,GAAMnQ,EAAG,CACd,MAAMyF,EAAMzF,EAAE,cACd,OAAKyF,EAEEA,EAAI,SAASzF,CAAC,GAAKkQ,GAAgBlQ,CAAC,EADhC,EAEf,CACA,MAAMtL,GAAwB,CAAA,EAC9B,SAAS0b,GAAkBjtB,EAAM,CAC7B,MAAMyR,EAASF,GAAsBvR,CAAI,EACzC,GAAIyR,EACA,OAAOA,EAEX,MAAMG,EAAW,OAAO,SACxB,IAAIF,EAAO,OAAO1R,CAAI,EACtB,GAAI4R,GAAY,OAAOA,EAAS,eAAkB,WAC9C,GAAI,CACA,MAAMC,EAAUD,EAAS,cAAc,QAAQ,EAC/CC,EAAQ,OAAS,GACjBD,EAAS,KAAK,YAAYC,CAAO,EACjC,MAAMC,EAAgBD,EAAQ,cAC1BC,GAAiBA,EAAc9R,CAAI,IACnC0R,EACII,EAAc9R,CAAI,GAE1B4R,EAAS,KAAK,YAAYC,CAAO,CACpC,MACS,CACT,CAEL,OAAQN,GAAsBvR,CAAI,EAAI0R,EAAK,KAAK,MAAM,CAC1D,CACA,SAASwb,MAA2BzpB,EAAM,CACtC,OAAOwpB,GAAkB,uBAAuB,EAAE,GAAGxpB,CAAI,CAC7D,CACA,SAAS6mB,MAAgB7mB,EAAM,CAC3B,OAAOwpB,GAAkB,YAAY,EAAE,GAAGxpB,CAAI,CAClD,CACA,SAAS4mB,MAAkB5mB,EAAM,CAC7B,OAAOwpB,GAAkB,cAAc,EAAE,GAAGxpB,CAAI,CACpD,CAEA,IAAI0pB,GAA8BC,IAChCA,EAAWA,EAAW,iBAAsB,CAAC,EAAI,mBACjDA,EAAWA,EAAW,KAAU,CAAC,EAAI,OACrCA,EAAWA,EAAW,aAAkB,CAAC,EAAI,eAC7CA,EAAWA,EAAW,oBAAyB,CAAC,EAAI,sBACpDA,EAAWA,EAAW,KAAU,CAAC,EAAI,OACrCA,EAAWA,EAAW,OAAY,CAAC,EAAI,SACvCA,EAAWA,EAAW,OAAY,CAAC,EAAI,SAChCA,IACND,GAAa,CAAA,CAAE,EACdE,GAAsCC,IACxCA,EAAmBA,EAAmB,SAAc,CAAC,EAAI,WACzDA,EAAmBA,EAAmB,UAAe,CAAC,EAAI,YAC1DA,EAAmBA,EAAmB,iBAAsB,CAAC,EAAI,mBACjEA,EAAmBA,EAAmB,OAAY,CAAC,EAAI,SACvDA,EAAmBA,EAAmB,eAAoB,CAAC,EAAI,iBAC/DA,EAAmBA,EAAmB,MAAW,CAAC,EAAI,QACtDA,EAAmBA,EAAmB,UAAe,CAAC,EAAI,YAC1DA,EAAmBA,EAAmB,iBAAsB,CAAC,EAAI,mBACjEA,EAAmBA,EAAmB,eAAoB,CAAC,EAAI,iBAC/DA,EAAmBA,EAAmB,eAAoB,CAAC,EAAI,iBAC/DA,EAAmBA,EAAmB,KAAU,EAAE,EAAI,OACtDA,EAAmBA,EAAmB,IAAS,EAAE,EAAI,MACrDA,EAAmBA,EAAmB,KAAU,EAAE,EAAI,OACtDA,EAAmBA,EAAmB,iBAAsB,EAAE,EAAI,mBAClEA,EAAmBA,EAAmB,UAAe,EAAE,EAAI,YAC3DA,EAAmBA,EAAmB,kBAAuB,EAAE,EAAI,oBACnEA,EAAmBA,EAAmB,cAAmB,EAAE,EAAI,gBACxDA,IACND,GAAqB,CAAA,CAAE,EACtBE,GAAsCC,IACxCA,EAAmBA,EAAmB,QAAa,CAAC,EAAI,UACxDA,EAAmBA,EAAmB,UAAe,CAAC,EAAI,YAC1DA,EAAmBA,EAAmB,MAAW,CAAC,EAAI,QACtDA,EAAmBA,EAAmB,YAAiB,CAAC,EAAI,cAC5DA,EAAmBA,EAAmB,SAAc,CAAC,EAAI,WACzDA,EAAmBA,EAAmB,MAAW,CAAC,EAAI,QACtDA,EAAmBA,EAAmB,KAAU,CAAC,EAAI,OACrDA,EAAmBA,EAAmB,WAAgB,CAAC,EAAI,aAC3DA,EAAmBA,EAAmB,mBAAwB,CAAC,EAAI,qBACnEA,EAAmBA,EAAmB,SAAc,CAAC,EAAI,WACzDA,EAAmBA,EAAmB,YAAiB,EAAE,EAAI,cACtDA,IACND,GAAqB,CAAA,CAAE,EACtBE,IAAiCC,IACnCA,EAAcA,EAAc,MAAW,CAAC,EAAI,QAC5CA,EAAcA,EAAc,IAAS,CAAC,EAAI,MAC1CA,EAAcA,EAAc,MAAW,CAAC,EAAI,QACrCA,IACND,IAAgB,CAAA,CAAE,EAErB,SAASE,GAAiBpR,EAAK,CAAE,IAAIC,EAA+BnW,EAAQkW,EAAI,CAAC,EAAO9iB,EAAI,EAAG,KAAOA,EAAI8iB,EAAI,QAAQ,CAAE,MAAME,EAAKF,EAAI9iB,CAAC,EAASie,EAAK6E,EAAI9iB,EAAI,CAAC,EAAW,GAARA,GAAK,GAAQgjB,IAAO,kBAAoBA,IAAO,iBAAmBpW,GAAS,KAAQ,OAAwBoW,IAAO,UAAYA,IAAO,kBAAoBD,EAAgBnW,EAAOA,EAAQqR,EAAGrR,CAAK,IAAcoW,IAAO,QAAUA,IAAO,kBAAkBpW,EAAQqR,EAAG,IAAI1c,IAASqL,EAAM,KAAKmW,EAAe,GAAGxhB,CAAI,CAAC,EAAGwhB,EAAgB,OAAc,CAAC,OAAOnW,CAAQ,CACrgB,SAASunB,GAAmB/Q,EAAG,CAC3B,MAAO,SAAUA,CACrB,CACA,MAAMgR,EAAiB,CACnB,aAAc,CACV,KAAK,OAAS,EACd,KAAK,KAAO,KACZ,KAAK,KAAO,IACf,CACD,IAAIC,EAAU,CACV,GAAIA,GAAY,KAAK,OACjB,MAAM,IAAI,MAAM,gCAAgC,EAEpD,IAAIC,EAAU,KAAK,KACnB,QAASC,EAAQ,EAAGA,EAAQF,EAAUE,IAClCD,EAAUJ,GAAiB,CAACI,EAAS,iBAAkB/Q,GAAKA,EAAE,IAAI,CAAC,GAAK,KAE5E,OAAO+Q,CACV,CACD,QAAQlR,EAAG,CACP,MAAM4B,EAAO,CACT,MAAO5B,EACP,SAAU,KACV,KAAM,IAClB,EAEQ,GADAA,EAAE,KAAO4B,EACL5B,EAAE,iBAAmB+Q,GAAmB/Q,EAAE,eAAe,EAAG,CAC5D,MAAMkR,EAAUlR,EAAE,gBAAgB,KAAK,KACvC4B,EAAK,KAAOsP,EACZtP,EAAK,SAAW5B,EAAE,gBAAgB,KAClCA,EAAE,gBAAgB,KAAK,KAAO4B,EAC1BsP,IACAA,EAAQ,SAAWtP,EAE1B,SACQ5B,EAAE,aACP+Q,GAAmB/Q,EAAE,WAAW,GAChCA,EAAE,YAAY,KAAK,SAAU,CAC7B,MAAMkR,EAAUlR,EAAE,YAAY,KAAK,SACnC4B,EAAK,SAAWsP,EAChBtP,EAAK,KAAO5B,EAAE,YAAY,KAC1BA,EAAE,YAAY,KAAK,SAAW4B,EAC1BsP,IACAA,EAAQ,KAAOtP,EAEtB,MAEO,KAAK,OACL,KAAK,KAAK,SAAWA,GAEzBA,EAAK,KAAO,KAAK,KACjB,KAAK,KAAOA,EAEZA,EAAK,OAAS,OACd,KAAK,KAAOA,GAEhB,KAAK,QACR,CACD,WAAW5B,EAAG,CACV,MAAMkR,EAAUlR,EAAE,KACb,KAAK,OAGLkR,EAAQ,UAUTA,EAAQ,SAAS,KAAOA,EAAQ,KAC5BA,EAAQ,KACRA,EAAQ,KAAK,SAAWA,EAAQ,SAGhC,KAAK,KAAOA,EAAQ,WAdxB,KAAK,KAAOA,EAAQ,KAChB,KAAK,KACL,KAAK,KAAK,SAAW,KAGrB,KAAK,KAAO,MAYhBlR,EAAE,MACF,OAAOA,EAAE,KAEb,KAAK,SACR,CACL,CACA,MAAMoR,GAAU,CAAC7P,EAAIzkB,IAAa,GAAGykB,CAAE,IAAIzkB,CAAQ,GACnD,MAAMu0B,EAAe,CACjB,aAAc,CACV,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,MAAQ,GACb,KAAK,WAAa,GAClB,KAAK,aAAe,IAAI,QACxB,KAAK,QAAU,GACf,KAAK,WAAa,GAClB,KAAK,SAAW,GAChB,KAAK,SAAW,IAAI,IACpB,KAAK,SAAW,IAAI,IACpB,KAAK,WAAa,IAAI,IACtB,KAAK,iBAAoBC,GAAc,CACnCA,EAAU,QAAQ,KAAK,eAAe,EACtC,KAAK,KAAI,CACrB,EACQ,KAAK,KAAO,IAAM,CACd,GAAI,KAAK,QAAU,KAAK,OACpB,OAEJ,MAAMC,EAAO,CAAA,EACPC,EAAW,IAAI,IACfC,EAAU,IAAIT,GACdU,EAAa1R,GAAM,CACrB,IAAI2R,EAAK3R,EACL4R,EAAS5N,GACb,KAAO4N,IAAW5N,IACd2N,EAAKA,GAAMA,EAAG,YACdC,EAASD,GAAM,KAAK,OAAO,MAAMA,CAAE,EAEvC,OAAOC,CACvB,EACkBC,EAAW7R,GAAM,CACnB,GAAI,CAACA,EAAE,YAAc,CAACmQ,GAAMnQ,CAAC,EACzB,OAEJ,MAAMljB,EAAWmjB,GAAaD,EAAE,UAAU,EACpC,KAAK,OAAO,MAAM2P,GAAc3P,CAAC,CAAC,EAClC,KAAK,OAAO,MAAMA,EAAE,UAAU,EAC9B4R,EAASF,EAAU1R,CAAC,EAC1B,GAAIljB,IAAa,IAAM80B,IAAW,GAC9B,OAAOH,EAAQ,QAAQzR,CAAC,EAE5B,MAAM0L,EAAKE,GAAoB5L,EAAG,CAC9B,IAAK,KAAK,IACV,OAAQ,KAAK,OACb,WAAY,KAAK,WACjB,cAAe,KAAK,cACpB,YAAa,KAAK,YAClB,gBAAiB,KAAK,gBACtB,cAAe,KAAK,cACpB,gBAAiB,KAAK,gBACtB,iBAAkB,KAAK,iBACvB,mBAAoB,KAAK,mBACzB,UAAW,GACX,kBAAmB,GACnB,iBAAkB,KAAK,iBACvB,iBAAkB,KAAK,iBACvB,gBAAiB,KAAK,gBACtB,WAAY,KAAK,WACjB,YAAa,KAAK,YAClB,eAAgB,KAAK,eACrB,eAAgB,KAAK,eACrB,aAAc,KAAK,aACnB,aAAc,KAAK,aACnB,YAAc8R,GAAa,CACnBzC,GAAmByC,EAAU,KAAK,MAAM,GACxC,CAACpD,EAAUoD,EAAU,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAK,GACrF,KAAK,cAAc,UAAUA,CAAQ,EAErCxC,GAAuBwC,EAAU,KAAK,MAAM,GAC5C,KAAK,kBAAkB,iBAAiBA,CAAQ,EAEhDvC,GAAcvP,CAAC,GACf,KAAK,iBAAiB,cAAcA,EAAE,WAAY,KAAK,GAAG,CAEjE,EACD,aAAc,CAAC+R,EAAQC,IAAY,CAC3BtD,EAAUqD,EAAQ,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAK,IAGtF,KAAK,cAAc,aAAaA,EAAQC,CAAO,EAC3CD,EAAO,eACP,KAAK,cAAc,UAAUA,EAAO,aAAa,EAErD,KAAK,iBAAiB,oBAAoBA,CAAM,EACnD,EACD,iBAAkB,CAACpJ,EAAMqJ,IAAY,CACjC,KAAK,kBAAkB,kBAAkBrJ,EAAMqJ,CAAO,CACzD,CACrB,CAAiB,EACGtG,IACA6F,EAAK,KAAK,CACN,SAAAz0B,EACA,OAAA80B,EACA,KAAMlG,CAC9B,CAAqB,EACD8F,EAAS,IAAI9F,EAAG,EAAE,EAEtC,EACY,KAAO,KAAK,WAAW,QACnB,KAAK,OAAO,kBAAkB,KAAK,WAAW,MAAK,CAAE,EAEzD,UAAW1L,KAAK,KAAK,SACbiS,GAAgB,KAAK,QAASjS,EAAG,KAAK,MAAM,GAC5C,CAAC,KAAK,SAAS,IAAIA,EAAE,UAAU,GAGnC6R,EAAQ7R,CAAC,EAEb,UAAWA,KAAK,KAAK,SACb,CAACkS,GAAgB,KAAK,WAAYlS,CAAC,GACnC,CAACiS,GAAgB,KAAK,QAASjS,EAAG,KAAK,MAAM,GAGxCkS,GAAgB,KAAK,SAAUlS,CAAC,EAFrC6R,EAAQ7R,CAAC,EAMT,KAAK,WAAW,IAAIA,CAAC,EAG7B,IAAImS,EAAY,KAChB,KAAOV,EAAQ,QAAQ,CACnB,IAAI7P,EAAO,KACX,GAAIuQ,EAAW,CACX,MAAMr1B,EAAW,KAAK,OAAO,MAAMq1B,EAAU,MAAM,UAAU,EACvDP,EAASF,EAAUS,EAAU,KAAK,EACpCr1B,IAAa,IAAM80B,IAAW,KAC9BhQ,EAAOuQ,EAEd,CACD,GAAI,CAACvQ,EAAM,CACP,IAAIwQ,EAAWX,EAAQ,KACvB,KAAOW,GAAU,CACb,MAAMC,EAAQD,EAEd,GADAA,EAAWA,EAAS,SAChBC,EAAO,CACP,MAAMv1B,EAAW,KAAK,OAAO,MAAMu1B,EAAM,MAAM,UAAU,EAEzD,GADeX,EAAUW,EAAM,KAAK,IACrB,GACX,SACC,GAAIv1B,IAAa,GAAI,CACtB8kB,EAAOyQ,EACP,KACH,KACI,CACD,MAAMC,EAAgBD,EAAM,MAC5B,GAAIC,EAAc,YACdA,EAAc,WAAW,WACrB,KAAK,uBAAwB,CACjC,MAAM1C,EAAa0C,EAAc,WAC5B,KAEL,GADiB,KAAK,OAAO,MAAM1C,CAAU,IAC5B,GAAI,CACjBhO,EAAOyQ,EACP,KACH,CACJ,CACJ,CACJ,CACJ,CACJ,CACD,GAAI,CAACzQ,EAAM,CACP,KAAO6P,EAAQ,MACXA,EAAQ,WAAWA,EAAQ,KAAK,KAAK,EAEzC,KACH,CACDU,EAAYvQ,EAAK,SACjB6P,EAAQ,WAAW7P,EAAK,KAAK,EAC7BiQ,EAAQjQ,EAAK,KAAK,CACrB,CACD,MAAM2Q,EAAU,CACZ,MAAO,KAAK,MACP,IAAKjQ,IAAU,CAChB,GAAI,KAAK,OAAO,MAAMA,EAAK,IAAI,EAC/B,MAAOA,EAAK,KAChC,EAAkB,EACG,OAAQA,GAAS,CAACkP,EAAS,IAAIlP,EAAK,EAAE,CAAC,EACvC,OAAQA,GAAS,KAAK,OAAO,IAAIA,EAAK,EAAE,CAAC,EAC9C,WAAY,KAAK,WACZ,IAAKkQ,GAAc,CACpB,KAAM,CAAE,WAAAhI,CAAY,EAAGgI,EACvB,GAAI,OAAOhI,EAAW,OAAU,SAAU,CACtC,MAAMiI,EAAY,KAAK,UAAUD,EAAU,SAAS,EAC9CE,EAAiB,KAAK,UAAUF,EAAU,gBAAgB,EAC5DC,EAAU,OAASjI,EAAW,MAAM,SAC/BiI,EAAYC,GAAgB,MAAM,MAAM,EAAE,SAC3ClI,EAAW,MAAM,MAAM,MAAM,EAAE,SAC/BA,EAAW,MAAQgI,EAAU,UAGxC,CACD,MAAO,CACH,GAAI,KAAK,OAAO,MAAMA,EAAU,IAAI,EACpC,WAAYhI,CACpC,CACA,CAAiB,EACI,OAAQgI,GAAc,CAAChB,EAAS,IAAIgB,EAAU,EAAE,CAAC,EACjD,OAAQA,GAAc,KAAK,OAAO,IAAIA,EAAU,EAAE,CAAC,EACxD,QAAS,KAAK,QACd,KAAAjB,CAChB,EACgB,CAACgB,EAAQ,MAAM,QACf,CAACA,EAAQ,WAAW,QACpB,CAACA,EAAQ,QAAQ,QACjB,CAACA,EAAQ,KAAK,SAGlB,KAAK,MAAQ,GACb,KAAK,WAAa,GAClB,KAAK,aAAe,IAAI,QACxB,KAAK,QAAU,GACf,KAAK,SAAW,IAAI,IACpB,KAAK,SAAW,IAAI,IACpB,KAAK,WAAa,IAAI,IACtB,KAAK,SAAW,GAChB,KAAK,WAAWA,CAAO,EACnC,EACQ,KAAK,gBAAmBI,GAAM,CAC1B,GAAI,CAAA1D,GAAU0D,EAAE,OAAQ,KAAK,MAAM,EAGnC,OAAQA,EAAE,KAAI,CACV,IAAK,gBAAiB,CAClB,MAAMnpB,EAAQmpB,EAAE,OAAO,YACnB,CAACjE,EAAUiE,EAAE,OAAQ,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAK,GACrFnpB,IAAUmpB,EAAE,UACZ,KAAK,MAAM,KAAK,CACZ,MAAOlL,GAAgBkL,EAAE,OAAQ,KAAK,cAAe,KAAK,iBAAkB,KAAK,gBAAiB,KAAK,mBAAoB,KAAK,WAAW,GAAKnpB,EAC1I,KAAK,WACD,KAAK,WAAWA,EAAOilB,GAAqBkE,EAAE,MAAM,CAAC,EACrDnpB,EAAM,QAAQ,QAAS,GAAG,EAC9BA,EACN,KAAMmpB,EAAE,MACpC,CAAyB,EAEL,KACH,CACD,IAAK,aAAc,CACf,MAAM9e,EAAS8e,EAAE,OACjB,IAAIC,EAAgBD,EAAE,cAClBnpB,EAAQmpB,EAAE,OAAO,aAAaC,CAAa,EAC/C,GAAIA,IAAkB,QAAS,CAC3B,MAAMn1B,EAAO0lB,GAAatP,CAAM,EAC1BqO,EAAUrO,EAAO,QACvBrK,EAAQ4Z,GAAcvP,EAAQqO,EAASzkB,CAAI,EAC3C,MAAM6sB,EAAgBtI,GAAgB,CAClC,iBAAkB,KAAK,iBACvB,QAAAE,EACA,KAAAzkB,CAC5B,CAAyB,EACK4sB,EAAY5C,GAAgBkL,EAAE,OAAQ,KAAK,cAAe,KAAK,iBAAkB,KAAK,gBAAiB,KAAK,mBAAoBrI,CAAa,EACnJ9gB,EAAQ2Y,GAAe,CACnB,SAAUkI,EACV,QAASxW,EACT,MAAArK,EACA,YAAa,KAAK,WAC9C,CAAyB,CACJ,CACD,GAAIklB,EAAUiE,EAAE,OAAQ,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAK,GACpFnpB,IAAUmpB,EAAE,SACZ,OAEJ,IAAIjzB,EAAO,KAAK,aAAa,IAAIizB,EAAE,MAAM,EACzC,GAAI9e,EAAO,UAAY,UACnB+e,IAAkB,OAClB,CAAC,KAAK,gBAAgBppB,CAAK,EAC3B,GAAI,CAACqK,EAAO,gBACR+e,EAAgB,aAGhB,QAkBR,GAfKlzB,IACDA,EAAO,CACH,KAAMizB,EAAE,OACR,WAAY,CAAE,EACd,UAAW,CAAE,EACb,iBAAkB,CAAE,CAChD,EACwB,KAAK,WAAW,KAAKjzB,CAAI,EACzB,KAAK,aAAa,IAAIizB,EAAE,OAAQjzB,CAAI,GAEpCkzB,IAAkB,QAClB/e,EAAO,UAAY,UAClB8e,EAAE,UAAY,IAAI,YAAW,IAAO,YACrC9e,EAAO,aAAa,sBAAuB,MAAM,EAEjD,CAAC8S,GAAgB9S,EAAO,QAAS+e,CAAa,IAC9ClzB,EAAK,WAAWkzB,CAAa,EAAInM,GAAmB,KAAK,IAAKlE,GAAY1O,EAAO,OAAO,EAAG0O,GAAYqQ,CAAa,EAAGppB,EAAOqK,EAAQ,KAAK,eAAe,EACtJ+e,IAAkB,SAAS,CAC3B,GAAI,CAAC,KAAK,cACN,GAAI,CACA,KAAK,cACD,SAAS,eAAe,oBAC/B,MACS,CACN,KAAK,cAAgB,KAAK,GAC7B,CAEL,MAAMC,EAAM,KAAK,cAAc,cAAc,MAAM,EAC/CF,EAAE,UACFE,EAAI,aAAa,QAASF,EAAE,QAAQ,EAExC,UAAWG,KAAS,MAAM,KAAKjf,EAAO,KAAK,EAAG,CAC1C,MAAMkf,EAAWlf,EAAO,MAAM,iBAAiBif,CAAK,EAC9CE,EAAcnf,EAAO,MAAM,oBAAoBif,CAAK,EACtDC,IAAaF,EAAI,MAAM,iBAAiBC,CAAK,GAC7CE,IAAgBH,EAAI,MAAM,oBAAoBC,CAAK,EAC/CE,IAAgB,GAChBtzB,EAAK,UAAUozB,CAAK,EAAIC,EAGxBrzB,EAAK,UAAUozB,CAAK,EAAI,CAACC,EAAUC,CAAW,EAIlDtzB,EAAK,iBAAiBozB,CAAK,EAAI,CAACC,EAAUC,CAAW,CAE5D,CACD,UAAWF,KAAS,MAAM,KAAKD,EAAI,KAAK,EAChChf,EAAO,MAAM,iBAAiBif,CAAK,IAAM,KACzCpzB,EAAK,UAAUozB,CAAK,EAAI,GAGnC,CAEL,KACH,CACD,IAAK,YAAa,CACd,GAAIpE,EAAUiE,EAAE,OAAQ,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAI,EACnF,OAEJA,EAAE,WAAW,QAAS,GAAM,KAAK,QAAQ,EAAGA,EAAE,MAAM,CAAC,EACrDA,EAAE,aAAa,QAAS,GAAM,CAC1B,MAAMM,EAAS,KAAK,OAAO,MAAM,CAAC,EAC5Bn2B,EAAWmjB,GAAa0S,EAAE,MAAM,EAChC,KAAK,OAAO,MAAMA,EAAE,OAAO,IAAI,EAC/B,KAAK,OAAO,MAAMA,EAAE,MAAM,EAC5BjE,EAAUiE,EAAE,OAAQ,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAK,GACpF1D,GAAU,EAAG,KAAK,MAAM,GACxB,CAACD,GAAa,EAAG,KAAK,MAAM,IAG5B,KAAK,SAAS,IAAI,CAAC,GACnBkE,GAAW,KAAK,SAAU,CAAC,EAC3B,KAAK,WAAW,IAAI,CAAC,GAEhB,KAAK,SAAS,IAAIP,EAAE,MAAM,GAAKM,IAAW,IAC1C/D,GAAkByD,EAAE,OAAQ,KAAK,MAAM,IACvC,KAAK,SAAS,IAAI,CAAC,GACxB,KAAK,SAASvB,GAAQ6B,EAAQn2B,CAAQ,CAAC,EACvCo2B,GAAW,KAAK,SAAU,CAAC,EAG3B,KAAK,QAAQ,KAAK,CACd,SAAAp2B,EACA,GAAIm2B,EACJ,SAAUhT,GAAa0S,EAAE,MAAM,GAAKtS,GAAkBsS,EAAE,MAAM,EACxD,GACA,MACtC,CAA6B,GAEL,KAAK,WAAW,KAAK,CAAC,EAC9C,CAAqB,EACD,KACH,CACJ,CACb,EACQ,KAAK,QAAU,CAAC3S,EAAGnM,IAAW,CAC1B,GAAI,MAAK,qBAAqB,cAAcmM,EAAG,IAAI,GAE/C,OAAK,SAAS,IAAIA,CAAC,GAAK,KAAK,SAAS,IAAIA,CAAC,GAE/C,IAAI,KAAK,OAAO,QAAQA,CAAC,EAAG,CACxB,GAAIiP,GAAUjP,EAAG,KAAK,MAAM,EACxB,OAEJ,KAAK,SAAS,IAAIA,CAAC,EACnB,IAAImT,EAAW,KACXtf,GAAU,KAAK,OAAO,QAAQA,CAAM,IACpCsf,EAAW,KAAK,OAAO,MAAMtf,CAAM,GAEnCsf,GAAYA,IAAa,KACzB,KAAK,SAAS/B,GAAQ,KAAK,OAAO,MAAMpR,CAAC,EAAGmT,CAAQ,CAAC,EAAI,GAEhE,MAEG,KAAK,SAAS,IAAInT,CAAC,EACnB,KAAK,WAAW,OAAOA,CAAC,EAEvB0O,EAAU1O,EAAG,KAAK,WAAY,KAAK,cAAe,KAAK,gBAAiB,EAAK,IAC9EA,EAAE,WAAW,QAASuM,GAAW,KAAK,QAAQA,CAAM,CAAC,EACjDgD,GAAcvP,CAAC,GACfA,EAAE,WAAW,WAAW,QAASuM,GAAW,CACxC,KAAK,qBAAqB,IAAIA,EAAQ,IAAI,EAC1C,KAAK,QAAQA,EAAQvM,CAAC,CAC9C,CAAqB,GAGrB,CACK,CACD,KAAK1c,EAAS,CACV,CACI,aACA,aACA,gBACA,kBACA,cACA,gBACA,kBACA,mBACA,qBACA,mBACA,mBACA,kBACA,aACA,cACA,kBACA,eACA,eACA,iBACA,iBACA,MACA,SACA,gBACA,oBACA,mBACA,gBACA,sBACZ,EAAU,QAAS5H,GAAQ,CACf,KAAKA,CAAG,EAAI4H,EAAQ5H,CAAG,CACnC,CAAS,CACJ,CACD,QAAS,CACL,KAAK,OAAS,GACd,KAAK,cAAc,QACtB,CACD,UAAW,CACP,KAAK,OAAS,GACd,KAAK,cAAc,WACnB,KAAK,KAAI,CACZ,CACD,UAAW,CACP,OAAO,KAAK,MACf,CACD,MAAO,CACH,KAAK,OAAS,GACd,KAAK,cAAc,MACtB,CACD,QAAS,CACL,KAAK,OAAS,GACd,KAAK,cAAc,SACnB,KAAK,KAAI,CACZ,CACD,OAAQ,CACJ,KAAK,iBAAiB,QACtB,KAAK,cAAc,OACtB,CACL,CACA,SAASw3B,GAAWE,EAASpT,EAAG,CAC5BoT,EAAQ,OAAOpT,CAAC,EAChBA,EAAE,WAAW,QAASuM,GAAW2G,GAAWE,EAAS7G,CAAM,CAAC,CAChE,CACA,SAAS0F,GAAgBoB,EAASrT,EAAG+I,EAAQ,CACzC,OAAIsK,EAAQ,SAAW,EACZ,GACJC,GAAiBD,EAASrT,EAAG+I,CAAM,CAC9C,CACA,SAASuK,GAAiBD,EAASrT,EAAG+I,EAAQ,CAC1C,IAAInH,EAAO5B,EAAE,WACb,KAAO4B,GAAM,CACT,MAAM9kB,EAAWisB,EAAO,MAAMnH,CAAI,EAClC,GAAIyR,EAAQ,KAAME,GAAMA,EAAE,KAAOz2B,CAAQ,EACrC,MAAO,GAEX8kB,EAAOA,EAAK,UACf,CACD,MAAO,EACX,CACA,SAASsQ,GAAgBsB,EAAKxT,EAAG,CAC7B,OAAIwT,EAAI,OAAS,EACN,GACJC,GAAiBD,EAAKxT,CAAC,CAClC,CACA,SAASyT,GAAiBD,EAAKxT,EAAG,CAC9B,KAAM,CAAE,WAAA0T,CAAY,EAAG1T,EACvB,OAAK0T,EAGDF,EAAI,IAAIE,CAAU,EACX,GAEJD,GAAiBD,EAAKE,CAAU,EAL5B,EAMf,CAEA,IAAIC,GACJ,SAASC,GAAqBp2B,EAAS,CACnCm2B,GAAen2B,CACnB,CACA,SAASq2B,IAAyB,CAC9BF,GAAe,MACnB,CACA,MAAMG,EAAmBC,GAChBJ,GAGiB,IAAI/sB,IAAS,CAC/B,GAAI,CACA,OAAOmtB,EAAG,GAAGntB,CAAI,CACpB,OACM1K,EAAO,CACV,GAAIy3B,IAAgBA,GAAaz3B,CAAK,IAAM,GACxC,MAAO,IAAM,CAC7B,EAEY,MAAMA,CACT,CACT,EAbe63B,EAiBf,SAASC,GAAiBtU,EAAK,CAAE,IAAIC,EAA+BnW,EAAQkW,EAAI,CAAC,EAAO9iB,EAAI,EAAG,KAAOA,EAAI8iB,EAAI,QAAQ,CAAE,MAAME,EAAKF,EAAI9iB,CAAC,EAASie,EAAK6E,EAAI9iB,EAAI,CAAC,EAAW,GAARA,GAAK,GAAQgjB,IAAO,kBAAoBA,IAAO,iBAAmBpW,GAAS,KAAQ,OAAwBoW,IAAO,UAAYA,IAAO,kBAAoBD,EAAgBnW,EAAOA,EAAQqR,EAAGrR,CAAK,IAAcoW,IAAO,QAAUA,IAAO,kBAAkBpW,EAAQqR,EAAG,IAAI1c,IAASqL,EAAM,KAAKmW,EAAe,GAAGxhB,CAAI,CAAC,EAAGwhB,EAAgB,OAAc,CAAC,OAAOnW,CAAQ,CACrgB,MAAMyqB,GAAkB,CAAA,EACxB,SAASzf,GAAe5Y,EAAO,CAC3B,GAAI,CACA,GAAI,iBAAkBA,EAAO,CACzB,MAAM0nB,EAAO1nB,EAAM,eACnB,GAAI0nB,EAAK,OACL,OAAOA,EAAK,CAAC,CAEpB,SACQ,SAAU1nB,GAASA,EAAM,KAAK,OACnC,OAAOA,EAAM,KAAK,CAAC,CAE1B,MACU,CACV,CACD,OAAOA,GAASA,EAAM,MAC1B,CACA,SAASs4B,GAAqB5wB,EAAS6wB,EAAQ,CAC3C,MAAMC,EAAiB,IAAI/C,GAC3B4C,GAAgB,KAAKG,CAAc,EACnCA,EAAe,KAAK9wB,CAAO,EAC3B,IAAI+wB,EAAuB,OAAO,kBAC9B,OAAO,qBACX,MAAMC,EAAoBN,GAAiB,CAAC,OAAQ,iBAAkB7T,GAAKA,EAAE,KAAM,iBAAkBC,GAAMA,EAAG,WAAY,eAAgBoB,GAAMA,EAAG,kBAAkB,CAAC,CAAC,EACnK8S,GACA,OAAOA,CAAiB,IACxBD,EAAuB,OAAOC,CAAiB,GAEnD,MAAMC,EAAW,IAAIF,EAAqBP,EAAiBxC,GAAc,CACjEhuB,EAAQ,YAAcA,EAAQ,WAAWguB,CAAS,IAAM,IAG5D8C,EAAe,iBAAiB,KAAKA,CAAc,EAAE9C,CAAS,CACjE,CAAA,CAAC,EACF,OAAAiD,EAAS,QAAQJ,EAAQ,CACrB,WAAY,GACZ,kBAAmB,GACnB,cAAe,GACf,sBAAuB,GACvB,UAAW,GACX,QAAS,EACjB,CAAK,EACMI,CACX,CACA,SAASC,GAAiB,CAAE,YAAAC,EAAa,SAAAC,EAAU,IAAAjP,EAAK,OAAAsD,CAAM,EAAK,CAC/D,GAAI2L,EAAS,YAAc,GACvB,MAAO,IAAM,CACrB,EAEI,MAAMC,EAAY,OAAOD,EAAS,WAAc,SAAWA,EAAS,UAAY,GAC1EE,EAAoB,OAAOF,EAAS,mBAAsB,SAC1DA,EAAS,kBACT,IACN,IAAIG,EAAY,CAAA,EACZC,EACJ,MAAMC,EAAY3H,GAAW0G,EAAiBj3B,GAAW,CACrD,MAAMm4B,EAAc,KAAK,IAAG,EAAKF,EACjCL,EAAYI,EAAU,IAAKI,IACvBA,EAAE,YAAcD,EACTC,EACV,EAAGp4B,CAAM,EACVg4B,EAAY,CAAA,EACZC,EAAe,IACvB,CAAK,EAAGF,CAAiB,EACfM,EAAiBpB,EAAgB1G,GAAW0G,EAAiBpsB,GAAQ,CACvE,MAAMmM,EAASW,GAAe9M,CAAG,EAC3B,CAAE,QAAAytB,EAAS,QAAAC,GAAYjG,GAAoBznB,CAAG,EAC9CA,EAAI,eAAe,CAAC,EACpBA,EACDotB,IACDA,EAAe9G,GAAY,GAE/B6G,EAAU,KAAK,CACX,EAAGM,EACH,EAAGC,EACH,GAAIrM,EAAO,MAAMlV,CAAM,EACvB,WAAYma,GAAY,EAAK8G,CACzC,CAAS,EACDC,EAAU,OAAO,UAAc,KAAertB,aAAe,UACvD8oB,EAAkB,KAClB9oB,aAAe,WACX8oB,EAAkB,UAClBA,EAAkB,SAAS,CACxC,CAAA,EAAGmE,EAAW,CACX,SAAU,EACb,CAAA,CAAC,EACIzgB,EAAW,CACb8Y,EAAG,YAAakI,EAAgBzP,CAAG,EACnCuH,EAAG,YAAakI,EAAgBzP,CAAG,EACnCuH,EAAG,OAAQkI,EAAgBzP,CAAG,CACtC,EACI,OAAOqO,EAAgB,IAAM,CACzB5f,EAAS,QAASmhB,GAAMA,EAAG,CAAA,CACnC,CAAK,CACL,CACA,SAASC,GAA6B,CAAE,mBAAAC,EAAoB,IAAA9P,EAAK,OAAAsD,EAAQ,WAAAjC,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,SAAA0N,GAAa,CAC9H,GAAIA,EAAS,mBAAqB,GAC9B,MAAO,IAAM,CACrB,EAEI,MAAMc,EAAad,EAAS,mBAAqB,IAC7CA,EAAS,mBAAqB,OAC5B,CAAE,EACFA,EAAS,iBACTxgB,EAAW,CAAA,EACjB,IAAIuhB,EAAqB,KACzB,MAAMC,EAAcC,GACR/5B,GAAU,CACd,MAAMiY,EAASW,GAAe5Y,CAAK,EACnC,GAAI8yB,EAAU7a,EAAQiT,EAAYC,EAAeC,EAAiB,EAAI,EAClE,OAEJ,IAAI4O,EAAc,KACdC,EAAeF,EACnB,GAAI,gBAAiB/5B,EAAO,CACxB,OAAQA,EAAM,YAAW,CACrB,IAAK,QACDg6B,EAAchF,GAAa,MAC3B,MACJ,IAAK,QACDgF,EAAchF,GAAa,MAC3B,MACJ,IAAK,MACDgF,EAAchF,GAAa,IAC3B,KACP,CACGgF,IAAgBhF,GAAa,MACzBF,EAAkBiF,CAAQ,IAAMjF,EAAkB,UAClDmF,EAAe,aAEVnF,EAAkBiF,CAAQ,IAAMjF,EAAkB,UACvDmF,EAAe,YAGEjF,GAAa,GACzC,MACQzB,GAAoBvzB,CAAK,IAC9Bg6B,EAAchF,GAAa,OAE3BgF,IAAgB,MAChBH,EAAqBG,GAChBC,EAAa,WAAW,OAAO,GAChCD,IAAgBhF,GAAa,OAC5BiF,EAAa,WAAW,OAAO,GAC5BD,IAAgBhF,GAAa,SACjCgF,EAAc,OAGblF,EAAkBiF,CAAQ,IAAMjF,EAAkB,QACvDkF,EAAcH,EACdA,EAAqB,MAEzB,MAAM1rB,EAAIolB,GAAoBvzB,CAAK,EAAIA,EAAM,eAAe,CAAC,EAAIA,EACjE,GAAI,CAACmO,EACD,OAEJ,MAAMwX,EAAKwH,EAAO,MAAMlV,CAAM,EACxB,CAAE,QAAAshB,EAAS,QAAAC,CAAS,EAAGrrB,EAC7B+pB,EAAgByB,CAAkB,EAAE,CAChC,KAAM7E,EAAkBmF,CAAY,EACpC,GAAAtU,EACA,EAAG4T,EACH,EAAGC,EACH,GAAIQ,IAAgB,MAAQ,CAAE,YAAAA,EAC9C,CAAa,CACb,EAEI,cAAO,KAAKlF,CAAiB,EACxB,OAAQh1B,GAAQ,OAAO,MAAM,OAAOA,CAAG,CAAC,GACzC,CAACA,EAAI,SAAS,WAAW,GACzB85B,EAAW95B,CAAG,IAAM,EAAK,EACxB,QAASi6B,GAAa,CACvB,IAAI/a,EAAY2H,GAAYoT,CAAQ,EACpC,MAAMn4B,EAAUk4B,EAAWC,CAAQ,EACnC,GAAI,OAAO,aACP,OAAQjF,EAAkBiF,CAAQ,EAAC,CAC/B,KAAKjF,EAAkB,UACvB,KAAKA,EAAkB,QACnB9V,EAAYA,EAAU,QAAQ,QAAS,SAAS,EAChD,MACJ,KAAK8V,EAAkB,WACvB,KAAKA,EAAkB,SACnB,MACP,CAELxc,EAAS,KAAK8Y,EAAGpS,EAAWpd,EAASioB,CAAG,CAAC,CACjD,CAAK,EACMqO,EAAgB,IAAM,CACzB5f,EAAS,QAASmhB,GAAMA,EAAG,CAAA,CACnC,CAAK,CACL,CACA,SAASS,GAAmB,CAAE,SAAAC,EAAU,IAAAtQ,EAAK,OAAAsD,EAAQ,WAAAjC,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,SAAA0N,GAAa,CAC1G,MAAMQ,EAAiBpB,EAAgB1G,GAAW0G,EAAiBpsB,GAAQ,CACvE,MAAMmM,EAASW,GAAe9M,CAAG,EACjC,GAAI,CAACmM,GACD6a,EAAU7a,EAAQiT,EAAYC,EAAeC,EAAiB,EAAI,EAClE,OAEJ,MAAMzF,EAAKwH,EAAO,MAAMlV,CAAM,EAC9B,GAAIA,IAAW4R,GAAOA,EAAI,YAAa,CACnC,MAAMuQ,EAAgB/H,GAAgBxI,EAAI,WAAW,EACrDsQ,EAAS,CACL,GAAAxU,EACA,EAAGyU,EAAc,KACjB,EAAGA,EAAc,GACjC,CAAa,CACJ,MAEGD,EAAS,CACL,GAAAxU,EACA,EAAG1N,EAAO,WACV,EAAGA,EAAO,SAC1B,CAAa,CAER,CAAA,EAAG6gB,EAAS,QAAU,GAAG,CAAC,EAC3B,OAAO1H,EAAG,SAAUkI,EAAgBzP,CAAG,CAC3C,CACA,SAASwQ,GAA2B,CAAE,iBAAAC,GAAoB,CAAE,IAAA7N,CAAG,EAAI,CAC/D,IAAI8N,EAAQ,GACRC,EAAQ,GACZ,MAAMC,EAAkBvC,EAAgB1G,GAAW0G,EAAgB,IAAM,CACrE,MAAMzI,EAASkD,KACTnD,EAAQoD,MACV2H,IAAU9K,GAAU+K,IAAUhL,KAC9B8K,EAAiB,CACb,MAAO,OAAO9K,CAAK,EACnB,OAAQ,OAAOC,CAAM,CACrC,CAAa,EACD8K,EAAQ9K,EACR+K,EAAQhL,EAEpB,CAAK,EAAG,GAAG,CAAC,EACR,OAAO4B,EAAG,SAAUqJ,EAAiBhO,CAAG,CAC5C,CACA,MAAMiO,GAAa,CAAC,QAAS,WAAY,QAAQ,EAC3CC,GAAoB,IAAI,QAC9B,SAASC,GAAkB,CAAE,QAAAC,EAAS,IAAAhR,EAAK,OAAAsD,EAAQ,WAAAjC,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,YAAA0P,EAAa,eAAAC,EAAgB,iBAAA1U,EAAkB,YAAAI,EAAa,SAAAqS,EAAU,qBAAAkC,EAAsB,cAAAlP,EAAe,gBAAAE,EAAiB,iBAAAD,EAAkB,mBAAAE,GAAuB,CAChQ,SAASgP,EAAaj7B,EAAO,CACzB,IAAIiY,EAASW,GAAe5Y,CAAK,EACjC,MAAMk7B,EAAgBl7B,EAAM,UACtBsmB,EAAUrO,GAAU2O,GAAY3O,EAAO,OAAO,EAGpD,GAFIqO,IAAY,WACZrO,EAASA,EAAO,eAChB,CAACA,GACD,CAACqO,GACDoU,GAAW,QAAQpU,CAAO,EAAI,GAC9BwM,EAAU7a,EAAQiT,EAAYC,EAAeC,EAAiB,EAAI,EAClE,OAEJ,MAAM/S,EAAKJ,EACX,GAAII,EAAG,UAAU,SAASyiB,CAAW,GAChCC,GAAkB1iB,EAAG,QAAQ0iB,CAAc,EAC5C,OAEJ,MAAMl5B,EAAO0lB,GAAatP,CAAM,EAChC,IAAIyO,EAAOc,GAAcnP,EAAIiO,EAASzkB,CAAI,EACtCs5B,EAAY,GAChB,MAAMzM,GAAgBtI,GAAgB,CAClC,iBAAAC,EACA,QAAAC,EACA,KAAAzkB,CACZ,CAAS,EACK4sB,EAAY5C,GAAgB5T,EAAQ6T,EAAeC,EAAkBC,EAAiBC,EAAoByC,EAAa,GACzH7sB,IAAS,SAAWA,IAAS,cAC7Bs5B,EAAYljB,EAAO,SAEvByO,EAAOH,GAAe,CAClB,SAAUkI,EACV,QAASxW,EACT,MAAOyO,EACP,YAAAD,CACZ,CAAS,EACD2U,EAAYnjB,EAAQ+iB,EACd,CAAE,KAAAtU,EAAM,UAAAyU,EAAW,cAAAD,CAAe,EAClC,CAAE,KAAAxU,EAAM,UAAAyU,CAAS,CAAE,EACzB,MAAM5zB,EAAO0Q,EAAO,KAChBpW,IAAS,SAAW0F,GAAQ4zB,GAC5BtR,EACK,iBAAiB,6BAA6BtiB,CAAI,IAAI,EACtD,QAAS8Q,GAAO,CACjB,GAAIA,IAAOJ,EAAQ,CACf,MAAMyO,GAAOH,GAAe,CACxB,SAAUkI,EACV,QAASpW,EACT,MAAOmP,GAAcnP,EAAIiO,EAASzkB,CAAI,EACtC,YAAA4kB,CACxB,CAAqB,EACD2U,EAAY/iB,EAAI2iB,EACV,CAAE,KAAAtU,GAAM,UAAW,CAACyU,EAAW,cAAe,EAAO,EACrD,CAAE,KAAAzU,GAAM,UAAW,CAACyU,CAAW,CAAA,CACxC,CACjB,CAAa,CAER,CACD,SAASC,EAAYnjB,EAAQojB,EAAG,CAC5B,MAAMC,EAAiBX,GAAkB,IAAI1iB,CAAM,EACnD,GAAI,CAACqjB,GACDA,EAAe,OAASD,EAAE,MAC1BC,EAAe,YAAcD,EAAE,UAAW,CAC1CV,GAAkB,IAAI1iB,EAAQojB,CAAC,EAC/B,MAAM1V,EAAKwH,EAAO,MAAMlV,CAAM,EAC9BigB,EAAgB2C,CAAO,EAAE,CACrB,GAAGQ,EACH,GAAA1V,CAChB,CAAa,CACJ,CACJ,CAED,MAAMrN,GADSwgB,EAAS,QAAU,OAAS,CAAC,QAAQ,EAAI,CAAC,QAAS,QAAQ,GAClD,IAAK9Z,GAAcoS,EAAGpS,EAAWkZ,EAAgB+C,CAAY,EAAGpR,CAAG,CAAC,EACtF0R,EAAgB1R,EAAI,YAC1B,GAAI,CAAC0R,EACD,MAAO,IAAM,CACTjjB,EAAS,QAASmhB,GAAMA,EAAG,CAAA,CACvC,EAEI,MAAM+B,EAAqBD,EAAc,OAAO,yBAAyBA,EAAc,iBAAiB,UAAW,OAAO,EACpHE,EAAiB,CACnB,CAACF,EAAc,iBAAiB,UAAW,OAAO,EAClD,CAACA,EAAc,iBAAiB,UAAW,SAAS,EACpD,CAACA,EAAc,kBAAkB,UAAW,OAAO,EACnD,CAACA,EAAc,oBAAoB,UAAW,OAAO,EACrD,CAACA,EAAc,kBAAkB,UAAW,eAAe,EAC3D,CAACA,EAAc,kBAAkB,UAAW,UAAU,CAC9D,EACI,OAAIC,GAAsBA,EAAmB,KACzCljB,EAAS,KAAK,GAAGmjB,EAAe,IAAKpC,GAAMvH,GAAWuH,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAC9D,KAAM,CACFnB,EAAgB+C,CAAY,EAAE,CAC1B,OAAQ,KACR,UAAW,EAC/B,CAAiB,CACJ,CACb,EAAW,GAAOM,CAAa,CAAC,CAAC,EAEtBrD,EAAgB,IAAM,CACzB5f,EAAS,QAASmhB,GAAMA,EAAG,CAAA,CACnC,CAAK,CACL,CACA,SAASiC,GAA0B5W,EAAM,CACrC,MAAMmU,EAAY,CAAA,EAClB,SAAS0C,EAAQC,EAAW7R,EAAK,CAC7B,GAAK8R,GAAiB,iBAAiB,GACnCD,EAAU,sBAAsB,iBAC/BC,GAAiB,cAAc,GAC5BD,EAAU,sBAAsB,cACnCC,GAAiB,iBAAiB,GAC/BD,EAAU,sBAAsB,iBACnCC,GAAiB,kBAAkB,GAChCD,EAAU,sBAAsB,iBAAmB,CAEvD,MAAMrG,EADQ,MAAM,KAAKqG,EAAU,WAAW,QAAQ,EAClC,QAAQA,CAAS,EACrC7R,EAAI,QAAQwL,CAAK,CACpB,SACQqG,EAAU,iBAAkB,CAEjC,MAAMrG,EADQ,MAAM,KAAKqG,EAAU,iBAAiB,QAAQ,EACxC,QAAQA,CAAS,EACrC7R,EAAI,QAAQwL,CAAK,CACpB,CACD,OAAOxL,CACV,CACD,OAAO4R,EAAQ7W,EAAMmU,CAAS,CAClC,CACA,SAAS6C,GAAgBC,EAAO5O,EAAQ6O,EAAa,CACjD,IAAIrW,EAAIsW,EACR,OAAKF,GAEDA,EAAM,UACNpW,EAAKwH,EAAO,MAAM4O,EAAM,SAAS,EAEjCE,EAAUD,EAAY,MAAMD,CAAK,EAC9B,CACH,QAAAE,EACA,GAAAtW,CACR,GARe,EASf,CACA,SAASuW,GAAuB,CAAE,iBAAAC,EAAkB,OAAAhP,EAAQ,kBAAAiP,CAAmB,EAAE,CAAE,IAAA3P,GAAO,CACtF,GAAI,CAACA,EAAI,eAAiB,CAACA,EAAI,cAAc,UACzC,MAAO,IAAM,CACrB,EAEI,MAAM4P,EAAa5P,EAAI,cAAc,UAAU,WAC/CA,EAAI,cAAc,UAAU,WAAa,IAAI,MAAM4P,EAAY,CAC3D,MAAOnE,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAACzX,EAAMyQ,CAAK,EAAIgH,EAChB,CAAE,GAAA5W,EAAI,QAAAsW,GAAYH,GAAgBQ,EAASnP,EAAQiP,EAAkB,WAAW,EACtF,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CE,EAAiB,CACb,GAAAxW,EACA,QAAAsW,EACA,KAAM,CAAC,CAAE,KAAAnX,EAAM,MAAAyQ,EAAO,CAC1C,CAAiB,EAEEtd,EAAO,MAAMqkB,EAASC,CAAa,CACtD,CAAS,CACT,CAAK,EACD,MAAMC,EAAa/P,EAAI,cAAc,UAAU,WAC/CA,EAAI,cAAc,UAAU,WAAa,IAAI,MAAM+P,EAAY,CAC3D,MAAOtE,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAAChH,CAAK,EAAIgH,EACV,CAAE,GAAA5W,EAAI,QAAAsW,GAAYH,GAAgBQ,EAASnP,EAAQiP,EAAkB,WAAW,EACtF,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CE,EAAiB,CACb,GAAAxW,EACA,QAAAsW,EACA,QAAS,CAAC,CAAE,MAAA1G,EAAO,CACvC,CAAiB,EAEEtd,EAAO,MAAMqkB,EAASC,CAAa,CACtD,CAAS,CACT,CAAK,EACD,IAAIE,EACAhQ,EAAI,cAAc,UAAU,UAC5BgQ,EAAUhQ,EAAI,cAAc,UAAU,QACtCA,EAAI,cAAc,UAAU,QAAU,IAAI,MAAMgQ,EAAS,CACrD,MAAOvE,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAAC7V,CAAI,EAAI6V,EACT,CAAE,GAAA5W,EAAI,QAAAsW,GAAYH,GAAgBQ,EAASnP,EAAQiP,EAAkB,WAAW,EACtF,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CE,EAAiB,CACb,GAAAxW,EACA,QAAAsW,EACA,QAASvV,CACjC,CAAqB,EAEEzO,EAAO,MAAMqkB,EAASC,CAAa,CAC1D,CAAa,CACb,CAAS,GAEL,IAAIG,EACAjQ,EAAI,cAAc,UAAU,cAC5BiQ,EAAcjQ,EAAI,cAAc,UAAU,YAC1CA,EAAI,cAAc,UAAU,YAAc,IAAI,MAAMiQ,EAAa,CAC7D,MAAOxE,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAAC7V,CAAI,EAAI6V,EACT,CAAE,GAAA5W,EAAI,QAAAsW,GAAYH,GAAgBQ,EAASnP,EAAQiP,EAAkB,WAAW,EACtF,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CE,EAAiB,CACb,GAAAxW,EACA,QAAAsW,EACA,YAAavV,CACrC,CAAqB,EAEEzO,EAAO,MAAMqkB,EAASC,CAAa,CAC1D,CAAa,CACb,CAAS,GAEL,MAAMI,EAA8B,CAAA,EAChCC,GAA4B,iBAAiB,EAC7CD,EAA4B,gBAAkBlQ,EAAI,iBAG9CmQ,GAA4B,cAAc,IAC1CD,EAA4B,aAAelQ,EAAI,cAE/CmQ,GAA4B,kBAAkB,IAC9CD,EAA4B,iBAAmBlQ,EAAI,kBAEnDmQ,GAA4B,iBAAiB,IAC7CD,EAA4B,gBAAkBlQ,EAAI,kBAG1D,MAAMoQ,EAAsB,CAAA,EAC5B,cAAO,QAAQF,CAA2B,EAAE,QAAQ,CAAC,CAACG,EAASj7B,CAAI,IAAM,CACrEg7B,EAAoBC,CAAO,EAAI,CAC3B,WAAYj7B,EAAK,UAAU,WAC3B,WAAYA,EAAK,UAAU,UACvC,EACQA,EAAK,UAAU,WAAa,IAAI,MAAMg7B,EAAoBC,CAAO,EAAE,WAAY,CAC3E,MAAO5E,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAACzX,EAAMyQ,CAAK,EAAIgH,EAChB,CAAE,GAAA5W,EAAI,QAAAsW,CAAO,EAAKH,GAAgBQ,EAAQ,iBAAkBnP,EAAQiP,EAAkB,WAAW,EACvG,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CE,EAAiB,CACb,GAAAxW,EACA,QAAAsW,EACA,KAAM,CACF,CACI,KAAAnX,EACA,MAAO,CACH,GAAG4W,GAA0BY,CAAO,EACpC/G,GAAS,CACZ,CACJ,CACJ,CACzB,CAAqB,EAEEtd,EAAO,MAAMqkB,EAASC,CAAa,CAC1D,CAAa,CACb,CAAS,EACD16B,EAAK,UAAU,WAAa,IAAI,MAAMg7B,EAAoBC,CAAO,EAAE,WAAY,CAC3E,MAAO5E,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAAChH,CAAK,EAAIgH,EACV,CAAE,GAAA5W,EAAI,QAAAsW,CAAO,EAAKH,GAAgBQ,EAAQ,iBAAkBnP,EAAQiP,EAAkB,WAAW,EACvG,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CE,EAAiB,CACb,GAAAxW,EACA,QAAAsW,EACA,QAAS,CACL,CAAE,MAAO,CAAC,GAAGP,GAA0BY,CAAO,EAAG/G,CAAK,CAAG,CAC5D,CACzB,CAAqB,EAEEtd,EAAO,MAAMqkB,EAASC,CAAa,CAC1D,CAAa,CACb,CAAS,CACT,CAAK,EACMrE,EAAgB,IAAM,CACzBzL,EAAI,cAAc,UAAU,WAAa4P,EACzC5P,EAAI,cAAc,UAAU,WAAa+P,EACzCC,IAAYhQ,EAAI,cAAc,UAAU,QAAUgQ,GAClDC,IAAgBjQ,EAAI,cAAc,UAAU,YAAciQ,GAC1D,OAAO,QAAQC,CAA2B,EAAE,QAAQ,CAAC,CAACG,EAASj7B,CAAI,IAAM,CACrEA,EAAK,UAAU,WAAag7B,EAAoBC,CAAO,EAAE,WACzDj7B,EAAK,UAAU,WAAag7B,EAAoBC,CAAO,EAAE,UACrE,CAAS,CACT,CAAK,CACL,CACA,SAASC,GAA8B,CAAE,OAAA5P,EAAQ,kBAAAiP,CAAiB,EAAK9X,EAAM,CACzE,IAAI0Y,EAAS,KACT1Y,EAAK,WAAa,YAClB0Y,EAAS7P,EAAO,MAAM7I,CAAI,EAE1B0Y,EAAS7P,EAAO,MAAM7I,EAAK,IAAI,EACnC,MAAM2Y,EAAc3Y,EAAK,WAAa,YAChC8T,GAAiB,CAAC9T,EAAM,SAAUuB,GAAMA,EAAG,YAAa,iBAAkBC,GAAMA,EAAG,QAAQ,CAAC,EAC5FsS,GAAiB,CAAC9T,EAAM,SAAUuD,GAAMA,EAAG,cAAe,iBAAkBwG,GAAMA,EAAG,YAAa,iBAAkBC,GAAMA,EAAG,UAAU,CAAC,EACxI4O,EAA6B9E,GAAiB,CAAC6E,EAAa,iBAAkB1O,GAAMA,EAAG,SAAS,CAAC,EACjG,OAAO,yBAAyB6J,GAAiB,CAAC6E,EAAa,iBAAkB3K,GAAOA,EAAI,SAAS,CAAC,EAAG,oBAAoB,EAC7H,OACN,OAAI0K,IAAW,MACXA,IAAW,IACX,CAACC,GACD,CAACC,EACM,IAAM,CACrB,GACI,OAAO,eAAe5Y,EAAM,qBAAsB,CAC9C,aAAc4Y,EAA2B,aACzC,WAAYA,EAA2B,WACvC,KAAM,CACF,OAAO9E,GAAiB,CAAC8E,EAA4B,SAAU3K,GAAOA,EAAI,IAAK,iBAAkBC,GAAOA,EAAI,KAAM,OAAQC,GAAOA,EAAI,IAAI,CAAC,CAAC,CAC9I,EACD,IAAI0K,EAAQ,CACR,MAAMrzB,EAASsuB,GAAiB,CAAC8E,EAA4B,SAAUxK,GAAOA,EAAI,IAAK,iBAAkB0K,GAAOA,EAAI,KAAM,OAAQC,GAAOA,EAAI,KAAMF,CAAM,CAAC,CAAC,EAC3J,GAAIH,IAAW,MAAQA,IAAW,GAC9B,GAAI,CACAZ,EAAkB,iBAAiBe,EAAQH,CAAM,CACpD,MACS,CACT,CAEL,OAAOlzB,CACV,CACT,CAAK,EACMouB,EAAgB,IAAM,CACzB,OAAO,eAAe5T,EAAM,qBAAsB,CAC9C,aAAc4Y,EAA2B,aACzC,WAAYA,EAA2B,WACvC,IAAKA,EAA2B,IAChC,IAAKA,EAA2B,GAC5C,CAAS,CACT,CAAK,EACL,CACA,SAASI,GAA6B,CAAE,mBAAAC,EAAoB,OAAApQ,EAAQ,oBAAAqQ,EAAqB,kBAAApB,CAAoB,EAAE,CAAE,IAAA3P,GAAO,CACpH,MAAMgR,EAAchR,EAAI,oBAAoB,UAAU,YACtDA,EAAI,oBAAoB,UAAU,YAAc,IAAI,MAAMgR,EAAa,CACnE,MAAOvF,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAACmB,EAAU9vB,EAAO+vB,CAAQ,EAAIpB,EACpC,GAAIiB,EAAoB,IAAIE,CAAQ,EAChC,OAAOD,EAAY,MAAMnB,EAAS,CAACoB,EAAU9vB,EAAO+vB,CAAQ,CAAC,EAEjE,KAAM,CAAE,GAAAhY,EAAI,QAAAsW,GAAYH,GAAgB1D,GAAiB,CAACkE,EAAS,SAAUsB,GAAOA,EAAI,WAAY,iBAAkBhK,GAAOA,EAAI,gBAAgB,CAAC,EAAGzG,EAAQiP,EAAkB,WAAW,EAC1L,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CsB,EAAmB,CACf,GAAA5X,EACA,QAAAsW,EACA,IAAK,CACD,SAAAyB,EACA,MAAA9vB,EACA,SAAA+vB,CACH,EACD,MAAOjC,GAA0BY,EAAQ,UAAU,CACvE,CAAiB,EAEErkB,EAAO,MAAMqkB,EAASC,CAAa,CACtD,CAAS,CACT,CAAK,EACD,MAAMsB,EAAiBpR,EAAI,oBAAoB,UAAU,eACzD,OAAAA,EAAI,oBAAoB,UAAU,eAAiB,IAAI,MAAMoR,EAAgB,CACzE,MAAO3F,EAAgB,CAACjgB,EAAQqkB,EAASC,IAAkB,CACvD,KAAM,CAACmB,CAAQ,EAAInB,EACnB,GAAIiB,EAAoB,IAAIE,CAAQ,EAChC,OAAOG,EAAe,MAAMvB,EAAS,CAACoB,CAAQ,CAAC,EAEnD,KAAM,CAAE,GAAA/X,EAAI,QAAAsW,GAAYH,GAAgB1D,GAAiB,CAACkE,EAAS,SAAUrI,GAAOA,EAAI,WAAY,iBAAkBC,GAAOA,EAAI,gBAAgB,CAAC,EAAG/G,EAAQiP,EAAkB,WAAW,EAC1L,OAAKzW,GAAMA,IAAO,IAAQsW,GAAWA,IAAY,KAC7CsB,EAAmB,CACf,GAAA5X,EACA,QAAAsW,EACA,OAAQ,CACJ,SAAAyB,CACH,EACD,MAAOhC,GAA0BY,EAAQ,UAAU,CACvE,CAAiB,EAEErkB,EAAO,MAAMqkB,EAASC,CAAa,CACtD,CAAS,CACT,CAAK,EACMrE,EAAgB,IAAM,CACzBzL,EAAI,oBAAoB,UAAU,YAAcgR,EAChDhR,EAAI,oBAAoB,UAAU,eAAiBoR,CAC3D,CAAK,CACL,CACA,SAASC,GAA6B,CAAE,mBAAAC,EAAoB,WAAA7S,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,OAAA+B,EAAQ,SAAA2L,EAAU,IAAAjP,GAAQ,CAC9H,MAAMjoB,EAAUs2B,EAAiBr2B,GAAS2vB,GAAW0G,EAAiBl4B,GAAU,CAC5E,MAAMiY,EAASW,GAAe5Y,CAAK,EACnC,GAAI,CAACiY,GACD6a,EAAU7a,EAAQiT,EAAYC,EAAeC,EAAiB,EAAI,EAClE,OAEJ,KAAM,CAAE,YAAA4S,EAAa,OAAAC,EAAQ,MAAAC,EAAO,aAAAC,CAAY,EAAKlmB,EACrD8lB,EAAmB,CACf,KAAAl8B,EACA,GAAIsrB,EAAO,MAAMlV,CAAM,EACvB,YAAA+lB,EACA,OAAAC,EACA,MAAAC,EACA,aAAAC,CACZ,CAAS,CACJ,CAAA,EAAGrF,EAAS,OAAS,GAAG,CAAC,EACpBxgB,EAAW,CACb8Y,EAAG,OAAQxvB,EAAQ,CAAC,EAAGioB,CAAG,EAC1BuH,EAAG,QAASxvB,EAAQ,CAAC,EAAGioB,CAAG,EAC3BuH,EAAG,SAAUxvB,EAAQ,CAAC,EAAGioB,CAAG,EAC5BuH,EAAG,eAAgBxvB,EAAQ,CAAC,EAAGioB,CAAG,EAClCuH,EAAG,aAAcxvB,EAAQ,CAAC,EAAGioB,CAAG,CACxC,EACI,OAAOqO,EAAgB,IAAM,CACzB5f,EAAS,QAASmhB,GAAMA,EAAG,CAAA,CACnC,CAAK,CACL,CACA,SAAS2E,GAAiB,CAAE,OAAAC,EAAQ,IAAAxU,GAAO,CACvC,MAAM4C,EAAM5C,EAAI,YAChB,GAAI,CAAC4C,EACD,MAAO,IAAM,CACrB,EAEI,MAAMnU,EAAW,CAAA,EACXgmB,EAAU,IAAI,QACdC,EAAmB9R,EAAI,SAC7BA,EAAI,SAAW,SAAkB+R,EAAQv9B,EAAQw9B,EAAa,CAC1D,MAAMC,EAAW,IAAIH,EAAiBC,EAAQv9B,EAAQw9B,CAAW,EACjE,OAAAH,EAAQ,IAAII,EAAU,CAClB,OAAAF,EACA,OAAQ,OAAOv9B,GAAW,SAC1B,YAAAw9B,EACA,WAAY,OAAOx9B,GAAW,SACxBA,EACA,KAAK,UAAU,MAAM,KAAK,IAAI,WAAWA,CAAM,CAAC,CAAC,CACnE,CAAS,EACMy9B,CACf,EACI,MAAMC,EAAiB1M,GAAMpI,EAAI,MAAO,MAAO,SAAUrL,EAAU,CAC/D,OAAO,SAAUkgB,EAAU,CACvB,OAAA7M,GAAaqG,EAAgB,IAAM,CAC/B,MAAMmB,EAAIiF,EAAQ,IAAII,CAAQ,EAC1BrF,IACAgF,EAAOhF,CAAC,EACRiF,EAAQ,OAAOI,CAAQ,EAE3C,CAAa,EAAG,CAAC,EACElgB,EAAS,MAAM,KAAM,CAACkgB,CAAQ,CAAC,CAClD,CACA,CAAK,EACD,OAAApmB,EAAS,KAAK,IAAM,CAChBmU,EAAI,SAAW8R,CACvB,CAAK,EACDjmB,EAAS,KAAKqmB,CAAc,EACrBzG,EAAgB,IAAM,CACzB5f,EAAS,QAASmhB,GAAMA,EAAG,CAAA,CACnC,CAAK,CACL,CACA,SAASmF,GAAsBC,EAAO,CAClC,KAAM,CAAE,IAAAhV,EAAK,OAAAsD,EAAQ,WAAAjC,EAAY,cAAAC,EAAe,gBAAAC,EAAiB,YAAA0T,CAAc,EAAGD,EAClF,IAAIE,EAAY,GAChB,MAAMC,EAAkB9G,EAAgB,IAAM,CAC1C,MAAM+G,EAAYpV,EAAI,eACtB,GAAI,CAACoV,GAAcF,GAAa3G,GAAiB,CAAC6G,EAAW,iBAAkB9K,GAAOA,EAAI,WAAW,CAAC,EAClG,OACJ4K,EAAYE,EAAU,aAAe,GACrC,MAAMC,EAAS,CAAA,EACTt0B,EAAQq0B,EAAU,YAAc,EACtC,QAASj+B,EAAI,EAAGA,EAAI4J,EAAO5J,IAAK,CAC5B,MAAMm+B,EAAQF,EAAU,WAAWj+B,CAAC,EAC9B,CAAE,eAAAo+B,EAAgB,YAAAC,EAAa,aAAAC,EAAc,UAAAC,CAAS,EAAKJ,EACjDrM,EAAUsM,EAAgBlU,EAAYC,EAAeC,EAAiB,EAAI,GACtF0H,EAAUwM,EAAcpU,EAAYC,EAAeC,EAAiB,EAAI,GAG5E8T,EAAO,KAAK,CACR,MAAO/R,EAAO,MAAMiS,CAAc,EAClC,YAAAC,EACA,IAAKlS,EAAO,MAAMmS,CAAY,EAC9B,UAAAC,CAChB,CAAa,CACJ,CACDT,EAAY,CAAE,OAAAI,CAAM,CAAE,CAC9B,CAAK,EACD,OAAAF,IACO5N,EAAG,kBAAmB4N,CAAe,CAChD,CACA,SAASQ,GAA0B,CAAE,IAAA3V,EAAK,gBAAA4V,GAAoB,CAC1D,MAAMhT,EAAM5C,EAAI,YAChB,MAAI,CAAC4C,GAAO,CAACA,EAAI,eACN,IAAM,CAAA,EACMwF,GAAMxF,EAAI,eAAgB,SAAU,SAAUjO,EAAU,CAC3E,OAAO,SAAUjX,EAAMm4B,EAAah4B,EAAS,CACzC,GAAI,CACA+3B,EAAgB,CACZ,OAAQ,CACJ,KAAAl4B,CACH,CACrB,CAAiB,CACJ,MACS,CACT,CACD,OAAOiX,EAAS,MAAM,KAAM,CAACjX,EAAMm4B,EAAah4B,CAAO,CAAC,CACpE,CACA,CAAK,CAEL,CACA,SAASi4B,GAAcC,EAAGC,EAAS,GAAI,CACnC,MAAMtE,EAAgBqE,EAAE,IAAI,YAC5B,GAAI,CAACrE,EACD,MAAO,IAAM,CACrB,EAEI,IAAIuE,EACAF,EAAE,YACFE,EAAmBxH,GAAqBsH,EAAGA,EAAE,GAAG,GAEpD,MAAMG,EAAmBnH,GAAiBgH,CAAC,EACrCI,EAA0BtG,GAA6BkG,CAAC,EACxDK,EAAgB/F,GAAmB0F,CAAC,EACpCM,EAAwB7F,GAA2BuF,EAAG,CACxD,IAAKrE,CACb,CAAK,EACK4E,EAAevF,GAAkBgF,CAAC,EAClCQ,EAA0BtC,GAA6B8B,CAAC,EAC9D,IAAIS,EAAqB,IAAM,GAC3BC,EAA4B,IAAM,GAClCC,EAA2B,IAAM,GACjCC,EAAe,IAAM,GACrBZ,EAAE,YACFS,EAAqBnE,GAAuB0D,EAAG,CAAE,IAAKrE,CAAe,CAAA,EACrE+E,EAA4BvD,GAA8B6C,EAAGA,EAAE,GAAG,EAClEW,EAA2BjD,GAA6BsC,EAAG,CACvD,IAAKrE,CACjB,CAAS,EACGqE,EAAE,eACFY,EAAepC,GAAiBwB,CAAC,IAGzC,MAAMa,EAAoB7B,GAAsBgB,CAAC,EAC3Cc,EAAwBlB,GAA0BI,CAAC,EACnDe,EAAiB,CAAA,EACvB,UAAWC,KAAUhB,EAAE,QACnBe,EAAe,KAAKC,EAAO,SAASA,EAAO,SAAUrF,EAAeqF,EAAO,OAAO,CAAC,EAEvF,OAAO1I,EAAgB,IAAM,CACzBG,GAAgB,QAASwI,GAAMA,EAAE,MAAO,CAAA,EACxCzI,GAAiB,CAAC0H,EAAkB,iBAAkBgB,GAAOA,EAAI,WAAY,OAAQC,GAAOA,EAAG,CAAE,CAAC,EAClGhB,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,EAAe,QAASlH,GAAMA,EAAG,CAAA,CACzC,CAAK,CACL,CACA,SAASoC,GAAiB7kB,EAAM,CAC5B,OAAO,OAAO,OAAOA,CAAI,EAAM,GACnC,CACA,SAAS4lB,GAA4B5lB,EAAM,CACvC,MAAO,GAAQ,OAAO,OAAOA,CAAI,EAAM,KACnC,OAAOA,CAAI,EAAE,WACb,eAAgB,OAAOA,CAAI,EAAE,WAC7B,eAAgB,OAAOA,CAAI,EAAE,UACrC,CAEA,MAAMgqB,EAAwB,CAC1B,YAAYC,EAAc,CACtB,KAAK,aAAeA,EACpB,KAAK,sBAAwB,IAAI,QACjC,KAAK,sBAAwB,IAAI,OACpC,CACD,MAAM9K,EAAQ+K,EAAUC,EAAeC,EAAe,CAClD,MAAMC,EAAkBF,GAAiB,KAAK,mBAAmBhL,CAAM,EACjEmL,EAAkBF,GAAiB,KAAK,mBAAmBjL,CAAM,EACvE,IAAIxQ,EAAK0b,EAAgB,IAAIH,CAAQ,EACrC,OAAKvb,IACDA,EAAK,KAAK,eACV0b,EAAgB,IAAIH,EAAUvb,CAAE,EAChC2b,EAAgB,IAAI3b,EAAIub,CAAQ,GAE7Bvb,CACV,CACD,OAAOwQ,EAAQ+K,EAAU,CACrB,MAAMG,EAAkB,KAAK,mBAAmBlL,CAAM,EAChDmL,EAAkB,KAAK,mBAAmBnL,CAAM,EACtD,OAAO+K,EAAS,IAAKvb,GAAO,KAAK,MAAMwQ,EAAQxQ,EAAI0b,EAAiBC,CAAe,CAAC,CACvF,CACD,YAAYnL,EAAQxQ,EAAI4b,EAAK,CACzB,MAAMD,EAAkBC,GAAO,KAAK,mBAAmBpL,CAAM,EAC7D,GAAI,OAAOxQ,GAAO,SACd,OAAOA,EACX,MAAMub,EAAWI,EAAgB,IAAI3b,CAAE,EACvC,OAAKub,GACM,EAEd,CACD,aAAa/K,EAAQqL,EAAK,CACtB,MAAMF,EAAkB,KAAK,mBAAmBnL,CAAM,EACtD,OAAOqL,EAAI,IAAK7b,GAAO,KAAK,YAAYwQ,EAAQxQ,EAAI2b,CAAe,CAAC,CACvE,CACD,MAAMnL,EAAQ,CACV,GAAI,CAACA,EAAQ,CACT,KAAK,sBAAwB,IAAI,QACjC,KAAK,sBAAwB,IAAI,QACjC,MACH,CACD,KAAK,sBAAsB,OAAOA,CAAM,EACxC,KAAK,sBAAsB,OAAOA,CAAM,CAC3C,CACD,mBAAmBA,EAAQ,CACvB,IAAIkL,EAAkB,KAAK,sBAAsB,IAAIlL,CAAM,EAC3D,OAAKkL,IACDA,EAAkB,IAAI,IACtB,KAAK,sBAAsB,IAAIlL,EAAQkL,CAAe,GAEnDA,CACV,CACD,mBAAmBlL,EAAQ,CACvB,IAAImL,EAAkB,KAAK,sBAAsB,IAAInL,CAAM,EAC3D,OAAKmL,IACDA,EAAkB,IAAI,IACtB,KAAK,sBAAsB,IAAInL,EAAQmL,CAAe,GAEnDA,CACV,CACL,CAEA,SAASG,GAAiB3d,EAAK,CAAE,IAAIC,EAA+BnW,EAAQkW,EAAI,CAAC,EAAO9iB,EAAI,EAAG,KAAOA,EAAI8iB,EAAI,QAAQ,CAAE,MAAME,EAAKF,EAAI9iB,CAAC,EAASie,EAAK6E,EAAI9iB,EAAI,CAAC,EAAW,GAARA,GAAK,GAAQgjB,IAAO,kBAAoBA,IAAO,iBAAmBpW,GAAS,KAAQ,OAAwBoW,IAAO,UAAYA,IAAO,kBAAoBD,EAAgBnW,EAAOA,EAAQqR,EAAGrR,CAAK,IAAcoW,IAAO,QAAUA,IAAO,kBAAkBpW,EAAQqR,EAAG,IAAI1c,IAASqL,EAAM,KAAKmW,EAAe,GAAGxhB,CAAI,CAAC,EAAGwhB,EAAgB,OAAc,CAAC,OAAOnW,CAAQ,CACrgB,MAAM8zB,EAAkB,CACpB,aAAc,CACV,KAAK,wBAA0B,IAAIV,GAAwB3Y,EAAK,EAChE,KAAK,2BAA6B,IAAI,OACzC,CACD,WAAY,CACX,CACD,iBAAkB,CACjB,CACD,cAAe,CACd,CACL,CACA,MAAMsZ,EAAc,CAChB,YAAYj6B,EAAS,CACjB,KAAK,QAAU,IAAI,QACnB,KAAK,qBAAuB,IAAI,QAChC,KAAK,wBAA0B,IAAIs5B,GAAwB3Y,EAAK,EAChE,KAAK,2BAA6B,IAAI,QACtC,KAAK,WAAa3gB,EAAQ,WAC1B,KAAK,YAAcA,EAAQ,YAC3B,KAAK,kBAAoBA,EAAQ,kBACjC,KAAK,yBAA2BA,EAAQ,yBACxC,KAAK,6BAA+B,IAAIs5B,GAAwB,KAAK,kBAAkB,YAAY,WAAW,KAAK,KAAK,kBAAkB,WAAW,CAAC,EACtJ,KAAK,OAASt5B,EAAQ,OAClB,KAAK,0BACL,OAAO,iBAAiB,UAAW,KAAK,cAAc,KAAK,IAAI,CAAC,CAEvE,CACD,UAAU6kB,EAAU,CAChB,KAAK,QAAQ,IAAIA,EAAU,EAAI,EAC3BA,EAAS,eACT,KAAK,qBAAqB,IAAIA,EAAS,cAAeA,CAAQ,CACrE,CACD,gBAAgB4L,EAAI,CAChB,KAAK,aAAeA,CACvB,CACD,aAAa5L,EAAU6J,EAAS,CAC5B,KAAK,WAAW,CACZ,KAAM,CACF,CACI,SAAU,KAAK,OAAO,MAAM7J,CAAQ,EACpC,OAAQ,KACR,KAAM6J,CACT,CACJ,EACD,QAAS,CAAE,EACX,MAAO,CAAE,EACT,WAAY,CAAE,EACd,eAAgB,EAC5B,CAAS,EACDqL,GAAiB,CAAC,KAAM,SAAUld,GAAKA,EAAE,aAAc,eAAgBC,GAAMA,EAAG+H,CAAQ,CAAC,CAAC,EACtFA,EAAS,iBACTA,EAAS,gBAAgB,oBACzBA,EAAS,gBAAgB,mBAAmB,OAAS,GACrD,KAAK,kBAAkB,iBAAiBA,EAAS,gBAAgB,mBAAoB,KAAK,OAAO,MAAMA,EAAS,eAAe,CAAC,CACvI,CACD,cAAc9qB,EAAS,CACnB,MAAMmgC,EAA0BngC,EAKhC,GAJImgC,EAAwB,KAAK,OAAS,SACtCA,EAAwB,SAAWA,EAAwB,KAAK,QAGhE,CADuBngC,EAAQ,OAE/B,OACJ,MAAM8qB,EAAW,KAAK,qBAAqB,IAAI9qB,EAAQ,MAAM,EAC7D,GAAI,CAAC8qB,EACD,OACJ,MAAMsV,EAAmB,KAAK,0BAA0BtV,EAAUqV,EAAwB,KAAK,KAAK,EAChGC,GACA,KAAK,YAAYA,EAAkBD,EAAwB,KAAK,UAAU,CACjF,CACD,0BAA0BrV,EAAUpe,EAAG,CACnC,OAAQA,EAAE,KAAI,CACV,KAAKumB,EAAU,aAAc,CACzB,KAAK,wBAAwB,MAAMnI,CAAQ,EAC3C,KAAK,6BAA6B,MAAMA,CAAQ,EAChD,KAAK,gBAAgBpe,EAAE,KAAK,KAAMoe,CAAQ,EAC1C,MAAMoB,EAASxf,EAAE,KAAK,KAAK,GAC3B,YAAK,2BAA2B,IAAIoe,EAAUoB,CAAM,EACpD,KAAK,kBAAkBxf,EAAE,KAAK,KAAMwf,CAAM,EACnC,CACH,UAAWxf,EAAE,UACb,KAAMumB,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,SAC1B,KAAM,CACF,CACI,SAAU,KAAK,OAAO,MAAMrI,CAAQ,EACpC,OAAQ,KACR,KAAMpe,EAAE,KAAK,IAChB,CACJ,EACD,QAAS,CAAE,EACX,MAAO,CAAE,EACT,WAAY,CAAE,EACd,eAAgB,EACnB,CACrB,CACa,CACD,KAAKumB,EAAU,KACf,KAAKA,EAAU,KACf,KAAKA,EAAU,iBACX,MAAO,GAEX,KAAKA,EAAU,OACX,OAAOvmB,EAEX,KAAKumB,EAAU,OACX,YAAK,WAAWvmB,EAAE,KAAK,QAASoe,EAAU,CAAC,KAAM,WAAY,aAAc,QAAQ,CAAC,EAC7Epe,EAEX,KAAKumB,EAAU,oBACX,OAAQvmB,EAAE,KAAK,OAAM,CACjB,KAAKymB,EAAkB,SACnB,OAAAzmB,EAAE,KAAK,KAAK,QAASiW,GAAM,CACvB,KAAK,WAAWA,EAAGmI,EAAU,CACzB,WACA,SACA,YAChC,CAA6B,EACD,KAAK,gBAAgBnI,EAAE,KAAMmI,CAAQ,EACrC,MAAMoB,EAAS,KAAK,2BAA2B,IAAIpB,CAAQ,EAC3DoB,GAAU,KAAK,kBAAkBvJ,EAAE,KAAMuJ,CAAM,CAC3E,CAAyB,EACDxf,EAAE,KAAK,QAAQ,QAASiW,GAAM,CAC1B,KAAK,WAAWA,EAAGmI,EAAU,CAAC,WAAY,IAAI,CAAC,CAC3E,CAAyB,EACDpe,EAAE,KAAK,WAAW,QAASiW,GAAM,CAC7B,KAAK,WAAWA,EAAGmI,EAAU,CAAC,IAAI,CAAC,CAC/D,CAAyB,EACDpe,EAAE,KAAK,MAAM,QAASiW,GAAM,CACxB,KAAK,WAAWA,EAAGmI,EAAU,CAAC,IAAI,CAAC,CAC/D,CAAyB,EACMpe,EAEX,KAAKymB,EAAkB,KACvB,KAAKA,EAAkB,UACvB,KAAKA,EAAkB,UACnB,OAAAzmB,EAAE,KAAK,UAAU,QAASkrB,GAAM,CAC5B,KAAK,WAAWA,EAAG9M,EAAU,CAAC,IAAI,CAAC,CAC/D,CAAyB,EACMpe,EAEX,KAAKymB,EAAkB,eACnB,MAAO,GAEX,KAAKA,EAAkB,iBACvB,KAAKA,EAAkB,iBACvB,KAAKA,EAAkB,OACvB,KAAKA,EAAkB,eACvB,KAAKA,EAAkB,MACnB,YAAK,WAAWzmB,EAAE,KAAMoe,EAAU,CAAC,IAAI,CAAC,EACjCpe,EAEX,KAAKymB,EAAkB,eACvB,KAAKA,EAAkB,iBACnB,YAAK,WAAWzmB,EAAE,KAAMoe,EAAU,CAAC,IAAI,CAAC,EACxC,KAAK,gBAAgBpe,EAAE,KAAMoe,EAAU,CAAC,SAAS,CAAC,EAC3Cpe,EAEX,KAAKymB,EAAkB,KACnB,OAAOzmB,EAEX,KAAKymB,EAAkB,UACnB,OAAAzmB,EAAE,KAAK,OAAO,QAASgxB,GAAU,CAC7B,KAAK,WAAWA,EAAO5S,EAAU,CAAC,QAAS,KAAK,CAAC,CAC7E,CAAyB,EACMpe,EAEX,KAAKymB,EAAkB,kBACnB,YAAK,WAAWzmB,EAAE,KAAMoe,EAAU,CAAC,IAAI,CAAC,EACxC,KAAK,gBAAgBpe,EAAE,KAAMoe,EAAU,CAAC,UAAU,CAAC,EACnDkV,GAAiB,CAACtzB,EAAG,SAAUyX,GAAMA,EAAG,KAAM,SAAUC,GAAMA,EAAG,OAAQ,iBAAkBC,GAAMA,EAAG,QAAS,OAAQ+B,GAAMA,EAAIia,GAAU,CACrI,KAAK,gBAAgBA,EAAOvV,EAAU,CAAC,SAAS,CAAC,CACpD,CAAA,CAAC,CAAC,EACIpe,CAEd,CAER,CACD,MAAO,EACV,CACD,QAAQ4zB,EAAcjrB,EAAKyV,EAAU7V,EAAM,CACvC,UAAW5W,KAAO4W,EACV,CAAC,MAAM,QAAQI,EAAIhX,CAAG,CAAC,GAAK,OAAOgX,EAAIhX,CAAG,GAAM,WAEhD,MAAM,QAAQgX,EAAIhX,CAAG,CAAC,EACtBgX,EAAIhX,CAAG,EAAIiiC,EAAa,OAAOxV,EAAUzV,EAAIhX,CAAG,CAAC,EAGjDgX,EAAIhX,CAAG,EAAIiiC,EAAa,MAAMxV,EAAUzV,EAAIhX,CAAG,CAAC,GAGxD,OAAOgX,CACV,CACD,WAAWA,EAAKyV,EAAU7V,EAAM,CAC5B,OAAO,KAAK,QAAQ,KAAK,wBAAyBI,EAAKyV,EAAU7V,CAAI,CACxE,CACD,gBAAgBI,EAAKyV,EAAU7V,EAAM,CACjC,OAAO,KAAK,QAAQ,KAAK,6BAA8BI,EAAKyV,EAAU7V,CAAI,CAC7E,CACD,gBAAgBsP,EAAMuG,EAAU,CAC5B,KAAK,WAAWvG,EAAMuG,EAAU,CAAC,KAAM,QAAQ,CAAC,EAC5C,eAAgBvG,GAChBA,EAAK,WAAW,QAASgc,GAAU,CAC/B,KAAK,gBAAgBA,EAAOzV,CAAQ,CACpD,CAAa,CAER,CACD,kBAAkBvG,EAAM2H,EAAQ,CACxB3H,EAAK,OAAS/B,EAAW,UAAY,CAAC+B,EAAK,SAC3CA,EAAK,OAAS2H,GACd,eAAgB3H,GAChBA,EAAK,WAAW,QAASgc,GAAU,CAC/B,KAAK,kBAAkBA,EAAOrU,CAAM,CACpD,CAAa,CAER,CACL,CAEA,MAAMsU,EAAqB,CACvB,MAAO,CACN,CACD,eAAgB,CACf,CACD,qBAAsB,CACrB,CACD,OAAQ,CACP,CACL,CACA,MAAMC,EAAiB,CACnB,YAAYx6B,EAAS,CACjB,KAAK,WAAa,IAAI,QACtB,KAAK,gBAAkB,GACvB,KAAK,WAAaA,EAAQ,WAC1B,KAAK,SAAWA,EAAQ,SACxB,KAAK,cAAgBA,EAAQ,cAC7B,KAAK,OAASA,EAAQ,OACtB,KAAK,KAAI,CACZ,CACD,MAAO,CACH,KAAK,MAAK,EACV,KAAK,kBAAkB,QAAS,QAAQ,CAC3C,CACD,cAAcgd,EAAYmF,EAAK,CAG3B,GAFI,CAACpF,GAAkBC,CAAU,GAE7B,KAAK,WAAW,IAAIA,CAAU,EAC9B,OACJ,KAAK,WAAW,IAAIA,CAAU,EAC9B,KAAK,cAAc,cAAc,cAAcA,CAAU,EACzD,MAAMiU,EAAWL,GAAqB,CAClC,GAAG,KAAK,cACR,IAAAzO,EACA,WAAY,KAAK,WACjB,OAAQ,KAAK,OACb,iBAAkB,IACrB,EAAEnF,CAAU,EACb,KAAK,gBAAgB,KAAK,IAAMiU,EAAS,WAAY,CAAA,EACrD,KAAK,gBAAgB,KAAKuB,GAAmB,CACzC,GAAG,KAAK,cACR,SAAU,KAAK,SACf,IAAKxV,EACL,OAAQ,KAAK,MAChB,CAAA,CAAC,EACFmN,GAAa,IAAM,CACXnN,EAAW,oBACXA,EAAW,mBAAmB,OAAS,GACvC,KAAK,cAAc,kBAAkB,iBAAiBA,EAAW,mBAAoB,KAAK,OAAO,MAAMA,EAAW,IAAI,CAAC,EAC3H,KAAK,gBAAgB,KAAKqY,GAA8B,CACpD,OAAQ,KAAK,OACb,kBAAmB,KAAK,cAAc,iBACtD,EAAerY,CAAU,CAAC,CACjB,EAAE,CAAC,CACP,CACD,oBAAoByd,EAAe,CAC3B,CAACA,EAAc,eAAiB,CAACA,EAAc,iBAEnD,KAAK,kBAAkBA,EAAc,cAAc,QAASA,EAAc,eAAe,CAC5F,CACD,kBAAkBtlB,EAASgN,EAAK,CAC5B,MAAMuY,EAAU,KAChB,KAAK,gBAAgB,KAAKnQ,GAAMpV,EAAQ,UAAW,eAAgB,SAAU2B,EAAU,CACnF,OAAO,SAAU6jB,EAAQ,CACrB,MAAM3d,EAAalG,EAAS,KAAK,KAAM6jB,CAAM,EAC7C,OAAI,KAAK,YAAc9N,GAAM,IAAI,GAC7B6N,EAAQ,cAAc,KAAK,WAAYvY,CAAG,EACvCnF,CACvB,CACS,CAAA,CAAC,CACL,CACD,OAAQ,CACJ,KAAK,gBAAgB,QAAS9iB,GAAY,CACtC,GAAI,CACAA,GACH,MACS,CACT,CACb,CAAS,EACD,KAAK,gBAAkB,GACvB,KAAK,WAAa,IAAI,QACtB,KAAK,cAAc,cAAc,kBACpC,CACL,CAEA,MAAM0gC,EAAkB,CACpB,OAAQ,CACP,CACD,QAAS,CACR,CACD,UAAW,CACV,CACD,MAAO,CACN,CACD,QAAS,CACR,CACD,UAAW,CACV,CACD,WAAY,CACX,CACD,eAAgB,CACf,CACD,kBAAmB,CAClB,CACL,CAEA,MAAMC,EAAkB,CACpB,YAAY76B,EAAS,CACjB,KAAK,oBAAsB,IAAI,QAC/B,KAAK,YAAc,IAAImsB,GACvB,KAAK,WAAansB,EAAQ,WAC1B,KAAK,oBAAsBA,EAAQ,mBACtC,CACD,kBAAkB86B,EAAQpM,EAAS,CAC3B,aAAcA,EAAQ,YACtB,KAAK,WAAW,CACZ,KAAM,CAAE,EACR,QAAS,CAAE,EACX,MAAO,CAAE,EACT,WAAY,CACR,CACI,GAAIA,EAAQ,GACZ,WAAYA,EACP,UACR,CACJ,CACjB,CAAa,EACL,KAAK,iBAAiBoM,CAAM,CAC/B,CACD,iBAAiBA,EAAQ,CACjB,KAAK,oBAAoB,IAAIA,CAAM,IAEvC,KAAK,oBAAoB,IAAIA,CAAM,EACnC,KAAK,6BAA6BA,CAAM,EAC3C,CACD,iBAAiBrF,EAAQH,EAAQ,CAC7B,GAAIG,EAAO,SAAW,EAClB,OACJ,MAAMsF,EAAwB,CAC1B,GAAIzF,EACJ,SAAU,CAAE,CACxB,EACc0F,EAAS,CAAA,EACf,UAAW3G,KAASoB,EAAQ,CACxB,IAAIlB,EACC,KAAK,YAAY,IAAIF,CAAK,EAW3BE,EAAU,KAAK,YAAY,MAAMF,CAAK,GAVtCE,EAAU,KAAK,YAAY,IAAIF,CAAK,EACpC2G,EAAO,KAAK,CACR,QAAAzG,EACA,MAAO,MAAM,KAAKF,EAAM,OAAS,QAAS,CAACpE,EAAGpC,KAAW,CACrD,KAAMpQ,GAAcwS,CAAC,EACrB,MAAApC,CACxB,EAAsB,CACtB,CAAiB,GAILkN,EAAsB,SAAS,KAAKxG,CAAO,CAC9C,CACGyG,EAAO,OAAS,IAChBD,EAAsB,OAASC,GACnC,KAAK,oBAAoBD,CAAqB,CACjD,CACD,OAAQ,CACJ,KAAK,YAAY,QACjB,KAAK,oBAAsB,IAAI,OAClC,CACD,6BAA6BD,EAAQ,CACpC,CACL,CAEA,MAAMG,EAAqB,CACvB,aAAc,CACV,KAAK,QAAU,IAAI,QACnB,KAAK,OAAS,EACjB,CACD,cAAc3c,EAAM4c,EAAY,CAC5B,MAAMC,EAAU,KAAK,QAAQ,IAAI7c,CAAI,EACrC,OAAQ6c,GAAW,MAAM,KAAKA,CAAO,EAAE,KAAM7/B,GAAWA,IAAW4/B,CAAU,CAChF,CACD,IAAI5c,EAAMhjB,EAAQ,CACT,KAAK,SACN,KAAK,OAAS,GACdyxB,GAAwB,IAAM,CAC1B,KAAK,QAAU,IAAI,QACnB,KAAK,OAAS,EAC9B,CAAa,GAEL,KAAK,QAAQ,IAAIzO,GAAO,KAAK,QAAQ,IAAIA,CAAI,GAAK,IAAI,KAAO,IAAIhjB,CAAM,CAAC,CAC3E,CACD,SAAU,CACT,CACL,CAEA,IAAI8/B,EACAC,GACJ,GAAI,CACA,GAAI,MAAM,KAAK,CAAC,CAAC,EAAI7b,GAAMA,EAAI,CAAC,EAAE,CAAC,IAAM,EAAG,CACxC,MAAM8b,EAAa,SAAS,cAAc,QAAQ,EAClD,SAAS,KAAK,YAAYA,CAAU,EACpC,MAAM,KAAOC,GAAe,CAACD,EAAY,SAAUze,GAAKA,EAAE,cAAe,iBAAkBC,GAAMA,EAAG,MAAO,SAAUoB,GAAMA,EAAG,IAAI,CAAC,GAAK,MAAM,KAC9I,SAAS,KAAK,YAAYod,CAAU,CACvC,CACL,OACOxU,EAAK,CACR,QAAQ,MAAM,gCAAiCA,CAAG,CACtD,CACA,MAAMrB,GAAShH,GAAY,EAC3B,SAAS+c,GAAOx7B,EAAU,GAAI,CAC1B,KAAM,CAAE,KAAAy7B,EAAM,iBAAAC,EAAkB,iBAAAC,EAAkB,WAAAnY,EAAa,WAAY,cAAAC,EAAgB,KAAM,gBAAAC,EAAkB,KAAM,YAAA0P,EAAc,YAAa,eAAAC,EAAiB,KAAM,YAAA7O,EAAc,GAAO,cAAAJ,EAAgB,UAAW,gBAAAE,EAAkB,KAAM,iBAAAD,EAAmB,KAAM,mBAAAE,EAAqB,KAAM,iBAAAmB,EAAmB,GAAM,cAAA6D,EAAe,iBAAkBqS,EAAmB,eAAgBC,EAAiB,gBAAAzY,EAAiB,YAAArE,EAAa,WAAA4G,EAAY,cAAAmW,EAAgB,KAAM,OAAAC,EAAQ,SAAA3K,EAAW,CAAA,EAAI,eAAAxL,EAAiB,GAAI,cAAAoW,EAAe,UAAAC,EAAY,GAAM,aAAAnW,EAAe,GAAO,yBAAAoW,EAA2B,GAAO,YAAAC,EAAcn8B,EAAQ,cAAgB,mBAC1nBA,EAAQ,YACR,OAAQ,qBAAAszB,EAAuB,GAAO,aAAA8I,GAAe,GAAO,aAAAvW,EAAe,GAAO,QAAAwW,EAAS,gBAAAtW,EAAkB,IAAM,GAAO,oBAAA+P,GAAsB,IAAI,IAAI,CAAE,CAAA,EAAG,aAAAzF,GAAc,WAAAiM,GAAY,iBAAAC,EAAmB,EAAGv8B,EACnNswB,GAAqBD,EAAY,EACjC,MAAMmM,GAAkBN,EAClB,OAAO,SAAW,OAClB,GACN,IAAIO,GAAoB,GACxB,GAAI,CAACD,GACD,GAAI,CACI,OAAO,OAAO,WACdC,GAAoB,GAE3B,MACS,CACNA,GAAoB,EACvB,CAEL,GAAID,IAAmB,CAACf,EACpB,MAAM,IAAI,MAAM,2BAA2B,EAE/C,GAAI,CAACe,IAAmB,CAACC,GACrB,MAAO,IAAM,CACrB,EAEQT,IAAkB,QAAa5K,EAAS,YAAc,SACtDA,EAAS,UAAY4K,GAEzBvW,GAAO,MAAK,EACZ,MAAM9G,GAAmB4K,IAAkB,GACrC,CACE,MAAO,GACP,KAAM,GACN,iBAAkB,GAClB,MAAO,GACP,MAAO,GACP,OAAQ,GACR,MAAO,GACP,OAAQ,GACR,IAAK,GACL,KAAM,GACN,KAAM,GACN,IAAK,GACL,KAAM,GACN,SAAU,GACV,OAAQ,GACR,MAAO,GACP,SAAU,EACb,EACCqS,IAAsB,OAClBA,EACA,GACJvT,GAAiBwT,IAAoB,IAAQA,IAAoB,MACjE,CACE,OAAQ,GACR,QAAS,GACT,YAAa,GACb,eAAgB,GAChB,eAAgB,GAChB,eAAgB,GAChB,kBAAmB,GACnB,qBAAsB,GACtB,mBAAoBA,IAAoB,MACxC,qBAAsBA,IAAoB,KAC7C,EACCA,GAEI,GACV/P,KACA,IAAI4Q,GACAC,GAA2B,EAC/B,MAAMt6B,GAAkBoE,GAAM,CAC1B,UAAWyyB,MAAUmD,GAAW,GACxBnD,GAAO,iBACPzyB,EAAIyyB,GAAO,eAAezyB,CAAC,GAGnC,OAAIs1B,GACA,CAACU,KACDh2B,EAAIs1B,EAAOt1B,CAAC,GAETA,CACf,EACI20B,EAAc,CAACnL,EAAG2M,KAAe,CAC7B,MAAMn2B,EAAIwpB,EAQV,GAPAxpB,EAAE,UAAYikB,KACV6Q,GAAe,CAAC5K,GAAiB,SAAUxS,GAAMA,EAAG,CAAC,EAAG,iBAAkBC,GAAMA,EAAG,SAAU,OAAQ+B,GAAMA,EAAE,CAAE,CAAC,GAChH1Z,EAAE,OAASumB,EAAU,cACrB,EAAEvmB,EAAE,OAASumB,EAAU,qBACnBvmB,EAAE,KAAK,SAAWymB,EAAkB,WACxCyD,GAAgB,QAASkM,GAAQA,EAAI,SAAU,CAAA,EAE/CL,GACAjB,GAAe,CAACE,EAAM,eAAgB9U,GAAMA,EAAGtkB,GAAeoE,CAAC,EAAGm2B,EAAU,CAAC,CAAC,UAEzEH,GAAmB,CACxB,MAAM1iC,EAAU,CACZ,KAAM,QACN,MAAOsI,GAAeoE,CAAC,EACvB,OAAQ,OAAO,SAAS,OACxB,WAAAm2B,EAChB,EACY,OAAO,OAAO,YAAY7iC,EAAS,GAAG,CACzC,CACD,GAAI0M,EAAE,OAASumB,EAAU,aACrB0P,GAAwBj2B,EACxBk2B,GAA2B,UAEtBl2B,EAAE,OAASumB,EAAU,oBAAqB,CAC/C,GAAIvmB,EAAE,KAAK,SAAWymB,EAAkB,UACpCzmB,EAAE,KAAK,eACP,OAEJk2B,KACA,MAAMG,EAAcnB,GAAoBgB,IAA4BhB,EAC9DoB,EAAarB,GACfgB,IACAj2B,EAAE,UAAYi2B,GAAsB,UAAYhB,GAChDoB,GAAeC,IACfC,GAAiB,EAAI,CAE5B,CACT,EACI,MAAMC,GAAuB5N,GAAM,CAC/B+L,EAAY,CACR,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,SAC1B,GAAGmC,CACN,CACb,CAAS,CACT,EACU6N,GAAqBvL,GAAMyJ,EAAY,CACzC,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,OAC1B,GAAGyE,CACN,CACT,CAAK,EACKwL,GAA6BxL,GAAMyJ,EAAY,CACjD,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,eAC1B,GAAGyE,CACN,CACT,CAAK,EACKyL,GAAgCla,GAAMkY,EAAY,CACpD,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,kBAC1B,GAAGhK,CACN,CACT,CAAK,EACKwR,GAAoB,IAAImG,GAAkB,CAC5C,WAAYoC,GACZ,oBAAqBG,EAC7B,CAAK,EACKC,GAAgB,OAAO,0BAA6B,WAAa,yBACjE,IAAIrD,GACJ,IAAIC,GAAc,CAChB,OAAAxU,GACA,WAAYwX,GACZ,kBAAmBvI,GACnB,yBAAAwH,EACA,YAAAd,CACZ,CAAS,EACL,UAAWlC,KAAUmD,GAAW,GACxBnD,EAAO,WACPA,EAAO,UAAU,CACb,WAAYzT,GACZ,wBAAyB4X,GAAc,wBACvC,6BAA8BA,GAAc,4BAC5D,CAAa,EAET,MAAMC,GAAuB,IAAIrC,GAC3BsC,GAAgBC,GAAkBjB,GAAkB,CACtD,OAAA9W,GACA,IAAK,OACL,WAAakM,GAAMyJ,EAAY,CAC3B,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,eAC1B,GAAGyE,CACN,CACb,CAAS,EACD,aAAA7L,EACA,WAAAtC,EACA,cAAAC,EACA,gBAAAC,EACA,cAAAoY,EACA,SAAU1K,EAAS,OACnB,eAAAxL,EACA,aAAAyK,EACR,CAAK,EACKoN,GAAmB,OAAO,8BAAiC,WAC7D,6BACE,IAAIlD,GACJ,IAAIC,GAAiB,CACnB,WAAYyC,GACZ,SAAUC,GACV,cAAe,CACX,WAAAZ,GACA,WAAA9Y,EACA,cAAAC,EACA,gBAAAC,EACA,YAAAc,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,iBAAAmB,EACA,iBAAA/G,GACA,eAAAiH,EACA,gBAAAxC,EACA,WAAAuC,EACA,YAAA5G,EACA,aAAA+G,EACA,aAAAD,EACA,SAAAuL,EACA,eAAA/I,GACA,cAAAgV,GACA,kBAAA3I,GACA,cAAA6I,GACA,gBAAAxX,EACA,qBAAAuX,EACH,EACD,OAAA7X,EACZ,CAAS,EACCuX,GAAmB,CAACJ,EAAa,KAAU,CAC7C,GAAI,CAACX,EACD,OAEJb,EAAY,CACR,KAAMpO,EAAU,KAChB,KAAM,CACF,KAAM,OAAO,SAAS,KACtB,MAAO9B,GAAgB,EACvB,OAAQD,GAAiB,CAC5B,CACJ,EAAE2R,CAAU,EACblI,GAAkB,MAAK,EACvB+I,GAAiB,KAAI,EACrB9M,GAAgB,QAASkM,GAAQA,EAAI,KAAM,CAAA,EAC3C,MAAMve,GAAOgL,GAAS,SAAU,CAC5B,OAAA7D,GACA,WAAAjC,EACA,cAAAC,EACA,gBAAAC,EACA,YAAAc,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,iBAAAmB,EACA,cAAe/G,GACf,gBAAAyE,EACA,YAAArE,EACA,WAAA4G,EACA,QAAS0C,GACT,eAAAzC,EACA,aAAAE,EACA,aAAAD,EACA,YAAcnJ,GAAM,CACZqP,GAAmBrP,EAAG+I,EAAM,GAC5B4X,GAAc,UAAU3gB,CAAC,EAEzBsP,GAAuBtP,EAAG+I,EAAM,GAChCiP,GAAkB,iBAAiBhY,CAAC,EAEpCuP,GAAcvP,CAAC,GACf+gB,GAAiB,cAAc/gB,EAAE,WAAY,QAAQ,CAE5D,EACD,aAAc,CAAC+R,EAAQC,IAAY,CAC/B2O,GAAc,aAAa5O,EAAQC,CAAO,EACtCD,EAAO,eACP8O,GAAc,UAAU9O,EAAO,aAAa,EAEhDgP,GAAiB,oBAAoBhP,CAAM,CAC9C,EACD,iBAAkB,CAACqM,EAAQpM,IAAY,CACnCgG,GAAkB,kBAAkBoG,EAAQpM,CAAO,CACtD,EACD,gBAAA3I,CACZ,CAAS,EACD,GAAI,CAACzH,GACD,OAAO,QAAQ,KAAK,iCAAiC,EAEzD8c,EAAY,CACR,KAAMpO,EAAU,aAChB,KAAM,CACF,KAAA1O,GACA,cAAeqM,GAAgB,MAAM,CACxC,CACb,CAAS,EACDgG,GAAgB,QAASkM,GAAQA,EAAI,OAAQ,CAAA,EACzC,SAAS,oBAAsB,SAAS,mBAAmB,OAAS,GACpEnI,GAAkB,iBAAiB,SAAS,mBAAoBjP,GAAO,MAAM,QAAQ,CAAC,CAClG,EACI4V,GAAoB2B,GACpB,GAAI,CACA,MAAMpsB,EAAW,CAAA,EACX8sB,GAAWvb,GACNqO,EAAgByH,EAAa,EAAE,CAClC,WAAAqE,GACA,WAAYW,GACZ,YAAa,CAAC1L,EAAWh4B,KAAW6hC,EAAY,CAC5C,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAAzzB,GACA,UAAAg4B,CACH,CACrB,CAAiB,EACD,mBAAqBlH,GAAM+Q,EAAY,CACnC,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,iBAC1B,GAAG7C,CACN,CACrB,CAAiB,EACD,SAAU6S,GACV,iBAAmB7S,GAAM+Q,EAAY,CACjC,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,eAC1B,GAAG7C,CACN,CACrB,CAAiB,EACD,QAAUsJ,GAAMyH,EAAY,CACxB,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,MAC1B,GAAGyG,CACN,CACrB,CAAiB,EACD,mBAAqBhC,GAAMyJ,EAAY,CACnC,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,iBAC1B,GAAGyE,CACN,CACrB,CAAiB,EACD,iBAAmB1B,GAAMmL,EAAY,CACjC,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,eAC1B,GAAG+C,CACN,CACrB,CAAiB,EACD,mBAAqBA,GAAMmL,EAAY,CACnC,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,iBAC1B,GAAG+C,CACN,CACrB,CAAiB,EACD,iBAAkBkN,GAClB,OAASxL,GAAMyJ,EAAY,CACvB,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,KAC1B,GAAGyE,CACN,CACrB,CAAiB,EACD,YAAcA,GAAM,CAChByJ,EAAY,CACR,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,UAC1B,GAAGyE,CACN,CACzB,CAAqB,CACJ,EACD,gBAAkB9O,GAAM,CACpBuY,EAAY,CACR,KAAMpO,EAAU,oBAChB,KAAM,CACF,OAAQE,EAAkB,cAC1B,GAAGrK,CACN,CACzB,CAAqB,CACJ,EACD,WAAAW,EACA,YAAA4P,EACA,eAAAC,EACA,YAAA7O,EACA,cAAAJ,EACA,gBAAAE,EACA,iBAAAD,EACA,mBAAAE,EACA,iBAAA5F,GACA,iBAAA+G,EACA,SAAA0L,EACA,UAAA6K,EACA,aAAAnW,EACA,aAAAD,EACA,qBAAAyN,EACA,aAAA8I,GACA,IAAAja,EACA,gBAAAiB,EACA,YAAArE,EACA,WAAA4G,EACA,gBAAAI,EACA,cAAAtC,EACA,gBAAAC,EACA,eAAA2E,GACA,eAAAzC,EACA,OAAAH,GACA,cAAA4X,GACA,kBAAA3I,GACA,iBAAA+I,GACA,qBAAAH,GACA,cAAAC,GACA,oBAAAzH,GACA,QAASyF,GAAe,CAACc,EACvC,iBAAkBzV,GAAMA,EAAG,OAAQ,OAAQC,GAAMA,EAAI8K,IAAMA,GAAE,QAAQ,EACrE,iBAAkB/G,GAAOA,EAAI,IAAK,OAAQC,GAAOA,EAAK8G,KAAO,CAC3C,SAAUA,GAAE,SACZ,QAASA,GAAE,QACX,SAAW1C,IAAYmM,EAAY,CAC/B,KAAMpO,EAAU,OAChB,KAAM,CACF,OAAQ2E,GAAE,KACV,QAAA1C,EACH,CACzB,CAAqB,CACrB,EAAkB,CAAC,CAAC,GAAK,CAAE,CACd,EAAE,CAAE,CAAA,EAEToO,GAAc,gBAAiBxY,GAAa,CACxC,GAAI,CACAjU,EAAS,KAAK8sB,GAAQ7Y,EAAS,eAAe,CAAC,CAClD,OACMjsB,EAAO,CACV,QAAQ,KAAKA,CAAK,CACrB,CACb,CAAS,EACD,MAAMuhB,EAAO,IAAM,CACf6iB,KACApsB,EAAS,KAAK8sB,GAAQ,QAAQ,CAAC,CAC3C,EACQ,OAAI,SAAS,aAAe,eACxB,SAAS,aAAe,WACxBvjB,KAGAvJ,EAAS,KAAK8Y,EAAG,mBAAoB,IAAM,CACvC0R,EAAY,CACR,KAAMpO,EAAU,iBAChB,KAAM,CAAE,CAC5B,CAAiB,EACGmP,IAAgB,oBAChBhiB,GACP,CAAA,CAAC,EACFvJ,EAAS,KAAK8Y,EAAG,OAAQ,IAAM,CAC3B0R,EAAY,CACR,KAAMpO,EAAU,KAChB,KAAM,CAAE,CAC5B,CAAiB,EACGmP,IAAgB,QAChBhiB,GACpB,EAAe,MAAM,CAAC,GAEP,IAAM,CACTvJ,EAAS,QAASmhB,GAAMA,EAAG,CAAA,EAC3BuL,GAAqB,QAAO,EAC5BjC,GAAoB,OACpB9K,IACZ,CACK,OACM33B,EAAO,CACV,QAAQ,KAAKA,CAAK,CACrB,CACL,CACA,SAASokC,GAAiBJ,EAAY,CAClC,GAAI,CAACvB,GACD,MAAM,IAAI,MAAM,iDAAiD,EAErEA,GAAkBuB,CAAU,CAChC,CACApB,GAAO,OAAS/V,GAChB+V,GAAO,iBAAmBwB,GAC1B,SAASQ,GAAkBG,EAAoB39B,EAAS,CACpD,GAAI,CACA,OAAO29B,EACDA,EAAmB39B,CAAO,EAC1B,IAAI46B,EACb,MACU,CACP,eAAQ,KAAK,oCAAoC,EAC1C,IAAIA,EACd,CACL,CAOA,MAAM/5B,EAAe,OAAO,iBAAqB,KAAe,iBAE1DrG,GAAiB,CAAC,OAAQ,OAAQ,QAAS,KAAK,EAChDojC,GAAS,YAEf,SAASC,GAAe9jC,EAASU,EAAQ,OAAQ,CAC/CqO,GACE,CACE,SAAU,UACV,KAAM,CACJ,OAAQ,QACT,EACD,MAAArO,EACA,QAAS,GAAGmjC,EAAM,GAAG7jC,CAAO,EAC7B,EACD,CAAE,MAAAU,CAAO,CACb,CACA,CAEA,SAASqjC,IAAmB,CAC1B,IAAIC,EAAW,GACXC,EAAS,GAEb,MAAMC,EAAU,CACd,UAAW,IAAA,GACX,SAAU,IAAA,GACV,UAAYtuB,GAAS,CACnBouB,EAAWpuB,EAAK,kBAChBquB,EAASruB,EAAK,cACf,CACL,EAEE,OAAI9O,GACFrG,GAAe,QAAQqF,GAAQ,CAC7Bo+B,EAAQp+B,CAAI,EAAI,IAAIhF,IAAS,CAC3BqjC,EAASr+B,CAAI,EAAE+9B,GAAQ,GAAG/iC,CAAI,EAC1BmjC,GACFH,GAAehjC,EAAK,KAAK,EAAE,EAAG0B,GAAwBsD,CAAI,CAAC,CAErE,CACA,CAAK,EAEDo+B,EAAQ,UAAY,CAACrlC,KAAUmB,IAAY,CACrCA,EAAQ,QAAUkkC,EAAQ,OAC5BA,EAAQ,MAAM,GAAGlkC,CAAO,EAG1BmkC,EAAS,MAAMN,GAAQhlC,CAAK,EAExBmlC,EACFI,GAAiBvlC,CAAK,EACbolC,GAGTH,GAAejlC,EAAO,OAAO,CAErC,EAEIqlC,EAAQ,SAAW,IAAIpjC,IAAS,CAC9BqjC,EAAS,KAAKN,GAAQ,GAAG/iC,CAAI,EACzBmjC,GAGF,WAAW,IAAMH,GAAehjC,EAAK,CAAC,CAAC,EAAG,CAAC,CAEnD,GAEIL,GAAe,QAAQqF,GAAQ,CAC7Bo+B,EAAQp+B,CAAI,EAAI,IAAA,EACtB,CAAK,EAGIo+B,CACT,CAEA,MAAMn9B,EAASg9B,GAAgB,EAEzBM,GAAqC,EACrCC,GAAwB,EAK9B,SAASC,GAAc3hC,EAAW,CAEhC,OADaA,EAAY,WACXA,EAAYA,EAAY,GACxC,CAKA,SAAS4hC,GAAa5hC,EAAW,CAE/B,OADaA,EAAY,WACXA,EAAY,IAAOA,CACnC,CAKA,SAAS6hC,GAAmBC,EAAQ11B,EAAY,CAC1CA,EAAW,WAAa,uBAIxB,CAAC,WAAY,UAAU,EAAE,SAASA,EAAW,UAC/C01B,EAAO,oBAAmB,EAE1BA,EAAO,6BAA4B,EAGrCA,EAAO,UAAU,KAGfA,EAAO,kBAAkB,CACvB,KAAMzR,EAAU,OAGhB,WAAYjkB,EAAW,WAAa,GAAK,IACzC,KAAM,CACJ,IAAK,aAEL,QAAS21B,GAAU31B,EAAY,GAAI,GAAI,CACxC,CACP,CAAK,EAGMA,EAAW,WAAa,UAChC,EACH,CAEA,MAAM41B,GAAuB,WAG7B,SAASC,GAAsBzpB,EAAS,CAEtC,OAD2BA,EAAQ,QAAQwpB,EAAoB,GAClCxpB,CAC/B,CAQA,SAAS0pB,GAAmBvmC,EAAO,CACjC,MAAMiY,EAASuuB,GAAcxmC,CAAK,EAElC,MAAI,CAACiY,GAAU,EAAEA,aAAkB,SAC1BA,EAGFquB,GAAsBruB,CAAM,CACrC,CAGA,SAASuuB,GAAcxmC,EAAO,CAC5B,OAAIymC,GAAkBzmC,CAAK,EAClBA,EAAM,OAGRA,CACT,CAEA,SAASymC,GAAkBzmC,EAAO,CAChC,OAAO,OAAOA,GAAU,UAAY,CAAC,CAACA,GAAS,WAAYA,CAC7D,CAEA,IAAIsY,GAMJ,SAASouB,GAAavO,EAAI,CAExB,OAAK7f,KACHA,GAAW,CAAA,EACXquB,MAGFruB,GAAS,KAAK6f,CAAE,EAET,IAAM,CACX,MAAMpO,EAAMzR,GAAWA,GAAS,QAAQ6f,CAAE,EAAI,GAC1CpO,EAAM,IACPzR,GAAW,OAAOyR,EAAK,CAAC,CAE/B,CACA,CAEA,SAAS4c,IAAwB,CAC/BvkC,GAAKmV,EAAQ,OAAQ,SAAUqvB,EAAoB,CACjD,OAAO,YAAarkC,EAAM,CACxB,GAAI+V,GACF,GAAI,CACFA,GAAS,QAAQ1W,GAAWA,EAAS,CAAA,CACtC,MAAW,CAEX,CAGH,OAAOglC,EAAmB,MAAMrvB,EAAQhV,CAAI,CAClD,CACA,CAAG,CACH,CAGA,MAAMskC,GAA6B,IAAI,IAAI,CACzCjS,EAAkB,SAClBA,EAAkB,eAClBA,EAAkB,iBAClBA,EAAkB,kBAClBA,EAAkB,eAClBA,EAAkB,UAClBA,EAAkB,gBACpB,CAAC,EAGD,SAASkS,GAAYC,EAAeC,EAAiBhhB,EAAM,CACzD+gB,EAAc,YAAYC,EAAiBhhB,CAAI,CACjD,CAGA,MAAMihB,EAAe,CAGlB,YACCd,EACAe,EAEAC,EAAsBjB,GACtB,CACA,KAAK,cAAgB,EACrB,KAAK,YAAc,EACnB,KAAK,QAAU,GAGf,KAAK,SAAWgB,EAAgB,QAAU,IAC1C,KAAK,WAAaA,EAAgB,UAAY,IAC9C,KAAK,eAAiBA,EAAgB,cAAgB,IACtD,KAAK,QAAUf,EACf,KAAK,gBAAkBe,EAAgB,eACvC,KAAK,oBAAsBC,CAC5B,CAGA,cAAe,CACd,MAAMC,EAAoBV,GAAa,IAAM,CAE3C,KAAK,cAAgBW,IAC3B,CAAK,EAED,KAAK,UAAY,IAAM,CACrBD,IAEA,KAAK,QAAU,GACf,KAAK,cAAgB,EACrB,KAAK,YAAc,CACzB,CACG,CAGA,iBAAkB,CACb,KAAK,WACP,KAAK,UAAS,EAGZ,KAAK,oBACP,aAAa,KAAK,kBAAkB,CAEvC,CAGA,YAAY32B,EAAYuV,EAAM,CAC7B,GAAIshB,GAActhB,EAAM,KAAK,eAAe,GAAK,CAACuhB,GAAkB92B,CAAU,EAC5E,OAGF,MAAM+2B,EAAW,CACf,UAAWvB,GAAax1B,EAAW,SAAS,EAC5C,gBAAiBA,EAEjB,WAAY,EACZ,KAAAuV,CACN,EAIM,KAAK,QAAQ,KAAKyhB,GAASA,EAAM,OAASD,EAAS,MAAQ,KAAK,IAAIC,EAAM,UAAYD,EAAS,SAAS,EAAI,CAAC,IAK/G,KAAK,QAAQ,KAAKA,CAAQ,EAGtB,KAAK,QAAQ,SAAW,GAC1B,KAAK,qBAAoB,EAE5B,CAGA,iBAAiBnjC,EAAY,KAAK,MAAO,CACxC,KAAK,cAAgB4hC,GAAa5hC,CAAS,CAC5C,CAGA,eAAeA,EAAY,KAAK,MAAO,CACtC,KAAK,YAAc4hC,GAAa5hC,CAAS,CAC1C,CAGA,cAAcwY,EAAS,CACtB,MAAMmJ,EAAOsgB,GAAsBzpB,CAAO,EAC1C,KAAK,kBAAkBmJ,EACxB,CAGA,kBAAkBA,EAAM,CACvB,KAAK,WAAWA,CAAI,EAAE,QAAQyhB,GAAS,CACrCA,EAAM,YACZ,CAAK,CACF,CAGA,WAAWzhB,EAAM,CAChB,OAAO,KAAK,QAAQ,OAAOyhB,GAASA,EAAM,OAASzhB,CAAI,CACxD,CAGA,cAAe,CACd,MAAM0hB,EAAiB,CAAA,EAEjB9iC,EAAMyiC,KAEZ,KAAK,QAAQ,QAAQI,GAAS,CACxB,CAACA,EAAM,eAAiB,KAAK,gBAC/BA,EAAM,cAAgBA,EAAM,WAAa,KAAK,cAAgB,KAAK,cAAgBA,EAAM,UAAY,QAEnG,CAACA,EAAM,aAAe,KAAK,cAC7BA,EAAM,YAAcA,EAAM,WAAa,KAAK,YAAc,KAAK,YAAcA,EAAM,UAAY,QAI7FA,EAAM,UAAY,KAAK,UAAY7iC,GACrC8iC,EAAe,KAAKD,CAAK,CAEjC,CAAK,EAGD,UAAWA,KAASC,EAAgB,CAClC,MAAM3d,EAAM,KAAK,QAAQ,QAAQ0d,CAAK,EAElC1d,EAAM,KACR,KAAK,qBAAqB0d,CAAK,EAC/B,KAAK,QAAQ,OAAO1d,EAAK,CAAC,EAE7B,CAGG,KAAK,QAAQ,QACf,KAAK,qBAAoB,CAE5B,CAGA,qBAAqB0d,EAAO,CAC3B,MAAMtB,EAAS,KAAK,QACdwB,EAAYF,EAAM,aAAeA,EAAM,aAAe,KAAK,eAC3DG,EAAcH,EAAM,eAAiBA,EAAM,eAAiB,KAAK,WAEjEI,EAAc,CAACF,GAAa,CAACC,EAC7B,CAAE,WAAAE,EAAY,gBAAAd,CAAiB,EAAGS,EAGxC,GAAII,EAAa,CAGf,MAAME,EAAmB,KAAK,IAAIN,EAAM,eAAiB,KAAK,SAAU,KAAK,QAAQ,EAAI,IACnFO,EAAYD,EAAmB,KAAK,SAAW,IAAO,WAAa,UAEnEt3B,EAAa,CACjB,KAAM,UACN,QAASu2B,EAAgB,QACzB,UAAWA,EAAgB,UAC3B,SAAU,uBACV,KAAM,CACJ,GAAGA,EAAgB,KACnB,IAAKzvB,EAAO,SAAS,KACrB,MAAO4uB,EAAO,gBAAiB,EAC/B,iBAAA4B,EACA,UAAAC,EAGA,WAAYF,GAAc,CAC3B,CACT,EAEM,KAAK,oBAAoB3B,EAAQ11B,CAAU,EAC3C,MACD,CAGD,GAAIq3B,EAAa,EAAG,CAClB,MAAMr3B,EAAa,CACjB,KAAM,UACN,QAASu2B,EAAgB,QACzB,UAAWA,EAAgB,UAC3B,SAAU,gBACV,KAAM,CACJ,GAAGA,EAAgB,KACnB,IAAKzvB,EAAO,SAAS,KACrB,MAAO4uB,EAAO,gBAAiB,EAC/B,WAAA2B,EACA,OAAQ,EACT,CACT,EAEM,KAAK,oBAAoB3B,EAAQ11B,CAAU,CAC5C,CACF,CAGA,sBAAuB,CAClB,KAAK,oBACP,aAAa,KAAK,kBAAkB,EAGtC,KAAK,mBAAqBw3B,GAAa,IAAM,KAAK,aAAY,EAAI,GAAI,CACvE,CACH,CAEA,MAAMC,GAAkB,CAAC,IAAK,SAAU,OAAO,EAG/C,SAASZ,GAActhB,EAAM+U,EAAgB,CAoB3C,MAnBI,IAACmN,GAAgB,SAASliB,EAAK,OAAO,GAKtCA,EAAK,UAAY,SAAW,CAAC,CAAC,SAAU,QAAQ,EAAE,SAASA,EAAK,aAAa,MAAM,GAAK,EAAE,GAQ5FA,EAAK,UAAY,MAChBA,EAAK,aAAa,UAAU,GAAMA,EAAK,aAAa,QAAQ,GAAKA,EAAK,aAAa,QAAQ,IAAM,UAKhG+U,GAAkB/U,EAAK,QAAQ+U,CAAc,EAKnD,CAEA,SAASwM,GAAkB92B,EAAY,CACrC,MAAO,CAAC,EAAEA,EAAW,MAAQ,OAAOA,EAAW,KAAK,QAAW,UAAYA,EAAW,UACxF,CAGA,SAAS42B,IAAe,CACtB,OAAO,KAAK,IAAK,EAAG,GACtB,CAGA,SAASc,GAAqCpB,EAAe/mC,EAAO,CAClE,GAAI,CASF,GAAI,CAACooC,GAAmBpoC,CAAK,EAC3B,OAGF,KAAM,CAAE,OAAAiB,CAAM,EAAKjB,EAAM,KASzB,GARI6mC,GAA2B,IAAI5lC,CAAM,GACvC8lC,EAAc,iBAAiB/mC,EAAM,SAAS,EAG5CiB,IAAW2zB,EAAkB,QAC/BmS,EAAc,eAAe/mC,EAAM,SAAS,EAG1CqoC,GAA8BroC,CAAK,EAAG,CACxC,KAAM,CAAE,KAAA6B,EAAM,GAAA8jB,GAAO3lB,EAAM,KACrBgmB,EAAOkd,GAAO,OAAO,QAAQvd,CAAE,EAEjCK,aAAgB,aAAenkB,IAASizB,EAAkB,OAC5DiS,EAAc,cAAc/gB,CAAI,CAEnC,CACF,MAAW,CAEX,CACH,CAEA,SAASoiB,GAAmBpoC,EAAO,CACjC,OAAOA,EAAM,OAAS8lC,EACxB,CAEA,SAASuC,GACProC,EACA,CACA,OAAOA,EAAM,KAAK,SAAW40B,EAAkB,gBACjD,CAKA,SAAS0T,GACP73B,EACA,CACA,MAAO,CACL,UAAW,KAAK,IAAG,EAAK,IACxB,KAAM,UACN,GAAGA,CACP,CACA,CAEA,IAAIyT,IACH,SAAUA,EAAU,CACjBA,EAASA,EAAS,SAAc,CAAC,EAAI,WACrCA,EAASA,EAAS,aAAkB,CAAC,EAAI,eACzCA,EAASA,EAAS,QAAa,CAAC,EAAI,UACpCA,EAASA,EAAS,KAAU,CAAC,EAAI,OACjCA,EAASA,EAAS,MAAW,CAAC,EAAI,QAClCA,EAASA,EAAS,QAAa,CAAC,EAAI,SACxC,GAAGA,KAAaA,GAAW,CAAE,EAAC,EAI9B,MAAMqkB,GAAuB,IAAI,IAAI,CACnC,KACA,QACA,aACA,OACA,OACA,MACA,QACA,eACA,cACA,WACA,gBACA,uBACF,CAAC,EAKD,SAASC,GAAsB5Z,EAAY,CACzC,MAAM9X,EAAM,CAAA,EACR,CAAC8X,EAAW,uBAAuB,GAAKA,EAAW,qBAAqB,IAC1EA,EAAW,uBAAuB,EAAIA,EAAW,qBAAqB,GAExE,UAAW9uB,KAAO8uB,EAChB,GAAI2Z,GAAqB,IAAIzoC,CAAG,EAAG,CACjC,IAAI2oC,EAAgB3oC,GAEhBA,IAAQ,eAAiBA,IAAQ,kBACnC2oC,EAAgB,UAGlB3xB,EAAI2xB,CAAa,EAAI7Z,EAAW9uB,CAAG,CACpC,CAGH,OAAOgX,CACT,CAEA,MAAM4xB,GACJvC,GAEQ1pB,GAAgB,CACtB,GAAI,CAAC0pB,EAAO,YACV,OAGF,MAAMr8B,EAAS6+B,GAAUlsB,CAAW,EAEpC,GAAI,CAAC3S,EACH,OAGF,MAAM8+B,EAAUnsB,EAAY,OAAS,QAC/Bzc,EAAQ4oC,EAAWnsB,EAAY,MAAU,OAG7CmsB,GACAzC,EAAO,eACPnmC,GACAA,EAAM,QACN,CAACA,EAAM,QACP,CAACA,EAAM,SACP,CAACA,EAAM,SACP,CAACA,EAAM,UAEP8mC,GACEX,EAAO,cACPr8B,EACAy8B,GAAmB9pB,EAAY,KAAO,CAC9C,EAGIypB,GAAmBC,EAAQr8B,CAAM,CACrC,EAIA,SAAS++B,GAAqB5wB,EAAQxW,EAAS,CAC7C,MAAM41B,EAAS6L,GAAO,OAAO,MAAMjrB,CAAM,EACnC+N,EAAOqR,GAAU6L,GAAO,OAAO,QAAQ7L,CAAM,EAC7CpR,EAAOD,GAAQkd,GAAO,OAAO,QAAQld,CAAI,EACzCnJ,EAAUoJ,GAAQ6iB,GAAU7iB,CAAI,EAAIA,EAAO,KAEjD,MAAO,CACL,QAAAxkB,EACA,KAAMob,EACF,CACE,OAAAwa,EACA,KAAM,CACJ,GAAIA,EACJ,QAASxa,EAAQ,QACjB,YAAa,MAAM,KAAKA,EAAQ,UAAU,EACvC,IAAKmJ,GAASA,EAAK,OAAS9B,GAAS,MAAQ8B,EAAK,WAAW,EAC7D,OAAO,OAAO,EACd,IAAIU,GAASA,EAAO,KAAI,CAAE,EAC1B,KAAK,EAAE,EACV,WAAY8hB,GAAsB3rB,EAAQ,UAAU,CACrD,CACF,EACD,CAAE,CACV,CACA,CAMA,SAAS8rB,GAAUlsB,EAAa,CAC9B,KAAM,CAAE,OAAAxE,EAAQ,QAAAxW,CAAS,EAAGsnC,GAAatsB,CAAW,EAEpD,OAAO6rB,GAAiB,CACtB,SAAU,MAAM7rB,EAAY,IAAI,GAChC,GAAGosB,GAAqB5wB,EAAQxW,CAAO,CAC3C,CAAG,CACH,CAEA,SAASsnC,GAAatsB,EAAa,CACjC,MAAMmsB,EAAUnsB,EAAY,OAAS,QAErC,IAAIhb,EACAwW,EAAS,KAGb,GAAI,CACFA,EAAS2wB,EAAUrC,GAAmB9pB,EAAY,KAAK,EAAK+pB,GAAc/pB,EAAY,OACtFhb,EAAUsb,GAAiB9E,EAAQ,CAAE,gBAAiB,GAAG,CAAE,GAAK,WACjE,MAAW,CACVxW,EAAU,WACX,CAED,MAAO,CAAE,OAAAwW,EAAQ,QAAAxW,EACnB,CAEA,SAASqnC,GAAU9iB,EAAM,CACvB,OAAOA,EAAK,OAAS9B,GAAS,OAChC,CAGA,SAAS8kB,GAAoB7C,EAAQnmC,EAAO,CAC1C,GAAI,CAACmmC,EAAO,YACV,OAMFA,EAAO,mBAAkB,EAEzB,MAAM11B,EAAaw4B,GAAsBjpC,CAAK,EAEzCyQ,GAILy1B,GAAmBC,EAAQ11B,CAAU,CACvC,CAGA,SAASw4B,GAAsBjpC,EAAO,CACpC,KAAM,CAAE,QAAAkpC,EAAS,SAAAC,EAAU,QAAAC,EAAS,OAAAC,EAAQ,IAAAvpC,EAAK,OAAAmY,CAAQ,EAAGjY,EAG5D,GAAI,CAACiY,GAAUqxB,GAAerxB,CAAQ,GAAI,CAACnY,EACzC,OAAO,KAIT,MAAMypC,EAAiBL,GAAWE,GAAWC,EACvCG,EAAiB1pC,EAAI,SAAW,EAItC,GAAI,CAACypC,GAAkBC,EACrB,OAAO,KAGT,MAAM/nC,EAAUsb,GAAiB9E,EAAQ,CAAE,gBAAiB,GAAG,CAAE,GAAK,YAChEwxB,EAAiBZ,GAAqB5wB,EAASxW,CAAO,EAE5D,OAAO6mC,GAAiB,CACtB,SAAU,aACV,QAAA7mC,EACA,KAAM,CACJ,GAAGgoC,EAAe,KAClB,QAAAP,EACA,SAAAC,EACA,QAAAC,EACA,OAAAC,EACA,IAAAvpC,CACD,CACL,CAAG,CACH,CAEA,SAASwpC,GAAerxB,EAAQ,CAC9B,OAAOA,EAAO,UAAY,SAAWA,EAAO,UAAY,YAAcA,EAAO,iBAC/E,CAGA,MAAMyxB,GAEH,CAED,SAAUC,GACV,MAAOC,GAEP,WAAYC,EACd,EAKA,SAASC,GACPC,EACA5D,EACA,CACA,MAAO,CAAC,CAAE,OAAA6D,CAAQ,IAAK,KAAK7D,EAAO,yBAAyB,KAAK4D,EAAOC,CAAM,CAAC,CACjF,CAKA,SAASC,GACPC,EACA,CACA,OAAOA,EAAQ,IAAIC,EAAsB,EAAE,OAAO,OAAO,CAC3D,CAEA,SAASA,GAAuBC,EAAO,CACrC,MAAMC,EAAYX,GAAYU,EAAM,SAAS,EAC7C,OAAKC,EAIEA,EAAUD,CAAK,EAHb,IAIX,CAEA,SAASE,GAAgBC,EAAM,CAG7B,QAASC,IAAgCjzB,EAAO,YAAY,YAAcgzB,GAAQ,GACpF,CAEA,SAASX,GAAiBQ,EAAO,CAC/B,KAAM,CAAE,SAAAK,EAAU,UAAAJ,EAAW,KAAA9iC,EAAM,UAAAmjC,CAAS,EAAKN,EAE3CO,EAAQL,GAAgBI,CAAS,EACvC,MAAO,CACL,KAAML,EACN,KAAA9iC,EACA,MAAAojC,EACA,IAAKA,EAAQF,EACb,KAAM,MACV,CACA,CAEA,SAASZ,GAAsBO,EAAO,CACpC,KAAM,CACJ,UAAAC,EACA,KAAA9iC,EACA,gBAAAqjC,EACA,SAAAH,EACA,YAAAI,EACA,gBAAAC,EACA,2BAAAC,EACA,yBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,aAAAC,EACA,cAAAC,EACA,UAAAV,EACA,aAAAW,EACA,KAAAxpC,CACD,EAAGuoC,EAGJ,OAAIK,IAAa,EACR,KAGF,CACL,KAAM,GAAGJ,CAAS,IAAIxoC,CAAI,GAC1B,MAAOyoC,GAAgBI,CAAS,EAChC,IAAKJ,GAAgBO,CAAW,EAChC,KAAAtjC,EACA,KAAM,CACJ,KAAM8jC,EACN,gBAAAT,EACA,gBAAAE,EACA,SAAAL,EACA,eAAAQ,EACA,2BAAAF,EACA,yBAAAC,EACA,eAAAE,EACA,aAAAC,EACA,YAAAN,EACA,cAAAO,CACD,CACL,CACA,CAEA,SAASzB,GACPS,EACA,CACA,KAAM,CACJ,UAAAC,EACA,cAAAiB,EACA,KAAA/jC,EACA,YAAAgkC,EACA,UAAAb,EACA,gBAAAE,EACA,gBAAAE,EACA,eAAAU,EACA,aAAAH,CACD,EAAGjB,EAGJ,MAAI,CAAC,QAAS,gBAAgB,EAAE,SAASkB,CAAa,EAC7C,KAGF,CACL,KAAM,GAAGjB,CAAS,IAAIiB,CAAa,GACnC,MAAOhB,GAAgBI,CAAS,EAChC,IAAKJ,GAAgBiB,CAAW,EAChC,KAAAhkC,EACA,KAAM,CACJ,KAAM8jC,EACN,WAAYG,EACZ,gBAAAZ,EACA,gBAAAE,CACD,CACL,CACA,CAKA,SAASW,GAA0BzB,EAAQ,CACzC,MAAM0B,EAAY1B,EAAO,QAAQA,EAAO,QAAQ,OAAS,CAAC,EACpDhkB,EAAO0lB,GAAaA,EAAU,QAAU,CAACA,EAAU,OAAO,EAAI,OACpE,OAAOC,GAAY3B,EAAQ,2BAA4BhkB,CAAI,CAC7D,CAEA,SAAS4lB,GAAcxB,EAAO,CAC5B,OAAQA,EAAQ,UAAY,MAC9B,CAKA,SAASyB,GAAyB7B,EAAQ,CACxC,MAAM8B,EAAe,CAAA,EACfC,EAAQ,CAAA,EACd,UAAW3B,KAASJ,EAAO,QACzB,GAAI4B,GAAcxB,CAAK,EAAG,CACxB,MAAM4B,EAAU,CAAA,EAChB,UAAW/qC,KAAUmpC,EAAM,QACzB,GAAInpC,EAAO,KAAM,CACf8qC,EAAM,KAAK9qC,EAAO,IAAI,EACtB,MAAMo2B,EAAS6L,GAAO,OAAO,MAAMjiC,EAAO,IAAI,EAC1Co2B,GACF2U,EAAQ,KAAK3U,CAAM,CAEtB,CAEHyU,EAAa,KAAK,CAAE,MAAO1B,EAAM,MAAO,QAAS4B,EAAQ,OAASA,EAAU,MAAW,CAAA,CACxF,CAGH,OAAOL,GAAY3B,EAAQ,0BAA2B+B,EAAOD,CAAY,CAC3E,CAKA,SAASG,GAAmBjC,EAAQ,CAClC,MAAM0B,EAAY1B,EAAO,QAAQA,EAAO,QAAQ,OAAS,CAAC,EACpDhkB,EAAO0lB,GAAaA,EAAU,OAAS,CAACA,EAAU,MAAM,EAAI,OAClE,OAAOC,GAAY3B,EAAQ,oBAAqBhkB,CAAI,CACtD,CAKA,SAASkmB,GAA0BlC,EAAQ,CACzC,MAAM0B,EAAY1B,EAAO,QAAQA,EAAO,QAAQ,OAAS,CAAC,EACpDhkB,EAAO0lB,GAAaA,EAAU,OAAS,CAACA,EAAU,MAAM,EAAI,OAClE,OAAOC,GAAY3B,EAAQ,4BAA6BhkB,CAAI,CAC9D,CAKA,SAAS2lB,GACP3B,EACAziC,EACAwkC,EACAI,EACA,CACA,MAAMv+B,EAAQo8B,EAAO,MACfoC,EAASpC,EAAO,OAEhBqC,EAAM/B,GAAgB18B,CAAK,EAEjC,MAAO,CACL,KAAM,YACN,KAAArG,EACA,MAAO8kC,EACP,IAAAA,EACA,KAAM,CACJ,MAAAz+B,EACA,KAAMA,EACN,OAAAw+B,EACA,QAASL,EAAQA,EAAM,IAAI/lB,GAAQkd,GAAO,OAAO,MAAMld,CAAI,CAAC,EAAI,OAChE,aAAAmmB,CACD,CACL,CACA,CAMA,SAASG,GAAyBnG,EAAQ,CACxC,SAASoG,EAAoBnC,EAAO,CAE7BjE,EAAO,mBAAmB,SAASiE,CAAK,GAC3CjE,EAAO,mBAAmB,KAAKiE,CAAK,CAEvC,CAED,SAASoC,EAAU,CAAE,QAAAtC,GAAW,CAC9BA,EAAQ,QAAQqC,CAAmB,CACpC,CAED,MAAME,EAAiB,CAAA,EAEvB,MAAC,CAAC,aAAc,QAAS,UAAU,EAAI,QAAQ5qC,GAAQ,CACrD4qC,EAAe,KAAKC,GAAqC7qC,EAAM2qC,CAAS,CAAC,CAC7E,CAAG,EAEDC,EAAe,KACbE,GAA6B7C,GAAgB2B,GAA2BtF,CAAM,CAAC,EAC/EyG,GAA6B9C,GAAgB+B,GAA0B1F,CAAM,CAAC,EAC9E0G,GAA6B/C,GAAgBmC,GAAoB9F,CAAM,CAAC,EACxE2G,GAA6BhD,GAAgBoC,GAA2B/F,CAAM,CAAC,CACnF,EAGS,IAAM,CACXsG,EAAe,QAAQM,GAAiBA,EAAe,CAAA,CAC3D,CACA,CAEA,MAAMpV,GAAI,q9TAEV,SAASxpB,IAAG,CAAC,MAAM,EAAE,IAAI,KAAK,CAACwpB,EAAC,CAAC,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAGhE,MAAMqV,WAAqC,KAAM,CAC9C,aAAc,CACb,MAAM,yCAAyCxpB,EAA4B,GAAG,CAC/E,CACH,CAMA,MAAMypB,EAAkB,CAKrB,aAAc,CACb,KAAK,OAAS,GACd,KAAK,WAAa,EAClB,KAAK,YAAc,EACpB,CAGA,IAAI,WAAY,CACf,OAAO,KAAK,OAAO,OAAS,CAC7B,CAGA,IAAI,MAAO,CACV,MAAO,MACR,CAGA,SAAU,CACT,KAAK,OAAS,EACf,CAGA,MAAM,SAASjtC,EAAO,CACrB,MAAMktC,EAAY,KAAK,UAAUltC,CAAK,EAAE,OAExC,GADA,KAAK,YAAcktC,EACf,KAAK,WAAa1pB,GACpB,MAAM,IAAIwpB,GAGZ,KAAK,OAAO,KAAKhtC,CAAK,CACvB,CAGA,QAAS,CACR,OAAO,IAAI,QAAQ0D,GAAW,CAI5B,MAAMypC,EAAY,KAAK,OACvB,KAAK,MAAK,EACVzpC,EAAQ,KAAK,UAAUypC,CAAS,CAAC,CACvC,CAAK,CACF,CAGA,OAAQ,CACP,KAAK,OAAS,GACd,KAAK,WAAa,EAClB,KAAK,YAAc,EACpB,CAGA,sBAAuB,CACtB,MAAM9oC,EAAY,KAAK,OAAO,IAAIrE,GAASA,EAAM,SAAS,EAAE,KAAM,EAAC,CAAC,EAEpE,OAAKqE,EAIE2hC,GAAc3hC,CAAS,EAHrB,IAIV,CACH,CAMA,MAAM+oC,EAAc,CAEjB,YAAYC,EAAQ,CACnB,KAAK,QAAUA,EACf,KAAK,IAAM,CACZ,CAMA,aAAc,CAEb,OAAI,KAAK,oBACA,KAAK,qBAGd,KAAK,oBAAsB,IAAI,QAAQ,CAAC3pC,EAASC,IAAW,CAC1D,KAAK,QAAQ,iBACX,UACA,CAAC,CAAE,KAAA8Z,CAAI,IAAO,CACPA,EAAO,QACV/Z,IAEAC,GAEH,EACD,CAAE,KAAM,EAAM,CACtB,EAEM,KAAK,QAAQ,iBACX,QACArD,GAAS,CACPqD,EAAOrD,CAAK,CACb,EACD,CAAE,KAAM,EAAM,CACtB,CACA,CAAK,EAEM,KAAK,oBACb,CAKA,SAAU,CACTiI,GAAeC,EAAO,KAAK,+BAA+B,EAC1D,KAAK,QAAQ,WACd,CAKA,YAAY8U,EAAQgwB,EAAK,CACxB,MAAM3nB,EAAK,KAAK,qBAEhB,OAAO,IAAI,QAAQ,CAACjiB,EAASC,IAAW,CACtC,MAAMyU,EAAW,CAAC,CAAE,KAAAqF,KAAW,CAC7B,MAAM5N,EAAW4N,EACjB,GAAI5N,EAAS,SAAWyN,GAMpBzN,EAAS,KAAO8V,EAOpB,IAFA,KAAK,QAAQ,oBAAoB,UAAWvN,CAAQ,EAEhD,CAACvI,EAAS,QAAS,CAErBtH,GAAeC,EAAO,MAAM,gCAAiCqH,EAAS,QAAQ,EAE9ElM,EAAO,IAAI,MAAM,6BAA6B,CAAC,EAC/C,MACD,CAEDD,EAAQmM,EAAS,UACzB,EAIM,KAAK,QAAQ,iBAAiB,UAAWuI,CAAQ,EACjD,KAAK,QAAQ,YAAY,CAAE,GAAAuN,EAAI,OAAArI,EAAQ,IAAAgwB,CAAG,CAAE,CAClD,CAAK,CACF,CAGA,oBAAqB,CACpB,OAAO,KAAK,KACb,CACH,CAMA,MAAMC,EAA8B,CAGjC,YAAYF,EAAQ,CACnB,KAAK,QAAU,IAAID,GAAcC,CAAM,EACvC,KAAK,mBAAqB,KAC1B,KAAK,WAAa,EAClB,KAAK,YAAc,EACpB,CAGA,IAAI,WAAY,CACf,MAAO,CAAC,CAAC,KAAK,kBACf,CAGA,IAAI,MAAO,CACV,MAAO,QACR,CAMA,aAAc,CACb,OAAO,KAAK,QAAQ,aACrB,CAKA,SAAU,CACT,KAAK,QAAQ,SACd,CAOA,SAASrtC,EAAO,CACf,MAAMqE,EAAY2hC,GAAchmC,EAAM,SAAS,GAC3C,CAAC,KAAK,oBAAsBqE,EAAY,KAAK,sBAC/C,KAAK,mBAAqBA,GAG5B,MAAMoZ,EAAO,KAAK,UAAUzd,CAAK,EAGjC,OAFA,KAAK,YAAcyd,EAAK,OAEpB,KAAK,WAAa+F,GACb,QAAQ,OAAO,IAAIwpB,EAA8B,EAGnD,KAAK,mBAAmBvvB,CAAI,CACpC,CAKA,QAAS,CACR,OAAO,KAAK,gBACb,CAGA,OAAQ,CACP,KAAK,mBAAqB,KAC1B,KAAK,WAAa,EAClB,KAAK,YAAc,GAGnB,KAAK,QAAQ,YAAY,OAAO,EAAE,KAAK,KAAMtP,GAAK,CAChD5F,GAAeC,EAAO,UAAU2F,EAAG,2CAA4CA,CAAC,CACtF,CAAK,CACF,CAGA,sBAAuB,CACtB,OAAO,KAAK,kBACb,CAKA,mBAAmBsP,EAAM,CACxB,OAAO,KAAK,QAAQ,YAAY,WAAYA,CAAI,CACjD,CAKA,MAAM,gBAAiB,CACtB,MAAM5N,EAAW,MAAM,KAAK,QAAQ,YAAY,QAAQ,EAExD,YAAK,mBAAqB,KAC1B,KAAK,WAAa,EAEXA,CACR,CACH,CAOA,MAAM29B,EAAkB,CAErB,YAAYH,EAAQ,CACnB,KAAK,UAAY,IAAIJ,GACrB,KAAK,aAAe,IAAIM,GAA6BF,CAAM,EAC3D,KAAK,MAAQ,KAAK,UAElB,KAAK,6BAA+B,KAAK,uBAC1C,CAGA,IAAI,MAAO,CACV,OAAO,KAAK,MAAM,IACnB,CAGA,IAAI,WAAY,CACf,OAAO,KAAK,MAAM,SACnB,CAGA,IAAI,aAAc,CACjB,OAAO,KAAK,MAAM,WACnB,CAEA,IAAI,YAAYz/B,EAAO,CACtB,KAAK,MAAM,YAAcA,CAC1B,CAGA,SAAU,CACT,KAAK,UAAU,UACf,KAAK,aAAa,SACnB,CAGA,OAAQ,CACP,OAAO,KAAK,MAAM,OACnB,CAGA,sBAAuB,CACtB,OAAO,KAAK,MAAM,sBACnB,CAOA,SAAS5N,EAAO,CACf,OAAO,KAAK,MAAM,SAASA,CAAK,CACjC,CAGA,MAAM,QAAS,CAEd,aAAM,KAAK,uBAEJ,KAAK,MAAM,QACnB,CAGA,sBAAuB,CACtB,OAAO,KAAK,4BACb,CAGA,MAAM,uBAAwB,CAC7B,GAAI,CACF,MAAM,KAAK,aAAa,aACzB,OAAQM,EAAO,CAGdiI,GAAeC,EAAO,UAAUlI,EAAO,sEAAsE,EAC7G,MACD,CAGD,MAAM,KAAK,4BACZ,CAGA,MAAM,4BAA6B,CAClC,KAAM,CAAE,OAAAmtC,EAAQ,YAAAC,GAAgB,KAAK,UAE/BC,EAAmB,CAAA,EACzB,UAAW3tC,KAASytC,EAClBE,EAAiB,KAAK,KAAK,aAAa,SAAS3tC,CAAK,CAAC,EAGzD,KAAK,aAAa,YAAc0tC,EAIhC,KAAK,MAAQ,KAAK,aAGlB,GAAI,CACF,MAAM,QAAQ,IAAIC,CAAgB,EAGlC,KAAK,UAAU,OAChB,OAAQrtC,EAAO,CACdiI,GAAeC,EAAO,UAAUlI,EAAO,8CAA8C,CACtF,CACF,CACH,CAKA,SAASstC,GAAkB,CACzB,eAAAC,EACA,UAAWC,CACb,EAAG,CACD,GACED,GAEA,OAAO,OACP,CACA,MAAMR,EAASU,GAAYD,CAAe,EAE1C,GAAIT,EACF,OAAOA,CAEV,CAED,OAAA9kC,GAAeC,EAAO,KAAK,qBAAqB,EACzC,IAAIykC,EACb,CAEA,SAASc,GAAYD,EAAiB,CACpC,GAAI,CACF,MAAME,EAAYF,GAAmBG,KAErC,GAAI,CAACD,EACH,OAGFzlC,GAAeC,EAAO,KAAK,2BAA2BslC,EAAkB,SAASA,CAAe,GAAK,EAAE,EAAE,EACzG,MAAMT,EAAS,IAAI,OAAOW,CAAS,EACnC,OAAO,IAAIR,GAAiBH,CAAM,CACnC,OAAQ/sC,EAAO,CACdiI,GAAeC,EAAO,UAAUlI,EAAO,qCAAqC,CAE7E,CACH,CAEA,SAAS2tC,IAAgB,CACvB,OAAI,OAAO,iCAAqC,KAAe,CAAC,iCACvD9/B,GAAC,EAGH,EACT,CAGA,SAAS+/B,IAAoB,CAC3B,GAAI,CAEF,MAAO,mBAAoB32B,GAAU,CAAC,CAACA,EAAO,cAC/C,MAAW,CACV,MAAO,EACR,CACH,CAKA,SAAS42B,GAAahI,EAAQ,CAC5BiI,KACAjI,EAAO,QAAU,MACnB,CAKA,SAASiI,IAAgB,CACvB,GAAKF,GAAiB,EAItB,GAAI,CACF32B,EAAO,eAAe,WAAWmL,EAAkB,CACpD,MAAW,CAEX,CACH,CAQA,SAAS2rB,GAAU5hC,EAAY,CAC7B,OAAIA,IAAe,OACV,GAIF,KAAK,OAAQ,EAAGA,CACzB,CAKA,SAAS6hC,GAAY7kC,EAAS,CAC5B,MAAM7E,EAAM,KAAK,MACX+gB,EAAKlc,EAAQ,IAAMT,GAAK,EAExBulC,EAAU9kC,EAAQ,SAAW7E,EAC7B4pC,EAAe/kC,EAAQ,cAAgB7E,EACvC6pC,EAAYhlC,EAAQ,WAAa,EACjCilC,EAAUjlC,EAAQ,QAClBklC,EAAoBllC,EAAQ,kBAElC,MAAO,CACL,GAAAkc,EACA,QAAA4oB,EACA,aAAAC,EACA,UAAAC,EACA,QAAAC,EACA,kBAAAC,CACJ,CACA,CAKA,SAASC,GAAYnlC,EAAS,CAC5B,GAAKykC,GAAiB,EAItB,GAAI,CACF32B,EAAO,eAAe,QAAQmL,GAAoB,KAAK,UAAUjZ,CAAO,CAAC,CAC1E,MAAW,CAEX,CACH,CAKA,SAASolC,GAAqBC,EAAmBC,EAAgB,CAC/D,OAAOV,GAAUS,CAAiB,EAAI,UAAYC,EAAiB,SAAW,EAChF,CAOA,SAASC,GACP,CAAE,kBAAAF,EAAmB,eAAAC,EAAgB,cAAAE,EAAgB,EAAO,EAC5D,CAAE,kBAAAN,CAAmB,EAAG,CAAE,EAC1B,CACA,MAAMD,EAAUG,GAAqBC,EAAmBC,CAAc,EAChEtlC,EAAU6kC,GAAY,CAC1B,QAAAI,EACA,kBAAAC,CACJ,CAAG,EAED,OAAIM,GACFL,GAAYnlC,CAAO,EAGdA,CACT,CAKA,SAASylC,IAAe,CACtB,GAAI,CAAChB,GAAiB,EACpB,OAAO,KAGT,GAAI,CAEF,MAAMiB,EAA2B53B,EAAO,eAAe,QAAQmL,EAAkB,EAEjF,GAAI,CAACysB,EACH,OAAO,KAGT,MAAMC,EAAa,KAAK,MAAMD,CAAwB,EAEtD,OAAA5mC,GAAeC,EAAO,SAAS,0BAA0B,EAElD8lC,GAAYc,CAAU,CAC9B,MAAW,CACV,OAAO,IACR,CACH,CAMA,SAASC,GACPC,EACAC,EACAC,EAAa,CAAC,IAAI,KAClB,CAEA,OAAIF,IAAgB,MAAQC,IAAW,QAAaA,EAAS,EACpD,GAILA,IAAW,EACN,GAGFD,EAAcC,GAAUC,CACjC,CAKA,SAASC,GACPhmC,EACA,CACE,kBAAAimC,EACA,kBAAAC,EACA,WAAAH,EAAa,KAAK,IAAK,CACxB,EACD,CACA,OAEEH,GAAU5lC,EAAQ,QAASimC,EAAmBF,CAAU,GAGxDH,GAAU5lC,EAAQ,aAAckmC,EAAmBH,CAAU,CAEjE,CAGA,SAASI,GACPnmC,EACA,CAAE,kBAAAkmC,EAAmB,kBAAAD,CAAmB,EACxC,CAOA,MALI,GAACD,GAAiBhmC,EAAS,CAAE,kBAAAkmC,EAAmB,kBAAAD,CAAmB,CAAA,GAKnEjmC,EAAQ,UAAY,UAAYA,EAAQ,YAAc,EAK5D,CAMA,SAASomC,GACP,CACE,kBAAAF,EACA,kBAAAD,EACA,kBAAAf,CACD,EAGDmB,EACA,CACA,MAAMC,EAAkBD,EAAe,eAAiBZ,GAAY,EAGpE,OAAKa,EAKAH,GAAqBG,EAAiB,CAAE,kBAAAJ,EAAmB,kBAAAD,CAAmB,CAAA,GAInFnnC,GAAeC,EAAO,SAAS,2DAA2D,EACnFwmC,GAAcc,EAAgB,CAAE,kBAAmBC,EAAgB,EAAE,CAAE,GAJrEA,GALPxnC,GAAeC,EAAO,SAAS,sBAAsB,EAC9CwmC,GAAcc,EAAgB,CAAE,kBAAAnB,CAAmB,CAAA,EAS9D,CAEA,SAASqB,GAAchwC,EAAO,CAC5B,OAAOA,EAAM,OAAS00B,EAAU,MAClC,CAUA,SAASub,GAAa9J,EAAQnmC,EAAOskC,EAAY,CAC/C,OAAK4L,GAAe/J,EAAQnmC,CAAK,GAMjCmwC,GAAUhK,EAAQnmC,EAAOskC,CAAU,EAE5B,IAPE,EAQX,CAQA,SAAS8L,GACPjK,EACAnmC,EACAskC,EACA,CACA,OAAK4L,GAAe/J,EAAQnmC,CAAK,EAI1BmwC,GAAUhK,EAAQnmC,EAAOskC,CAAU,EAHjC,QAAQ,QAAQ,IAAI,CAI/B,CAEA,eAAe6L,GACbhK,EACAnmC,EACAskC,EACA,CACA,GAAI,CAAC6B,EAAO,YACV,OAAO,KAGT,GAAI,CACE7B,GAAc6B,EAAO,gBAAkB,UACzCA,EAAO,YAAY,QAGjB7B,IACF6B,EAAO,YAAY,YAAc,IAGnC,MAAMkK,EAAgBlK,EAAO,aAEvBmK,EAA6BC,GAAmBvwC,EAAOqwC,EAAc,uBAAuB,EAElG,OAAKC,EAIE,MAAMnK,EAAO,YAAY,SAASmK,CAA0B,EAHjE,MAIH,OAAQhwC,EAAO,CACd,MAAMoK,EAASpK,GAASA,aAAiB0sC,GAA+B,uBAAyB,WACjG7G,EAAO,gBAAgB7lC,CAAK,EAE5B,MAAM6lC,EAAO,KAAK,CAAE,OAAAz7B,CAAQ,CAAA,EAE5B,MAAMvC,EAASuI,IAEXvI,GACFA,EAAO,mBAAmB,qBAAsB,QAAQ,CAE3D,CACH,CAGA,SAAS+nC,GAAe/J,EAAQnmC,EAAO,CACrC,GAAI,CAACmmC,EAAO,aAAeA,EAAO,SAAQ,GAAM,CAACA,EAAO,YACtD,MAAO,GAGT,MAAMqK,EAAgBxK,GAAchmC,EAAM,SAAS,EAMnD,OAAIwwC,EAAgBrK,EAAO,SAAS,iBAAmB,KAAK,MACnD,GAILqK,EAAgBrK,EAAO,WAAY,EAAC,iBAAmBA,EAAO,WAAY,EAAC,mBAC7E59B,GACEC,EAAO,SAAS,iCAAiCgoC,CAAa,wCAAwC,EACjG,IAGF,EACT,CAEA,SAASD,GACPvwC,EACAyI,EACA,CACA,GAAI,CACF,GAAI,OAAOA,GAAa,YAAcunC,GAAchwC,CAAK,EACvD,OAAOyI,EAASzI,CAAK,CAExB,OAAQM,EAAO,CACd,OAAAiI,GACEC,EAAO,UAAUlI,EAAO,oFAAoF,EACvG,IACR,CAED,OAAON,CACT,CAGA,SAAS6M,GAAa7M,EAAO,CAC3B,MAAO,CAACA,EAAM,IAChB,CAGA,SAAS2M,GAAmB3M,EAAO,CACjC,OAAOA,EAAM,OAAS,aACxB,CAGA,SAASywC,GAAczwC,EAAO,CAC5B,OAAOA,EAAM,OAAS,cACxB,CAGA,SAAS0wC,GAAgB1wC,EAAO,CAC9B,OAAOA,EAAM,OAAS,UACxB,CAKA,SAAS2wC,GAAqBxK,EAAQ,CACpC,MAAO,CAACnmC,EAAOwK,IAAiB,CAC9B,GAAI,CAAC27B,EAAO,UAAS,GAAO,CAACt5B,GAAa7M,CAAK,GAAK,CAAC2M,GAAmB3M,CAAK,EAC3E,OAGF,MAAMuB,EAAaiJ,GAAgBA,EAAa,WAKhD,GAAI,GAACjJ,GAAcA,EAAa,KAAOA,GAAc,KAIrD,IAAIoL,GAAmB3M,CAAK,EAAG,CAC7B4wC,GAAuBzK,EAAQnmC,CAAK,EACpC,MACD,CAED6wC,GAAiB1K,EAAQnmC,CAAK,EAClC,CACA,CAEA,SAAS4wC,GAAuBzK,EAAQnmC,EAAO,CAC7C,MAAM8wC,EAAgB3K,EAAO,aAKzBnmC,EAAM,UAAYA,EAAM,SAAS,OAASA,EAAM,SAAS,MAAM,UAAY8wC,EAAc,SAAS,KAAO,KAC3GA,EAAc,SAAS,IAAI9wC,EAAM,SAAS,MAAM,SAEpD,CAEA,SAAS6wC,GAAiB1K,EAAQnmC,EAAO,CACvC,MAAM8wC,EAAgB3K,EAAO,aAc7B,GANInmC,EAAM,UAAY8wC,EAAc,SAAS,KAAO,KAClDA,EAAc,SAAS,IAAI9wC,EAAM,QAAQ,EAKvCmmC,EAAO,gBAAkB,UAAY,CAACnmC,EAAM,MAAQ,CAACA,EAAM,KAAK,SAClE,OAGF,KAAM,CAAE,oBAAA+wC,CAAmB,EAAK5K,EAAO,WAAU,EAC7C,OAAO4K,GAAwB,YAAc,CAACA,EAAoB/wC,CAAK,GAI3EioC,GAAa,SAAY,CACvB,GAAI,CAEF,MAAM9B,EAAO,2BACd,OAAQ3X,EAAK,CACZ2X,EAAO,gBAAgB3X,CAAG,CAC3B,CACL,CAAG,CACH,CAKA,SAASwiB,GAAsB7K,EAAQ,CACrC,OAAQnmC,GAAU,CACZ,CAACmmC,EAAO,UAAS,GAAM,CAACt5B,GAAa7M,CAAK,GAI9CixC,GAAqB9K,EAAQnmC,CAAK,CACtC,CACA,CAEA,SAASixC,GAAqB9K,EAAQnmC,EAAO,CAC3C,MAAMkxC,EACJlxC,EAAM,WAAaA,EAAM,UAAU,QAAUA,EAAM,UAAU,OAAO,CAAC,GAAKA,EAAM,UAAU,OAAO,CAAC,EAAE,MACtG,GAAI,OAAOkxC,GAAmB,WAQ5BA,EAAe,MACb,iGACD,GAIDA,EAAe,MAAM,iEAAiE,GACtF,CACA,MAAMzgC,EAAa63B,GAAiB,CAClC,SAAU,uBACV,KAAM,CACJ,IAAK9nB,GAAiB,CACvB,CACP,CAAK,EACD0lB,GAAmBC,EAAQ11B,CAAU,CACtC,CACH,CAKA,SAAS0gC,GAAkBhL,EAAQ,CACjC,MAAMh+B,EAASuI,IAEVvI,GAILA,EAAO,GAAG,sBAAuBsI,GAAc2gC,GAAoBjL,EAAQ11B,CAAU,CAAC,CACxF,CAEA,SAAS2gC,GAAoBjL,EAAQ11B,EAAY,CAC/C,GAAI,CAAC01B,EAAO,UAAS,GAAM,CAACkL,GAAyB5gC,CAAU,EAC7D,OAGF,MAAM3G,EAASwnC,GAAoB7gC,CAAU,EACzC3G,GACFo8B,GAAmBC,EAAQr8B,CAAM,CAErC,CAGA,SAASwnC,GAAoB7gC,EAAY,CACvC,MACE,CAAC4gC,GAAyB5gC,CAAU,GACpC,CAEE,QACA,MAEA,eACA,oBACN,EAAM,SAASA,EAAW,QAAQ,GAE9BA,EAAW,SAAS,WAAW,KAAK,EAE7B,KAGLA,EAAW,WAAa,UACnB8gC,GAA2B9gC,CAAU,EAGvC63B,GAAiB73B,CAAU,CACpC,CAGA,SAAS8gC,GACP9gC,EACA,CACA,MAAMlO,EAAOkO,EAAW,MAAQA,EAAW,KAAK,UAEhD,GAAI,CAAC,MAAM,QAAQlO,CAAI,GAAKA,EAAK,SAAW,EAC1C,OAAO+lC,GAAiB73B,CAAU,EAGpC,IAAI+gC,EAAc,GAGlB,MAAMC,EAAiBlvC,EAAK,IAAI+qC,GAAO,CACrC,GAAI,CAACA,EACH,OAAOA,EAET,GAAI,OAAOA,GAAQ,SACjB,OAAIA,EAAI,OAASjqB,IACfmuB,EAAc,GACP,GAAGlE,EAAI,MAAM,EAAGjqB,EAAoB,CAAC,KAGvCiqB,EAET,GAAI,OAAOA,GAAQ,SACjB,GAAI,CACF,MAAMoE,EAAgBtL,GAAUkH,EAAK,CAAC,EAEtC,OADoB,KAAK,UAAUoE,CAAa,EAChC,OAASruB,IACvBmuB,EAAc,GAEP,GAAG,KAAK,UAAUE,EAAe,KAAM,CAAC,EAAE,MAAM,EAAGruB,EAAoB,CAAC,KAE1EquB,CACR,MAAW,CAEX,CAGH,OAAOpE,CACX,CAAG,EAED,OAAOhF,GAAiB,CACtB,GAAG73B,EACH,KAAM,CACJ,GAAGA,EAAW,KACd,UAAWghC,EACX,GAAID,EAAc,CAAE,MAAO,CAAE,SAAU,CAAC,uBAAuB,CAAC,CAAI,EAAG,EACxE,CACL,CAAG,CACH,CAEA,SAASH,GAAyB5gC,EAAY,CAC5C,MAAO,CAAC,CAACA,EAAW,QACtB,CAKA,SAASkhC,GAAa3xC,EAAOC,EAAM,CACjC,OAAID,EAAM,MAAQ,CAACA,EAAM,WAAa,CAACA,EAAM,UAAU,QAAU,CAACA,EAAM,UAAU,OAAO,OAChF,GAIL,GAAAC,EAAK,mBAAqBA,EAAK,kBAAkB,UAKvD,CAKA,SAAS2xC,GAAsBzL,EAAQnmC,EAAO,CAC5CmmC,EAAO,oBAAmB,EAC1BA,EAAO,UAAU,IACVnmC,EAAM,WAQXmmC,EAAO,kBAAkB,CACvB,KAAMzR,EAAU,OAChB,UAAW10B,EAAM,UAAY,IAC7B,KAAM,CACJ,IAAK,aACL,QAAS,CACP,UAAWA,EAAM,UACjB,KAAM,UACN,SAAU,kBACV,KAAM,CACJ,WAAYA,EAAM,QACnB,CACF,CACF,CACP,GAEW,IArBE,EAsBV,CACH,CAOA,SAAS6xC,GAA2B1L,EAAQnmC,EAAO,CAYjD,OAXImmC,EAAO,gBAAkB,UAMzBnmC,EAAM,UAAY4iB,IAKlB,CAAC5iB,EAAM,WAAaA,EAAM,KACrB,GAGFquC,GAAUlI,EAAO,WAAY,EAAC,eAAe,CACtD,CAKA,SAAS2L,GAA0B3L,EAAQ,CACzC,OAAO,OAAO,OACZ,CAACnmC,EAAOC,IAEF,CAACkmC,EAAO,UAAW,GAAIA,EAAO,SAAQ,EACjCnmC,EAGLywC,GAAczwC,CAAK,GAGrB,OAAOA,EAAM,YACNA,GAIL,CAAC6M,GAAa7M,CAAK,GAAK,CAAC2M,GAAmB3M,CAAK,GAAK,CAAC0wC,GAAgB1wC,CAAK,GAM5E,CADoBmmC,EAAO,+BAEtBnmC,EAGL0wC,GAAgB1wC,CAAK,GAGvBmmC,EAAO,MAAK,EACZnmC,EAAM,SAAS,SAAS,UAAYmmC,EAAO,aAAY,EAEvDyL,GAAsBzL,EAAQnmC,CAAK,EAC5BA,GAKL2xC,GAAa3xC,EAAOC,CAAI,GAAK,CAACkmC,EAAO,WAAU,EAAG,aAAa,mBACjE59B,GAAeC,EAAO,IAAI,sCAAuCxI,CAAK,EAC/D,QAMmB6xC,GAA2B1L,EAAQnmC,CAAK,GAInBmmC,EAAO,gBAAkB,aAGxEnmC,EAAM,KAAO,CAAE,GAAGA,EAAM,KAAM,SAAUmmC,EAAO,aAAY,IAGtDnmC,GAET,CAAE,GAAI,QAAU,CACpB,CACA,CAKA,SAAS+xC,GACP5L,EACA+D,EACA,CACA,OAAOA,EAAQ,IAAI,CAAC,CAAE,KAAAroC,EAAM,MAAA8oC,EAAO,IAAA0B,EAAK,KAAA9kC,EAAM,KAAAkW,KAAW,CACvD,MAAM5N,EAAWs2B,EAAO,kBAAkB,CACxC,KAAMzR,EAAU,OAChB,UAAWiW,EACX,KAAM,CACJ,IAAK,kBACL,QAAS,CACP,GAAI9oC,EACJ,YAAa0F,EACb,eAAgBojC,EAChB,aAAc0B,EACd,KAAA5uB,CACD,CACF,CACP,CAAK,EAGD,OAAO,OAAO5N,GAAa,SAAW,QAAQ,QAAQ,IAAI,EAAIA,CAClE,CAAG,CACH,CAEA,SAASmiC,GAAcv1B,EAAa,CAClC,KAAM,CAAE,KAAAiB,EAAM,GAAAC,CAAI,EAAGlB,EAEf7X,EAAM,KAAK,IAAG,EAAK,IAEzB,MAAO,CACL,KAAM,kBACN,MAAOA,EACP,IAAKA,EACL,KAAM+Y,EACN,KAAM,CACJ,SAAUD,CACX,CACL,CACA,CAKA,SAASu0B,GAA0B9L,EAAQ,CACzC,OAAQ1pB,GAAgB,CACtB,GAAI,CAAC0pB,EAAO,YACV,OAGF,MAAMr8B,EAASkoC,GAAcv1B,CAAW,EAEpC3S,IAAW,OAKfq8B,EAAO,WAAU,EAAG,KAAK,KAAKr8B,EAAO,IAAI,EACzCq8B,EAAO,oBAAmB,EAE1BA,EAAO,UAAU,KACf4L,GAAuB5L,EAAQ,CAACr8B,CAAM,CAAC,EAEhC,GACR,EACL,CACA,CAMA,SAASooC,GAAoB/L,EAAQt9B,EAAK,CAExC,OAAIN,GAAe49B,EAAO,WAAU,EAAG,aAAa,eAC3C,GAGFr2B,GAAmBjH,EAAK6H,EAAS,CAAE,CAC5C,CAGA,SAASyhC,GACPhM,EACAr8B,EACA,CACKq8B,EAAO,aAIRr8B,IAAW,OAIXooC,GAAoB/L,EAAQr8B,EAAO,IAAI,GAI3Cq8B,EAAO,UAAU,KACf4L,GAAuB5L,EAAQ,CAACr8B,CAAM,CAAC,EAIhC,GACR,EACH,CAGA,SAASsoC,GAAY50B,EAAM,CACzB,GAAI,CAACA,EACH,OAGF,MAAM60B,EAAc,IAAI,YAExB,GAAI,CACF,GAAI,OAAO70B,GAAS,SAClB,OAAO60B,EAAY,OAAO70B,CAAI,EAAE,OAGlC,GAAIA,aAAgB,gBAClB,OAAO60B,EAAY,OAAO70B,EAAK,SAAU,CAAA,EAAE,OAG7C,GAAIA,aAAgB,SAAU,CAC5B,MAAM80B,EAAcC,GAAmB/0B,CAAI,EAC3C,OAAO60B,EAAY,OAAOC,CAAW,EAAE,MACxC,CAED,GAAI90B,aAAgB,KAClB,OAAOA,EAAK,KAGd,GAAIA,aAAgB,YAClB,OAAOA,EAAK,UAIf,MAAW,CAEX,CAGH,CAGA,SAASg1B,GAAyB7tC,EAAQ,CACxC,GAAI,CAACA,EACH,OAGF,MAAM8tC,EAAO,SAAS9tC,EAAQ,EAAE,EAChC,OAAO,MAAM8tC,CAAI,EAAI,OAAYA,CACnC,CAGA,SAASC,GAAcl1B,EAAM,CAC3B,GAAI,CACF,GAAI,OAAOA,GAAS,SAClB,MAAO,CAACA,CAAI,EAGd,GAAIA,aAAgB,gBAClB,MAAO,CAACA,EAAK,SAAQ,CAAE,EAGzB,GAAIA,aAAgB,SAClB,MAAO,CAAC+0B,GAAmB/0B,CAAI,CAAC,EAGlC,GAAI,CAACA,EACH,MAAO,CAAC,MAAS,CAEpB,OAAQld,EAAO,CACd,OAAAiI,GAAeC,EAAO,UAAUlI,EAAO,2BAA4Bkd,CAAI,EAChE,CAAC,OAAW,kBAAkB,CACtC,CAED,OAAAjV,GAAeC,EAAO,KAAK,6CAA8CgV,CAAI,EAEtE,CAAC,OAAW,uBAAuB,CAC5C,CAGA,SAASm1B,GACPC,EACAC,EACA,CACA,GAAI,CAACD,EACH,MAAO,CACL,QAAS,CAAE,EACX,KAAM,OACN,MAAO,CACL,SAAU,CAACC,CAAO,CACnB,CACP,EAGE,MAAMC,EAAU,CAAE,GAAGF,EAAK,KAAK,EACzBG,EAAmBD,EAAQ,UAAY,GAC7C,OAAAA,EAAQ,SAAW,CAAC,GAAGC,EAAkBF,CAAO,EAEhDD,EAAK,MAAQE,EACNF,CACT,CAGA,SAASI,GACPnxC,EACA4b,EACA,CACA,GAAI,CAACA,EACH,OAAO,KAGT,KAAM,CAAE,eAAAP,EAAgB,aAAAC,EAAc,IAAAtU,EAAK,OAAAyU,EAAQ,WAAA/b,EAAY,QAAAqY,EAAS,SAAA/J,CAAU,EAAG4N,EAerF,MAbe,CACb,KAAA5b,EACA,MAAOqb,EAAiB,IACxB,IAAKC,EAAe,IACpB,KAAMtU,EACN,KAAMuD,GAAkB,CACtB,OAAAkR,EACA,WAAA/b,EACA,QAAAqY,EACA,SAAA/J,CACN,CAAK,CACL,CAGA,CAGA,SAASojC,GAAqCC,EAAU,CACtD,MAAO,CACL,QAAS,CAAE,EACX,KAAMA,EACN,MAAO,CACL,SAAU,CAAC,aAAa,CACzB,CACL,CACA,CAGA,SAASC,GACP/tC,EACA8tC,EACA11B,EACA,CACA,GAAI,CAAC01B,GAAY,OAAO,KAAK9tC,CAAO,EAAE,SAAW,EAC/C,OAGF,GAAI,CAAC8tC,EACH,MAAO,CACL,QAAA9tC,CACN,EAGE,GAAI,CAACoY,EACH,MAAO,CACL,QAAApY,EACA,KAAM8tC,CACZ,EAGE,MAAMN,EAAO,CACX,QAAAxtC,EACA,KAAM8tC,CACV,EAEQ,CAAE,KAAME,EAAgB,SAAAC,CAAQ,EAAKC,GAAqB91B,CAAI,EACpE,OAAAo1B,EAAK,KAAOQ,EACRC,GAAYA,EAAS,OAAS,IAChCT,EAAK,MAAQ,CACX,SAAAS,CACN,GAGST,CACT,CAGA,SAASW,GAAkBnuC,EAASouC,EAAgB,CAClD,OAAO,OAAO,QAAQpuC,CAAO,EAAE,OAAO,CAACquC,EAAiB,CAAC3zC,EAAK8N,CAAK,IAAM,CACvE,MAAM66B,EAAgB3oC,EAAI,cAE1B,OAAI0zC,EAAe,SAAS/K,CAAa,GAAKrjC,EAAQtF,CAAG,IACvD2zC,EAAgBhL,CAAa,EAAI76B,GAE5B6lC,CACR,EAAE,CAAE,CAAA,CACP,CAEA,SAASlB,GAAmBmB,EAAU,CAIpC,OAAO,IAAI,gBAAgBA,CAAQ,EAAE,SAAQ,CAC/C,CAEA,SAASJ,GAAqB91B,EAE7B,CACC,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAC3B,MAAO,CACL,KAAAA,CACN,EAGE,MAAMm2B,EAAmBn2B,EAAK,OAAS4F,GACjCwwB,EAAiBC,GAAmBr2B,CAAI,EAE9C,GAAIm2B,EAAkB,CACpB,MAAMG,EAAgBt2B,EAAK,MAAM,EAAG4F,EAAqB,EAEzD,OAAIwwB,EACK,CACL,KAAME,EACN,SAAU,CAAC,sBAAsB,CACzC,EAGW,CACL,KAAM,GAAGA,CAAa,IACtB,SAAU,CAAC,gBAAgB,CACjC,CACG,CAED,GAAIF,EACF,GAAI,CAEF,MAAO,CACL,KAFe,KAAK,MAAMp2B,CAAI,CAGtC,CACK,MAAY,CAEZ,CAGH,MAAO,CACL,KAAAA,CACJ,CACA,CAEA,SAASq2B,GAAmB3jC,EAAK,CAC/B,MAAM6jC,EAAQ7jC,EAAI,CAAC,EACb8jC,EAAO9jC,EAAIA,EAAI,OAAS,CAAC,EAG/B,OAAQ6jC,IAAU,KAAOC,IAAS,KAASD,IAAU,KAAOC,IAAS,GACvE,CAGA,SAASC,GAAWprC,EAAKqrC,EAAM,CAC7B,MAAMC,EAAUC,GAAWvrC,CAAG,EAE9B,OAAO6J,GAAyByhC,EAASD,CAAI,CAC/C,CAGA,SAASE,GAAWvrC,EAAKwrC,EAAU98B,EAAO,SAAS,QAAS,CAE1D,GAAI1O,EAAI,WAAW,SAAS,GAAKA,EAAI,WAAW,UAAU,GAAKA,EAAI,WAAW0O,EAAO,SAAS,MAAM,EAClG,OAAO1O,EAET,MAAMyrC,EAAW,IAAI,IAAIzrC,EAAKwrC,CAAO,EAGrC,GAAIC,EAAS,SAAW,IAAI,IAAID,CAAO,EAAE,OACvC,OAAOxrC,EAGT,MAAMsrC,EAAUG,EAAS,KAGzB,MAAI,CAACzrC,EAAI,SAAS,GAAG,GAAKsrC,EAAQ,SAAS,GAAG,EACrCA,EAAQ,MAAM,EAAG,EAAE,EAGrBA,CACT,CAMA,eAAeI,GACb9jC,EACAxQ,EACAyH,EAGA,CACA,GAAI,CACF,MAAM+V,EAAO,MAAM+2B,GAAkB/jC,EAAYxQ,EAAMyH,CAAO,EAGxDoC,EAASkpC,GAA4B,iBAAkBv1B,CAAI,EACjE00B,GAAqBzqC,EAAQ,OAAQoC,CAAM,CAC5C,OAAQxJ,EAAO,CACdiI,GAAeC,EAAO,UAAUlI,EAAO,oCAAoC,CAC5E,CACH,CAOA,SAASm0C,GACPhkC,EACAxQ,EACA,CACA,KAAM,CAAE,MAAAy0C,EAAO,SAAA7kC,CAAU,EAAG5P,EAEtBud,EAAOk3B,EAAQC,GAAwBD,CAAK,EAAI,OAChDE,EAAUxC,GAAY50B,CAAI,EAE1Bq3B,EAAUhlC,EAAW2iC,GAAyB3iC,EAAS,QAAQ,IAAI,gBAAgB,CAAC,EAAI,OAE1F+kC,IAAY,SACdnkC,EAAW,KAAK,kBAAoBmkC,GAElCC,IAAY,SACdpkC,EAAW,KAAK,mBAAqBokC,EAEzC,CAEA,eAAeL,GACb/jC,EACAxQ,EACAyH,EACA,CACA,MAAM9C,EAAM,KAAK,MACX,CAAE,eAAAsY,EAAiBtY,EAAK,aAAAuY,EAAevY,CAAG,EAAK3E,EAE/C,CACJ,IAAA4I,EACA,OAAAyU,EACA,YAAa/b,EAAa,EAC1B,kBAAmBuzC,EACnB,mBAAoBC,CACxB,EAAMtkC,EAAW,KAETukC,EACJf,GAAWprC,EAAKnB,EAAQ,sBAAsB,GAAK,CAACusC,GAAWprC,EAAKnB,EAAQ,qBAAqB,EAE7FkS,EAAUo7B,EACZC,GAAgBvtC,EAASzH,EAAK,MAAO60C,CAAe,EACpD7B,GAAqC6B,CAAe,EAClDjlC,EAAW,MAAMqlC,GAAiBF,EAAgBttC,EAASzH,EAAK,SAAU80C,CAAgB,EAEhG,MAAO,CACL,eAAA73B,EACA,aAAAC,EACA,IAAAtU,EACA,OAAAyU,EACA,WAAA/b,EACA,QAAAqY,EACA,SAAA/J,CACJ,CACA,CAEA,SAASolC,GACP,CAAE,qBAAAE,EAAsB,sBAAAC,CAAuB,EAC/CV,EACAI,EACA,CACA,MAAM1vC,EAAUsvC,EAAQW,GAAkBX,EAAOU,CAAqB,EAAI,GAE1E,GAAI,CAACD,EACH,OAAOhC,GAA8B/tC,EAAS0vC,EAAiB,MAAS,EAI1E,MAAMQ,EAAcX,GAAwBD,CAAK,EAC3C,CAACa,EAAS1C,CAAO,EAAIH,GAAc4C,CAAW,EAC9C73B,EAAO01B,GAA8B/tC,EAAS0vC,EAAiBS,CAAO,EAE5E,OAAI1C,EACKF,GAAal1B,EAAMo1B,CAAO,EAG5Bp1B,CACT,CAGA,eAAey3B,GACbF,EACA,CACE,qBAAAG,EACA,uBAAAK,CACD,EACD3lC,EACAklC,EACA,CACA,GAAI,CAACC,GAAkBD,IAAqB,OAC1C,OAAO9B,GAAqC8B,CAAgB,EAG9D,MAAM3vC,EAAUyK,EAAW4lC,GAAc5lC,EAAS,QAAS2lC,CAAsB,EAAI,GAErF,GAAI,CAAC3lC,GAAa,CAACslC,GAAwBJ,IAAqB,OAC9D,OAAO5B,GAA8B/tC,EAAS2vC,EAAkB,MAAS,EAG3E,KAAM,CAACW,EAAU7C,CAAO,EAAI,MAAM8C,GAAwB9lC,CAAQ,EAC5D/F,EAAS8rC,GAAgBF,EAAU,CACvC,qBAAAP,EAEA,iBAAAJ,EACA,eAAAC,EACA,QAAA5vC,CACJ,CAAG,EAED,OAAIytC,EACKF,GAAa7oC,EAAQ+oC,CAAO,EAG9B/oC,CACT,CAEA,SAAS8rC,GACPF,EACA,CACE,qBAAAP,EACA,iBAAAJ,EACA,eAAAC,EACA,QAAA5vC,CACD,EAGD,CACA,GAAI,CACF,MAAMqtC,EACJiD,GAAYA,EAAS,QAAUX,IAAqB,OAAY3C,GAAYsD,CAAQ,EAAIX,EAE1F,OAAKC,EAIDG,EACKhC,GAA8B/tC,EAASqtC,EAAMiD,CAAQ,EAGvDvC,GAA8B/tC,EAASqtC,EAAM,MAAS,EAPpDQ,GAAqCR,CAAI,CAQnD,OAAQnyC,EAAO,CACd,OAAAiI,GAAeC,EAAO,UAAUlI,EAAO,mCAAmC,EAEnE6yC,GAA8B/tC,EAAS2vC,EAAkB,MAAS,CAC1E,CACH,CAEA,eAAeY,GAAwB9lC,EAAU,CAC/C,MAAMgmC,EAAMC,GAAkBjmC,CAAQ,EAEtC,GAAI,CAACgmC,EACH,MAAO,CAAC,OAAW,kBAAkB,EAGvC,GAAI,CAEF,MAAO,CADM,MAAME,GAAoBF,CAAG,CAC9B,CACb,OAAQv1C,EAAO,CACd,OAAIA,aAAiB,OAASA,EAAM,QAAQ,QAAQ,SAAS,EAAI,IAC/DiI,GAAeC,EAAO,KAAK,2CAA2C,EAC/D,CAAC,OAAW,oBAAoB,IAGzCD,GAAeC,EAAO,UAAUlI,EAAO,uCAAuC,EACvE,CAAC,OAAW,kBAAkB,EACtC,CACH,CAEA,SAASq0C,GAAwBqB,EAAY,GAAI,CAE/C,GAAI,EAAAA,EAAU,SAAW,GAAK,OAAOA,EAAU,CAAC,GAAM,UAItD,OAAQA,EAAU,CAAC,EAAI,IACzB,CAEA,SAASP,GAAcrwC,EAASouC,EAAgB,CAC9C,MAAMyC,EAAa,CAAA,EAEnB,OAAAzC,EAAe,QAAQ7uC,GAAU,CAC3BS,EAAQ,IAAIT,CAAM,IACpBsxC,EAAWtxC,CAAM,EAAIS,EAAQ,IAAIT,CAAM,EAE7C,CAAG,EAEMsxC,CACT,CAEA,SAASZ,GAAkBW,EAAWxC,EAAgB,CACpD,OAAIwC,EAAU,SAAW,GAAK,OAAOA,EAAU,CAAC,GAAM,SAC7CE,GAAsBF,EAAU,CAAC,EAAIxC,CAAc,EAGxDwC,EAAU,SAAW,EAChBE,GAAsBF,EAAU,CAAC,EAAIxC,CAAc,EAGrD,EACT,CAEA,SAAS0C,GACPxB,EACAlB,EACA,CACA,GAAI,CAACkB,EACH,MAAO,GAGT,MAAMtvC,EAAUsvC,EAAM,QAEtB,OAAKtvC,EAIDA,aAAmB,QACdqwC,GAAcrwC,EAASouC,CAAc,EAI1C,MAAM,QAAQpuC,CAAO,EAChB,GAGFmuC,GAAkBnuC,EAASouC,CAAc,EAZvC,EAaX,CAEA,SAASsC,GAAkBjmC,EAAU,CACnC,GAAI,CAEF,OAAOA,EAAS,OACjB,OAAQvP,EAAO,CAEdiI,GAAeC,EAAO,UAAUlI,EAAO,+BAA+B,CACvE,CACH,CAOA,SAASy1C,GAAoBlmC,EAAU,CACrC,OAAO,IAAI,QAAQ,CAACnM,EAASC,IAAW,CACtC,MAAMH,EAAUykC,GAAa,IAAMtkC,EAAO,IAAI,MAAM,4CAA4C,CAAC,EAAG,GAAG,EAEvGwyC,GAAiBtmC,CAAQ,EACtB,KACCumC,GAAO1yC,EAAQ0yC,CAAG,EAClB1rC,GAAU/G,EAAO+G,CAAM,CACxB,EACA,QAAQ,IAAM,aAAalH,CAAO,CAAC,CAC1C,CAAG,CACH,CAEA,eAAe2yC,GAAiBtmC,EAAU,CAGxC,OAAO,MAAMA,EAAS,MACxB,CAMA,eAAewmC,GACb5lC,EACAxQ,EACAyH,EACA,CACA,GAAI,CACF,MAAM+V,EAAO64B,GAAgB7lC,EAAYxQ,EAAMyH,CAAO,EAGhDoC,EAASkpC,GAA4B,eAAgBv1B,CAAI,EAC/D00B,GAAqBzqC,EAAQ,OAAQoC,CAAM,CAC5C,OAAQxJ,EAAO,CACdiI,GAAeC,EAAO,UAAUlI,EAAO,kCAAkC,CAC1E,CACH,CAOA,SAASi2C,GACP9lC,EACAxQ,EACA,CACA,KAAM,CAAE,IAAA4e,EAAK,MAAA61B,CAAO,EAAGz0C,EAEvB,GAAI,CAAC4e,EACH,OAGF,MAAM+1B,EAAUxC,GAAYsC,CAAK,EAC3BG,EAAUh2B,EAAI,kBAAkB,gBAAgB,EAClD2zB,GAAyB3zB,EAAI,kBAAkB,gBAAgB,CAAC,EAChE23B,GAAa33B,EAAI,SAAUA,EAAI,YAAY,EAE3C+1B,IAAY,SACdnkC,EAAW,KAAK,kBAAoBmkC,GAElCC,IAAY,SACdpkC,EAAW,KAAK,mBAAqBokC,EAEzC,CAEA,SAASyB,GACP7lC,EACAxQ,EACAyH,EACA,CACA,MAAM9C,EAAM,KAAK,MACX,CAAE,eAAAsY,EAAiBtY,EAAK,aAAAuY,EAAevY,EAAK,MAAA8vC,EAAO,IAAA71B,CAAK,EAAG5e,EAE3D,CACJ,IAAA4I,EACA,OAAAyU,EACA,YAAa/b,EAAa,EAC1B,kBAAmBuzC,EACnB,mBAAoBC,CACxB,EAAMtkC,EAAW,KAEf,GAAI,CAAC5H,EACH,OAAO,KAGT,GAAI,CAACgW,GAAO,CAACo1B,GAAWprC,EAAKnB,EAAQ,sBAAsB,GAAKusC,GAAWprC,EAAKnB,EAAQ,qBAAqB,EAAG,CAC9G,MAAMkS,EAAUq5B,GAAqC6B,CAAe,EAC9DjlC,EAAWojC,GAAqC8B,CAAgB,EACtE,MAAO,CACL,eAAA73B,EACA,aAAAC,EACA,IAAAtU,EACA,OAAAyU,EACA,WAAA/b,EACA,QAAAqY,EACA,SAAA/J,CACN,CACG,CAED,MAAM4mC,EAAU53B,EAAIxB,EAAmB,EACjC+3B,EAAwBqB,EAC1BlD,GAAkBkD,EAAQ,gBAAiB/uC,EAAQ,qBAAqB,EACxE,GACE8tC,EAAyBjC,GAAkBmD,GAAmB73B,CAAG,EAAGnX,EAAQ,sBAAsB,EAElG,CAAC4tC,EAAaqB,CAAc,EAAIjvC,EAAQ,qBAAuBgrC,GAAcgC,CAAK,EAAI,CAAC,MAAS,EAChG,CAACkC,EAAcC,CAAe,EAAInvC,EAAQ,qBAAuBovC,GAAoBj4B,CAAG,EAAI,CAAC,MAAS,EAEtGjF,EAAUu5B,GAA8BiC,EAAuBN,EAAiBQ,CAAW,EAC3FzlC,EAAWsjC,GAA8BqC,EAAwBT,EAAkB6B,CAAY,EAErG,MAAO,CACL,eAAA15B,EACA,aAAAC,EACA,IAAAtU,EACA,OAAAyU,EACA,WAAA/b,EACA,QAASo1C,EAAiBhE,GAAa/4B,EAAS+8B,CAAc,EAAI/8B,EAClE,SAAUi9B,EAAkBlE,GAAa9iC,EAAUgnC,CAAe,EAAIhnC,CAC1E,CACA,CAEA,SAAS6mC,GAAmB73B,EAAK,CAC/B,MAAMzZ,EAAUyZ,EAAI,wBAEpB,OAAKzZ,EAIEA,EAAQ,MAAM;AAAA,CAAM,EAAE,OAAO,CAAC2xC,EAAKp8B,IAAS,CACjD,KAAM,CAAC7a,EAAK8N,CAAK,EAAI+M,EAAK,MAAM,IAAI,EACpC,OAAI/M,IACFmpC,EAAIj3C,EAAI,YAAa,CAAA,EAAI8N,GAEpBmpC,CACR,EAAE,CAAE,CAAA,EATI,EAUX,CAEA,SAASD,GAAoBj4B,EAAK,CAEhC,MAAMm4B,EAAS,CAAA,EAEf,GAAI,CACF,MAAO,CAACn4B,EAAI,YAAY,CACzB,OAAQ1Q,EAAG,CACV6oC,EAAO,KAAK7oC,CAAC,CACd,CAGD,GAAI,CACF,OAAO8oC,GAAkBp4B,EAAI,SAAUA,EAAI,YAAY,CACxD,OAAQ1Q,EAAG,CACV6oC,EAAO,KAAK7oC,CAAC,CACd,CAED,OAAA5F,GAAeC,EAAO,KAAK,kCAAmC,GAAGwuC,CAAM,EAEhE,CAAC,MAAS,CACnB,CAaA,SAASC,GACPz5B,EACA05B,EACA,CACA,GAAI,CACF,GAAI,OAAO15B,GAAS,SAClB,MAAO,CAACA,CAAI,EAGd,GAAIA,aAAgB,SAClB,MAAO,CAACA,EAAK,KAAK,SAAS,EAG7B,GAAI05B,IAAiB,QAAU15B,GAAQ,OAAOA,GAAS,SACrD,MAAO,CAAC,KAAK,UAAUA,CAAI,CAAC,EAG9B,GAAI,CAACA,EACH,MAAO,CAAC,MAAS,CAEpB,OAAQld,EAAO,CACd,OAAAiI,GAAeC,EAAO,UAAUlI,EAAO,2BAA4Bkd,CAAI,EAChE,CAAC,OAAW,kBAAkB,CACtC,CAED,OAAAjV,GAAeC,EAAO,KAAK,6CAA8CgV,CAAI,EAEtE,CAAC,OAAW,uBAAuB,CAC5C,CAEA,SAASg5B,GACPh5B,EACA05B,EACA,CACA,GAAI,CACF,MAAM3B,EAAU2B,IAAiB,QAAU15B,GAAQ,OAAOA,GAAS,SAAW,KAAK,UAAUA,CAAI,EAAIA,EACrG,OAAO40B,GAAYmD,CAAO,CAC3B,MAAY,CACX,MACD,CACH,CAQA,SAAS4B,GAAyBhR,EAAQ,CACxC,MAAMh+B,EAASuI,IAEf,GAAI,CACF,KAAM,CACJ,uBAAA0mC,EACA,sBAAAC,EACA,qBAAAlC,EACA,sBAAAC,EACA,uBAAAI,CACN,EAAQrP,EAAO,aAELz+B,EAAU,CACd,OAAAy+B,EACA,uBAAAiR,EACA,sBAAAC,EACA,qBAAAlC,EACA,sBAAAC,EACA,uBAAAI,CACN,EAEQrtC,GACFA,EAAO,GAAG,sBAAuB,CAACsI,EAAYxQ,IAASq3C,GAA2B5vC,EAAS+I,EAAYxQ,CAAI,CAAC,CAE/G,MAAY,CAEZ,CACH,CAGA,SAASq3C,GACP5vC,EACA+I,EACAxQ,EACA,CACA,GAAKwQ,EAAW,KAIhB,GAAI,CACE8mC,GAAiB9mC,CAAU,GAAK+mC,GAAWv3C,CAAI,IAIjDs2C,GAAoB9lC,EAAYxQ,CAAI,EAIpCo2C,GAA6B5lC,EAAYxQ,EAAMyH,CAAO,GAGpD+vC,GAAmBhnC,CAAU,GAAKinC,GAAaz3C,CAAI,IAIrDw0C,GAAsBhkC,EAAYxQ,CAAI,EAItCs0C,GAA+B9jC,EAAYxQ,EAAMyH,CAAO,EAE3D,OAAQyG,EAAG,CACV5F,GAAeC,EAAO,UAAU2F,EAAG,yCAAyC,CAC7E,CACH,CAEA,SAASopC,GAAiB9mC,EAAY,CACpC,OAAOA,EAAW,WAAa,KACjC,CAEA,SAASgnC,GAAmBhnC,EAAY,CACtC,OAAOA,EAAW,WAAa,OACjC,CAEA,SAAS+mC,GAAWv3C,EAAM,CACxB,OAAOA,GAAQA,EAAK,GACtB,CAEA,SAASy3C,GAAaz3C,EAAM,CAC1B,OAAOA,GAAQA,EAAK,QACtB,CAKA,SAAS03C,GAAmBxR,EAAQ,CAElC,MAAMh+B,EAASuI,IAEfkH,GAAuC8wB,GAAkBvC,CAAM,CAAC,EAChE/pB,GAAiC61B,GAA0B9L,CAAM,CAAC,EAClEgL,GAAkBhL,CAAM,EACxBgR,GAAyBhR,CAAM,EAI/B,MAAMp8B,EAAiB+nC,GAA0B3L,CAAM,EACvDyR,GAAkB7tC,CAAc,EAG5B5B,IACFA,EAAO,GAAG,kBAAmB6oC,GAAsB7K,CAAM,CAAC,EAC1Dh+B,EAAO,GAAG,iBAAkBwoC,GAAqBxK,CAAM,CAAC,EACxDh+B,EAAO,GAAG,YAAcgE,GAAQ,CAC9B,MAAM0rC,EAAW1R,EAAO,eAEpB0R,GAAY1R,EAAO,UAAW,GAAIA,EAAO,gBAAkB,WAErCA,EAAO,iCAE7Bh6B,EAAI,UAAY0rC,EAG1B,CAAK,EAED1vC,EAAO,GAAG,YAAaqG,GAAQ,CAC7B23B,EAAO,eAAiB33B,CAC9B,CAAK,EAIDrG,EAAO,GAAG,UAAWqG,GAAQ,CAC3B23B,EAAO,eAAiB33B,CAC9B,CAAK,EAGDrG,EAAO,GAAG,qBAAsB,CAAC2vC,EAAepwC,IAAY,CAC1D,MAAMmwC,EAAW1R,EAAO,eACpBz+B,GAAWA,EAAQ,eAAiBy+B,EAAO,UAAW,GAAI0R,GAExDC,EAAc,UAAYA,EAAc,SAAS,WACnDA,EAAc,SAAS,SAAS,UAAYD,EAGtD,CAAK,EAEL,CAMA,eAAeE,GAAe5R,EAAQ,CAEpC,GAAI,CACF,OAAO,QAAQ,IACb4L,GAAuB5L,EAAQ,CAE7B6R,GAAkBzgC,EAAO,YAAY,MAAM,CACnD,CAAO,CACP,CACG,MAAe,CAEd,MAAO,EACR,CACH,CAEA,SAASygC,GAAkBC,EAAa,CACtC,KAAM,CAAE,gBAAAC,EAAiB,gBAAAC,EAAiB,eAAAC,CAAc,EAAKH,EAGvD1N,EAAO,KAAK,IAAG,EAAK,IAC1B,MAAO,CACL,KAAM,SACN,KAAM,SACN,MAAOA,EACP,IAAKA,EACL,KAAM,CACJ,OAAQ,CACN,gBAAA2N,EACA,gBAAAC,EACA,eAAAC,CACD,CACF,CACL,CACA,CAoBA,SAASC,GAASl+B,EAAMsX,EAAM/pB,EAAS,CACrC,IAAI4wC,EAEAC,EACAC,EAEJ,MAAMC,EAAU/wC,GAAWA,EAAQ,QAAU,KAAK,IAAIA,EAAQ,QAAS+pB,CAAI,EAAI,EAE/E,SAASinB,GAAa,CACpB,OAAAC,IACAL,EAAsBn+B,EAAI,EACnBm+B,CACR,CAED,SAASK,GAAe,CACtBJ,IAAY,QAAa,aAAaA,CAAO,EAC7CC,IAAe,QAAa,aAAaA,CAAU,EACnDD,EAAUC,EAAa,MACxB,CAED,SAASrpC,GAAQ,CACf,OAAIopC,IAAY,QAAaC,IAAe,OACnCE,EAAU,EAEZJ,CACR,CAED,SAASM,GAAY,CACnB,OAAIL,GACF,aAAaA,CAAO,EAEtBA,EAAUtQ,GAAayQ,EAAYjnB,CAAI,EAEnCgnB,GAAWD,IAAe,SAC5BA,EAAavQ,GAAayQ,EAAYD,CAAO,GAGxCH,CACR,CAED,OAAAM,EAAU,OAASD,EACnBC,EAAU,MAAQzpC,EACXypC,CACT,CAOA,SAASC,GAAuB1S,EAAQ,CACtC,IAAI2S,EAAgB,GAEpB,MAAO,CAAC94C,EAAO+4C,IAAgB,CAE7B,GAAI,CAAC5S,EAAO,+BAAgC,CAC1C59B,GAAeC,EAAO,KAAK,8CAA8C,EAEzE,MACD,CAID,MAAM87B,EAAayU,GAAe,CAACD,EACnCA,EAAgB,GAEZ3S,EAAO,eACTgC,GAAqChC,EAAO,cAAenmC,CAAK,EAIlEmmC,EAAO,UAAU,IAAM,CAYrB,GANIA,EAAO,gBAAkB,UAAY7B,GACvC6B,EAAO,gBAAe,EAKpB,CAAC8J,GAAa9J,EAAQnmC,EAAOskC,CAAU,EAEzC,MAAO,GAKT,GAAI,CAACA,EACH,MAAO,GAGT,MAAM76B,EAAU08B,EAAO,QAevB,GAJA6S,GAAiB7S,EAAQ7B,CAAU,EAI/B6B,EAAO,gBAAkB,UAAY18B,GAAW08B,EAAO,YAAa,CACtE,MAAM8S,EAAgB9S,EAAO,YAAY,qBAAoB,EACzD8S,IACF1wC,GACEC,EAAO,KAAK,8DAA8D,IAAI,KAAKywC,CAAa,CAAC,EAAE,EAErGxvC,EAAQ,QAAUwvC,EAEd9S,EAAO,WAAY,EAAC,eACtByI,GAAYnlC,CAAO,EAGxB,CAQD,OAAIA,GAAWA,EAAQ,mBAInB08B,EAAO,gBAAkB,WAQtBA,EAAO,QAGP,EACb,CAAK,CACL,CACA,CAKA,SAAS+S,GAAmB/S,EAAQ,CAClC,MAAMz+B,EAAUy+B,EAAO,aACvB,MAAO,CACL,KAAMzR,EAAU,OAChB,UAAW,KAAK,IAAK,EACrB,KAAM,CACJ,IAAK,UACL,QAAS,CACP,mBAAoByR,EAAO,kBAAmB,EAC9C,kBAAmBz+B,EAAQ,kBAC3B,gBAAiBA,EAAQ,gBACzB,qBAAsBA,EAAQ,eAC9B,cAAeA,EAAQ,cACvB,YAAaA,EAAQ,YACrB,cAAeA,EAAQ,cACvB,eAAgBy+B,EAAO,YAAcA,EAAO,YAAY,OAAS,SAAW,GAC5E,qBAAsBz+B,EAAQ,uBAAuB,OAAS,EAC9D,qBAAsBA,EAAQ,qBAC9B,yBAA0BA,EAAQ,sBAAsB,OAAS,EACjE,0BAA2BA,EAAQ,uBAAuB,OAAS,CACpE,CACF,CACL,CACA,CAMA,SAASsxC,GAAiB7S,EAAQ7B,EAAY,CAExC,CAACA,GAAc,CAAC6B,EAAO,SAAWA,EAAO,QAAQ,YAAc,GAInE8J,GAAa9J,EAAQ+S,GAAmB/S,CAAM,EAAG,EAAK,CACxD,CAKA,SAASgT,IAAwC,CAE/C,MAAMhtC,EAAM0C,GAAe,EAAG,sBAAqB,EAAG,IAClD1C,GACF,OAAOA,EAAI,UAIb,MAAMitC,EAAaC,KACnB,GAAID,EAAY,CACd,MAAMjtC,EAAMmtC,GAAkCF,CAAU,EACxD,OAAQjtC,EAAM,SACf,CACH,CAMA,SAASotC,GACPC,EACAC,EACAr1C,EACAqC,EACA,CACA,OAAOjC,GACLk1C,GAA2BF,EAAaG,GAAgCH,CAAW,EAAG/yC,EAAQrC,CAAG,EACjG,CACE,CAAC,CAAE,KAAM,cAAgB,EAAEo1C,CAAW,EACtC,CACE,CACE,KAAM,mBAIN,OACE,OAAOC,GAAkB,SAAW,IAAI,YAAa,EAAC,OAAOA,CAAa,EAAE,OAASA,EAAc,MACtG,EACDA,CACD,CACF,CACL,CACA,CAKA,SAASG,GAAqB,CAC5B,cAAAH,EACA,QAAAr0C,CACF,EAEE,CACA,IAAIy0C,EAGJ,MAAMC,EAAgB,GAAG,KAAK,UAAU10C,CAAO,CAAC;AAAA,EAGhD,GAAI,OAAOq0C,GAAkB,SAC3BI,EAAsB,GAAGC,CAAa,GAAGL,CAAa,OACjD,CAGL,MAAMM,EAFM,IAAI,cAEK,OAAOD,CAAa,EAEzCD,EAAsB,IAAI,WAAWE,EAAS,OAASN,EAAc,MAAM,EAC3EI,EAAoB,IAAIE,CAAQ,EAChCF,EAAoB,IAAIJ,EAAeM,EAAS,MAAM,CACvD,CAED,OAAOF,CACT,CAKA,eAAeG,GAAmB,CAChC,OAAA7xC,EACA,MAAAW,EACA,SAAUmxC,EACV,MAAAj6C,CACF,EAEE,CACA,MAAMoH,EACJ,OAAOe,EAAO,eAAkB,UAAYA,EAAO,gBAAkB,MAAQ,CAAC,MAAM,QAAQA,EAAO,aAAa,EAC5G,OAAO,KAAKA,EAAO,aAAa,EAChC,OAEA+xC,EAAY,CAAE,SAAAD,EAAU,aAAA7yC,GAE9Be,EAAO,KAAK,kBAAmBnI,EAAOk6C,CAAS,EAE/C,MAAMC,EAAiB,MAAMtuC,GAC3B1D,EAAO,WAAY,EACnBnI,EACAk6C,EACApxC,EACAX,EACAyD,GAAmB,CACvB,EAGE,GAAI,CAACuuC,EACH,OAAO,KAMTA,EAAc,SAAWA,EAAc,UAAY,aAGnD,MAAM9pC,EAAWlI,EAAO,iBAClB,CAAE,KAAAZ,EAAM,QAAA6yC,CAAS,EAAI/pC,GAAYA,EAAS,KAAQ,GAExD,OAAA8pC,EAAc,IAAM,CAClB,GAAGA,EAAc,IACjB,KAAM5yC,GAAQ,4BACd,QAAS6yC,GAAW,OACxB,EAESD,CACT,CAKA,eAAeE,GAAkB,CAC/B,cAAAZ,EACA,SAAA5B,EACA,UAAWyC,EACX,aAAAC,EACA,UAAAl2C,EACA,QAAAoF,CACF,EAAG,CACD,MAAM+wC,EAAwBZ,GAAqB,CACjD,cAAAH,EACA,QAAS,CACP,WAAAa,CACD,CACL,CAAG,EAEK,CAAE,KAAApG,EAAM,SAAAuG,EAAU,SAAAC,EAAU,iBAAAC,CAAgB,EAAKJ,EAEjDpyC,EAASuI,IACT5H,EAAQ+F,KACRlF,EAAYxB,GAAUA,EAAO,aAAY,EACzC/D,EAAM+D,GAAUA,EAAO,OAAM,EAEnC,GAAI,CAACA,GAAU,CAACwB,GAAa,CAACvF,GAAO,CAACqF,EAAQ,QAC5C,OAAO1F,GAAoB,CAAA,CAAE,EAG/B,MAAM62C,EAAY,CAChB,KAAMj4B,GACN,uBAAwBg4B,EAAmB,IAC3C,UAAWt2C,EAAY,IACvB,UAAWo2C,EACX,UAAWC,EACX,KAAAxG,EACA,UAAW2D,EACX,WAAAyC,EACA,YAAa7wC,EAAQ,OACzB,EAEQ+vC,EAAc,MAAMQ,GAAmB,CAAE,MAAAlxC,EAAO,OAAAX,EAAQ,SAAA0vC,EAAU,MAAO+C,CAAS,CAAE,EAE1F,GAAI,CAACpB,EAEH,OAAArxC,EAAO,mBAAmB,kBAAmB,SAAUyyC,CAAS,EAChEryC,GAAeC,EAAO,KAAK,0DAA0D,EAC9EzE,GAAoB,CAAA,CAAE,EAyC/B,OAAOy1C,EAAY,sBAEnB,MAAMtuC,EAAWquC,GAAqBC,EAAagB,EAAuBp2C,EAAK+D,EAAO,aAAa,MAAM,EAEzG,IAAI0H,EAEJ,GAAI,CACFA,EAAW,MAAMlG,EAAU,KAAKuB,CAAQ,CACzC,OAAQsjB,EAAK,CACZ,MAAMluB,EAAQ,IAAI,MAAMsiB,EAAqB,EAE7C,GAAI,CAGFtiB,EAAM,MAAQkuB,CACf,MAAW,CAEX,CACD,MAAMluB,CACP,CAGD,GAAI,OAAOuP,EAAS,YAAe,WAAaA,EAAS,WAAa,KAAOA,EAAS,YAAc,KAClG,MAAM,IAAIgrC,GAAyBhrC,EAAS,UAAU,EAGxD,MAAMX,EAAa/J,GAAiB,CAAE,EAAE0K,CAAQ,EAChD,GAAI3K,GAAcgK,EAAY,QAAQ,EACpC,MAAM,IAAI4rC,GAAe5rC,CAAU,EAGrC,OAAOW,CACT,CAKA,MAAMgrC,WAAiC,KAAM,CAC1C,YAAYt5C,EAAY,CACvB,MAAM,kCAAkCA,CAAU,EAAE,CACrD,CACH,CAKA,MAAMu5C,WAAuB,KAAM,CAEhC,YAAY5rC,EAAY,CACvB,MAAM,gBAAgB,EACtB,KAAK,WAAaA,CACnB,CACH,CAKA,eAAe6rC,GACbC,EACAC,EAAc,CACZ,MAAO,EACP,SAAU/3B,EACX,EACD,CACA,KAAM,CAAE,cAAAu2B,EAAe,QAAAyB,CAAS,EAAGF,EAGnC,GAAKvB,EAAc,OAInB,GAAI,CACF,aAAMY,GAAkBW,CAAU,EAC3B,EACR,OAAQxsB,EAAK,CACZ,GAAIA,aAAeqsB,IAA4BrsB,aAAessB,GAC5D,MAAMtsB,EAcR,GAVA2sB,GAAW,UAAW,CACpB,YAAaF,EAAY,KAC/B,CAAK,EAEGC,GACFA,EAAQ1sB,CAAG,EAKTysB,EAAY,OAAS93B,GAAiB,CACxC,MAAM7iB,EAAQ,IAAI,MAAM,GAAGsiB,EAAqB,yBAAyB,EAEzE,GAAI,CAGFtiB,EAAM,MAAQkuB,CACf,MAAW,CAEX,CAED,MAAMluB,CACP,CAGD,OAAA26C,EAAY,UAAY,EAAEA,EAAY,MAE/B,IAAI,QAAQ,CAACv3C,EAASC,IAAW,CACtCskC,GAAa,SAAY,CACvB,GAAI,CACF,MAAM8S,GAAWC,EAAYC,CAAW,EACxCv3C,EAAQ,EAAI,CACb,OAAQ8qB,EAAK,CACZ7qB,EAAO6qB,CAAG,CACX,CACT,EAASysB,EAAY,QAAQ,CAC7B,CAAK,CACF,CACH,CAEA,MAAMG,GAAY,cACZC,GAAU,YAWhB,SAASC,GACPr8B,EACAs8B,EACAC,EACA,CACA,MAAM53C,EAAU,IAAI,IAEd63C,EAAY72C,GAAQ,CACxB,MAAMm0B,EAAYn0B,EAAM42C,EACxB53C,EAAQ,QAAQ,CAAConB,EAAQlrB,IAAQ,CAC3BA,EAAMi5B,GACRn1B,EAAQ,OAAO9D,CAAG,CAE1B,CAAK,CACL,EAEQ47C,EAAiB,IACd,CAAC,GAAG93C,EAAQ,OAAM,CAAE,EAAE,OAAO,CAACgnB,EAAGiW,IAAMjW,EAAIiW,EAAG,CAAC,EAGxD,IAAI8a,EAAc,GAElB,MAAO,IAAI3wC,IAAS,CAElB,MAAMpG,EAAM,KAAK,MAAM,KAAK,IAAG,EAAK,GAAI,EAMxC,GAHA62C,EAAS72C,CAAG,EAGR82C,EAAgB,GAAIH,EAAU,CAChC,MAAMK,EAAeD,EACrB,OAAAA,EAAc,GACPC,EAAeP,GAAUD,EACjC,CAEDO,EAAc,GACd,MAAM/wC,EAAQhH,EAAQ,IAAIgB,CAAG,GAAK,EAClC,OAAAhB,EAAQ,IAAIgB,EAAKgG,EAAQ,CAAC,EAEnBqU,EAAG,GAAGjU,CAAI,CACrB,CACA,CAOA,MAAM6wC,EAAiB,CAqDpB,YAAY,CACX,QAAAn0C,EACA,iBAAAo0C,CACD,EAED,CAACD,GAAgB,UAAU,OAAO,KAAK,IAAI,EAAEA,GAAgB,UAAU,QAAQ,KAAK,IAAI,EAAEA,GAAgB,UAAU,QAAQ,KAAK,IAAI,EAAEA,GAAgB,UAAU,QAAQ,KAAK,IAAI,EAAEA,GAAgB,UAAU,QAAQ,KAAK,IAAI,EAAEA,GAAgB,UAAU,QAAQ,KAAK,IAAI,EAC1Q,KAAK,YAAc,KACnB,KAAK,mBAAqB,GAC1B,KAAK,yBAA2B,GAChC,KAAK,cAAgB,UACrB,KAAK,SAAW,CACd,iBAAkBh5B,GAClB,kBAAmBC,EACzB,EACI,KAAK,cAAgB,KAAK,MAC1B,KAAK,WAAa,GAClB,KAAK,UAAY,GACjB,KAAK,qBAAuB,GAC5B,KAAK,6BAA+B,GACpC,KAAK,SAAW,CACd,SAAU,IAAI,IACd,SAAU,IAAI,IACd,KAAM,CAAE,EACR,iBAAkB,KAAK,IAAK,EAC5B,WAAY,EAClB,EAEI,KAAK,kBAAoBg5B,EACzB,KAAK,SAAWp0C,EAEhB,KAAK,gBAAkB2wC,GAAS,IAAM,KAAK,SAAU,KAAK,SAAS,cAAe,CAChF,QAAS,KAAK,SAAS,aAC7B,CAAK,EAED,KAAK,mBAAqBiD,GACxB,CAACt7C,EAAOskC,IAAe8L,GAAS,KAAMpwC,EAAOskC,CAAU,EAEvD,IAEA,CACN,EAEI,KAAM,CAAE,iBAAAyX,EAAkB,yBAAAC,CAA0B,EAAG,KAAK,WAAU,EAEhE9U,EAAkB6U,EACpB,CACE,UAAW,KAAK,IAAIz4B,GAAsBy4B,CAAgB,EAC1D,QAASA,EACT,cAAex4B,GACf,eAAgBy4B,EAA2BA,EAAyB,KAAK,GAAG,EAAI,EACjF,EACD,OAOJ,GALI9U,IACF,KAAK,cAAgB,IAAID,GAAc,KAAMC,CAAe,GAI1D3+B,EAAa,CACf,MAAM0zC,EAAcv0C,EAAQ,aAC5Bc,EAAO,UAAU,CACf,kBAAmB,CAAC,CAACyzC,EAAY,kBACjC,eAAgB,CAAC,CAACA,EAAY,cACtC,CAAO,CACF,CACF,CAGA,YAAa,CACZ,OAAO,KAAK,QACb,CAGA,WAAY,CACX,OAAO,KAAK,UACb,CAGA,UAAW,CACV,OAAO,KAAK,SACb,CAKA,mBAAoB,CACnB,MAAO,EAAQ,KAAK,OACrB,CAGA,YAAa,CACZ,OAAO,KAAK,QACb,CAGA,gBAAgB37C,EAAO,CACtBiI,GAAeC,EAAO,UAAUlI,CAAK,EACjC,KAAK,SAAS,SAChB,KAAK,SAAS,QAAQA,CAAK,CAE9B,CAMA,mBAAmBquC,EAAmB,CACrC,KAAM,CAAE,gBAAAuN,EAAiB,kBAAApN,GAAsB,KAAK,SAI9CqN,EAAsBD,GAAmB,GAAKpN,GAAqB,EAIzE,GAFA,KAAK,qBAAuBqN,EAExB,CAAAA,EAQJ,IAFA,KAAK,8BAA8BxN,CAAiB,EAEhD,CAAC,KAAK,QAAS,CAEjBpmC,GAAeC,EAAO,UAAU,IAAI,MAAM,yCAAyC,CAAC,EACpF,MACD,CAEG,KAAK,QAAQ,UAAY,KAQ7B,KAAK,cAAgB,KAAK,QAAQ,UAAY,UAAY,KAAK,QAAQ,YAAc,EAAI,SAAW,UAEpGD,GAAeC,EAAO,SAAS,sBAAsB,KAAK,aAAa,OAAO,EAE9E,KAAK,qBAAoB,GAC1B,CASA,OAAQ,CACP,GAAI,KAAK,YAAc,KAAK,gBAAkB,UAAW,CACvDD,GAAeC,EAAO,KAAK,kCAAkC,EAC7D,MACD,CAED,GAAI,KAAK,YAAc,KAAK,gBAAkB,SAAU,CACtDD,GAAeC,EAAO,KAAK,6DAA6D,EACxF,MACD,CAEDD,GAAeC,EAAO,SAAS,iCAAiC,EAMhE,KAAK,oBAAmB,EAExB,MAAMiB,EAAUomC,GACd,CACE,kBAAmB,KAAK,SAAS,kBACjC,kBAAmB,KAAK,SAAS,iBAClC,EACD,CACE,cAAe,KAAK,SAAS,cAE7B,kBAAmB,EACnB,eAAgB,EACjB,CACP,EAEI,KAAK,QAAUpmC,EAEf,KAAK,qBAAoB,CAC1B,CAMA,gBAAiB,CAChB,GAAI,KAAK,WAAY,CACnBlB,GAAeC,EAAO,KAAK,6DAA6D,EACxF,MACD,CAEDD,GAAeC,EAAO,SAAS,gCAAgC,EAE/D,MAAMiB,EAAUomC,GACd,CACE,kBAAmB,KAAK,SAAS,kBACjC,kBAAmB,KAAK,SAAS,iBAClC,EACD,CACE,cAAe,KAAK,SAAS,cAC7B,kBAAmB,EACnB,eAAgB,EACjB,CACP,EAEI,KAAK,QAAUpmC,EAEf,KAAK,cAAgB,SACrB,KAAK,qBAAoB,CAC1B,CAOA,gBAAiB,CAChB,GAAI,CACF,MAAM2yC,EAAgB,KAAK,QAE3B,KAAK,eAAiBlZ,GAAO,CAC3B,GAAG,KAAK,kBAIR,GAAI,KAAK,gBAAkB,SACvB,CAAE,iBAAkBjgB,EAAsB,EAQ1C,KAAK,SAAS,aAAa,oBAAsB,CAE/C,iBAAkB,KAAK,IAAI,KAAQ,KAAK,SAAS,aAAa,kBAAkB,CAC9F,EACQ,KAAM41B,GAAuB,IAAI,EACjC,WAAY,KAAK,mBACjB,GAAIuD,EACA,CACE,aAAcA,EAAc,aAC5B,iBAAkBA,EAAc,iBAChC,SAAUA,EAAc,SACxB,eAAgBA,EAAc,cAC/B,EACD,EACZ,CAAO,CACF,OAAQ5tB,EAAK,CACZ,KAAK,gBAAgBA,CAAG,CACzB,CACF,CAQA,eAAgB,CACf,GAAI,CACF,OAAI,KAAK,iBACP,KAAK,eAAc,EACnB,KAAK,eAAiB,QAGjB,EACR,OAAQA,EAAK,CACZ,YAAK,gBAAgBA,CAAG,EACjB,EACR,CACF,CAMA,MAAM,KAAK,CAAE,WAAA6tB,EAAa,GAAO,OAAA3xC,CAAM,EAAK,CAAA,EAAI,CAC/C,GAAK,KAAK,WAMV,MAAK,WAAa,GAElB,GAAI,CACFnC,GAAeC,EAAO,KAAK,kBAAkBkC,EAAS,iBAAiBA,CAAM,GAAK,EAAE,EAAE,EAEtFyuC,KAEA,KAAK,iBAAgB,EACrB,KAAK,cAAa,EAElB,KAAK,gBAAgB,SAGjBkD,GACF,MAAM,KAAK,OAAO,CAAE,MAAO,EAAM,CAAA,EAInC,KAAK,aAAe,KAAK,YAAY,QAAO,EAC5C,KAAK,YAAc,KAInBlO,GAAa,IAAI,CAClB,OAAQ3f,EAAK,CACZ,KAAK,gBAAgBA,CAAG,CACzB,EACF,CAOA,OAAQ,CACH,KAAK,YAIT,KAAK,UAAY,GACjB,KAAK,cAAa,EAElBjmB,GAAeC,EAAO,KAAK,gBAAgB,EAC5C,CAQA,QAAS,CACJ,CAAC,KAAK,WAAa,CAAC,KAAK,cAAa,IAI1C,KAAK,UAAY,GACjB,KAAK,eAAc,EAEnBD,GAAeC,EAAO,KAAK,iBAAiB,EAC7C,CASA,MAAM,0BAA0B,CAAE,kBAAA8zC,EAAoB,EAAI,EAAK,CAAA,EAAI,CAClE,GAAI,KAAK,gBAAkB,UACzB,OAAO,KAAK,iBAGd,MAAMC,EAAe,KAAK,MAE1Bh0C,GAAeC,EAAO,KAAK,8BAA8B,EAMzD,MAAM,KAAK,iBAEX,MAAMg0C,EAAsB,KAAK,gBAE7B,CAACF,GAAqB,CAACE,GAKtB,KAAK,gBAAoB,YAK9B,KAAK,cAAgB,UAGjB,KAAK,UACP,KAAK,oBAAoBD,CAAY,EACrC,KAAK,uBAAuBA,CAAY,EACxC,KAAK,kBAAiB,GAGxB,KAAK,eAAc,EACpB,CAUA,UAAUpkB,EAAI,CAEb,MAAMskB,EAAWtkB,IAIb,KAAK,gBAAkB,UAMvBskB,IAAa,IAMjB,KAAK,gBAAe,CACrB,CAOA,qBAAsB,CAKrB,GAJA,KAAK,oBAAmB,EAIpB,CAAC,KAAK,eAAgB,CAGxB,GAAI,CAAC,KAAK,gBACR,OAIF,KAAK,OAAM,EACX,MACD,CAGD,KAAK,6BAA4B,EAEjC,KAAK,uBAAsB,CAC5B,CASA,oBAAqB,CACpB,KAAK,oBAAmB,EACxB,KAAK,uBAAsB,CAC5B,CAKA,kBAAmB,CAClB,OAAI,KAAK,gBAAkB,SAClB,QAAQ,UAGV,KAAK,gBACb,CAKA,OAAQ,CACP,OAAO,KAAK,iBACb,CAOA,gBAAiB,CAChB,YAAK,gBAAe,EAEb,KAAK,gBAAgB,OAC7B,CAKA,aAAc,CACb,KAAK,gBAAgB,QACtB,CAGA,cAAe,CACd,OAAO,KAAK,SAAW,KAAK,QAAQ,EACrC,CAUA,8BAA+B,CAK9B,GACE,KAAK,eACLpN,GAAU,KAAK,cAAe,KAAK,SAAS,gBAAgB,GAC5D,KAAK,SACL,KAAK,QAAQ,UAAY,UACzB,CAKA,KAAK,MAAK,EACV,MACD,CAID,MAAK,OAAK,eAMX,CAOA,iBAAkB,CACjB,MAAMqN,EAAU,GAAGnlC,EAAO,SAAS,QAAQ,GAAGA,EAAO,SAAS,IAAI,GAAGA,EAAO,SAAS,MAAM,GACrF1O,EAAM,GAAG0O,EAAO,SAAS,MAAM,GAAGmlC,CAAO,GAE/C,KAAK,mBAAqB,GAC1B,KAAK,yBAA2B,GAGhC,KAAK,cAAa,EAElB,KAAK,SAAS,WAAa7zC,EAC3B,KAAK,SAAS,iBAAmB,KAAK,IAAG,EACzC,KAAK,SAAS,KAAK,KAAKA,CAAG,CAC5B,CAMA,kBACC7I,EACAskC,EACA,CACA,MAAMuR,EAAM,KAAK,mBAAmB71C,EAAOskC,CAAU,EAIrD,GAAIuR,IAAQuF,GAAW,CACrB,MAAM3qC,EAAa63B,GAAiB,CAClC,SAAU,kBAClB,CAAO,EAED,KAAK,UAAU,IAEN,CAAC2H,GAAa,KAAM,CACzB,KAAMlK,GACN,UAAWt1B,EAAW,WAAa,EACnC,KAAM,CACJ,IAAK,aACL,QAASA,EACT,OAAQ,EACT,CACX,CAAS,CACF,CACF,CAED,OAAOolC,CACR,CAMA,iBAAkB,CACjB,MAAM8G,EAAiB,KAAK,gBAAkBtD,GAAa,EACrDuD,EAAeD,GAAkBE,GAAYF,CAAc,EAG3D17C,GADc27C,GAAgBE,GAAWF,CAAY,EAAE,MAAS,IAC5CG,EAAgC,EAC1D,GAAI,GAACH,GAAgB,CAAC37C,GAAU,CAAC,CAAC,QAAS,QAAQ,EAAE,SAASA,CAAM,GAIpE,OAAO67C,GAAWF,CAAY,EAAE,WACjC,CAMA,sBAAuB,CACtB,KAAK,gBAAe,EAIpB,KAAK,uBAAsB,EAE3B,KAAK,YAAchP,GAAkB,CACnC,eAAgB,KAAK,SAAS,eAC9B,UAAW,KAAK,SAAS,SAC/B,CAAK,EAED,KAAK,iBAAgB,EACrB,KAAK,cAAa,EAGlB,KAAK,WAAa,GAClB,KAAK,UAAY,GAEjB,KAAK,eAAc,CACpB,CAKA,8BAA8Be,EAAmB,CAGhD,MAAMI,EAAiB,KAAK,SAAS,gBAAkB,EAEjDtlC,EAAUomC,GACd,CACE,kBAAmB,KAAK,SAAS,kBACjC,kBAAmB,KAAK,SAAS,kBACjC,kBAAAlB,CACD,EACD,CACE,cAAe,KAAK,SAAS,cAC7B,kBAAmB,KAAK,SAAS,kBACjC,eAAAI,CACD,CACP,EAEI,KAAK,QAAUtlC,CAChB,CAMA,eAAgB,CAGf,GAAI,CAAC,KAAK,QACR,MAAO,GAGT,MAAMuzC,EAAiB,KAAK,QAE5B,OACEpN,GAAqBoN,EAAgB,CACnC,kBAAmB,KAAK,SAAS,kBACjC,kBAAmB,KAAK,SAAS,iBACzC,CAAO,GAID,KAAK,gBAAgBA,CAAc,EAC5B,IAGF,EACR,CAOA,MAAM,gBAAgBvzC,EAAS,CACzB,KAAK,aAGV,MAAM,KAAK,KAAK,CAAE,OAAQ,iBAAmB,CAAA,EAC7C,KAAK,mBAAmBA,EAAQ,EAAE,EACnC,CAKA,eAAgB,CACf,GAAI,CACF8N,EAAO,SAAS,iBAAiB,mBAAoB,KAAK,uBAAuB,EACjFA,EAAO,iBAAiB,OAAQ,KAAK,iBAAiB,EACtDA,EAAO,iBAAiB,QAAS,KAAK,kBAAkB,EACxDA,EAAO,iBAAiB,UAAW,KAAK,oBAAoB,EAExD,KAAK,eACP,KAAK,cAAc,eAIhB,KAAK,+BACRogC,GAAmB,IAAI,EAEvB,KAAK,6BAA+B,GAEvC,OAAQnpB,EAAK,CACZ,KAAK,gBAAgBA,CAAG,CACzB,CAED,KAAK,4BAA8B8d,GAAyB,IAAI,CACjE,CAKA,kBAAmB,CAClB,GAAI,CACF/0B,EAAO,SAAS,oBAAoB,mBAAoB,KAAK,uBAAuB,EAEpFA,EAAO,oBAAoB,OAAQ,KAAK,iBAAiB,EACzDA,EAAO,oBAAoB,QAAS,KAAK,kBAAkB,EAC3DA,EAAO,oBAAoB,UAAW,KAAK,oBAAoB,EAE3D,KAAK,eACP,KAAK,cAAc,kBAGjB,KAAK,6BACP,KAAK,4BAA2B,CAEnC,OAAQiX,EAAK,CACZ,KAAK,gBAAgBA,CAAG,CACzB,CACF,CAQA,QAAS,CAAC,KAAK,wBAA0B,IAAM,CAC1CjX,EAAO,SAAS,kBAAoB,UACtC,KAAK,2BAA0B,EAE/B,KAAK,2BAA0B,CAErC,CAAI,CAKD,SAAU,CAAC,KAAK,kBAAoB,IAAM,CACzC,MAAM9G,EAAa63B,GAAiB,CAClC,SAAU,SAChB,CAAK,EAID,KAAK,2BAA2B73B,CAAU,CAC9C,CAAI,CAKD,SAAU,CAAC,KAAK,mBAAqB,IAAM,CAC1C,MAAMA,EAAa63B,GAAiB,CAClC,SAAU,UAChB,CAAK,EAID,KAAK,2BAA2B73B,CAAU,CAC9C,CAAI,CAGD,SAAU,CAAC,KAAK,qBAAwBzQ,GAAU,CACjDgpC,GAAoB,KAAMhpC,CAAK,CACnC,CAAI,CAKD,2BAA2ByQ,EAAY,CAClC,CAAC,KAAK,SAIMg/B,GAAiB,KAAK,QAAS,CAC7C,kBAAmB,KAAK,SAAS,kBACjC,kBAAmB,KAAK,SAAS,iBACvC,CAAK,IAMGh/B,GACF,KAAK,wBAAwBA,CAAU,EAQpC,KAAK,mBACX,CAKA,2BAA2BA,EAAY,CACtC,GAAI,CAAC,KAAK,QACR,OAKF,GAAI,CAFoB,KAAK,+BAEP,CAIpBlI,GAAeC,EAAO,KAAK,qDAAqD,EAChF,MACD,CAEGiI,GACF,KAAK,wBAAwBA,CAAU,CAE1C,CAKA,oBAAoBwsC,EAAgB,KAAK,MAAO,CAC/C,KAAK,cAAgBA,CACtB,CAKA,uBAAuBA,EAAgB,KAAK,MAAO,CAC9C,KAAK,UACP,KAAK,QAAQ,aAAeA,EAC5B,KAAK,kBAAiB,EAEzB,CAKA,wBAAwBxsC,EAAY,CACnC,KAAK,UAAU,IAAM,CAGnB,KAAK,kBAAkB,CACrB,KAAMikB,EAAU,OAChB,UAAWjkB,EAAW,WAAa,EACnC,KAAM,CACJ,IAAK,aACL,QAASA,CACV,CACT,CAAO,CACP,CAAK,CACF,CAMA,wBAAyB,CACxB,IAAIysC,EAAqBjT,GAAyB,KAAK,kBAAkB,EAAE,OAAO,KAAK,wBAAwB,EAW/G,GATA,KAAK,mBAAqB,GAC1B,KAAK,yBAA2B,GAQ5B,KAAK,qBAAsB,CAC7B,MAAMkT,EAA4B,KAAK,SAAS,iBAAmB,IACnED,EAAqBA,EAAmB,OAAO9S,GAASA,EAAM,OAAS+S,CAAyB,CACjG,CAED,OAAO,QAAQ,IAAIpL,GAAuB,KAAMmL,CAAkB,CAAC,CACpE,CAKA,eAAgB,CAEf,KAAK,SAAS,SAAS,QACvB,KAAK,SAAS,SAAS,QACvB,KAAK,SAAS,KAAO,EACtB,CAGA,wCAAyC,CACxC,KAAM,CAAE,QAAAzzC,EAAS,YAAA2zC,CAAa,EAAG,KAQjC,GALI,CAAC3zC,GAAW,CAAC2zC,GAAe,KAAK,sBAKjC3zC,EAAQ,UACV,OAGF,MAAMwvC,EAAgBmE,EAAY,uBAC9BnE,GAAiBA,EAAgB,KAAK,SAAS,mBACjD,KAAK,SAAS,iBAAmBA,EAEpC,CAKA,kBAAmB,CAClB,MAAMoE,EAAW,CACf,iBAAkB,KAAK,SAAS,iBAChC,WAAY,KAAK,SAAS,WAC1B,SAAU,MAAM,KAAK,KAAK,SAAS,QAAQ,EAC3C,SAAU,MAAM,KAAK,KAAK,SAAS,QAAQ,EAC3C,KAAM,KAAK,SAAS,IAC1B,EAEI,YAAK,cAAa,EAEXA,CACR,CAUA,MAAM,WAAY,CACjB,MAAMxF,EAAW,KAAK,eAEtB,GAAI,CAAC,KAAK,SAAW,CAAC,KAAK,aAAe,CAACA,EAAU,CACnDtvC,GAAeC,EAAO,MAAM,2CAA2C,EACvE,MACD,CAKD,GAHA,MAAM,KAAK,yBAGP,GAAC,KAAK,aAAe,CAAC,KAAK,YAAY,aAK3C,MAAMuvC,GAAe,IAAI,EAGrB,EAAC,KAAK,aAKNF,IAAa,KAAK,gBAItB,GAAI,CAEF,KAAK,uCAAsC,EAE3C,MAAMxzC,EAAY,KAAK,MAKvB,GAAIA,EAAY,KAAK,SAAS,iBAAmB,KAAK,SAAS,kBAAoB,IACjF,MAAM,IAAI,MAAM,yCAAyC,EAG3D,MAAMk2C,EAAe,KAAK,mBAEpB9L,EAAY,KAAK,QAAQ,YAC/B,KAAK,kBAAiB,EAGtB,MAAMgL,EAAgB,MAAM,KAAK,YAAY,OAAM,EAEnD,MAAMsB,GAAW,CACf,SAAAlD,EACA,cAAA4B,EACA,UAAAhL,EACA,aAAA8L,EACA,QAAS,KAAK,QACd,UAAAl2C,EACA,QAASmqB,GAAO,KAAK,gBAAgBA,CAAG,CAChD,CAAO,CACF,OAAQA,EAAK,CACZ,KAAK,gBAAgBA,CAAG,EAOxB,KAAK,KAAK,CAAE,OAAQ,YAAc,CAAA,EAElC,MAAMrmB,EAASuI,IAEf,GAAIvI,EAAQ,CACV,MAAMm1C,EAAa9uB,aAAessB,GAAiB,oBAAsB,aACzE3yC,EAAO,mBAAmBm1C,EAAY,QAAQ,CAC/C,CACF,CACF,CAMA,SAAU,CAAC,KAAK,OAAS,MAAO,CAC/B,MAAAC,EAAQ,EACT,EAEA,KAAO,CACN,GAAI,CAAC,KAAK,YAAc,CAACA,EAEvB,OAGF,GAAI,CAAC,KAAK,+BAAgC,CACxCh1C,GAAeC,EAAO,MAAM,0DAA0D,EACtF,MACD,CAED,GAAI,CAAC,KAAK,QAER,OAGF,MAAMmiC,EAAQ,KAAK,QAAQ,QAErBF,EADM,KAAK,MACME,EAGvB,KAAK,gBAAgB,SAIrB,MAAM6S,EAAW/S,EAAW,KAAK,SAAS,kBACpCgT,EAAUhT,EAAW,KAAK,SAAS,kBAAoB,IAC7D,GAAI+S,GAAYC,EAAS,CACvBl1C,GACEC,EAAO,KACL,qBAAqB,KAAK,MAAMiiC,EAAW,GAAI,CAAC,aAC9C+S,EAAW,QAAU,MACjC,uBACA,EAEUA,GACF,KAAK,gBAAe,EAEtB,MACD,CAED,MAAMJ,EAAc,KAAK,YACrBA,GAAe,KAAK,QAAQ,YAAc,GAAK,CAACA,EAAY,aAC9D70C,GAAeC,EAAO,KAAK,4CAA4C,EAIzE,MAAMk1C,EAAmB,CAAC,CAAC,KAAK,WAI3B,KAAK,aACR,KAAK,WAAa,KAAK,aAGzB,GAAI,CACF,MAAM,KAAK,UACZ,OAAQlvB,EAAK,CACZ,KAAK,gBAAgBA,CAAG,CAC9B,QAAc,CACR,KAAK,WAAa,OAEdkvB,GAMF,KAAK,gBAAe,CAEvB,CACL,CAAI,CAGD,mBAAoB,CACf,KAAK,SAAW,KAAK,SAAS,eAChC9O,GAAY,KAAK,OAAO,CAE3B,CAGA,SAAU,CAAC,KAAK,mBAAsBlZ,GAAc,CACnD,MAAM9qB,EAAQ8qB,EAAU,OAElBioB,EAAgB,KAAK,SAAS,cAC9BC,EAA0B,KAAK,SAAS,wBACxCC,EAAoBF,GAAiB/yC,EAAQ+yC,EAInD,GAAI/yC,EAAQgzC,GAA2BC,EAAmB,CACxD,MAAMptC,EAAa63B,GAAiB,CAClC,SAAU,mBACV,KAAM,CACJ,MAAA19B,EACA,MAAOizC,CACR,CACT,CAAO,EACD,KAAK,wBAAwBptC,CAAU,CACxC,CAGD,OAAIotC,GAGF,KAAK,KAAK,CAAE,OAAQ,gBAAiB,WAAY,KAAK,gBAAkB,SAAS,CAAE,EAC5E,IAIF,EACX,CAAI,CACJ,CAEA,SAASC,GAAUC,EAAWC,EAAkB,CAC9C,MAAO,CACL,GAAGD,EAEH,GAAGC,CACP,EAAI,KAAK,GAAG,CACZ,CAKA,SAASC,GAAkB,CAAE,KAAAC,EAAM,OAAAC,EAAQ,MAAAC,EAAO,QAAAC,EAAS,OAAAC,GAAU,CACnE,MAAMC,EAAyB,CAAC,gBAAgB,EAE1CC,EAAeV,GAAUI,EAAM,CAAC,eAAgB,oBAAoB,CAAC,EACrEO,EAAiBX,GAAUK,EAAQ,CAAE,CAAA,EAY3C,MAVgB,CAEd,iBAAkBK,EAClB,mBAAoBC,EAEpB,cAAeX,GAAUM,EAAO,CAAC,gBAAiB,sBAAuB,GAAGG,CAAsB,CAAC,EACnG,gBAAiBT,GAAUO,EAAS,EAAE,EACtC,eAAgBP,GAAUQ,EAAQ,CAAC,iBAAkB,uBAAwB,oBAAoB,CAAC,CACtG,CAGA,CAKA,SAASI,GAAc,CACrB,GAAArmC,EACA,IAAAvY,EACA,eAAA6+C,EACA,YAAAzyB,EACA,eAAA0yB,EACA,MAAAhxC,CACF,EAAG,CAOD,MALI,CAACse,GAKD0yB,EAAe,oBAAsBvmC,EAAG,QAAQumC,EAAe,kBAAkB,EAC5EhxC,EAIP+wC,EAAe,SAAS7+C,CAAG,GAG1BA,IAAQ,SAAWuY,EAAG,UAAY,SAAW,CAAC,SAAU,QAAQ,EAAE,SAASA,EAAG,aAAa,MAAM,GAAK,EAAE,EAElGzK,EAAM,QAAQ,QAAS,GAAG,EAG5BA,CACT,CAEA,MAAMixC,GACJ,mGAEIC,GAA0B,CAAC,iBAAkB,eAAgB,QAAQ,EAE3E,IAAIC,GAAe,GAgBnB,MAAMC,GAAsBt3C,GACnB,IAAIu3C,GAAOv3C,CAAO,EAS3B,MAAMu3C,EAAQ,CAIX,OAAO,cAAe,CAAC,KAAK,GAAK,QAAS,CAkB1C,YAAY,CACX,cAAAC,EAAgBn8B,GAChB,cAAAo8B,EAAgBn8B,GAChB,kBAAAo8B,EAAoB37B,GACpB,kBAAAisB,EAAoB/rB,GACpB,cAAAsrB,EAAgB,GAChB,eAAApB,EAAiB,GACjB,UAAAG,EACA,aAAAqR,EAAe,CAAE,EACjB,YAAAnzB,EAAc,GACd,cAAA+E,EAAgB,GAChB,cAAAquB,EAAgB,GAEhB,wBAAA1B,EAA0B,IAC1B,cAAAD,EAAgB,IAEhB,iBAAA5B,EAAmB,IACnB,yBAAAC,EAA2B,CAAE,EAE7B,uBAAA5E,EAAyB,CAAE,EAC3B,sBAAAC,EAAwB,CAAE,EAC1B,qBAAAlC,EAAuB,GACvB,sBAAAC,EAAwB,CAAE,EAC1B,uBAAAI,EAAyB,CAAE,EAE3B,KAAA0I,EAAO,CAAE,EACT,eAAAS,EAAiB,CAAC,QAAS,aAAa,EACxC,OAAAR,EAAS,CAAE,EACX,MAAAC,EAAQ,CAAE,EACV,QAAAC,EAAU,CAAE,EACZ,OAAAC,EAAS,CAAE,EACX,OAAAiB,EAEA,wBAAAC,EACA,oBAAAzO,EACA,QAAAmK,CACD,EAAG,GAAI,CACN,KAAK,KAAO+D,GAAO,GAEnB,MAAML,GAAiBX,GAAkB,CACvC,KAAAC,EACA,OAAAC,EACA,MAAAC,EACA,QAAAC,EACA,OAAAC,CACN,CAAK,EAyED,GAvEA,KAAK,kBAAoB,CACvB,cAAArtB,EACA,YAAA/E,EACA,iBAAkB,CAAE,SAAU,EAAM,EACpC,WAAYqzB,EACZ,YAAaA,EACb,gBAAiB,CAACz/C,EAAK8N,EAAOyK,IAC5BqmC,GAAc,CACZ,eAAAC,EACA,YAAAzyB,EACA,eAAA0yB,GACA,IAAA9+C,EACA,MAAA8N,EACA,GAAAyK,CACV,CAAS,EAEH,GAAGumC,GAGH,eAAgB,MAChB,iBAAkB,GAElB,aAAc,GAGd,aAAc,GACd,aAAepwB,GAAQ,CACrB,GAAI,CACFA,EAAI,UAAY,EACjB,MAAe,CAGf,CACF,CACP,EAEI,KAAK,gBAAkB,CACrB,cAAA0wB,EACA,cAAAC,EACA,kBAAmB,KAAK,IAAIC,EAAmB17B,EAAyB,EACxE,kBAAmB,KAAK,IAAIgsB,EAAmB/rB,EAAmB,EAClE,cAAAsrB,EACA,eAAApB,EACA,UAAAG,EACA,cAAAsR,EACA,cAAAruB,EACA,YAAA/E,EACA,wBAAA0xB,EACA,cAAAD,EACA,iBAAA5B,EACA,yBAAAC,EACA,uBAAA5E,EACA,sBAAAC,EACA,qBAAAlC,EACA,sBAAuBsK,GAAyBrK,CAAqB,EACrE,uBAAwBqK,GAAyBjK,CAAsB,EACvE,wBAAAgK,EACA,oBAAAzO,EACA,QAAAmK,EAEA,aAAAmE,CACN,EAEQ,KAAK,gBAAgB,gBAGvB,KAAK,kBAAkB,cAAiB,KAAK,kBAAkB,cAE3D,GAAG,KAAK,kBAAkB,aAAa,IAAIR,EAAe,GAD1DA,IAIF,KAAK,gBAAkBh8C,KACzB,MAAM,IAAI,MAAM,4DAA4D,EAG9E,KAAK,eAAiB,EACvB,CAGA,IAAI,gBAAiB,CACpB,OAAOk8C,EACR,CAGA,IAAI,eAAenxC,EAAO,CACzBmxC,GAAenxC,CAChB,CAKA,cAAczF,EAAQ,CACjB,CAACtF,GAAS,GAAM,KAAK,UAIzB,KAAK,OAAOsF,CAAM,EAClB,KAAK,YAAYA,CAAM,EACxB,CASA,OAAQ,CACF,KAAK,SAGV,KAAK,QAAQ,OACd,CAMA,gBAAiB,CACX,KAAK,SAIV,KAAK,QAAQ,gBACd,CAMA,MAAO,CACN,OAAK,KAAK,QAIH,KAAK,QAAQ,KAAK,CAAE,WAAY,KAAK,QAAQ,gBAAkB,SAAS,CAAE,EAHxE,QAAQ,SAIlB,CAUA,MAAMT,EAAS,CACd,OAAK,KAAK,QAKL,KAAK,QAAQ,YAKX,KAAK,QAAQ,0BAA0BA,CAAO,GAJnD,KAAK,QAAQ,QACN,QAAQ,WANR,QAAQ,SAUlB,CAKA,aAAc,CACb,GAAI,GAAC,KAAK,SAAW,CAAC,KAAK,QAAQ,aAInC,OAAO,KAAK,QAAQ,cACrB,CAUA,kBAAmB,CAClB,GAAI,GAAC,KAAK,SAAW,CAAC,KAAK,QAAQ,aAInC,OAAO,KAAK,QAAQ,aACrB,CAKA,YAAYS,EAAQ,CACd,KAAK,UAIV,KAAK,sCAAsCA,CAAM,EACjD,KAAK,QAAQ,qBACd,CAGA,OAAOA,EAAQ,CAEd,MAAMu3C,EAAeC,GAA4B,KAAK,gBAAiBx3C,CAAM,EAE7E,KAAK,QAAU,IAAI0zC,GAAgB,CACjC,QAAS6D,EACT,iBAAkB,KAAK,iBAC7B,CAAK,CACF,CAGA,sCAAsCv3C,EAAQ,CAI7C,GAAI,CACF,MAAMy3C,EAAoBz3C,EAAO,qBAAqB,cAAc,EAGpE,GAAI,CAACy3C,EACH,OAGF,KAAK,QAAQ,QAAaA,EAAkB,WAAU,CACvD,MAAW,CAEX,CAEF,CACH,CAACX,GAAO,aAAY,EAGpB,SAASU,GAA4BE,EAAgB13C,EAAQ,CAC3D,MAAM23C,EAAM33C,EAAO,aAEbu3C,EAAe,CACnB,kBAAmB,EACnB,gBAAiB,EACjB,GAAGtzC,GAAkByzC,CAAc,CACvC,EAEQE,EAA2B9yC,GAAgB6yC,EAAI,wBAAwB,EACvEE,EAA2B/yC,GAAgB6yC,EAAI,wBAAwB,EAE7E,OAAIC,GAA4B,MAAQC,GAA4B,MAClEpxC,GAAe,IAAM,CAEnB,QAAQ,KACN,uGACR,CACA,CAAK,EAGCmxC,GAA4B,OAC9BL,EAAa,kBAAoBK,GAG/BC,GAA4B,OAC9BN,EAAa,gBAAkBM,GAG1BN,CACT,CAEA,SAASD,GAAyBr6C,EAAS,CACzC,MAAO,CAAC,GAAG05C,GAAyB,GAAG15C,EAAQ,IAAIT,GAAUA,EAAO,YAAa,CAAA,CAAC,CACpF,CCxrSA,SAASs7C,GAAezxC,EAAM/F,EAAU,CACtC,MAAMy3C,EAAMC,KACZ,OAAID,EAAI,eACCA,EAAI,eAAe1xC,EAAM/F,CAAQ,EAGnC23C,GAAUt3C,IACfu3C,GAAiBv3C,EAAO0F,GAAQ,MAAS,EAClC/F,EAASK,CAAK,EACtB,CACH,CAkIA,SAASq3C,IAAS,CAChB,MAAMG,EAAUC,KAChB,OAAOC,GAAwBF,CAAO,CACxC,CCjVA,SAASnwC,GAAiBzI,EAASH,EAAM6I,EAAQ,CAAC7I,CAAI,EAAGtG,EAAS,MAAO,CACvE,MAAMoP,EAAW3I,EAAQ,WAAa,GAEjC2I,EAAS,MACZA,EAAS,IAAM,CACb,KAAM,qBAAqB9I,CAAI,GAC/B,SAAU6I,EAAM,IAAI7I,IAAS,CAC3B,KAAM,GAAGtG,CAAM,YAAYsG,CAAI,GAC/B,QAAS+I,EACjB,EAAQ,EACF,QAASA,EACf,GAGE5I,EAAQ,UAAY2I,CACtB,CCvBA,SAASwR,GAAKna,EAAS,CACrB,MAAM2P,EAAO,CACX,GAAG3P,CACP,EAEE,OAAAyI,GAAiBkH,EAAM,OAAO,EAC9B8jC,GAAW,QAAS,SAAEf,GAAO,OAAA,CAAE,EACxBqG,GAAOppC,CAAI,CACpB,CCRA,SAASqpC,GAAiBC,EAAc,CACtC,MAAMC,EAAaD,EAAa,MAAM,UAAU,EAChD,OAAOC,IAAe,MAAQ,SAASA,EAAW,CAAC,CAAC,GAAK,EAC3D,CAKA,SAASC,GAASvgD,EAAOwgD,EAAO,CAC9B,MAAMC,EAAa,IAAI,QAEvB,SAASplB,EAAQr7B,EAAOwgD,EAAO,CAG7B,GAAI,CAAAC,EAAW,IAAIzgD,CAAK,EAGxB,IAAIA,EAAM,MACR,OAAAygD,EAAW,IAAIzgD,CAAK,EACbq7B,EAAQr7B,EAAM,MAAOwgD,CAAK,EAEnCxgD,EAAM,MAAQwgD,EACf,CAEDnlB,EAAQr7B,EAAOwgD,CAAK,CACtB,CAUA,SAASE,GAEP1gD,EACA,CAAE,eAAA2gD,CAAgB,EAClBhhD,EACA,CASA,GAAIygD,GAAiBtG,GAAAA,OAAO,GAAKxtC,GAAQtM,CAAK,GAAK2gD,EAAgB,CACjE,MAAMC,EAAqB,IAAI,MAAM5gD,EAAM,OAAO,EAClD4gD,EAAmB,KAAO,uBAAuB5gD,EAAM,IAAI,GAC3D4gD,EAAmB,MAAQD,EAG3BJ,GAASvgD,EAAO4gD,CAAkB,CACnC,CAED,OAAOrb,GAAiBvlC,EAAO,CAC7B,GAAGL,EACH,eAAgB,CACd,SAAU,CAAE,MAAO,CAAE,eAAAghD,EAAkB,CACxC,CACL,CAAG,CACH,CCvEA,MAAME,GAAkB,kBAElBC,GAAkB,kBAElBC,GAAiB,iBCGjBC,GAAoB,UAM1B,MAAMC,WAAiBC,GAAAA,SAAgB,CAWpC,OAAO,cAAe,CAAC,KAAK,aAAe,CAC1C,SAAU,GACV,cAAe,GACf,eAAgB,EACpB,CAAI,CAED,YAAYC,EAAO,CAClB,MAAMA,CAAK,EACX,KAAM,CAAE,KAAAl6C,EAAM,SAAAm6C,EAAW,EAAK,EAAK,KAAK,MAEpCA,IAIJ,KAAK,WAAaC,GAAkB,CAClC,KAAM,IAAIp6C,CAAI,IACd,aAAc,GACd,GAAI85C,GACJ,WAAY,CACV,CAACO,EAAgC,EAAG,yBACpC,oBAAqBr6C,CACtB,CACP,CAAK,EACF,CAGA,mBAAoB,CACf,KAAK,YACP,KAAK,WAAW,KAEnB,CAEA,sBAAsB,CAAE,YAAAs6C,EAAa,eAAAC,EAAiB,EAAI,EAAI,CAI7D,GAAIA,GAAkB,KAAK,YAAcD,IAAgB,KAAK,MAAM,YAAa,CAG/E,MAAME,EAAe,OAAO,KAAKF,CAAW,EAAE,OAAOG,GAAKH,EAAYG,CAAC,IAAM,KAAK,MAAM,YAAYA,CAAC,CAAC,EACtG,GAAID,EAAa,OAAS,EAAG,CAC3B,MAAMn9C,EAAMq9C,KACZ,KAAK,YAAchC,GAAe,KAAK,WAAY,IAC1C0B,GAAkB,CACvB,KAAM,IAAI,KAAK,MAAM,IAAI,IACzB,aAAc,GACd,GAAIP,GACJ,UAAWx8C,EACX,WAAY,CACV,CAACg9C,EAAgC,EAAG,yBACpC,oBAAqB,KAAK,MAAM,KAChC,yBAA0BG,CAC3B,CACb,CAAW,CACF,CACF,CACF,CAED,MAAO,EACR,CAEA,oBAAqB,CAChB,KAAK,cACP,KAAK,YAAY,MACjB,KAAK,YAAc,OAEtB,CAIA,sBAAuB,CACtB,MAAM5kC,EAAe8kC,KACf,CAAE,KAAA16C,EAAM,cAAA26C,EAAgB,EAAI,EAAK,KAAK,MAE5C,GAAI,KAAK,YAAcA,EAAe,CACpC,MAAMxX,EAAYoS,GAAW,KAAK,UAAU,EAAE,UAC9CmD,GAAe,KAAK,WAAY,IAAM,CACpC,MAAMkC,EAAaR,GAAkB,CACnC,aAAc,GACd,KAAM,IAAIp6C,CAAI,IACd,GAAI45C,GACJ,UAAAzW,EACA,WAAY,CACV,CAACkX,EAAgC,EAAG,yBACpC,oBAAqBr6C,CACtB,CACX,CAAS,EACG46C,GAGFA,EAAW,IAAIhlC,CAAY,CAErC,CAAO,CACF,CACF,CAEA,QAAS,CACR,OAAO,KAAK,MAAM,QACnB,CACH,CAAEokC,GAAS,eAWX,SAASa,GACPC,EAEA36C,EACA,CACA,MAAM46C,EACyBD,EAAiB,aAAeA,EAAiB,MAAQf,GAElFiB,EAAWd,GACfe,GAAmB,cAACjB,GAAU,CAAE,GAAG75C,EAAS,KAAM46C,EAAsB,YAAab,CAAO,EACxFe,GAAAA,cAAoBH,EAAkB,CAAE,GAAGZ,EAAS,CACvD,EAGH,OAAAc,EAAQ,YAAc,YAAYD,CAAoB,IAItDG,GAAqBF,EAASF,CAAgB,EACvCE,CACT,CCjJA,MAAMG,GAAgB,CACpB,eAAgB,KAChB,MAAO,KACP,QAAS,IACX,EAQA,MAAMC,WAAsBnB,GAAAA,SAAgB,CAEzC,YAAYC,EAAO,CAClB,MAAMA,CAAK,EAAEkB,GAAc,UAAU,OAAO,KAAK,IAAI,EACrD,KAAK,MAAQD,GACb,KAAK,0BAA4B,GAEjC,MAAMv6C,EAASuI,IACXvI,GAAUs5C,EAAM,aAClB,KAAK,0BAA4B,GACjC,KAAK,aAAet5C,EAAO,GAAG,iBAAkBnI,GAAS,CACnD,CAACA,EAAM,MAAQ,KAAK,cAAgBA,EAAM,WAAa,KAAK,cAC9DkiB,GAAiB,CAAE,GAAGu/B,EAAM,cAAe,QAAS,KAAK,YAAY,CAAE,CAEjF,CAAO,EAEJ,CAEA,kBAAkBnhD,EAAOsiD,EAAW,CACnC,KAAM,CAAE,eAAA3B,CAAgB,EAAG2B,EAErBC,EAAyB5B,GAAyB,OAElD,CAAE,cAAA6B,EAAe,QAAA5H,EAAS,WAAA6H,EAAY,cAAAn8C,CAAe,EAAG,KAAK,MACnEw5C,GAAUt3C,GAAS,CACbg6C,GACFA,EAAch6C,EAAOxI,EAAOuiD,CAAsB,EAGpD,MAAM95C,EAAUi4C,GAAsB1gD,EAAOsiD,EAAW,CAAE,UAAW,CAAE,QAAS,CAAC,CAAC,KAAK,MAAM,QAAQ,CAAI,CAAA,EAErG1H,GACFA,EAAQ56C,EAAOuiD,EAAwB95C,CAAO,EAE5Cg6C,IACF,KAAK,aAAeh6C,EAChB,KAAK,2BACPmZ,GAAiB,CAAE,GAAGtb,EAAe,QAAAmC,CAAS,CAAA,GAMlD,KAAK,SAAS,CAAE,MAAAzI,EAAO,eAAA2gD,EAAgB,QAAAl4C,CAAS,CAAA,CACtD,CAAK,CACF,CAEA,mBAAoB,CACnB,KAAM,CAAE,QAAAi6C,CAAO,EAAK,KAAK,MACrBA,GACFA,GAEH,CAEA,sBAAuB,CACtB,KAAM,CAAE,MAAA1iD,EAAO,eAAA2gD,EAAgB,QAAAl4C,CAAO,EAAK,KAAK,MAC1C,CAAE,UAAAk6C,CAAS,EAAK,KAAK,MACvBA,GACFA,EAAU3iD,EAAO2gD,EAAgBl4C,CAAO,EAGtC,KAAK,eACP,KAAK,aAAY,EACjB,KAAK,aAAe,OAEvB,CAEA,QAAS,CAAC,KAAK,mBAAqB,IAAM,CACzC,KAAM,CAAE,QAAAm6C,CAAO,EAAK,KAAK,MACnB,CAAE,MAAA5iD,EAAO,eAAA2gD,EAAgB,QAAAl4C,CAAO,EAAK,KAAK,MAC5Cm6C,GACFA,EAAQ5iD,EAAO2gD,EAAgBl4C,CAAO,EAExC,KAAK,SAAS25C,EAAa,CAC/B,CAAI,CAED,QAAS,CACR,KAAM,CAAE,SAAAS,EAAU,SAAAC,GAAa,KAAK,MAC9BC,EAAQ,KAAK,MAEnB,GAAIA,EAAM,MAAO,CACf,IAAIxmC,EAYJ,OAXI,OAAOsmC,GAAa,WACtBtmC,EAAU2lC,GAAmB,cAACW,EAAU,CACtC,MAAOE,EAAM,MACb,eAAgBA,EAAM,eACtB,WAAY,KAAK,mBACjB,QAASA,EAAM,OACzB,CAAS,EAEDxmC,EAAUsmC,EAGRG,GAAAA,eAAqBzmC,CAAO,EACvBA,GAGLsmC,GACF56C,IAAeC,GAAO,KAAK,+CAA+C,EAIrE,KACR,CAED,OAAI,OAAO46C,GAAa,WACdA,EAAQ,EAEXA,CACR,CACH,QCjIIrsB,GAAIwsB,GAENC,GAAqBzsB,GAAE,WACDA,GAAE,4oGCHpB,kBAAE0sB,GAAkB,uBAAAC,EAA2B,EAAAC,GAE/CC,GAAgB,IAAM,CAC1B,QAAQ,IAAI,uBAAuB,EAEzBC,GAAKH,GAAwB,OAAW,CAChD,SACED,KAAqB,cACjBK,GAAyB,KACzBA,GAAyB,KAC/B,gBAAiB,CACf,SAAU,GACV,UAAW,CACT,oBAAqB,UACvB,EACA,iBAAkB,GAClB,cAAe,EACjB,CAAA,CACD,CACH,EAEMC,GAA2B,IAAM,CACrCC,GAAoB,EAAI,CAC1B,EAEaC,GAAkC,IAAM,CACnD,MAAMC,EAAmB,OAAO,cAAgB,OAAO,cAAkB,EAAA,KACnEC,EACJD,GAAoBA,EAAiB,WAAW,UACpC,CAAC,OAAO,eAGpB,QAAQ,IAAI,cAAc,EAGxBC,EACYP,KAEWG,IAE7B,EC1BaK,GAAQC,GAAe,CAClC,QAAS,CACP,eAAgBC,GAChB,OAAQC,GACR,UAAWC,GACX,OAAQC,GACR,oBAAqBC,GACrB,eAAgBC,GAChB,WAAYC,GACZ,QAASC,GACT,CAACC,GAAI,WAAW,EAAGA,GAAI,OACzB,EACA,WAAaC,GACXA,EAAuB,EAAA,OAAOD,GAAI,UAAU,CAChD,CAAC,4nGCnBK,CAAErB,iBAAAA,EAAqB,EAAAE,GAEhBqB,GAAyB,CAAC,CAAE,SAAA5B,CAAS,IAC/C6B,GAAA,IAAAtC,GAAA,CAAc,WAAYc,KAAqB,cAC9C,gBAACyB,GAAS,CAAA,MAAAd,GACR,SAACa,GAAAA,IAAAE,GAAM,WAAN,CACC,SAACC,GAAA,KAAAC,GAAA,CAAe,MAAOC,GACrB,SAAA,CAAAL,GAAA,IAACM,GAAS,EAAA,EACTnC,CAAA,EACH,CAAA,CACF,CACF,CAAA,EACF,4nGCPFa,KAEA,KAAM,CAAE,iBAAAR,GAAkB,uBAAA+B,EAA2B,EAAA7B,GAErD8B,GAAY,CACV,iBAAkB,GAClB,IAAK,6EACL,QAAShC,KAAqB,cAC9B,YAAaA,GACb,aAAc,CACZiC,GAAyB,EACzBC,GAA8C,CAAA,UAC5CC,GAAA,UACA,YAAAC,GACA,kBAAAC,GACA,yBAAAC,GACA,YAAAC,EAAA,CACD,CACH,EAKA,iBAAkB,GAGlB,yBAA0B,GAG1B,yBAA0B,CAC5B,CAAC,EAED,MAAMC,GAAuB,IAC1BhB,GAAA,IAAAD,GAAA,CACC,SAACC,GAAAA,IAAAiB,GACC,CAAA,gBAACC,GAAI,CAAA,CAAA,CACP,CAAA,CACF,CAAA,EAGIC,GAAUC,GAAoBJ,EAAgB,GAEnD,SAAY,CACL,MAAAK,EAAa,MAAMC,GAAoB,CAC3C,aAAcf,GACd,QAAS,CACP,UAAW,cACb,CAAA,CACD,EAEKgB,EAAY,SAAS,eAAe,MAAM,EACnChD,GAAWgD,CAAU,EAE7B,OACFvB,GAAA,IAAAqB,EAAA,CACC,gBAACF,GAAA,CAAQ,CAAA,EACX,CAAA,CAEJ,GAAG","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44]}