{
  "version": 3,
  "sources": ["../../types/dist/rrweb-types.js", "../../utils/dist/rrweb-utils.js", "../src/utils.ts", "../src/types.ts", "../src/snapshot.ts"],
  "sourcesContent": ["var 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 || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n  CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n  CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n  CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n  return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n  MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n  MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n  MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n  MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n  MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n  return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n  ReplayerEvents2[\"Start\"] = \"start\";\n  ReplayerEvents2[\"Pause\"] = \"pause\";\n  ReplayerEvents2[\"Resume\"] = \"resume\";\n  ReplayerEvents2[\"Resize\"] = \"resize\";\n  ReplayerEvents2[\"Finish\"] = \"finish\";\n  ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n  ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n  ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n  ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n  ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n  ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n  ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n  ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n  ReplayerEvents2[\"Flush\"] = \"flush\";\n  ReplayerEvents2[\"StateChange\"] = \"state-change\";\n  ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n  ReplayerEvents2[\"Destroy\"] = \"destroy\";\n  return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n  NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n  NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n  NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n  NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n  NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n  NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n  return NodeType2;\n})(NodeType || {});\nexport {\n  CanvasContext,\n  EventType,\n  IncrementalSource,\n  MediaInteractions,\n  MouseInteractions,\n  NodeType,\n  PointerTypes,\n  ReplayerEvents\n};\n//# sourceMappingURL=rrweb-types.js.map\n", "const testableAccessors = {\n  Node: [\"childNodes\", \"parentNode\", \"parentElement\", \"textContent\"],\n  ShadowRoot: [\"host\", \"styleSheets\"],\n  Element: [\"shadowRoot\"],\n  MutationObserver: []\n};\nconst testableMethods = {\n  Node: [\"contains\", \"getRootNode\"],\n  ShadowRoot: [\"getSelection\"],\n  Element: [\"querySelector\", \"querySelectorAll\"],\n  MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nfunction angularZoneUnpatchedAlternative(key) {\n  var _a, _b;\n  const angularUnpatchedVersionSymbol = (_b = (_a = globalThis == null ? void 0 : globalThis.Zone) == null ? void 0 : _a.__symbol__) == null ? void 0 : _b.call(_a, key);\n  if (angularUnpatchedVersionSymbol && globalThis[angularUnpatchedVersionSymbol]) {\n    return globalThis[angularUnpatchedVersionSymbol];\n  } else {\n    return void 0;\n  }\n}\nfunction getUntaintedPrototype(key) {\n  if (untaintedBasePrototype[key])\n    return untaintedBasePrototype[key];\n  const candidate = angularZoneUnpatchedAlternative(key) || globalThis[key];\n  const defaultPrototype = candidate.prototype;\n  const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n  const isUntaintedAccessors = Boolean(\n    accessorNames && // @ts-expect-error 2345\n    accessorNames.every(\n      (accessor) => {\n        var _a, _b;\n        return Boolean(\n          (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n        );\n      }\n    )\n  );\n  const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n  const isUntaintedMethods = Boolean(\n    methodNames && methodNames.every(\n      // @ts-expect-error 2345\n      (method) => {\n        var _a;\n        return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n      }\n    )\n  );\n  if (isUntaintedAccessors && isUntaintedMethods) {\n    untaintedBasePrototype[key] = candidate.prototype;\n    return candidate.prototype;\n  }\n  const iframeEl = document.createElement(\"iframe\");\n  try {\n    document.body.appendChild(iframeEl);\n    const win = iframeEl.contentWindow;\n    if (!win) return candidate.prototype;\n    const untaintedObject = win[key].prototype;\n    if (!untaintedObject) return defaultPrototype;\n    return untaintedBasePrototype[key] = untaintedObject;\n  } catch {\n    return defaultPrototype;\n  } finally {\n    if (iframeEl.parentNode) {\n      document.body.removeChild(iframeEl);\n    }\n  }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n  var _a;\n  const cacheKey = `${key}.${String(accessor)}`;\n  if (untaintedAccessorCache[cacheKey])\n    return untaintedAccessorCache[cacheKey].call(\n      instance\n    );\n  const untaintedPrototype = getUntaintedPrototype(key);\n  const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n    untaintedPrototype,\n    accessor\n  )) == null ? void 0 : _a.get;\n  if (!untaintedAccessor) return instance[accessor];\n  untaintedAccessorCache[cacheKey] = untaintedAccessor;\n  return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n  const cacheKey = `${key}.${String(method)}`;\n  if (untaintedMethodCache[cacheKey])\n    return untaintedMethodCache[cacheKey].bind(\n      instance\n    );\n  const untaintedPrototype = getUntaintedPrototype(key);\n  const untaintedMethod = untaintedPrototype[method];\n  if (typeof untaintedMethod !== \"function\") return instance[method];\n  untaintedMethodCache[cacheKey] = untaintedMethod;\n  return untaintedMethod.bind(instance);\n}\nfunction childNodes(n) {\n  return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n  return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n  return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n  return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n  return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n  return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n  if (!n || !(\"host\" in n)) return null;\n  return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n  return n.styleSheets;\n}\nfunction shadowRoot(n) {\n  if (!n || !(\"shadowRoot\" in n)) return null;\n  return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n  return getUntaintedMethod(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n  return getUntaintedMethod(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n  return getUntaintedPrototype(\"MutationObserver\").constructor;\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  } catch {\n    return () => {\n    };\n  }\n}\nconst index = {\n  childNodes,\n  parentNode,\n  parentElement,\n  textContent,\n  contains,\n  getRootNode,\n  host,\n  styleSheets,\n  shadowRoot,\n  querySelector,\n  querySelectorAll,\n  mutationObserver: mutationObserverCtor,\n  patch\n};\nexport {\n  childNodes,\n  contains,\n  index as default,\n  getRootNode,\n  getUntaintedAccessor,\n  getUntaintedMethod,\n  getUntaintedPrototype,\n  host,\n  mutationObserverCtor,\n  parentElement,\n  parentNode,\n  patch,\n  querySelector,\n  querySelectorAll,\n  shadowRoot,\n  styleSheets,\n  textContent\n};\n//# sourceMappingURL=rrweb-utils.js.map\n", "import type {\n  idNodeMap,\n  MaskInputFn,\n  MaskInputOptions,\n  nodeMetaMap,\n} from './types';\n\nimport { NodeType } from '@posthog/rrweb-types';\nimport type {\n  IMirror,\n  serializedNodeWithId,\n  serializedNode,\n  documentNode,\n  documentTypeNode,\n  textNode,\n  elementNode,\n} from '@posthog/rrweb-types';\nimport dom from '@posthog/rrweb-utils';\n\nexport function isElement(n: Node): n is Element {\n  return n.nodeType === n.ELEMENT_NODE;\n}\n\nexport function isShadowRoot(n: Node): n is ShadowRoot {\n  const hostEl: Element | null =\n    // anchor and textarea elements also have a `host` property\n    // but only shadow roots have a `mode` property\n    (n && 'host' in n && 'mode' in n && dom.host(n as ShadowRoot)) || null;\n  return Boolean(\n    hostEl && 'shadowRoot' in hostEl && dom.shadowRoot(hostEl) === n,\n  );\n}\n\n/**\n * To fix the issue https://github.com/rrweb-io/rrweb/issues/933.\n * Some websites use polyfilled shadow dom and this function is used to detect this situation.\n */\nexport function isNativeShadowDom(shadowRoot: ShadowRoot): boolean {\n  return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\n}\n\n/**\n * Browsers sometimes destructively modify the css rules they receive.\n * This function tries to rectify the modifications the browser made to make it more cross platform compatible.\n * @param cssText - output of `CSSStyleRule.cssText`\n * @returns `cssText` with browser inconsistencies fixed.\n */\nfunction fixBrowserCompatibilityIssuesInCSS(cssText: string): string {\n  /**\n   * Chrome outputs `-webkit-background-clip` as `background-clip` in `CSSStyleRule.cssText`.\n   * But then Chrome ignores `background-clip` as css input.\n   * Re-introduce `-webkit-background-clip` to fix this issue.\n   */\n  if (\n    cssText.includes(' background-clip: text;') &&\n    !cssText.includes(' -webkit-background-clip: text;')\n  ) {\n    cssText = cssText.replace(\n      /\\sbackground-clip:\\s*text;/g,\n      ' -webkit-background-clip: text; background-clip: text;',\n    );\n  }\n  return cssText;\n}\n\n// Remove this declaration once typescript has added `CSSImportRule.supportsText` to the lib.\ndeclare interface CSSImportRule extends CSSRule {\n  readonly href: string;\n  readonly layerName: string | null;\n  readonly media: MediaList;\n  readonly styleSheet: CSSStyleSheet;\n  /**\n   * experimental API, currently only supported in firefox\n   * https://developer.mozilla.org/en-US/docs/Web/API/CSSImportRule/supportsText\n   */\n  readonly supportsText?: string | null;\n}\n\n/**\n * Browsers sometimes incorrectly escape `@import` on `.cssText` statements.\n * This function tries to correct the escaping.\n * more info: https://bugs.chromium.org/p/chromium/issues/detail?id=1472259\n * @param cssImportRule\n * @returns `cssText` with browser inconsistencies fixed, or null if not applicable.\n */\nexport function escapeImportStatement(rule: CSSImportRule): string {\n  const { cssText } = rule;\n  if (cssText.split('\"').length < 3) return cssText;\n\n  const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\n  if (rule.layerName === '') {\n    statement.push(`layer`);\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}\n\nexport function stringifyStylesheet(s: CSSStyleSheet): string | null {\n  try {\n    const rules = s.rules || s.cssRules;\n    if (!rules) {\n      return null;\n    }\n    let sheetHref = s.href;\n    if (!sheetHref && s.ownerNode) {\n      // an inline <style> element\n      sheetHref = s.ownerNode.baseURI;\n    }\n    const stringifiedRules = Array.from(rules, (rule: CSSRule) =>\n      stringifyRule(rule, sheetHref),\n    ).join('');\n    return fixBrowserCompatibilityIssuesInCSS(stringifiedRules);\n  } catch (error) {\n    return null;\n  }\n}\n\nexport function stringifyRule(rule: CSSRule, sheetHref: string | null): string {\n  if (isCSSImportRule(rule)) {\n    let importStringified;\n    try {\n      importStringified =\n        // for same-origin stylesheets,\n        // we can access the imported stylesheet rules directly\n        stringifyStylesheet(rule.styleSheet) ||\n        // work around browser issues with the raw string `@import url(...)` statement\n        escapeImportStatement(rule);\n    } catch (error) {\n      importStringified = rule.cssText;\n    }\n    // if importStringified is not null,\n    // there should be a stylesheet and a rule here,\n    // but we avoid errors in this method by checking for null\n    // see https://github.com/rrweb-io/rrweb/pull/1686\n    try {\n      if (importStringified && rule.styleSheet?.href) {\n        // url()s within the imported stylesheet are relative to _that_ sheet's href\n        return absolutifyURLs(importStringified, rule.styleSheet.href);\n      }\n    } catch {\n      // swallow this, we'll return null\n    }\n    return importStringified;\n  } else {\n    let ruleStringified = rule.cssText;\n    if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\n      // Safari does not escape selectors with : properly\n      // see https://bugs.webkit.org/show_bug.cgi?id=184604\n      ruleStringified = fixSafariColons(ruleStringified);\n    }\n    if (sheetHref) {\n      return absolutifyURLs(ruleStringified, sheetHref);\n    }\n    return ruleStringified;\n  }\n}\n\nexport function fixSafariColons(cssStringified: string): string {\n  // Replace e.g. [aa:bb] with [aa\\\\:bb]\n  const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n  return cssStringified.replace(regex, '$1\\\\$2');\n}\n\nexport function isCSSImportRule(rule: CSSRule): rule is CSSImportRule {\n  return 'styleSheet' in rule;\n}\n\nexport function isCSSStyleRule(rule: CSSRule): rule is CSSStyleRule {\n  return 'selectorText' in rule;\n}\n\nexport class Mirror implements IMirror<Node> {\n  private idNodeMap: idNodeMap = new Map();\n  private nodeMetaMap: nodeMetaMap = new WeakMap();\n\n  getId(n: Node | undefined | null): number {\n    if (!n) return -1;\n\n    const id = this.getMeta(n)?.id;\n\n    // if n is not a serialized Node, use -1 as its id.\n    return id ?? -1;\n  }\n\n  getNode(id: number): Node | null {\n    return this.idNodeMap.get(id) || null;\n  }\n\n  getIds(): number[] {\n    return Array.from(this.idNodeMap.keys());\n  }\n\n  getMeta(n: Node): serializedNodeWithId | null {\n    return this.nodeMetaMap.get(n) || null;\n  }\n\n  // removes the node from idNodeMap\n  // doesn't remove the node from nodeMetaMap\n  removeNodeFromMap(n: Node) {\n    const id = this.getId(n);\n    this.idNodeMap.delete(id);\n\n    if (n.childNodes) {\n      n.childNodes.forEach((childNode) =>\n        this.removeNodeFromMap(childNode as unknown as Node),\n      );\n    }\n\n    if (isElement(n)) {\n      const shadowRootEl = dom.shadowRoot(n);\n      if (shadowRootEl) {\n        this.removeNodeFromMap(shadowRootEl as unknown as Node);\n      }\n\n      if (n.nodeName === 'IFRAME' && (n as HTMLIFrameElement).contentDocument) {\n        this.removeNodeFromMap(\n          (n as HTMLIFrameElement).contentDocument as unknown as Node,\n        );\n      }\n    }\n  }\n  has(id: number): boolean {\n    return this.idNodeMap.has(id);\n  }\n\n  hasNode(node: Node): boolean {\n    return this.nodeMetaMap.has(node);\n  }\n\n  add(n: Node, meta: serializedNodeWithId) {\n    const id = meta.id;\n    this.idNodeMap.set(id, n);\n    this.nodeMetaMap.set(n, meta);\n  }\n\n  replace(id: number, n: Node) {\n    const oldNode = this.getNode(id);\n    if (oldNode) {\n      const meta = this.nodeMetaMap.get(oldNode);\n      if (meta) this.nodeMetaMap.set(n, meta);\n    }\n    this.idNodeMap.set(id, n);\n  }\n\n  reset() {\n    this.idNodeMap = new Map();\n    this.nodeMetaMap = new WeakMap();\n  }\n}\n\nexport function createMirror(): Mirror {\n  return new Mirror();\n}\n\nexport function maskInputValue({\n  element,\n  maskInputOptions,\n  tagName,\n  type,\n  value,\n  maskInputFn,\n}: {\n  element: HTMLElement;\n  maskInputOptions: MaskInputOptions;\n  tagName: string;\n  type: string | null;\n  value: string | null;\n  maskInputFn?: MaskInputFn;\n}): string {\n  let text = value || '';\n  const actualType = type && toLowerCase(type);\n\n  if (\n    maskInputOptions[tagName.toLowerCase() as keyof MaskInputOptions] ||\n    (actualType && maskInputOptions[actualType as keyof MaskInputOptions])\n  ) {\n    if (maskInputFn) {\n      text = maskInputFn(text, element);\n    } else {\n      text = '*'.repeat(text.length);\n    }\n  }\n  return text;\n}\n\nexport function toLowerCase<T extends string>(str: T): Lowercase<T> {\n  return str.toLowerCase() as unknown as Lowercase<T>;\n}\n\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\ntype PatchedGetImageData = {\n  [ORIGINAL_ATTRIBUTE_NAME]: CanvasImageData['getImageData'];\n} & CanvasImageData['getImageData'];\n\nexport function is2DCanvasBlank(canvas: HTMLCanvasElement): boolean {\n  const ctx = canvas.getContext('2d');\n  if (!ctx) return true;\n\n  const chunkSize = 50;\n\n  // get chunks of the canvas and check if it is blank\n  for (let x = 0; x < canvas.width; x += chunkSize) {\n    for (let y = 0; y < canvas.height; y += chunkSize) {\n      // eslint-disable-next-line @typescript-eslint/unbound-method\n      const getImageData = ctx.getImageData as PatchedGetImageData;\n      const originalGetImageData =\n        ORIGINAL_ATTRIBUTE_NAME in getImageData\n          ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n          : getImageData;\n      // by getting the canvas in chunks we avoid an expensive\n      // `getImageData` call that retrieves everything\n      // even if we can already tell from the first chunk(s) that\n      // the canvas isn't blank\n      const pixelBuffer = new Uint32Array(\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n        originalGetImageData.call(\n          ctx,\n          x,\n          y,\n          Math.min(chunkSize, canvas.width - x),\n          Math.min(chunkSize, canvas.height - y),\n        ).data.buffer,\n      );\n      if (pixelBuffer.some((pixel) => pixel !== 0)) return false;\n    }\n  }\n  return true;\n}\n\nexport function isNodeMetaEqual(a: serializedNode, b: serializedNode): boolean {\n  if (!a || !b || a.type !== b.type) return false;\n  if (a.type === NodeType.Document)\n    return a.compatMode === (b as documentNode).compatMode;\n  else if (a.type === NodeType.DocumentType)\n    return (\n      a.name === (b as documentTypeNode).name &&\n      a.publicId === (b as documentTypeNode).publicId &&\n      a.systemId === (b as documentTypeNode).systemId\n    );\n  else if (\n    a.type === NodeType.Comment ||\n    a.type === NodeType.Text ||\n    a.type === NodeType.CDATA\n  )\n    return a.textContent === (b as textNode).textContent;\n  else if (a.type === NodeType.Element)\n    return (\n      a.tagName === (b as elementNode).tagName &&\n      JSON.stringify(a.attributes) ===\n        JSON.stringify((b as elementNode).attributes) &&\n      a.isSVG === (b as elementNode).isSVG &&\n      a.needBlock === (b as elementNode).needBlock\n    );\n  return false;\n}\n\n/**\n * Get the type of an input element.\n * This takes care of the case where a password input is changed to a text input.\n * In this case, we continue to consider this of type password, in order to avoid leaking sensitive data\n * where passwords should be masked.\n */\nexport function getInputType(element: HTMLElement): Lowercase<string> | null {\n  // when omitting the type of input element(e.g. <input />), the type is treated as text\n  const type = (element as HTMLInputElement).type;\n\n  return element.hasAttribute('data-rr-is-password')\n    ? 'password'\n    : type\n    ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n      toLowerCase(type)\n    : null;\n}\n\n/**\n * Extracts the file extension from an a path, considering search parameters and fragments.\n * @param path - Path to file\n * @param baseURL - [optional] Base URL of the page, used to resolve relative paths. Defaults to current page URL.\n */\nexport function extractFileExtension(\n  path: string,\n  baseURL?: string,\n): string | null {\n  let url;\n  try {\n    url = new URL(path, baseURL ?? window.location.href);\n  } catch (err) {\n    return null;\n  }\n  const regex = /\\.([0-9a-z]+)(?:$)/i;\n  const match = url.pathname.match(regex);\n  return match?.[1] ?? null;\n}\n\nfunction extractOrigin(url: string): string {\n  let origin = '';\n  if (url.indexOf('//') > -1) {\n    origin = url.split('/').slice(0, 3).join('/');\n  } else {\n    origin = url.split('/')[0];\n  }\n  origin = origin.split('?')[0];\n  return origin;\n}\n\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;\nexport function absolutifyURLs(cssText: string | null, href: string): string {\n  return (cssText || '').replace(\n    URL_IN_CSS_REF,\n    (\n      origin: string,\n      quote1: string,\n      path1: string,\n      quote2: string,\n      path2: string,\n      path3: string,\n    ) => {\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}${\n          extractOrigin(href) + filePath\n        }${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        } else if (part === '..') {\n          stack.pop();\n        } else {\n          stack.push(part);\n        }\n      }\n      return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\n    },\n  );\n}\n\nconst STRIPED_PLACEHOLDER_SVG =\n  'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxkZWZzPgogICAgPHBhdHRlcm4gaWQ9InN0cmlwZXMiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+CiAgICAgIDxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iYmxhY2siLz4KICAgICAgPHBhdGggZD0iTTggMEgxNkwwIDE2VjhMOCAwWiIgZmlsbD0iIzJEMkQyRCIvPgogICAgICA8cGF0aCBkPSJNMTYgOFYxNkg4TDE2IDhaIiBmaWxsPSIjMkQyRDJEIi8+CiAgICA8L3BhdHRlcm4+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjc3RyaXBlcykiLz4KPC9zdmc+Cg==';\n\nconst MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION = 4096;\n\nexport function recompressBase64Image(\n  img: HTMLImageElement,\n  dataURL: string,\n  type?: string,\n  quality?: number,\n): string {\n  if (!img.complete || img.naturalWidth === 0) {\n    return dataURL;\n  }\n\n  // don't recompress very large images to avoid performance issues\n  if (\n    img.naturalWidth > MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION ||\n    img.naturalHeight > MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION\n  ) {\n    return dataURL;\n  }\n\n  try {\n    const canvas = document.createElement('canvas');\n    canvas.width = img.naturalWidth;\n    canvas.height = img.naturalHeight;\n    const ctx = canvas.getContext('2d');\n\n    if (!ctx) {\n      return dataURL;\n    }\n\n    ctx.drawImage(img, 0, 0);\n    const recompressed = canvas.toDataURL(type || 'image/webp', quality ?? 0.4);\n\n    return recompressed;\n  } catch (err) {\n    return dataURL;\n  }\n}\n\nexport function checkDataURLSize(\n  dataURL: string,\n  maxLength: number | undefined,\n): string {\n  if (!maxLength || dataURL.length <= maxLength) {\n    return dataURL;\n  }\n\n  return STRIPED_PLACEHOLDER_SVG;\n}\n", "export enum NodeType {\n  Document,\n  DocumentType,\n  Element,\n  Text,\n  CDATA,\n  Comment,\n}\n\nexport type documentNode = {\n  type: NodeType.Document;\n  childNodes: serializedNodeWithId[];\n  compatMode?: string;\n};\n\nexport type documentTypeNode = {\n  type: NodeType.DocumentType;\n  name: string;\n  publicId: string;\n  systemId: string;\n};\n\nexport type attributes = {\n  [key: string]: string | number | true | null;\n};\nexport type legacyAttributes = {\n  /**\n   * @deprecated old bug in rrweb was causing these to always be set\n   * @see https://github.com/rrweb-io/rrweb/pull/651\n   */\n  selected: false;\n};\n\nexport type elementNode = {\n  type: NodeType.Element;\n  tagName: string;\n  attributes: attributes;\n  childNodes: serializedNodeWithId[];\n  isSVG?: true;\n  needBlock?: boolean;\n  // This is a custom element or not.\n  isCustom?: true;\n};\n\nexport type textNode = {\n  type: NodeType.Text;\n  textContent: string;\n  isStyle?: true;\n};\n\nexport type cdataNode = {\n  type: NodeType.CDATA;\n  textContent: '';\n};\n\nexport type commentNode = {\n  type: NodeType.Comment;\n  textContent: string;\n};\n\nexport type serializedNode = (\n  | documentNode\n  | documentTypeNode\n  | elementNode\n  | textNode\n  | cdataNode\n  | commentNode\n) & {\n  rootId?: number;\n  isShadowHost?: boolean;\n  isShadow?: boolean;\n};\n\nimport type { serializedNodeWithId } from '@posthog/rrweb-types';\n\nexport type serializedElementNodeWithId = Extract<\n  serializedNodeWithId,\n  Record<'type', NodeType.Element>\n>;\n\nexport type tagMap = {\n  [key: string]: string;\n};\n\nexport type DialogAttributes = {\n  open: string;\n  /**\n   * Represents the dialog's open mode.\n   * `modal` means the dialog is opened with `showModal()`.\n   * `non-modal` means the dialog is opened with `show()` or\n   * by adding an `open` attribute.\n   */\n  rr_open_mode: 'modal' | 'non-modal';\n  /**\n   * Currently unimplemented, but in future can be used to:\n   * Represents the order of which of the dialog was opened.\n   * This is useful for replaying the dialog `.showModal()` in the correct order.\n   */\n  // rr_open_mode_index?: number;\n};\n\nexport interface ICanvas extends HTMLCanvasElement {\n  __context: string;\n}\n\nexport type idNodeMap = Map<number, Node>;\n\nexport type nodeMetaMap = WeakMap<Node, serializedNodeWithId>;\n\nexport type MaskInputOptions = Partial<{\n  color: boolean;\n  date: boolean;\n  'datetime-local': boolean;\n  email: boolean;\n  month: boolean;\n  number: boolean;\n  range: boolean;\n  search: boolean;\n  tel: boolean;\n  text: boolean;\n  time: boolean;\n  url: boolean;\n  week: boolean;\n  // unify textarea and select element with text input\n  textarea: boolean;\n  select: boolean;\n  password: boolean;\n}>;\n\nexport type SlimDOMOptions = Partial<{\n  script: boolean;\n  comment: boolean;\n  headFavicon: boolean;\n  headWhitespace: boolean;\n  headMetaDescKeywords: boolean;\n  headMetaSocial: boolean;\n  headMetaRobots: boolean;\n  headMetaHttpEquiv: boolean;\n  headMetaAuthorship: boolean;\n  headMetaVerification: boolean;\n  /**\n   * blocks title tag 'animations' which can generate a lot of mutations that aren't usually displayed in replayers\n   **/\n  headTitleMutations: boolean;\n}>;\n\nexport type MaskTextFn = (text: string, element: HTMLElement | null) => string;\nexport type MaskInputFn = (text: string, element: HTMLElement) => string;\n\nexport type KeepIframeSrcFn = (src: string) => boolean;\n\nexport type BuildCache = {\n  stylesWithHoverClass: Map<string, string>;\n};\n", "import type {\n  MaskInputOptions,\n  SlimDOMOptions,\n  MaskTextFn,\n  MaskInputFn,\n  KeepIframeSrcFn,\n  ICanvas,\n  DialogAttributes,\n} from './types';\nimport { NodeType } from '@posthog/rrweb-types';\nimport type {\n  serializedNode,\n  serializedNodeWithId,\n  serializedElementNodeWithId,\n  elementNode,\n  attributes,\n  mediaAttributes,\n  DataURLOptions,\n} from '@posthog/rrweb-types';\nimport {\n  Mirror,\n  is2DCanvasBlank,\n  isElement,\n  isShadowRoot,\n  maskInputValue,\n  isNativeShadowDom,\n  stringifyStylesheet,\n  getInputType,\n  toLowerCase,\n  extractFileExtension,\n  checkDataURLSize,\n  recompressBase64Image,\n  absolutifyURLs,\n} from './utils';\nimport dom from '@posthog/rrweb-utils';\n\nlet _id = 1;\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\n\nexport const IGNORED_NODE = -2;\n\nexport function genId(): number {\n  return _id++;\n}\n\nfunction getValidTagName(element: HTMLElement): Lowercase<string> {\n  if (element instanceof HTMLFormElement) {\n    return 'form';\n  }\n\n  const processedTagName = toLowerCase(element.tagName);\n\n  if (tagNameRegex.test(processedTagName)) {\n    // if the tag name is odd and we cannot extract\n    // anything from the string, then we return a\n    // generic div\n    return 'div';\n  }\n\n  return processedTagName;\n}\n\nlet canvasService: HTMLCanvasElement | null;\nlet canvasCtx: CanvasRenderingContext2D | null;\n\n// eslint-disable-next-line no-control-regex\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/; // Don't use \\s, to avoid matching non-breaking space\n// eslint-disable-next-line no-control-regex\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\n\nfunction getAbsoluteSrcsetString(doc: Document, attributeValue: string) {\n  /*\n    run absoluteToDoc over every url in the srcset\n\n    this is adapted from https://github.com/albell/parse-srcset/\n    without the parsing of the descriptors (we return these as-is)\n    parce-srcset is in turn based on\n    https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n  */\n  if (attributeValue.trim() === '') {\n    return attributeValue;\n  }\n\n  let pos = 0;\n\n  function collectCharacters(regEx: RegExp) {\n    let chars: string;\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\n  const output = [];\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    collectCharacters(SRCSET_COMMAS_OR_SPACES);\n    if (pos >= attributeValue.length) {\n      break;\n    }\n    // don't split on commas within urls\n    let url = collectCharacters(SRCSET_NOT_SPACES);\n    if (url.slice(-1) === ',') {\n      // aside: according to spec more than one comma at the end is a parse error, but we ignore that\n      url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n      // the trailing comma splits the srcset, so the interpretion is that\n      // another url will follow, and the descriptor is empty\n      output.push(url);\n    } else {\n      let descriptorsStr = '';\n      url = absoluteToDoc(doc, url);\n      let inParens = false;\n      // eslint-disable-next-line no-constant-condition\n      while (true) {\n        const c = attributeValue.charAt(pos);\n        if (c === '') {\n          output.push((url + descriptorsStr).trim());\n          break;\n        } else if (!inParens) {\n          if (c === ',') {\n            pos += 1;\n            output.push((url + descriptorsStr).trim());\n            break; // parse the next url\n          } else if (c === '(') {\n            inParens = true;\n          }\n        } else {\n          // in parenthesis; ignore commas\n          // (parenthesis may be supported by future additions to spec)\n          if (c === ')') {\n            inParens = false;\n          }\n        }\n        descriptorsStr += c;\n        pos += 1;\n      }\n    }\n  }\n  return output.join(', ');\n}\n\nconst cachedDocument = new WeakMap<Document, HTMLAnchorElement>();\n\nexport function absoluteToDoc(doc: Document, attributeValue: string): string {\n  if (!attributeValue || attributeValue.trim() === '') {\n    return attributeValue;\n  }\n\n  return getHref(doc, attributeValue);\n}\n\nfunction isSVGElement(el: Element): boolean {\n  return Boolean(el.tagName === 'svg' || (el as SVGElement).ownerSVGElement);\n}\n\nfunction getHref(doc: Document, customHref?: string) {\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  } else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\n    return customHref;\n  }\n  // note: using `new URL` is slower. See #1434 or https://jsbench.me/uqlud17rxo/1\n  a.setAttribute('href', customHref);\n  return a.href;\n}\n\nexport function transformAttribute(\n  doc: Document,\n  tagName: Lowercase<string>,\n  name: Lowercase<string>,\n  value: string | null,\n  element?: HTMLElement,\n  dataURLOptions?: DataURLOptions,\n): string | null {\n  if (!value) {\n    return value;\n  }\n\n  // relative path in attribute\n  if (\n    name === 'src' ||\n    (name === 'href' && !(tagName === 'use' && value[0] === '#'))\n  ) {\n    // href starts with a # is an id pointer for svg\n    const transformedValue = absoluteToDoc(doc, value);\n\n    if (tagName === 'img' && transformedValue.startsWith('data:') && element) {\n      const img = element as HTMLImageElement;\n\n      let processedDataURL = transformedValue;\n\n      if (dataURLOptions?.type || dataURLOptions?.quality !== undefined) {\n        processedDataURL = recompressBase64Image(\n          img,\n          transformedValue,\n          dataURLOptions.type,\n          dataURLOptions.quality,\n        );\n      }\n\n      if (dataURLOptions?.maxBase64ImageLength) {\n        processedDataURL = checkDataURLSize(\n          processedDataURL,\n          dataURLOptions.maxBase64ImageLength,\n        );\n      }\n\n      return processedDataURL;\n    }\n\n    return transformedValue;\n  } else if (name === 'xlink:href' && value[0] !== '#') {\n    // xlink:href starts with # is an id pointer\n    return absoluteToDoc(doc, value);\n  } else if (\n    name === 'background' &&\n    (tagName === 'table' || tagName === 'td' || tagName === 'th')\n  ) {\n    return absoluteToDoc(doc, value);\n  } else if (name === 'srcset') {\n    return getAbsoluteSrcsetString(doc, value);\n  } else if (name === 'style') {\n    return absolutifyURLs(value, getHref(doc));\n  } else if (tagName === 'object' && name === 'data') {\n    return absoluteToDoc(doc, value);\n  }\n\n  return value;\n}\n\nexport function ignoreAttribute(\n  tagName: string,\n  name: string,\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  _value: unknown,\n): boolean {\n  return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\n}\n\nexport function _isBlockedElement(\n  element: HTMLElement,\n  blockClass: string | RegExp,\n  blockSelector: string | null,\n): boolean {\n  try {\n    if (typeof blockClass === 'string') {\n      if (element.classList.contains(blockClass)) {\n        return true;\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  } catch (e) {\n    //\n  }\n\n  return false;\n}\n\nexport function classMatchesRegex(\n  node: Node | null,\n  regex: RegExp,\n  checkAncestors: boolean,\n): boolean {\n  if (!node) return false;\n  if (node.nodeType !== node.ELEMENT_NODE) {\n    if (!checkAncestors) return false;\n    return classMatchesRegex(dom.parentNode(node), regex, checkAncestors);\n  }\n\n  for (let eIndex = (node as HTMLElement).classList.length; eIndex--; ) {\n    const className = (node as HTMLElement).classList[eIndex];\n    if (regex.test(className)) {\n      return true;\n    }\n  }\n  if (!checkAncestors) return false;\n  return classMatchesRegex(dom.parentNode(node), regex, checkAncestors);\n}\n\nexport function needMaskingText(\n  node: Node,\n  maskTextClass: string | RegExp,\n  maskTextSelector: string | null,\n  checkAncestors: boolean,\n): boolean {\n  let el: Element;\n  if (isElement(node)) {\n    el = node;\n    if (!dom.childNodes(el).length) {\n      // optimisation: we can avoid any of the below checks on leaf elements\n      // as masking is applied to child text nodes only\n      return false;\n    }\n  } else if (dom.parentElement(node) === null) {\n    // should warn? maybe a text node isn't attached to a parent node yet?\n    return false;\n  } else {\n    el = dom.parentElement(node)!;\n  }\n  try {\n    if (typeof maskTextClass === 'string') {\n      if (checkAncestors) {\n        if (el.closest(`.${maskTextClass}`)) return true;\n      } else {\n        if (el.classList.contains(maskTextClass)) return true;\n      }\n    } else {\n      if (classMatchesRegex(el, maskTextClass, checkAncestors)) return true;\n    }\n    if (maskTextSelector) {\n      if (checkAncestors) {\n        if (el.closest(maskTextSelector)) return true;\n      } else {\n        if (el.matches(maskTextSelector)) return true;\n      }\n    }\n  } catch (e) {\n    //\n  }\n  return false;\n}\n\n// https://stackoverflow.com/a/36155560\nfunction onceIframeLoaded(\n  iframeEl: HTMLIFrameElement,\n  listener: () => unknown,\n  iframeLoadTimeout: number,\n) {\n  const win = iframeEl.contentWindow;\n  if (!win) {\n    return;\n  }\n  // document is loading\n  let fired = false;\n\n  let readyState: DocumentReadyState;\n  try {\n    readyState = win.document.readyState;\n  } catch (error) {\n    return;\n  }\n  if (readyState !== 'complete') {\n    const timer = setTimeout(() => {\n      if (!fired) {\n        listener();\n        fired = true;\n      }\n    }, iframeLoadTimeout);\n    iframeEl.addEventListener('load', () => {\n      clearTimeout(timer);\n      fired = true;\n      listener();\n    });\n    return;\n  }\n  // check blank frame for Chrome\n  const blankUrl = 'about:blank';\n  if (\n    win.location.href !== blankUrl ||\n    iframeEl.src === blankUrl ||\n    iframeEl.src === ''\n  ) {\n    // iframe was already loaded, make sure we wait to trigger the listener\n    // till _after_ the mutation that found this iframe has had time to process\n    setTimeout(listener, 0);\n\n    return iframeEl.addEventListener('load', listener); // keep listing for future loads\n  }\n  // use default listener\n  iframeEl.addEventListener('load', listener);\n}\n\nfunction onceStylesheetLoaded(\n  link: HTMLLinkElement,\n  listener: () => unknown,\n  styleSheetLoadTimeout: number,\n) {\n  let fired = false;\n  let styleSheetLoaded: StyleSheet | null;\n  try {\n    styleSheetLoaded = link.sheet;\n  } catch (error) {\n    return;\n  }\n\n  if (styleSheetLoaded) return;\n\n  const timer = setTimeout(() => {\n    if (!fired) {\n      listener();\n      fired = true;\n    }\n  }, styleSheetLoadTimeout);\n\n  link.addEventListener('load', () => {\n    clearTimeout(timer);\n    fired = true;\n    listener();\n  });\n}\n\nfunction serializeNode(\n  n: Node,\n  options: {\n    doc: Document;\n    mirror: Mirror;\n    blockClass: string | RegExp;\n    blockSelector: string | null;\n    needsMask: boolean;\n    inlineStylesheet: boolean;\n    maskInputOptions: MaskInputOptions;\n    maskTextFn: MaskTextFn | undefined;\n    maskInputFn: MaskInputFn | undefined;\n    dataURLOptions?: DataURLOptions;\n    inlineImages: boolean;\n    recordCanvas: boolean;\n    keepIframeSrcFn: KeepIframeSrcFn;\n    /**\n     * `newlyAddedElement: true` skips scrollTop and scrollLeft check\n     */\n    newlyAddedElement?: boolean;\n  },\n): serializedNode | false {\n  const {\n    doc,\n    mirror,\n    blockClass,\n    blockSelector,\n    needsMask,\n    inlineStylesheet,\n    maskInputOptions = {},\n    maskTextFn,\n    maskInputFn,\n    dataURLOptions = {},\n    inlineImages,\n    recordCanvas,\n    keepIframeSrcFn,\n    newlyAddedElement = false,\n  } = options;\n  // Only record root id when document object is not the base document\n  const rootId = getRootId(doc, mirror);\n  switch (n.nodeType) {\n    case n.DOCUMENT_NODE:\n      if ((n as Document).compatMode !== 'CSS1Compat') {\n        return {\n          type: NodeType.Document,\n          childNodes: [],\n          compatMode: (n as Document).compatMode, // probably \"BackCompat\"\n        };\n      } else {\n        return {\n          type: NodeType.Document,\n          childNodes: [],\n        };\n      }\n    case n.DOCUMENT_TYPE_NODE:\n      return {\n        type: NodeType.DocumentType,\n        name: (n as DocumentType).name,\n        publicId: (n as DocumentType).publicId,\n        systemId: (n as DocumentType).systemId,\n        rootId,\n      };\n    case n.ELEMENT_NODE:\n      return serializeElementNode(n as HTMLElement, {\n        doc,\n        blockClass,\n        blockSelector,\n        inlineStylesheet,\n        maskInputOptions,\n        maskInputFn,\n        dataURLOptions,\n        inlineImages,\n        recordCanvas,\n        keepIframeSrcFn,\n        newlyAddedElement,\n        rootId,\n      });\n    case n.TEXT_NODE:\n      return serializeTextNode(n as Text, {\n        doc,\n        needsMask,\n        maskTextFn,\n        rootId,\n      });\n    case n.CDATA_SECTION_NODE:\n      return {\n        type: NodeType.CDATA,\n        textContent: '',\n        rootId,\n      };\n    case n.COMMENT_NODE:\n      return {\n        type: NodeType.Comment,\n        textContent: dom.textContent(n as Comment) || '',\n        rootId,\n      };\n    default:\n      return false;\n  }\n}\n\nfunction getRootId(doc: Document, mirror: Mirror): number | undefined {\n  if (!mirror.hasNode(doc)) return undefined;\n  const docId = mirror.getId(doc);\n  return docId === 1 ? undefined : docId;\n}\n\nfunction serializeTextNode(\n  n: Text,\n  options: {\n    doc: Document;\n    needsMask: boolean;\n    maskTextFn: MaskTextFn | undefined;\n    rootId: number | undefined;\n  },\n): serializedNode {\n  const { needsMask, maskTextFn, rootId } = options;\n  // The parent node may not be a html element which has a tagName attribute.\n  // So just let it be undefined which is ok in this use case.\n  const parent = dom.parentNode(n);\n  const parentTagName = parent && (parent as HTMLElement).tagName;\n  let text = dom.textContent(n);\n  const isStyle = parentTagName === 'STYLE' ? true : undefined;\n  const isScript = parentTagName === 'SCRIPT' ? true : undefined;\n  if (isStyle && text) {\n    try {\n      // try to read style sheet\n      if (n.nextSibling || n.previousSibling) {\n        // This is not the only child of the stylesheet.\n        // We can't read all of the sheet's .cssRules and expect them\n        // to _only_ include the current rule(s) added by the text node.\n        // So we'll be conservative and keep textContent as-is.\n      } else if ((parent as HTMLStyleElement).sheet?.cssRules) {\n        text = stringifyStylesheet((parent as HTMLStyleElement).sheet!);\n      }\n    } catch (err) {\n      console.warn(\n        `Cannot get CSS styles from text's parentNode. Error: ${err as string}`,\n        n,\n      );\n    }\n    text = absolutifyURLs(text, getHref(options.doc));\n  }\n  if (isScript) {\n    text = 'SCRIPT_PLACEHOLDER';\n  }\n  if (!isStyle && !isScript && text && needsMask) {\n    text = maskTextFn\n      ? maskTextFn(text, dom.parentElement(n))\n      : text.replace(/[\\S]/g, '*');\n  }\n\n  return {\n    type: NodeType.Text,\n    textContent: text || '',\n    isStyle,\n    rootId,\n  };\n}\n\nfunction findStylesheet(doc: Document, href: string) {\n  return Array.from(doc.styleSheets).find((s) => s.href === href);\n}\n\n/**\n * in production, we've seen elements like\n * `<link type=\"text/css\" rel=\"stylesheet\" id=\"dark-mode-custom-link\"></link>`\n * while HTMLLinkElement suggests an href is always present\n * the w3c spec is less specific\n * and regardless we've seen at least one instance of this in the wild\n * let's be defensive and make sure this is typed as possibly undefined\n */\nfunction hrefFrom(n: unknown): string | undefined {\n  return (n as HTMLLinkElement).href;\n}\n\nfunction serializeElementNode(\n  n: HTMLElement,\n  options: {\n    doc: Document;\n    blockClass: string | RegExp;\n    blockSelector: string | null;\n    inlineStylesheet: boolean;\n    maskInputOptions: MaskInputOptions;\n    maskInputFn: MaskInputFn | undefined;\n    dataURLOptions?: DataURLOptions;\n    inlineImages: boolean;\n    recordCanvas: boolean;\n    keepIframeSrcFn: KeepIframeSrcFn;\n    /**\n     * `newlyAddedElement: true` skips scrollTop and scrollLeft check\n     */\n    newlyAddedElement?: boolean;\n    rootId: number | undefined;\n  },\n): serializedNode | false {\n  const {\n    doc,\n    blockClass,\n    blockSelector,\n    inlineStylesheet,\n    maskInputOptions = {},\n    maskInputFn,\n    dataURLOptions = {},\n    inlineImages,\n    recordCanvas,\n    keepIframeSrcFn,\n    newlyAddedElement = false,\n    rootId,\n  } = options;\n  const needBlock = _isBlockedElement(n, blockClass, blockSelector);\n  const tagName = getValidTagName(n);\n  let attributes: attributes = {};\n  const len = n.attributes.length;\n  for (let i = 0; i < len; i++) {\n    const attr = n.attributes[i];\n    if (!ignoreAttribute(tagName, attr.name, attr.value)) {\n      attributes[attr.name] = transformAttribute(\n        doc,\n        tagName,\n        toLowerCase(attr.name),\n        attr.value,\n        n,\n        dataURLOptions,\n      );\n    }\n  }\n  // remote css\n  if (tagName === 'link' && inlineStylesheet) {\n    //TODO: maybe replace this `.styleSheets` with original one\n    const href: string | undefined = hrefFrom(n);\n    if (href) {\n      let stylesheet = findStylesheet(doc, href);\n      if (!stylesheet && href.includes('.css')) {\n        const rootDomain = window.location.origin;\n        const stylesheetPath = href.replace(window.location.href, '');\n        const potentialStylesheetHref = rootDomain + '/' + stylesheetPath;\n        stylesheet = findStylesheet(doc, potentialStylesheetHref);\n      }\n      let cssText: string | null = null;\n      if (stylesheet) {\n        cssText = stringifyStylesheet(stylesheet);\n      }\n      if (cssText) {\n        delete attributes.rel;\n        delete attributes.href;\n        attributes._cssText = cssText;\n      }\n    }\n  }\n  // dynamic stylesheet\n  if (\n    tagName === 'style' &&\n    (n as HTMLStyleElement).sheet &&\n    // TODO: Currently we only try to get dynamic stylesheet when it is an empty style element\n    !(n.innerText || dom.textContent(n) || '').trim().length\n  ) {\n    const cssText = stringifyStylesheet(\n      (n as HTMLStyleElement).sheet as CSSStyleSheet,\n    );\n    if (cssText) {\n      attributes._cssText = cssText;\n    }\n  }\n  // form fields\n  if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n    const value = (n as HTMLInputElement | HTMLTextAreaElement).value;\n    const checked = (n as HTMLInputElement).checked;\n    if (\n      attributes.type !== 'radio' &&\n      attributes.type !== 'checkbox' &&\n      attributes.type !== 'submit' &&\n      attributes.type !== 'button' &&\n      value\n    ) {\n      attributes.value = maskInputValue({\n        element: n,\n        type: getInputType(n),\n        tagName,\n        value,\n        maskInputOptions,\n        maskInputFn,\n      });\n    } else if (checked) {\n      attributes.checked = checked;\n    }\n  }\n  if (tagName === 'option') {\n    if ((n as HTMLOptionElement).selected && !maskInputOptions['select']) {\n      attributes.selected = true;\n    } else {\n      // ignore the html attribute (which corresponds to DOM (n as HTMLOptionElement).defaultSelected)\n      // if it's already been changed\n      delete attributes.selected;\n    }\n  }\n\n  if (tagName === 'dialog' && (n as HTMLDialogElement).open) {\n    // register what type of dialog is this\n    // `modal` or `non-modal`\n    // this is used to trigger `showModal()` or `show()` on replay (outside of rrweb-snapshot, in rrweb)\n    try {\n      (attributes as DialogAttributes).rr_open_mode = n.matches('dialog:modal')\n        ? 'modal'\n        : 'non-modal';\n    } catch {\n      // likely this is safari not able to deal with the `:modal` selector\n      // we can't detect whether the dialog is modal or non-modal open, so have to guess\n      // hopefully this is only safari 15.4 and 15.5\n      attributes.rr_open_mode = 'modal';\n      attributes.ph_rr_could_not_detect_modal = true;\n    }\n  }\n\n  // canvas image data\n  if (tagName === 'canvas' && recordCanvas) {\n    if ((n as ICanvas).__context === '2d') {\n      // only record this on 2d canvas\n      if (!is2DCanvasBlank(n as HTMLCanvasElement)) {\n        attributes.rr_dataURL = (n as HTMLCanvasElement).toDataURL(\n          dataURLOptions.type,\n          dataURLOptions.quality,\n        );\n      }\n    } else if (!('__context' in n)) {\n      // context is unknown, better not call getContext to trigger it\n      const canvasDataURL = (n as HTMLCanvasElement).toDataURL(\n        dataURLOptions.type,\n        dataURLOptions.quality,\n      );\n\n      // create blank canvas of same dimensions\n      const blankCanvas = doc.createElement('canvas');\n      blankCanvas.width = (n as HTMLCanvasElement).width;\n      blankCanvas.height = (n as HTMLCanvasElement).height;\n      const blankCanvasDataURL = blankCanvas.toDataURL(\n        dataURLOptions.type,\n        dataURLOptions.quality,\n      );\n\n      // no need to save dataURL if it's the same as blank canvas\n      if (canvasDataURL !== blankCanvasDataURL) {\n        attributes.rr_dataURL = canvasDataURL;\n      }\n    }\n  }\n  // save image offline\n  if (tagName === 'img' && inlineImages) {\n    if (!canvasService) {\n      canvasService = doc.createElement('canvas');\n      canvasCtx = canvasService.getContext('2d');\n    }\n    const image = n as HTMLImageElement;\n    const imageSrc: string =\n      image.currentSrc || image.getAttribute('src') || '<unknown-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(\n          dataURLOptions.type,\n          dataURLOptions.quality,\n        );\n      } catch (err) {\n        if (image.crossOrigin !== 'anonymous') {\n          image.crossOrigin = 'anonymous';\n          if (image.complete && image.naturalWidth !== 0)\n            recordInlineImage(); // too early due to image reload\n          else image.addEventListener('load', recordInlineImage);\n          return;\n        } else {\n          console.warn(\n            `Cannot inline img src=${imageSrc}! Error: ${err as string}`,\n          );\n        }\n      }\n      if (image.crossOrigin === 'anonymous') {\n        priorCrossOrigin\n          ? (attributes.crossOrigin = priorCrossOrigin)\n          : image.removeAttribute('crossorigin');\n      }\n    };\n    // The image content may not have finished loading yet.\n    if (image.complete && image.naturalWidth !== 0) recordInlineImage();\n    else image.addEventListener('load', recordInlineImage);\n  }\n  // media elements\n  if (tagName === 'audio' || tagName === 'video') {\n    const mediaAttributes = attributes as mediaAttributes;\n    mediaAttributes.rr_mediaState = (n as HTMLMediaElement).paused\n      ? 'paused'\n      : 'played';\n    mediaAttributes.rr_mediaCurrentTime = (n as HTMLMediaElement).currentTime;\n    mediaAttributes.rr_mediaPlaybackRate = (n as HTMLMediaElement).playbackRate;\n    mediaAttributes.rr_mediaMuted = (n as HTMLMediaElement).muted;\n    mediaAttributes.rr_mediaLoop = (n as HTMLMediaElement).loop;\n    mediaAttributes.rr_mediaVolume = (n as HTMLMediaElement).volume;\n  }\n  // Scroll\n  if (!newlyAddedElement) {\n    // `scrollTop` and `scrollLeft` are expensive calls because they trigger reflow.\n    // Since `scrollTop` & `scrollLeft` are always 0 when an element is added to the DOM.\n    // And scrolls also get picked up by rrweb's ScrollObserver\n    // So we can safely skip the `scrollTop/Left` calls for newly added elements\n    if (n.scrollLeft) {\n      attributes.rr_scrollLeft = n.scrollLeft;\n    }\n    if (n.scrollTop) {\n      attributes.rr_scrollTop = n.scrollTop;\n    }\n  }\n  // block element\n  if (needBlock) {\n    const { width, height, left, top } = n.getBoundingClientRect();\n    attributes = {\n      class: attributes.class,\n      rr_width: `${width}px`,\n      rr_height: `${height}px`,\n      rr_left: `${Math.floor(left + (doc.defaultView?.scrollX || 0))}px`,\n      rr_top: `${Math.floor(top + (doc.defaultView?.scrollY || 0))}px`,\n    };\n  }\n  // iframe\n  if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src as string)) {\n    if (!(n as HTMLIFrameElement).contentDocument) {\n      // we can't record it directly as we can't see into it\n      // preserve the src attribute so a decision can be taken at replay time\n      attributes.rr_src = attributes.src;\n    }\n    delete attributes.src; // prevent auto loading\n  }\n\n  let isCustomElement: true | undefined;\n  try {\n    if (customElements.get(tagName)) isCustomElement = true;\n  } catch (e) {\n    // In case old browsers don't support customElements\n  }\n\n  return {\n    type: NodeType.Element,\n    tagName,\n    attributes,\n    childNodes: [],\n    isSVG: isSVGElement(n as Element) || undefined,\n    needBlock,\n    rootId,\n    isCustom: isCustomElement,\n  };\n}\n\nfunction lowerIfExists(\n  maybeAttr: string | number | boolean | undefined | null,\n): string {\n  if (maybeAttr === undefined || maybeAttr === null) {\n    return '';\n  } else {\n    return (maybeAttr as string).toLowerCase();\n  }\n}\n\nfunction slimDOMExcluded(\n  sn: serializedNode,\n  slimDOMOptions: SlimDOMOptions,\n): boolean {\n  if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n    // TODO: convert IE conditional comments to real nodes\n    return true;\n  } else if (sn.type === NodeType.Element) {\n    if (\n      slimDOMOptions.script &&\n      // script tag\n      (sn.tagName === 'script' ||\n        // (module)preload link\n        (sn.tagName === 'link' &&\n          ((sn.attributes.rel === 'preload' && sn.attributes.as === 'script') ||\n            sn.attributes.rel === 'modulepreload')) ||\n        // prefetch link\n        (sn.tagName === 'link' &&\n          sn.attributes.rel === 'prefetch' &&\n          typeof sn.attributes.href === 'string' &&\n          extractFileExtension(sn.attributes.href) === 'js'))\n    ) {\n      return true;\n    } else if (\n      slimDOMOptions.headFavicon &&\n      ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n        (sn.tagName === 'meta' &&\n          (lowerIfExists(sn.attributes.name).match(\n            /^msapplication-tile(image|color)$/,\n          ) ||\n            lowerIfExists(sn.attributes.name) === 'application-name' ||\n            ['icon', 'apple-touch-icon', 'shortcut icon'].includes(\n              lowerIfExists(sn.attributes.rel),\n            ))))\n    ) {\n      return true;\n    } else if (sn.tagName === 'meta') {\n      if (\n        slimDOMOptions.headMetaDescKeywords &&\n        lowerIfExists(sn.attributes.name).match(/^description|keywords$/)\n      ) {\n        return true;\n      } else if (\n        slimDOMOptions.headMetaSocial &&\n        (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook)\n          lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n          lowerIfExists(sn.attributes.name) === 'pinterest')\n      ) {\n        return true;\n      } else if (\n        slimDOMOptions.headMetaRobots &&\n        ['robots', 'googlebot', 'bingbot'].includes(\n          lowerIfExists(sn.attributes.name),\n        )\n      ) {\n        return true;\n      } else if (\n        slimDOMOptions.headMetaHttpEquiv &&\n        sn.attributes['http-equiv'] !== undefined\n      ) {\n        // e.g. X-UA-Compatible, Content-Type, Content-Language,\n        // cache-control, X-Translated-By\n        return true;\n      } else if (\n        slimDOMOptions.headMetaAuthorship &&\n        (['author', 'generator', 'framework', 'publisher', 'progid'].includes(\n          lowerIfExists(sn.attributes.name),\n        ) ||\n          lowerIfExists(sn.attributes.property).match(/^article:/) ||\n          lowerIfExists(sn.attributes.property).match(/^product:/))\n      ) {\n        return true;\n      } else if (\n        slimDOMOptions.headMetaVerification &&\n        [\n          'google-site-verification',\n          'yandex-verification',\n          'csrf-token',\n          'p:domain_verify',\n          'verify-v1',\n          'verification',\n          'shopify-checkout-api-token',\n        ].includes(lowerIfExists(sn.attributes.name))\n      ) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nexport const DEFAULT_MAX_DEPTH = 50;\n\nlet _maxDepthWarned = false;\nlet _maxDepthReached = false;\n\nexport function wasMaxDepthReached(): boolean {\n  return _maxDepthReached;\n}\n\nexport function resetMaxDepthState(): void {\n  _maxDepthReached = false;\n  _maxDepthWarned = false;\n}\n\nexport function serializeNodeWithId(\n  n: Node,\n  options: {\n    doc: Document;\n    mirror: Mirror;\n    blockClass: string | RegExp;\n    blockSelector: string | null;\n    maskTextClass: string | RegExp;\n    maskTextSelector: string | null;\n    skipChild: boolean;\n    inlineStylesheet: boolean;\n    newlyAddedElement?: boolean;\n    maskInputOptions?: MaskInputOptions;\n    needsMask?: boolean;\n    maskTextFn: MaskTextFn | undefined;\n    maskInputFn: MaskInputFn | undefined;\n    slimDOMOptions: SlimDOMOptions;\n    dataURLOptions?: DataURLOptions;\n    keepIframeSrcFn?: KeepIframeSrcFn;\n    inlineImages?: boolean;\n    recordCanvas?: boolean;\n    preserveWhiteSpace?: boolean;\n    onSerialize?: (n: Node) => unknown;\n    onIframeLoad?: (\n      iframeNode: HTMLIFrameElement,\n      node: serializedElementNodeWithId,\n    ) => unknown;\n    iframeLoadTimeout?: number;\n    onStylesheetLoad?: (\n      linkNode: HTMLLinkElement,\n      node: serializedElementNodeWithId,\n    ) => unknown;\n    stylesheetLoadTimeout?: number;\n    depth?: number;\n    maxDepth?: number;\n    onMaxDepthReached?: () => void;\n  },\n): serializedNodeWithId | null {\n  const {\n    doc,\n    mirror,\n    blockClass,\n    blockSelector,\n    maskTextClass,\n    maskTextSelector,\n    skipChild = false,\n    inlineStylesheet = true,\n    maskInputOptions = {},\n    maskTextFn,\n    maskInputFn,\n    slimDOMOptions,\n    dataURLOptions = {},\n    inlineImages = false,\n    recordCanvas = false,\n    onSerialize,\n    onIframeLoad,\n    iframeLoadTimeout = 5000,\n    onStylesheetLoad,\n    stylesheetLoadTimeout = 5000,\n    keepIframeSrcFn = () => false,\n    newlyAddedElement = false,\n    depth = 0,\n    maxDepth = DEFAULT_MAX_DEPTH,\n  } = options;\n  let { needsMask } = options;\n  let { preserveWhiteSpace = true } = options;\n\n  if (depth >= maxDepth) {\n    _maxDepthReached = true;\n    if (!_maxDepthWarned) {\n      _maxDepthWarned = true;\n      console.warn(\n        `[rrweb-snapshot] DOM tree depth exceeded max depth of ${maxDepth}. ` +\n          `Children beyond this depth will not be recorded. ` +\n          `This may indicate deeply nested DOM structures.`,\n      );\n    }\n    return null;\n  }\n\n  if (!needsMask) {\n    // perf: if needsMask = true, children won't also need to check\n    const checkAncestors = needsMask === undefined; // if false, we've already checked ancestors\n    needsMask = needMaskingText(\n      n as Element,\n      maskTextClass,\n      maskTextSelector,\n      checkAncestors,\n    );\n  }\n\n  const _serializedNode = serializeNode(n, {\n    doc,\n    mirror,\n    blockClass,\n    blockSelector,\n    needsMask,\n    inlineStylesheet,\n    maskInputOptions,\n    maskTextFn,\n    maskInputFn,\n    dataURLOptions,\n    inlineImages,\n    recordCanvas,\n    keepIframeSrcFn,\n    newlyAddedElement,\n  });\n  if (!_serializedNode) {\n    // TODO: dev only\n    console.warn(n, 'not serialized');\n    return null;\n  }\n\n  let id: number | undefined;\n  if (mirror.hasNode(n)) {\n    // Reuse the previous id\n    id = mirror.getId(n);\n  } else if (\n    slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n    (!preserveWhiteSpace &&\n      _serializedNode.type === NodeType.Text &&\n      !_serializedNode.isStyle &&\n      !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)\n  ) {\n    id = IGNORED_NODE;\n  } else {\n    id = genId();\n  }\n\n  const serializedNode = Object.assign(_serializedNode, { id });\n  // add IGNORED_NODE to mirror to track nextSiblings\n  mirror.add(n, serializedNode);\n\n  if (id === IGNORED_NODE) {\n    return null; // slimDOM\n  }\n\n  if (onSerialize) {\n    onSerialize(n);\n  }\n  let recordChild = !skipChild;\n  if (serializedNode.type === NodeType.Element) {\n    recordChild = recordChild && !serializedNode.needBlock;\n    // this property was not needed in replay side\n    delete serializedNode.needBlock;\n    const shadowRootEl = dom.shadowRoot(n);\n    if (shadowRootEl && isNativeShadowDom(shadowRootEl))\n      serializedNode.isShadowHost = true;\n  }\n  if (\n    (serializedNode.type === NodeType.Document ||\n      serializedNode.type === NodeType.Element) &&\n    recordChild\n  ) {\n    if (\n      slimDOMOptions.headWhitespace &&\n      serializedNode.type === NodeType.Element &&\n      serializedNode.tagName === 'head'\n      // would impede performance: || getComputedStyle(n)['white-space'] === 'normal'\n    ) {\n      preserveWhiteSpace = false;\n    }\n    const bypassOptions = {\n      doc,\n      mirror,\n      blockClass,\n      blockSelector,\n      needsMask,\n      maskTextClass,\n      maskTextSelector,\n      skipChild,\n      inlineStylesheet,\n      maskInputOptions,\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      depth: depth + 1,\n      maxDepth,\n    };\n\n    if (\n      serializedNode.type === NodeType.Element &&\n      serializedNode.tagName === 'textarea' &&\n      (serializedNode as elementNode).attributes.value !== undefined\n    ) {\n      // value parameter in DOM reflects the correct value, so ignore childNode\n    } else {\n      for (const childN of Array.from(dom.childNodes(n))) {\n        const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n        if (serializedChildNode) {\n          serializedNode.childNodes.push(serializedChildNode);\n        }\n      }\n    }\n\n    let shadowRootEl: ShadowRoot | null = null;\n    if (isElement(n) && (shadowRootEl = dom.shadowRoot(n))) {\n      for (const childN of Array.from(dom.childNodes(shadowRootEl))) {\n        const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n        if (serializedChildNode) {\n          isNativeShadowDom(shadowRootEl) &&\n            (serializedChildNode.isShadow = true);\n          serializedNode.childNodes.push(serializedChildNode);\n        }\n      }\n    }\n  }\n\n  const parent = dom.parentNode(n);\n  if (parent && isShadowRoot(parent) && isNativeShadowDom(parent)) {\n    serializedNode.isShadow = true;\n  }\n\n  if (\n    serializedNode.type === NodeType.Element &&\n    serializedNode.tagName === 'iframe'\n  ) {\n    onceIframeLoaded(\n      n as HTMLIFrameElement,\n      () => {\n        const iframeDoc = (n as HTMLIFrameElement).contentDocument;\n        if (iframeDoc && onIframeLoad) {\n          const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n            doc: iframeDoc,\n            mirror,\n            blockClass,\n            blockSelector,\n            needsMask,\n            maskTextClass,\n            maskTextSelector,\n            skipChild: false,\n            inlineStylesheet,\n            maskInputOptions,\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            depth: depth + 1,\n            maxDepth,\n          });\n\n          if (serializedIframeNode) {\n            onIframeLoad(\n              n as HTMLIFrameElement,\n              serializedIframeNode as serializedElementNodeWithId,\n            );\n          }\n        }\n      },\n      iframeLoadTimeout,\n    );\n  }\n\n  // <link rel=stylesheet href=...>\n  if (\n    serializedNode.type === NodeType.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  ) {\n    onceStylesheetLoaded(\n      n as HTMLLinkElement,\n      () => {\n        if (onStylesheetLoad) {\n          const serializedLinkNode = serializeNodeWithId(n, {\n            doc,\n            mirror,\n            blockClass,\n            blockSelector,\n            needsMask,\n            maskTextClass,\n            maskTextSelector,\n            skipChild: false,\n            inlineStylesheet,\n            maskInputOptions,\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            depth,\n            maxDepth,\n          });\n\n          if (serializedLinkNode) {\n            onStylesheetLoad(\n              n as HTMLLinkElement,\n              serializedLinkNode as serializedElementNodeWithId,\n            );\n          }\n        }\n      },\n      stylesheetLoadTimeout,\n    );\n  }\n\n  return serializedNode;\n}\n\nexport function slimDOMDefaults(\n  slimDOM: 'all' | boolean | SlimDOMOptions,\n): SlimDOMOptions {\n  if (slimDOM === true || slimDOM === 'all') {\n    return {\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: slimDOM === 'all',\n      headMetaDescKeywords: slimDOM === 'all',\n      headTitleMutations: slimDOM === 'all',\n    };\n  }\n  if (slimDOM === false) {\n    return {};\n  }\n  return slimDOM;\n}\n\nfunction snapshot(\n  n: Document,\n  options?: {\n    mirror?: Mirror;\n    blockClass?: string | RegExp;\n    blockSelector?: string | null;\n    maskTextClass?: string | RegExp;\n    maskTextSelector?: string | null;\n    inlineStylesheet?: boolean;\n    maskAllInputs?: boolean | MaskInputOptions;\n    maskTextFn?: MaskTextFn;\n    maskInputFn?: MaskInputFn;\n    slimDOM?: 'all' | boolean | SlimDOMOptions;\n    dataURLOptions?: DataURLOptions;\n    inlineImages?: boolean;\n    recordCanvas?: boolean;\n    preserveWhiteSpace?: boolean;\n    onSerialize?: (n: Node) => unknown;\n    onIframeLoad?: (\n      iframeNode: HTMLIFrameElement,\n      node: serializedElementNodeWithId,\n    ) => unknown;\n    iframeLoadTimeout?: number;\n    onStylesheetLoad?: (\n      linkNode: HTMLLinkElement,\n      node: serializedElementNodeWithId,\n    ) => unknown;\n    stylesheetLoadTimeout?: number;\n    keepIframeSrcFn?: KeepIframeSrcFn;\n    maxDepth?: number;\n  },\n): serializedNodeWithId | null {\n  const {\n    mirror = new Mirror(),\n    blockClass = 'rr-block',\n    blockSelector = null,\n    maskTextClass = 'rr-mask',\n    maskTextSelector = null,\n    inlineStylesheet = true,\n    inlineImages = false,\n    recordCanvas = false,\n    maskAllInputs = false,\n    maskTextFn,\n    maskInputFn,\n    slimDOM = false,\n    dataURLOptions,\n    preserveWhiteSpace,\n    onSerialize,\n    onIframeLoad,\n    iframeLoadTimeout,\n    onStylesheetLoad,\n    stylesheetLoadTimeout,\n    keepIframeSrcFn = () => false,\n    maxDepth,\n  } = options || {};\n  const maskInputOptions: MaskInputOptions =\n    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          password: true,\n        }\n      : maskAllInputs === false\n      ? {\n          password: true,\n        }\n      : maskAllInputs;\n  const slimDOMOptions: SlimDOMOptions = slimDOMDefaults(slimDOM);\n  return serializeNodeWithId(n, {\n    doc: n,\n    mirror,\n    blockClass,\n    blockSelector,\n    maskTextClass,\n    maskTextSelector,\n    skipChild: false,\n    inlineStylesheet,\n    maskInputOptions,\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    maxDepth,\n  });\n}\n\nexport function visitSnapshot(\n  node: serializedNodeWithId,\n  onVisit: (node: serializedNodeWithId) => unknown,\n) {\n  function walk(current: serializedNodeWithId) {\n    onVisit(current);\n    if (\n      current.type === NodeType.Document ||\n      current.type === NodeType.Element\n    ) {\n      current.childNodes.forEach(walk);\n    }\n  }\n\n  walk(node);\n}\n\nexport function cleanupSnapshot() {\n  // allow a new recording to start numbering nodes from scratch\n  _id = 1;\n}\n\nexport default snapshot;\n"],
  "mappings": "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",
  "names": ["NodeType", "NodeType2", "testableAccessors", "testableMethods", "untaintedBasePrototype", "angularZoneUnpatchedAlternative", "key", "_a", "_b", "angularUnpatchedVersionSymbol", "getUntaintedPrototype", "candidate", "defaultPrototype", "accessorNames", "isUntaintedAccessors", "accessor", "methodNames", "isUntaintedMethods", "method", "iframeEl", "win", "untaintedObject", "e", "untaintedAccessorCache", "getUntaintedAccessor", "instance", "cacheKey", "untaintedPrototype", "untaintedAccessor", "untaintedMethodCache", "getUntaintedMethod", "untaintedMethod", "childNodes", "n", "parentNode", "parentElement", "textContent", "contains", "other", "getRootNode", "host", "styleSheets", "shadowRoot", "querySelector", "selectors", "querySelectorAll", "mutationObserverCtor", "patch", "source", "name", "replacement", "original", "wrapped", "index", "isElement", "isShadowRoot", "hostEl", "dom", "isNativeShadowDom", "fixBrowserCompatibilityIssuesInCSS", "cssText", "escapeImportStatement", "rule", "statement", "stringifyStylesheet", "s", "rules", "sheetHref", "stringifiedRules", "stringifyRule", "error", "isCSSImportRule", "importStringified", "absolutifyURLs", "ruleStringified", "isCSSStyleRule", "fixSafariColons", "cssStringified", "regex", "Mirror", "__publicField", "id", "childNode", "shadowRootEl", "node", "meta", "oldNode", "createMirror", "maskInputValue", "element", "maskInputOptions", "tagName", "type", "value", "maskInputFn", "text", "actualType", "toLowerCase", "str", "ORIGINAL_ATTRIBUTE_NAME", "is2DCanvasBlank", "canvas", "ctx", "chunkSize", "x", "y", "getImageData", "originalGetImageData", "pixel", "isNodeMetaEqual", "a", "b", "getInputType", "extractFileExtension", "path", "baseURL", "url", "err", "match", "extractOrigin", "origin", "URL_IN_CSS_REF", "URL_PROTOCOL_MATCH", "URL_WWW_MATCH", "DATA_URI", "href", "quote1", "path1", "quote2", "path2", "path3", "filePath", "maybeQuote", "stack", "parts", "part", "STRIPED_PLACEHOLDER_SVG", "MAX_IMAGE_DIMENSION_FOR_RECOMPRESSION", "recompressBase64Image", "img", "dataURL", "quality", "checkDataURLSize", "maxLength", "_id", "tagNameRegex", "IGNORED_NODE", "genId", "getValidTagName", "element", "processedTagName", "toLowerCase", "canvasService", "canvasCtx", "SRCSET_NOT_SPACES", "SRCSET_COMMAS_OR_SPACES", "getAbsoluteSrcsetString", "doc", "attributeValue", "pos", "collectCharacters", "regEx", "chars", "match", "output", "url", "absoluteToDoc", "descriptorsStr", "inParens", "c", "cachedDocument", "getHref", "isSVGElement", "el", "customHref", "a", "transformAttribute", "tagName", "name", "value", "dataURLOptions", "transformedValue", "img", "processedDataURL", "recompressBase64Image", "checkDataURLSize", "absolutifyURLs", "ignoreAttribute", "_value", "_isBlockedElement", "blockClass", "blockSelector", "eIndex", "className", "e", "classMatchesRegex", "node", "regex", "checkAncestors", "dom", "needMaskingText", "maskTextClass", "maskTextSelector", "isElement", "onceIframeLoaded", "iframeEl", "listener", "iframeLoadTimeout", "win", "fired", "readyState", "error", "timer", "blankUrl", "onceStylesheetLoaded", "link", "styleSheetLoadTimeout", "styleSheetLoaded", "serializeNode", "n", "options", "mirror", "needsMask", "inlineStylesheet", "maskInputOptions", "maskTextFn", "maskInputFn", "inlineImages", "recordCanvas", "keepIframeSrcFn", "newlyAddedElement", "rootId", "getRootId", "NodeType", "serializeElementNode", "serializeTextNode", "docId", "parent", "parentTagName", "text", "isStyle", "isScript", "_a", "stringifyStylesheet", "err", "findStylesheet", "href", "s", "hrefFrom", "needBlock", "attributes", "len", "i", "attr", "stylesheet", "rootDomain", "stylesheetPath", "potentialStylesheetHref", "cssText", "checked", "maskInputValue", "getInputType", "is2DCanvasBlank", "canvasDataURL", "blankCanvas", "blankCanvasDataURL", "image", "imageSrc", "priorCrossOrigin", "recordInlineImage", "mediaAttributes", "width", "height", "left", "top", "_b", "isCustomElement", "lowerIfExists", "maybeAttr", "slimDOMExcluded", "sn", "slimDOMOptions", "extractFileExtension", "DEFAULT_MAX_DEPTH", "_maxDepthWarned", "_maxDepthReached", "wasMaxDepthReached", "resetMaxDepthState", "serializeNodeWithId", "skipChild", "onSerialize", "onIframeLoad", "onStylesheetLoad", "stylesheetLoadTimeout", "depth", "maxDepth", "preserveWhiteSpace", "_serializedNode", "id", "serializedNode", "recordChild", "shadowRootEl", "isNativeShadowDom", "bypassOptions", "childN", "serializedChildNode", "isShadowRoot", "iframeDoc", "serializedIframeNode", "serializedLinkNode", "slimDOMDefaults", "slimDOM", "snapshot", "Mirror", "maskAllInputs", "visitSnapshot", "onVisit", "walk", "current", "cleanupSnapshot"]
}
