/* Partytown 0.7.5 - MIT builder.io */ (self => { const WinIdKey = Symbol(); const InstanceIdKey = Symbol(); const InstanceDataKey = Symbol(); const NamespaceKey = Symbol(); const ApplyPathKey = Symbol(); const InstanceStateKey = Symbol(); const HookContinue = Symbol(); const HookPrevent = Symbol(); const webWorkerInstances = new Map; const webWorkerRefsByRefId = {}; const webWorkerRefIdsByRef = new WeakMap; const postMessages = []; const webWorkerCtx = {}; const webWorkerlocalStorage = new Map; const webWorkerSessionStorage = new Map; const environments = {}; const cachedDimensions = new Map; const cachedStructure = new Map; const commaSplit = str => str.split(","); const partytownLibUrl = url => { url = webWorkerCtx.$libPath$ + url; if (new URL(url).origin != location.origin) { throw "Invalid " + url; } return url; }; const getterDimensionPropNames = commaSplit("clientWidth,clientHeight,clientTop,clientLeft,innerWidth,innerHeight,offsetWidth,offsetHeight,offsetTop,offsetLeft,outerWidth,outerHeight,pageXOffset,pageYOffset,scrollWidth,scrollHeight,scrollTop,scrollLeft"); const elementStructurePropNames = commaSplit("childElementCount,children,firstElementChild,lastElementChild,nextElementSibling,previousElementSibling"); const structureChangingMethodNames = commaSplit("insertBefore,remove,removeChild,replaceChild"); const dimensionChangingSetterNames = commaSplit("className,width,height,hidden,innerHTML,innerText,textContent"); const dimensionChangingMethodNames = commaSplit("setAttribute,setAttributeNS,setProperty"); const eventTargetMethods = commaSplit("addEventListener,dispatchEvent,removeEventListener"); const nonBlockingMethods = eventTargetMethods.concat(dimensionChangingMethodNames, commaSplit("add,observe,remove,unobserve")); const IS_TAG_REG = /^[A-Z_]([A-Z0-9-]*[A-Z0-9])?$/; const noop = () => {}; const len = obj => obj.length; const getConstructorName = obj => { var _a, _b, _c; try { const constructorName = null === (_a = null == obj ? void 0 : obj.constructor) || void 0 === _a ? void 0 : _a.name; if (constructorName) { return constructorName; } } catch (e) {} try { const zoneJsConstructorName = null === (_c = null === (_b = null == obj ? void 0 : obj.__zone_symbol__originalInstance) || void 0 === _b ? void 0 : _b.constructor) || void 0 === _c ? void 0 : _c.name; if (zoneJsConstructorName) { return zoneJsConstructorName; } } catch (e) {} return ""; }; const EMPTY_ARRAY = []; const randomId = () => Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36); const SCRIPT_TYPE = "text/partytown"; const defineProperty = (obj, memberName, descriptor) => Object.defineProperty(obj, memberName, { ...descriptor, configurable: true }); const defineConstructorName = (Cstr, value) => defineProperty(Cstr, "name", { value: value }); const definePrototypeProperty = (Cstr, memberName, descriptor) => defineProperty(Cstr.prototype, memberName, descriptor); const definePrototypePropertyDescriptor = (Cstr, propertyDescriptorMap) => Object.defineProperties(Cstr.prototype, propertyDescriptorMap); const definePrototypeValue = (Cstr, memberName, value) => definePrototypeProperty(Cstr, memberName, { value: value, writable: true }); const hasInstanceStateValue = (instance, stateKey) => stateKey in instance[InstanceStateKey]; const getInstanceStateValue = (instance, stateKey) => instance[InstanceStateKey][stateKey]; const setInstanceStateValue = (instance, stateKey, stateValue) => instance[InstanceStateKey][stateKey] = stateValue; const setWorkerRef = (ref, refId) => { if (!(refId = webWorkerRefIdsByRef.get(ref))) { webWorkerRefIdsByRef.set(ref, refId = randomId()); webWorkerRefsByRefId[refId] = ref; } return refId; }; const getOrCreateNodeInstance = (winId, instanceId, nodeName, namespace, instance) => { instance = webWorkerInstances.get(instanceId); if (!instance && nodeName && environments[winId]) { instance = environments[winId].$createNode$(nodeName, instanceId, namespace); webWorkerInstances.set(instanceId, instance); } return instance; }; const definePrototypeNodeType = (Cstr, nodeType) => definePrototypeValue(Cstr, "nodeType", nodeType); const cachedTreeProps = (Cstr, treeProps) => treeProps.map((propName => definePrototypeProperty(Cstr, propName, { get() { let cacheKey = getInstanceCacheKey(this, propName); let result = cachedStructure.get(cacheKey); if (!result) { result = getter(this, [ propName ]); cachedStructure.set(cacheKey, result); } return result; } }))); const getInstanceCacheKey = (instance, memberName, args) => [ instance[WinIdKey], instance[InstanceIdKey], memberName, ...(args || EMPTY_ARRAY).map((arg => String(arg && arg[WinIdKey] ? arg[InstanceIdKey] : arg))) ].join("."); const cachedProps = (Cstr, propNames) => commaSplit(propNames).map((propName => definePrototypeProperty(Cstr, propName, { get() { hasInstanceStateValue(this, propName) || setInstanceStateValue(this, propName, getter(this, [ propName ])); return getInstanceStateValue(this, propName); }, set(val) { getInstanceStateValue(this, propName) !== val && setter(this, [ propName ], val); setInstanceStateValue(this, propName, val); } }))); const cachedDimensionProps = Cstr => getterDimensionPropNames.map((propName => definePrototypeProperty(Cstr, propName, { get() { const dimension = cachedDimensions.get(getInstanceCacheKey(this, propName)); if ("number" == typeof dimension) { return dimension; } const groupedDimensions = getter(this, [ propName ], getterDimensionPropNames); if (groupedDimensions && "object" == typeof groupedDimensions) { Object.entries(groupedDimensions).map((([dimensionPropName, value]) => cachedDimensions.set(getInstanceCacheKey(this, dimensionPropName), value))); return groupedDimensions[propName]; } return groupedDimensions; } }))); const cachedDimensionMethods = (Cstr, dimensionMethodNames) => dimensionMethodNames.map((methodName => { Cstr.prototype[methodName] = function(...args) { let cacheKey = getInstanceCacheKey(this, methodName, args); let dimensions = cachedDimensions.get(cacheKey); if (!dimensions) { dimensions = callMethod(this, [ methodName ], args); cachedDimensions.set(cacheKey, dimensions); } return dimensions; }; })); const serializeForMain = ($winId$, $instanceId$, value, added, type) => void 0 !== value && (type = typeof value) ? "string" === type || "boolean" === type || "number" === type || null == value ? [ 0, value ] : "function" === type ? [ 4, { $winId$: $winId$, $instanceId$: $instanceId$, $refId$: setWorkerRef(value) } ] : (added = added || new Set) && Array.isArray(value) ? added.has(value) ? [ 1, [] ] : added.add(value) && [ 1, value.map((v => serializeForMain($winId$, $instanceId$, v, added))) ] : "object" === type ? value[InstanceIdKey] ? [ 3, [ value[WinIdKey], value[InstanceIdKey] ] ] : value instanceof Event ? [ 5, serializeObjectForMain($winId$, $instanceId$, value, false, added) ] : supportsTrustedHTML && value instanceof TrustedHTML ? [ 0, value.toString() ] : value instanceof ArrayBuffer ? [ 8, value ] : ArrayBuffer.isView(value) ? [ 9, value.buffer, getConstructorName(value) ] : [ 2, serializeObjectForMain($winId$, $instanceId$, value, true, added) ] : void 0 : value; const supportsTrustedHTML = "undefined" != typeof TrustedHTML; const serializeObjectForMain = (winId, instanceId, obj, includeFunctions, added, serializedObj, propName, propValue) => { serializedObj = {}; if (!added.has(obj)) { added.add(obj); for (propName in obj) { propValue = obj[propName]; (includeFunctions || "function" != typeof propValue) && (serializedObj[propName] = serializeForMain(winId, instanceId, propValue, added)); } } return serializedObj; }; const serializeInstanceForMain = (instance, value) => instance ? serializeForMain(instance[WinIdKey], instance[InstanceIdKey], value) : [ 0, value ]; const deserializeFromMain = (winId, instanceId, applyPath, serializedValueTransfer, serializedType, serializedValue, obj, key) => { if (serializedValueTransfer) { serializedType = serializedValueTransfer[0]; serializedValue = serializedValueTransfer[1]; if (0 === serializedType || 11 === serializedType || 12 === serializedType) { return serializedValue; } if (4 === serializedType) { return deserializeRefFromMain(applyPath, serializedValue); } if (6 === serializedType) { return winId && applyPath.length > 0 ? (...args) => callMethod(environments[winId].$window$, applyPath, args, 1) : noop; } if (3 === serializedType) { return getOrCreateSerializedInstance(serializedValue); } if (7 === serializedType) { return new NodeList(serializedValue.map(getOrCreateSerializedInstance)); } if (10 === serializedType) { return new Attr(serializedValue); } if (1 === serializedType) { return serializedValue.map((v => deserializeFromMain(winId, instanceId, applyPath, v))); } if (14 === serializedType) { return new CustomError(serializedValue); } obj = {}; for (key in serializedValue) { obj[key] = deserializeFromMain(winId, instanceId, [ ...applyPath, key ], serializedValue[key]); } if (13 === serializedType) { return new environments[winId].$window$.CSSStyleDeclaration(winId, instanceId, applyPath, obj); } if (5 === serializedType) { if ("message" === obj.type && obj.origin) { let postMessageKey = JSON.stringify(obj.data); let postMessageData = postMessages.find((pm => pm.$data$ === postMessageKey)); let env; if (postMessageData) { env = environments[postMessageData.$winId$]; if (env) { obj.source = env.$window$; obj.origin = env.$location$.origin; } } } return new Proxy(new Event(obj.type, obj), { get: (target, propName) => propName in obj ? obj[propName] : "function" == typeof target[String(propName)] ? noop : target[String(propName)] }); } if (2 === serializedType) { return obj; } } }; const getOrCreateSerializedInstance = ([winId, instanceId, nodeName]) => instanceId === winId && environments[winId] ? environments[winId].$window$ : getOrCreateNodeInstance(winId, instanceId, nodeName); const deserializeRefFromMain = (applyPath, {$winId$: $winId$, $instanceId$: $instanceId$, $nodeName$: $nodeName$, $refId$: $refId$}) => { webWorkerRefsByRefId[$refId$] || webWorkerRefIdsByRef.set(webWorkerRefsByRefId[$refId$] = function(...args) { const instance = getOrCreateNodeInstance($winId$, $instanceId$, $nodeName$); return callMethod(instance, applyPath, args); }, $refId$); return webWorkerRefsByRefId[$refId$]; }; class CustomError extends Error { constructor(errorObject) { super(errorObject.message); this.name = errorObject.name; this.message = errorObject.message; this.stack = errorObject.stack; } } class NodeList { constructor(nodes) { (this._ = nodes).map(((node, index) => this[index] = node)); } entries() { return this._.entries(); } forEach(cb, thisArg) { this._.map(cb, thisArg); } item(index) { return this[index]; } keys() { return this._.keys(); } get length() { return len(this._); } values() { return this._.values(); } [Symbol.iterator]() { return this._[Symbol.iterator](); } } const Attr = class { constructor(serializedAttr) { this.name = serializedAttr[0]; this.value = serializedAttr[1]; } get nodeName() { return this.name; } get nodeType() { return 2; } }; const warnCrossOrgin = (apiType, apiName, env) => console.warn(`Partytown unable to ${apiType} cross-origin ${apiName}: ` + env.$location$); const logWorker = (msg, winId) => { try { const config = webWorkerCtx.$config$; if (config.logStackTraces) { const frames = (new Error).stack.split("\n"); const i = frames.findIndex((f => f.includes("logWorker"))); msg += "\n" + frames.slice(i + 1).join("\n"); } let prefix; let color; if (winId) { prefix = `Worker (${normalizedWinId(winId)}) 🎉`; color = winColor(winId); } else { prefix = self.name; color = "#9844bf"; } if (webWorkerCtx.lastLog !== msg) { webWorkerCtx.lastLog = msg; console.debug.apply(console, [ `%c${prefix}`, `background: ${color}; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;`, msg ]); } } catch (e) {} }; const winIds = []; const normalizedWinId = winId => { winIds.includes(winId) || winIds.push(winId); return winIds.indexOf(winId) + 1; }; const winColor = winId => { const colors = [ "#00309e", "#ea3655", "#eea727" ]; const index = normalizedWinId(winId) - 1; return colors[index] || colors[colors.length - 1]; }; const getTargetProp = (target, applyPath) => { let n = ""; if (target) { const cstrName = getConstructorName(target); if ("Window" === cstrName) { n = ""; } else if ("string" == typeof target[InstanceDataKey]) { let nodeName = target[InstanceDataKey]; n = "#text" === nodeName ? "textNode." : "#comment" === nodeName ? "commentNode." : "#document" === nodeName ? "document." : "html" === nodeName ? "doctype." : nodeName.toLowerCase() + "."; } else { n = "nodeType" in target && 2 === target.nodeType ? "attributes." : "CanvasRenderingContext2D" === cstrName ? "context2D." : "CanvasRenderingContextWebGL" === cstrName ? "contextWebGL." : "CSSStyleDeclaration" === cstrName ? "style." : "MutationObserver" === cstrName ? "mutationObserver." : "NamedNodeMap" === cstrName ? "namedNodeMap." : "ResizeObserver" === cstrName ? "resizeObserver." : cstrName.substring(0, 1).toLowerCase() + cstrName.substring(1) + "."; } target[ApplyPathKey] && target[ApplyPathKey].length && (n += [ ...target[ApplyPathKey] ].join(".") + "."); } if (applyPath.length > 1) { const first = applyPath.slice(0, applyPath.length - 1); const last = applyPath[applyPath.length - 1]; if (!isNaN(last)) { return n + `${first.join(".")}[${last}]`; } } return n + applyPath.join("."); }; const getLogValue = (applyPath, v) => { const type = typeof v; if (void 0 === v) { return "undefined"; } if ("boolean" === type || "number" === type || null == v) { return JSON.stringify(v); } if ("string" === type) { return applyPath.includes("cookie") ? JSON.stringify(v.slice(0, 10) + "...") : JSON.stringify(v.length > 50 ? v.slice(0, 40) + "..." : v); } if (Array.isArray(v)) { return `[${v.map(getLogValue).join(", ")}]`; } if ("object" === type) { const instanceId = v[InstanceIdKey]; const cstrName = getConstructorName(v); if ("string" == typeof instanceId) { if ("Window" === cstrName) { return "window"; } if ("string" == typeof v[InstanceDataKey]) { if (1 === v.nodeType) { return `<${v[InstanceDataKey].toLowerCase()}>`; } if (10 === v.nodeType) { return ``; } if (v.nodeType <= 11) { return v[InstanceDataKey]; } } return "¯\\_(ツ)_/¯ instance obj"; } return v[Symbol.iterator] ? `[${Array.from(v).map((i => getLogValue(applyPath, i))).join(", ")}]` : "value" in v ? "string" == typeof v.value ? `"${v.value}"` : objToString(v.value) : objToString(v); } return (v => "object" == typeof v && v && v.then)(v) ? "Promise" : "function" === type ? `ƒ() ${v.name || ""}`.trim() : `¯\\_(ツ)_/¯ ${String(v)}`.trim(); }; const objToString = obj => { const s = []; for (let key in obj) { const value = obj[key]; const type = typeof value; "string" === type ? s.push(`${key}: "${value}"`) : "function" === type ? s.push(`${key}: ƒ`) : Array.isArray(type) ? s.push(`${key}: [..]`) : "object" === type && value ? s.push(`${key}: {..}`) : s.push(`${key}: ${String(value)}`); } let str = s.join(", "); str.length > 200 && (str = str.substring(0, 200) + ".."); return `{ ${str} }`; }; const logDimensionCacheClearStyle = (target, propName) => { (webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logSetters) && logWorker(`Dimension cache cleared from style.${propName} setter`, target[WinIdKey]); }; const logDimensionCacheClearMethod = (target, methodName) => { (webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logCalls) && logWorker(`Dimension cache cleared from method call ${methodName}()`, target[WinIdKey]); }; const taskQueue = []; const queue = (instance, $applyPath$, callType, $assignInstanceId$, $groupedGetters$, buffer) => { if (instance[ApplyPathKey]) { taskQueue.push({ $winId$: instance[WinIdKey], $instanceId$: instance[InstanceIdKey], $applyPath$: [ ...instance[ApplyPathKey], ...$applyPath$ ], $assignInstanceId$: $assignInstanceId$, $groupedGetters$: $groupedGetters$ }); taskQueue[len(taskQueue) - 1].$debug$ = ((target, applyPath, callType) => { let m = getTargetProp(target, applyPath); 1 === callType ? m += " (blocking)" : 2 === callType ? m += " (non-blocking)" : 3 === callType && (m += " (non-blocking, no-side-effect)"); return m.trim(); })(instance, $applyPath$, callType); buffer && 3 !== callType && console.error("buffer must be sent NonBlockingNoSideEffect"); if (3 === callType) { webWorkerCtx.$postMessage$([ 12, { $msgId$: randomId(), $tasks$: [ ...taskQueue ] } ], buffer ? [ buffer instanceof ArrayBuffer ? buffer : buffer.buffer ] : void 0); taskQueue.length = 0; } else if (1 === callType) { return sendToMain(true); } webWorkerCtx.$asyncMsgTimer$ = setTimeout(sendToMain, 20); } }; const sendToMain = isBlocking => { clearTimeout(webWorkerCtx.$asyncMsgTimer$); if (len(taskQueue)) { webWorkerCtx.$config$.logMainAccess && logWorker(`Main access, tasks sent: ${taskQueue.length}`); const endTask = taskQueue[len(taskQueue) - 1]; const accessReq = { $msgId$: randomId(), $tasks$: [ ...taskQueue ] }; taskQueue.length = 0; if (isBlocking) { const accessRsp = ((webWorkerCtx, accessReq) => { const xhr = new XMLHttpRequest; xhr.open("POST", partytownLibUrl("proxytown"), false); xhr.send(JSON.stringify(accessReq)); return JSON.parse(xhr.responseText); })(0, accessReq); const isPromise = accessRsp.$isPromise$; const rtnValue = deserializeFromMain(endTask.$winId$, endTask.$instanceId$, endTask.$applyPath$, accessRsp.$rtnValue$); if (accessRsp.$error$) { if (isPromise) { return Promise.reject(accessRsp.$error$); } throw new Error(accessRsp.$error$); } return isPromise ? Promise.resolve(rtnValue) : rtnValue; } webWorkerCtx.$postMessage$([ 12, accessReq ]); } }; const getter = (instance, applyPath, groupedGetters, rtnValue) => { if (webWorkerCtx.$config$.get) { rtnValue = webWorkerCtx.$config$.get(createHookOptions(instance, applyPath)); if (rtnValue !== HookContinue) { return rtnValue; } } rtnValue = queue(instance, applyPath, 1, void 0, groupedGetters); ((target, applyPath, rtnValue, restrictedToWorker = false, groupedGetters = false) => { if (webWorkerCtx.$config$.logGetters) { try { const msg = `Get ${getTargetProp(target, applyPath)}, returned: ${getLogValue(applyPath, rtnValue)}${restrictedToWorker ? " (restricted to worker)" : ""}${groupedGetters ? " (grouped getter)" : ""}`; msg.includes("Symbol(") || logWorker(msg, target[WinIdKey]); } catch (e) {} } })(instance, applyPath, rtnValue, false, !!groupedGetters); return rtnValue; }; const setter = (instance, applyPath, value, hookSetterValue) => { if (webWorkerCtx.$config$.set) { hookSetterValue = webWorkerCtx.$config$.set({ value: value, prevent: HookPrevent, ...createHookOptions(instance, applyPath) }); if (hookSetterValue === HookPrevent) { return; } hookSetterValue !== HookContinue && (value = hookSetterValue); } if (dimensionChangingSetterNames.some((s => applyPath.includes(s)))) { cachedDimensions.clear(); ((target, propName) => { (webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logSetters) && logWorker(`Dimension cache cleared from setter "${propName}"`, target[WinIdKey]); })(instance, applyPath[applyPath.length - 1]); } applyPath = [ ...applyPath, serializeInstanceForMain(instance, value), 0 ]; ((target, applyPath, value, restrictedToWorker = false) => { if (webWorkerCtx.$config$.logSetters) { try { applyPath = applyPath.slice(0, applyPath.length - 2); logWorker(`Set ${getTargetProp(target, applyPath)}, value: ${getLogValue(applyPath, value)}${restrictedToWorker ? " (restricted to worker)" : ""}`, target[WinIdKey]); } catch (e) {} } })(instance, applyPath, value); queue(instance, applyPath, 2); }; const callMethod = (instance, applyPath, args, callType, assignInstanceId, buffer, rtnValue, methodName) => { if (webWorkerCtx.$config$.apply) { rtnValue = webWorkerCtx.$config$.apply({ args: args, ...createHookOptions(instance, applyPath) }); if (rtnValue !== HookContinue) { return rtnValue; } } methodName = applyPath[len(applyPath) - 1]; applyPath = [ ...applyPath, serializeInstanceForMain(instance, args) ]; callType = callType || (nonBlockingMethods.includes(methodName) ? 2 : 1); if ("setAttribute" === methodName && hasInstanceStateValue(instance, args[0])) { setInstanceStateValue(instance, args[0], args[1]); } else if (structureChangingMethodNames.includes(methodName)) { cachedDimensions.clear(); cachedStructure.clear(); ((target, methodName) => { (webWorkerCtx.$config$.logGetters || webWorkerCtx.$config$.logCalls) && logWorker(`Dimension and DOM structure cache cleared from method call ${methodName}()`, target[WinIdKey]); })(instance, methodName); } else if (dimensionChangingMethodNames.includes(methodName)) { callType = 2; cachedDimensions.clear(); logDimensionCacheClearMethod(instance, methodName); } rtnValue = queue(instance, applyPath, callType, assignInstanceId, void 0, buffer); ((target, applyPath, args, rtnValue) => { if (webWorkerCtx.$config$.logCalls) { try { applyPath = applyPath.slice(0, applyPath.length - 1); logWorker(`Call ${getTargetProp(target, applyPath)}(${args.map((v => getLogValue(applyPath, v))).join(", ")}), returned: ${getLogValue(applyPath, rtnValue)}`, target[WinIdKey]); } catch (e) {} } })(instance, applyPath, args, rtnValue); return rtnValue; }; const constructGlobal = (instance, cstrName, args) => { ((target, cstrName, args) => { if (webWorkerCtx.$config$.logCalls) { try { logWorker(`Construct new ${cstrName}(${args.map((v => getLogValue([], v))).join(", ")})`, target[WinIdKey]); } catch (e) {} } })(instance, cstrName, args); queue(instance, [ 1, cstrName, serializeInstanceForMain(instance, args) ], 1); }; const createHookOptions = (instance, applyPath) => ({ name: applyPath.join("."), continue: HookContinue, nodeName: instance[InstanceDataKey], constructor: getConstructorName(instance), instance: instance, window: environments[instance[WinIdKey]].$window$ }); const addStorageApi = (win, storageName, storages, isSameOrigin, env) => { let getItems = items => { items = storages.get(win.origin); items || storages.set(win.origin, items = []); return items; }; let getIndexByKey = key => getItems().findIndex((i => i[STORAGE_KEY] === key)); let index; let item; let storage = { getItem(key) { index = getIndexByKey(key); return index > -1 ? getItems()[index][STORAGE_VALUE] : null; }, setItem(key, value) { index = getIndexByKey(key); index > -1 ? getItems()[index][STORAGE_VALUE] = value : getItems().push([ key, value ]); isSameOrigin ? callMethod(win, [ storageName, "setItem" ], [ key, value ], 2) : warnCrossOrgin("set", storageName, env); }, removeItem(key) { index = getIndexByKey(key); index > -1 && getItems().splice(index, 1); isSameOrigin ? callMethod(win, [ storageName, "removeItem" ], [ key ], 2) : warnCrossOrgin("remove", storageName, env); }, key(index) { item = getItems()[index]; return item ? item[STORAGE_KEY] : null; }, clear() { getItems().length = 0; isSameOrigin ? callMethod(win, [ storageName, "clear" ], EMPTY_ARRAY, 2) : warnCrossOrgin("clear", storageName, env); }, get length() { return getItems().length; } }; win[storageName] = new Proxy(storage, { get: (target, key) => Reflect.has(target, key) ? Reflect.get(target, key) : target.getItem(key), set(target, key, value) { target.setItem(key, value); return true; }, has: (target, key) => !!Reflect.has(target, key) || "string" == typeof key && null !== target.getItem(key), deleteProperty(target, key) { target.removeItem(key); return true; } }); }; const STORAGE_KEY = 0; const STORAGE_VALUE = 1; const createCSSStyleDeclarationCstr = (win, WorkerBase, cstrName) => { win[cstrName] = defineConstructorName(class extends WorkerBase { constructor(winId, instanceId, applyPath, styles) { super(winId, instanceId, applyPath, styles || {}); return new Proxy(this, { get(target, propName) { if (target[propName]) { return target[propName]; } target[propName] || "string" != typeof propName || target[InstanceDataKey][propName] || (target[InstanceDataKey][propName] = getter(target, [ propName ])); return target[InstanceDataKey][propName]; }, set(target, propName, propValue) { target[InstanceDataKey][propName] = propValue; setter(target, [ propName ], propValue); logDimensionCacheClearStyle(target, propName); cachedDimensions.clear(); return true; } }); } setProperty(...args) { this[InstanceDataKey][args[0]] = args[1]; callMethod(this, [ "setProperty" ], args, 2); logDimensionCacheClearStyle(this, args[0]); cachedDimensions.clear(); } getPropertyValue(propName) { return this[propName]; } removeProperty(propName) { let value = this[InstanceDataKey][propName]; callMethod(this, [ "removeProperty" ], [ propName ], 2); logDimensionCacheClearStyle(this, propName); cachedDimensions.clear(); this[InstanceDataKey][propName] = void 0; return value; } }, cstrName); }; const createCSSStyleSheetConstructor = (win, cssStyleSheetCstrName) => { win[cssStyleSheetCstrName] = defineConstructorName(class { constructor(ownerNode) { this.ownerNode = ownerNode; } get cssRules() { const ownerNode = this.ownerNode; return new Proxy({}, { get(target, propKey) { const propName = String(propKey); return "item" === propName ? index => getCssRule(ownerNode, index) : "length" === propName ? getCssRules(ownerNode).length : isNaN(propName) ? target[propKey] : getCssRule(ownerNode, propName); } }); } insertRule(ruleText, index) { const cssRules = getCssRules(this.ownerNode); index = void 0 === index ? 0 : index; if (index >= 0 && index <= cssRules.length) { callMethod(this.ownerNode, [ "sheet", "insertRule" ], [ ruleText, index ], 2); cssRules.splice(index, 0, 0); } logDimensionCacheClearMethod(this.ownerNode, "insertRule"); cachedDimensions.clear(); return index; } deleteRule(index) { callMethod(this.ownerNode, [ "sheet", "deleteRule" ], [ index ], 2); getCssRules(this.ownerNode).splice(index, 1); logDimensionCacheClearMethod(this.ownerNode, "deleteRule"); cachedDimensions.clear(); } get type() { return "text/css"; } }, cssStyleSheetCstrName); const HTMLStyleDescriptorMap = { sheet: { get() { return new win[cssStyleSheetCstrName](this); } } }; definePrototypePropertyDescriptor(win.HTMLStyleElement, HTMLStyleDescriptorMap); }; const getCssRules = (ownerNode, cssRules) => { cssRules = getInstanceStateValue(ownerNode, 2); if (!cssRules) { cssRules = getter(ownerNode, [ "sheet", "cssRules" ]); setInstanceStateValue(ownerNode, 2, cssRules); } return cssRules; }; const getCssRule = (ownerNode, index, cssRules) => { cssRules = getCssRules(ownerNode); 0 === cssRules[index] && (cssRules[index] = getter(ownerNode, [ "sheet", "cssRules", parseInt(index, 10) ])); return cssRules[index]; }; const runScriptContent = (env, instanceId, scriptContent, winId, errorMsg) => { try { webWorkerCtx.$config$.logScriptExecution && logWorker(`Execute script: ${scriptContent.substring(0, 100).split("\n").map((l => l.trim())).join(" ").trim().substring(0, 60)}...`, winId); env.$currentScriptId$ = instanceId; run(env, scriptContent); } catch (contentError) { console.error(scriptContent, contentError); errorMsg = String(contentError.stack || contentError); } env.$currentScriptId$ = ""; return errorMsg; }; const run = (env, scriptContent, scriptUrl) => { env.$runWindowLoadEvent$ = 1; scriptContent = `with(this){${scriptContent.replace(/\bthis\b/g, "(thi$(this)?window:this)").replace(/\/\/# so/g, "//Xso")}\n;function thi$(t){return t===this}};${(webWorkerCtx.$config$.globalFns || []).filter((globalFnName => /[a-zA-Z_$][0-9a-zA-Z_$]*/.test(globalFnName))).map((g => `(typeof ${g}=='function'&&(this.${g}=${g}))`)).join(";")};` + (scriptUrl ? "\n//# sourceURL=" + scriptUrl : ""); env.$isSameOrigin$ || (scriptContent = scriptContent.replace(/.postMessage\(/g, `.postMessage('${env.$winId$}',`)); new Function(scriptContent).call(env.$window$); env.$runWindowLoadEvent$ = 0; }; const runStateLoadHandlers = (instance, type, handlers) => { handlers = getInstanceStateValue(instance, type); handlers && setTimeout((() => handlers.map((cb => cb({ type: type }))))); }; const resolveToUrl = (env, url, type, baseLocation, resolvedUrl, configResolvedUrl) => { baseLocation = env.$location$; while (!baseLocation.host) { env = environments[env.$parentWinId$]; baseLocation = env.$location$; if (env.$winId$ === env.$parentWinId$) { break; } } resolvedUrl = new URL(url || "", baseLocation); if (type && webWorkerCtx.$config$.resolveUrl) { configResolvedUrl = webWorkerCtx.$config$.resolveUrl(resolvedUrl, baseLocation, type); if (configResolvedUrl) { return configResolvedUrl; } } return resolvedUrl; }; const resolveUrl = (env, url, type) => resolveToUrl(env, url, type) + ""; const getPartytownScript = () => `