1 line
563 KiB
Plaintext
1 line
563 KiB
Plaintext
{"version":3,"file":"ruffle.js","mappings":"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","sources":["webpack://ruffle-selfhosted/webpack/runtime/load script","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/EventAttributes.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/HTMLAttributes.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/HelperTypes.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/SVGAttributes.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/StyleAttributes.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/classnames.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom-types/dist/index.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/createElement.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/defineCustomElement.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/index.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/jsx-runtime.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/setAttributes.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/types.js","webpack://ruffle-selfhosted/../../node_modules/tsx-dom/dist/utils.js","webpack://ruffle-selfhosted/webpack/bootstrap","webpack://ruffle-selfhosted/webpack/runtime/define property getters","webpack://ruffle-selfhosted/webpack/runtime/ensure chunk","webpack://ruffle-selfhosted/webpack/runtime/get javascript chunk filename","webpack://ruffle-selfhosted/webpack/runtime/global","webpack://ruffle-selfhosted/webpack/runtime/harmony module decorator","webpack://ruffle-selfhosted/webpack/runtime/hasOwnProperty shorthand","webpack://ruffle-selfhosted/webpack/runtime/make namespace object","webpack://ruffle-selfhosted/webpack/runtime/publicPath","webpack://ruffle-selfhosted/webpack/runtime/jsonp chunk loading","webpack://ruffle-selfhosted/../core/dist/version.js","webpack://ruffle-selfhosted/../core/dist/version-range.js","webpack://ruffle-selfhosted/../core/dist/public/setup/public-api.js","webpack://ruffle-selfhosted/../core/dist/build-info.js","webpack://ruffle-selfhosted/../core/dist/public/config/load-options.js","webpack://ruffle-selfhosted/../core/dist/public/config/default.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/types.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/resolver.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/scope.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/builtins.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/memoizer.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/bundle.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/bundle/esm/resource.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/langneg/esm/locale.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/langneg/esm/negotiate_languages.js","webpack://ruffle-selfhosted/../../node_modules/@fluent/langneg/esm/matches.js","webpack://ruffle-selfhosted/../core/dist/internal/i18n.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/clipboard-permission.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/shadow-template.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/static-styles.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/dynamic-styles.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/container.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/splash-screen.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/save-manager.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/volume-controls.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/unsupported-video.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/hardware-acceleration.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/context-menu-overlay.js","webpack://ruffle-selfhosted/../core/dist/flash-identifiers.js","webpack://ruffle-selfhosted/../core/dist/swf-utils.js","webpack://ruffle-selfhosted/../core/dist/current-script.js","webpack://ruffle-selfhosted/../core/dist/internal/constants.js","webpack://ruffle-selfhosted/../core/dist/internal/errors.js","webpack://ruffle-selfhosted/../core/dist/internal/ui/panic.js","webpack://ruffle-selfhosted/../../node_modules/wasm-feature-detect/dist/esm/index.js","webpack://ruffle-selfhosted/../core/dist/js-polyfills.js","webpack://ruffle-selfhosted/../core/dist/load-ruffle.js","webpack://ruffle-selfhosted/../core/dist/internal/register-element.js","webpack://ruffle-selfhosted/../core/dist/internal/builder.js","webpack://ruffle-selfhosted/../core/dist/internal/player/inner.js","webpack://ruffle-selfhosted/../core/dist/internal/player/ruffle-player-element.js","webpack://ruffle-selfhosted/../core/dist/internal/player/ruffle-embed-element.js","webpack://ruffle-selfhosted/../core/dist/internal/player/ruffle-object-element.js","webpack://ruffle-selfhosted/../core/dist/plugin-polyfill.js","webpack://ruffle-selfhosted/../core/dist/polyfills.js","webpack://ruffle-selfhosted/../core/dist/public-path.js","webpack://ruffle-selfhosted/../core/dist/internal/internal-source-api.js","webpack://ruffle-selfhosted/./js/ruffle.js","webpack://ruffle-selfhosted/../core/dist/public/setup/install.js"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"ruffle-selfhosted:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.classnames = void 0;\nconst classListFromObject = (record) => Object.entries(record).map(([key, value]) => value && key);\nconst isTruthy = (v) => !!v;\nconst isUnique = (v, i, a) => a.indexOf(v) === i;\nconst emptyArray = [];\nfunction classnamesToArray(value) {\n if (!value)\n return emptyArray;\n if (typeof value === \"string\")\n return [value];\n if (Array.isArray(value))\n return value.flatMap(classnamesToArray).filter(isTruthy);\n return classListFromObject(value).filter(isTruthy);\n}\nfunction classnames(value) {\n const list = classnamesToArray(value).filter(isUnique);\n return list.length > 0 ? list.join(\" \") : undefined;\n}\nexports.classnames = classnames;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./EventAttributes\"), exports);\n__exportStar(require(\"./HTMLAttributes\"), exports);\n__exportStar(require(\"./StyleAttributes\"), exports);\n__exportStar(require(\"./SVGAttributes\"), exports);\n__exportStar(require(\"./HelperTypes\"), exports);\n__exportStar(require(\"./classnames\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createRef = exports.h = exports.createElement = void 0;\nconst setAttributes_1 = require(\"./setAttributes\");\nconst utils_1 = require(\"./utils\");\nfunction createElement(tag, attrs, ...children) {\n if (typeof tag === \"function\")\n return tag({ ...attrs, children });\n const { finalTag, finalAttrs } = (0, utils_1.applyTsxTag)(tag, attrs);\n const element = (0, utils_1.createDomElement)(finalTag, finalAttrs);\n if (finalAttrs)\n (0, setAttributes_1.setAttributes)(element, finalAttrs);\n (0, utils_1.applyChildren)(element, children);\n return element;\n}\nexports.createElement = createElement;\nexports.h = createElement;\nconst createRef = () => ({ current: null });\nexports.createRef = createRef;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defineCustomElement = void 0;\nconst jsx_runtime_1 = require(\"./jsx-runtime\");\nfunction defineCustomElement(name, constructor, options) {\n customElements.define(name, constructor, options);\n return (props) => (0, jsx_runtime_1.jsx)(name, props);\n}\nexports.defineCustomElement = defineCustomElement;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./createElement\"), exports);\n__exportStar(require(\"./defineCustomElement\"), exports);\n__exportStar(require(\"./jsx-runtime\"), exports);\n__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jsxDEV = exports.jsxs = exports.jsx = void 0;\nconst setAttributes_1 = require(\"./setAttributes\");\nconst utils_1 = require(\"./utils\");\nfunction jsx(tag, props) {\n if (typeof tag === \"function\")\n return tag(props);\n const { children, ...attrs } = props;\n const { finalTag, finalAttrs } = (0, utils_1.applyTsxTag)(tag, attrs);\n const element = (0, utils_1.createDomElement)(finalTag, finalAttrs);\n (0, setAttributes_1.setAttributes)(element, finalAttrs);\n (0, utils_1.applyChildren)(element, [children]);\n return element;\n}\nexports.jsx = jsx;\nexports.jsxs = jsx;\nexports.jsxDEV = jsx;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setAttributes = void 0;\nconst tsx_dom_types_1 = require(\"tsx-dom-types\");\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction transferKnownProperties(source, target) {\n for (const key of Object.keys(source)) {\n if (key in target)\n target[key] = source[key];\n }\n}\n/** \"on\" followed by an uppercase character. Not sure if there are any events with anything other than A-Z. Checking unicode just to be safe */\nconst eventAttributeName = /^on\\p{Lu}/u;\nfunction setAttributes(element, attrs) {\n for (const name of Object.keys(attrs)) {\n // Ignore some debug props that might be added by bundlers\n if (name === \"__source\" || name === \"__self\" || name === \"tsxTag\")\n continue;\n const value = attrs[name];\n if (name === \"class\") {\n const finalValue = (0, tsx_dom_types_1.classnames)(value);\n if (finalValue)\n element.setAttribute(name, finalValue);\n }\n else if (name === \"ref\") {\n value.current = element;\n }\n else if (eventAttributeName.test(name)) {\n const finalName = name.replace(/Capture$/, \"\");\n const useCapture = name !== finalName;\n const eventName = finalName.toLowerCase().substring(2);\n element.addEventListener(eventName, value, useCapture);\n }\n else if (name === \"style\" && typeof value !== \"string\") {\n // Special handler for style with a value of type CSSStyleDeclaration\n transferKnownProperties(value, element.style);\n }\n else if (name === \"dangerouslySetInnerHTML\")\n element.innerHTML = value;\n else if (value === true)\n element.setAttribute(name, name);\n else if (value || value === 0)\n element.setAttribute(name, value.toString());\n }\n}\nexports.setAttributes = setAttributes;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyTsxTag = exports.createDomElement = exports.applyChildren = void 0;\nfunction applyChild(element, child) {\n if (child instanceof Element)\n element.appendChild(child);\n else if (typeof child === \"string\" || typeof child === \"number\")\n element.appendChild(document.createTextNode(child.toString()));\n else\n console.warn(\"Unknown type to append: \", child);\n}\nfunction applyChildren(element, children) {\n for (const child of children) {\n if (!child && child !== 0)\n continue;\n if (Array.isArray(child))\n applyChildren(element, child);\n else\n applyChild(element, child);\n }\n}\nexports.applyChildren = applyChildren;\nfunction createDomElement(tag, attrs) {\n const options = attrs?.is ? { is: attrs.is } : undefined;\n if (attrs?.xmlns)\n return document.createElementNS(attrs.xmlns, tag, options);\n return document.createElement(tag, options);\n}\nexports.createDomElement = createDomElement;\nfunction applyTsxTag(tag, attrs) {\n let finalTag = tag;\n let finalAttrs = attrs;\n if (finalAttrs && \"tsxTag\" in finalAttrs) {\n finalTag = finalAttrs.tsxTag;\n if (!finalAttrs.is && tag.includes(\"-\")) {\n finalAttrs = { ...finalAttrs, is: tag };\n }\n }\n return { finalTag, finalAttrs };\n}\nexports.applyTsxTag = applyTsxTag;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"core.ruffle.\" + {\"69\":\"b4eda2bd326cf533bbe6\",\"655\":\"3453b18337ead3dd1fa0\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkruffle_selfhosted\"] = self[\"webpackChunkruffle_selfhosted\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * A representation of a semver 2 compliant version string\n */\nexport class Version {\n /**\n * Construct a Version from specific components.\n *\n * If you wish to parse a string into a Version then please use {@link fromSemver}.\n *\n * @param major The major version component.\n * @param minor The minor version component.\n * @param patch The patch version component.\n * @param prIdent A list of pre-release identifiers, if any\n * @param buildIdent A list of build identifiers, if any\n */\n constructor(major, minor, patch, prIdent, buildIdent) {\n this.major = major;\n this.minor = minor;\n this.patch = patch;\n this.prIdent = prIdent;\n this.buildIdent = buildIdent;\n }\n /**\n * Construct a version from a semver 2 compliant string.\n *\n * This function is intended for use with semver 2 compliant strings.\n * Malformed strings may still parse correctly, but this result is not\n * guaranteed.\n *\n * @param versionString A semver 2.0.0 compliant version string\n * @returns A version object\n */\n static fromSemver(versionString) {\n const buildSplit = versionString.split(\"+\"), prSplit = buildSplit[0].split(\"-\"), versionSplit = prSplit[0].split(\".\");\n const major = parseInt(versionSplit[0], 10);\n let minor = 0;\n let patch = 0;\n let prIdent = null;\n let buildIdent = null;\n if (versionSplit[1] !== undefined) {\n minor = parseInt(versionSplit[1], 10);\n }\n if (versionSplit[2] !== undefined) {\n patch = parseInt(versionSplit[2], 10);\n }\n if (prSplit[1] !== undefined) {\n prIdent = prSplit[1].split(\".\");\n }\n if (buildSplit[1] !== undefined) {\n buildIdent = buildSplit[1].split(\".\");\n }\n return new Version(major, minor, patch, prIdent, buildIdent);\n }\n /**\n * Returns true if a given version is compatible with this one.\n *\n * Compatibility is defined as having the same nonzero major version\n * number, or if both major versions are zero, the same nonzero minor\n * version number, or if both minor versions are zero, the same nonzero\n * patch version number.\n *\n * This implements the ^ operator in npm's semver package, with the\n * exception of the prerelease exclusion rule.\n *\n * @param other The other version to test against\n * @returns True if compatible\n */\n isCompatibleWith(other) {\n return ((this.major !== 0 && this.major === other.major) ||\n (this.major === 0 &&\n other.major === 0 &&\n this.minor !== 0 &&\n this.minor === other.minor) ||\n (this.major === 0 &&\n other.major === 0 &&\n this.minor === 0 &&\n other.minor === 0 &&\n this.patch !== 0 &&\n this.patch === other.patch));\n }\n /**\n * Returns true if this version has precedence over (is newer than) another\n * version.\n *\n * Precedence is defined as in the Semver 2 spec. This implements the >\n * operator in npm's semver package, with the exception of the prerelease\n * exclusion rule.\n *\n * @param other The other version to test against\n * @returns True if this version has precedence over the other one\n */\n hasPrecedenceOver(other) {\n if (this.major > other.major) {\n return true;\n }\n else if (this.major < other.major) {\n return false;\n }\n if (this.minor > other.minor) {\n return true;\n }\n else if (this.minor < other.minor) {\n return false;\n }\n if (this.patch > other.patch) {\n return true;\n }\n else if (this.patch < other.patch) {\n return false;\n }\n if (this.prIdent === null && other.prIdent !== null) {\n return true;\n }\n else if (this.prIdent !== null && other.prIdent === null) {\n return false;\n }\n else if (this.prIdent !== null && other.prIdent !== null) {\n const isNumeric = /^[0-9]*$/;\n for (let i = 0; i < this.prIdent.length && i < other.prIdent.length; i += 1) {\n const numericThis = isNumeric.test(other.prIdent[i]);\n const numericOther = isNumeric.test(this.prIdent[i]);\n if (!numericOther && numericThis) {\n return true;\n }\n else if (numericOther && numericThis) {\n const intThis = parseInt(this.prIdent[i], 10);\n const intOther = parseInt(other.prIdent[i], 10);\n if (intThis > intOther) {\n return true;\n }\n else if (intThis < intOther) {\n return false;\n }\n }\n else if (numericOther && !numericThis) {\n return false;\n }\n else if (!numericOther && !numericThis) {\n if (this.prIdent[i] > other.prIdent[i]) {\n return true;\n }\n else if (this.prIdent[i] < other.prIdent[i]) {\n return false;\n }\n }\n }\n if (this.prIdent.length > other.prIdent.length) {\n return true;\n }\n else if (this.prIdent.length < other.prIdent.length) {\n return false;\n }\n }\n // Unlike prerelease, we prefer to have a build ident than to not\n if (this.buildIdent !== null && other.buildIdent === null) {\n return true;\n }\n else if (this.buildIdent === null && other.buildIdent !== null) {\n return false;\n }\n else if (this.buildIdent !== null && other.buildIdent !== null) {\n const isNumeric = /^[0-9]*$/;\n for (let i = 0; i < this.buildIdent.length && i < other.buildIdent.length; i += 1) {\n const numricThis = isNumeric.test(this.buildIdent[i]);\n const numericOther = isNumeric.test(other.buildIdent[i]);\n if (!numricThis && numericOther) {\n return true;\n }\n else if (numricThis && numericOther) {\n const intThis = parseInt(this.buildIdent[i], 10);\n const intOther = parseInt(other.buildIdent[i], 10);\n if (intThis > intOther) {\n return true;\n }\n else if (intThis < intOther) {\n return false;\n }\n }\n else if (numricThis && !numericOther) {\n return false;\n }\n else if (!numricThis && !numericOther) {\n if (this.buildIdent[i] > other.buildIdent[i]) {\n return true;\n }\n else if (this.buildIdent[i] < other.buildIdent[i]) {\n return false;\n }\n }\n }\n return this.buildIdent.length > other.buildIdent.length;\n }\n return false;\n }\n /**\n * Tests if a given version is equivalent to this one.\n *\n * Build and prerelease tags are ignored.\n *\n * @param other The other version to test against\n * @returns True if the given version is equivalent\n */\n isEqual(other) {\n return (this.major === other.major &&\n this.minor === other.minor &&\n this.patch === other.patch);\n }\n /**\n * Tests if a given version is stable or a compatible prerelease for this\n * version.\n *\n * This implements the prerelease exclusion rule of NPM semver: a\n * prerelease version can only pass this check if the major/minor/patch\n * components of both versions are the same. Otherwise, the prerelease\n * version always fails.\n *\n * @param other The other version to test against\n * @returns True if the given version is either stable, or a\n * prerelease in the same series as this one.\n */\n isStableOrCompatiblePrerelease(other) {\n if (other.prIdent === null) {\n return true;\n }\n else {\n return (this.major === other.major &&\n this.minor === other.minor &&\n this.patch === other.patch);\n }\n }\n}\n","import { Version } from \"./version\";\n/**\n * Represents a set of version requirements.\n */\nexport class VersionRange {\n /**\n * Constructs a range of versions as specified by the given requirements.\n *\n * If you wish to construct this object from a string representation,\n * then use {@link fromRequirementString}.\n *\n * @param requirements Requirements to set this range by\n */\n constructor(requirements) {\n this.requirements = requirements;\n }\n /**\n * Determine if a given version satisfies this range.\n *\n * @param fver A version object to test against.\n * @returns Whether or not the given version matches this range\n */\n satisfiedBy(fver) {\n for (const requirement of this.requirements) {\n let matches = true;\n for (const { comparator, version } of requirement) {\n matches =\n matches && version.isStableOrCompatiblePrerelease(fver);\n if (comparator === \"\" || comparator === \"=\") {\n matches = matches && version.isEqual(fver);\n }\n else if (comparator === \">\") {\n matches = matches && fver.hasPrecedenceOver(version);\n }\n else if (comparator === \">=\") {\n matches =\n matches &&\n (fver.hasPrecedenceOver(version) ||\n version.isEqual(fver));\n }\n else if (comparator === \"<\") {\n matches = matches && version.hasPrecedenceOver(fver);\n }\n else if (comparator === \"<=\") {\n matches =\n matches &&\n (version.hasPrecedenceOver(fver) ||\n version.isEqual(fver));\n }\n else if (comparator === \"^\") {\n matches = matches && version.isCompatibleWith(fver);\n }\n }\n if (matches) {\n return true;\n }\n }\n return false;\n }\n /**\n * Parse a requirement string into a version range.\n *\n * @param requirement The version requirements, consisting of a\n * series of space-separated strings, each one being a semver version\n * optionally prefixed by a comparator or a separator.\n *\n * Valid comparators are:\n * - `\"\"` or `\"=\"`: Precisely this version\n * - `\">`\": A version newer than this one\n * - `\">`=\": A version newer or equal to this one\n * - `\"<\"`: A version older than this one\n * - `\"<=\"`: A version older or equal to this one\n * - `\"^\"`: A version that is compatible with this one\n *\n * A separator is `\"||`\" which splits the requirement string into\n * left OR right.\n * @returns A version range object.\n */\n static fromRequirementString(requirement) {\n const components = requirement.split(\" \");\n let set = [];\n const requirements = [];\n for (const component of components) {\n if (component === \"||\") {\n if (set.length > 0) {\n requirements.push(set);\n set = [];\n }\n }\n else if (component.length > 0) {\n const match = /[0-9]/.exec(component);\n if (match) {\n const comparator = component.slice(0, match.index).trim();\n const version = Version.fromSemver(component.slice(match.index).trim());\n set.push({ comparator, version });\n }\n }\n }\n if (set.length > 0) {\n requirements.push(set);\n }\n return new VersionRange(requirements);\n }\n}\n","import { Version } from \"../../version\";\nimport { VersionRange } from \"../../version-range\";\n/**\n * Represents the Ruffle public API.\n *\n * The public API exists primarily to allow multiple installations of Ruffle on a\n * page (e.g. an extension install and a local one) to cooperate. In an ideal\n * situation, all Ruffle sources on the page install themselves into a single\n * public API, and then the public API picks the newest version by default.\n *\n * This API *is* versioned, in case we need to upgrade it. However, it must be\n * backwards- and forwards-compatible with all known sources.\n */\nexport class PublicAPI {\n /**\n * Construct the Ruffle public API.\n *\n * Do not use this function to negotiate a public API. Instead, use\n * `public_api` to register your Ruffle source with an existing public API\n * if it exists.\n *\n * Constructing a Public API will also trigger it to initialize Ruffle once\n * the page loads, if the API has not already been superseded.\n *\n * @param prev What used to be in the public API slot.\n *\n * This is used to upgrade from a prior version of the public API, or from\n * a user-defined configuration object placed in the public API slot.\n */\n constructor(prev) {\n this.sources = prev?.sources || {};\n this.config = prev?.config || {};\n this.invoked = prev?.invoked || false;\n this.newestName = prev?.newestName || null;\n prev?.superseded?.();\n if (document.readyState === \"loading\") {\n // Cloudflare Rocket Loader interferes with the DOMContentLoaded event,\n // so we listen for readystatechange instead\n document.addEventListener(\"readystatechange\", this.init.bind(this));\n }\n else {\n window.setTimeout(this.init.bind(this), 0);\n }\n }\n /**\n * The version of the public API.\n *\n * This is *not* the version of Ruffle itself.\n *\n * This allows a page with an old version of the Public API to be upgraded\n * to a new version of the API. The public API is intended to be changed\n * very infrequently, if at all, but this provides an escape mechanism for\n * newer Ruffle sources to upgrade older installations.\n *\n * @returns The version of this public API.\n */\n get version() {\n return \"0.1.0\";\n }\n /**\n * Determine the name of the newest registered source in the Public API.\n *\n * @returns The name of the source, or `null` if no source\n * has yet to be registered.\n */\n newestSourceName() {\n let newestName = null, newestVersion = Version.fromSemver(\"0.0.0\");\n for (const k in this.sources) {\n if (Object.prototype.hasOwnProperty.call(this.sources, k)) {\n const kVersion = Version.fromSemver(this.sources[k].version);\n if (kVersion.hasPrecedenceOver(newestVersion)) {\n newestName = k;\n newestVersion = kVersion;\n }\n }\n }\n return newestName;\n }\n /**\n * Negotiate and start Ruffle.\n *\n * This function reads the config parameter to determine which polyfills\n * should be enabled. If the configuration parameter is missing, then we\n * use a built-in set of defaults sufficient to fool sites with static\n * content and weak plugin detection.\n */\n init() {\n if (!this.invoked) {\n this.invoked = true;\n this.newestName = this.newestSourceName();\n if (this.newestName === null) {\n throw new Error(\"No registered Ruffle source!\");\n }\n const polyfills = \"polyfills\" in this.config ? this.config.polyfills : true;\n if (polyfills !== false) {\n this.sources[this.newestName].polyfill();\n }\n }\n }\n /**\n * Look up the newest Ruffle source and return it's API.\n *\n * @returns An instance of the Source API.\n */\n newest() {\n const name = this.newestSourceName();\n return name !== null ? this.sources[name] : null;\n }\n /**\n * Look up a specific Ruffle version (or any version satisfying a given set\n * of requirements) and return it's API.\n *\n * @param requirementString A set of semantic version requirement\n * strings that the player version must satisfy.\n * @returns An instance of the Source API, if one or more\n * sources satisfied the requirement.\n */\n satisfying(requirementString) {\n const requirement = VersionRange.fromRequirementString(requirementString);\n let valid = null;\n for (const k in this.sources) {\n if (Object.prototype.hasOwnProperty.call(this.sources, k)) {\n const version = Version.fromSemver(this.sources[k].version);\n if (requirement.satisfiedBy(version)) {\n valid = this.sources[k];\n }\n }\n }\n return valid;\n }\n /**\n * Look up the newest Ruffle version compatible with the `local` source, if\n * it's installed. Otherwise, use the latest version.\n *\n * @returns An instance of the Source API\n */\n localCompatible() {\n if (this.sources[\"local\"] !== undefined) {\n return this.satisfying(\"^\" + this.sources[\"local\"].version);\n }\n else {\n return this.newest();\n }\n }\n /**\n * Look up the newest Ruffle version with the exact same version as the\n * `local` source, if it's installed. Otherwise, use the latest version.\n *\n * @returns An instance of the Source API\n */\n local() {\n if (this.sources[\"local\"] !== undefined) {\n return this.satisfying(\"=\" + this.sources[\"local\"].version);\n }\n else {\n return this.newest();\n }\n }\n /**\n * Indicates that this version of the public API has been superseded by a\n * newer version.\n *\n * This should only be called by a newer version of the Public API.\n * Identical versions of the Public API should not supersede older versions\n * of that same API.\n *\n * Unfortunately, we can't disable polyfills after-the-fact, so this\n * only lets you disable the init event...\n */\n superseded() {\n this.invoked = true;\n }\n}\n","/**\n * Stores build information about <b>this specific version of the `ruffle-core` library</b>.\n *\n * It does not represent the version of Ruffle that may be in use by the page (for example, if a browser extension overrides it).\n *\n * @privateRemarks\n * This is generated at build time via `set_version.ts`.\n */\nexport const buildInfo = {\n versionNumber: \"0.1.0\",\n versionName: \"nightly 2024-11-16\",\n versionChannel: \"nightly\",\n buildDate: \"2024-11-16T00:06:34.748Z\",\n commitHash: \"99561d98c5064be69f29b95cd47ec92d5a5de757\",\n};\n","/**\n * Represents the various types of auto-play behaviours that are supported.\n */\nexport var AutoPlay;\n(function (AutoPlay) {\n /**\n * The player should automatically play the movie as soon as it is loaded.\n *\n * If the browser does not support automatic audio, the movie will begin\n * muted.\n */\n AutoPlay[\"On\"] = \"on\";\n /**\n * The player should not attempt to automatically play the movie.\n *\n * This will leave it to the user or API to actually play when appropriate.\n */\n AutoPlay[\"Off\"] = \"off\";\n /**\n * The player should automatically play the movie as soon as it is deemed\n * \"appropriate\" to do so.\n *\n * The exact behaviour depends on the browser, but commonly requires some\n * form of user interaction on the page in order to allow auto playing videos\n * with sound.\n */\n AutoPlay[\"Auto\"] = \"auto\";\n})(AutoPlay || (AutoPlay = {}));\n/**\n * Controls whether the content is letterboxed or pillarboxed when the\n * player's aspect ratio does not match the movie's aspect ratio.\n *\n * When letterboxed, black bars will be rendered around the exterior\n * margins of the content.\n */\nexport var Letterbox;\n(function (Letterbox) {\n /**\n * The content will never be letterboxed.\n */\n Letterbox[\"Off\"] = \"off\";\n /**\n * The content will only be letterboxed if the content is running fullscreen.\n */\n Letterbox[\"Fullscreen\"] = \"fullscreen\";\n /**\n * The content will always be letterboxed.\n */\n Letterbox[\"On\"] = \"on\";\n})(Letterbox || (Letterbox = {}));\n/**\n * When the player is muted, this controls whether or not Ruffle will show a\n * \"click to unmute\" overlay on top of the movie.\n */\nexport var UnmuteOverlay;\n(function (UnmuteOverlay) {\n /**\n * Show an overlay explaining that the movie is muted.\n */\n UnmuteOverlay[\"Visible\"] = \"visible\";\n /**\n * Don't show an overlay and pretend that everything is fine.\n */\n UnmuteOverlay[\"Hidden\"] = \"hidden\";\n})(UnmuteOverlay || (UnmuteOverlay = {}));\n/**\n * Console logging level.\n */\nexport var LogLevel;\n(function (LogLevel) {\n LogLevel[\"Error\"] = \"error\";\n LogLevel[\"Warn\"] = \"warn\";\n LogLevel[\"Info\"] = \"info\";\n LogLevel[\"Debug\"] = \"debug\";\n LogLevel[\"Trace\"] = \"trace\";\n})(LogLevel || (LogLevel = {}));\n/**\n * The window mode of a Ruffle player.\n */\nexport var WindowMode;\n(function (WindowMode) {\n /**\n * The Flash content is rendered in its own window and layering is done with the browser's\n * default behavior.\n *\n * In Ruffle, this mode functions like `WindowMode::Opaque` and will layer the Flash content\n * together with other HTML elements.\n */\n WindowMode[\"Window\"] = \"window\";\n /**\n * The Flash content is layered together with other HTML elements, and the stage color is\n * opaque. Content can render above or below Ruffle based on CSS rendering order.\n */\n WindowMode[\"Opaque\"] = \"opaque\";\n /**\n * The Flash content is layered together with other HTML elements, and the SWF stage color is\n * transparent. Content beneath Ruffle will be visible through transparent areas.\n */\n WindowMode[\"Transparent\"] = \"transparent\";\n /**\n * Request compositing with hardware acceleration when possible.\n * This mode has no effect in Ruffle and will function like `WindowMode.Opaque`.\n */\n WindowMode[\"Direct\"] = \"direct\";\n /**\n * Request a direct rendering path, bypassing browser compositing when possible.\n * This mode has no effect in Ruffle and will function like `WindowMode::Opaque`.\n */\n WindowMode[\"Gpu\"] = \"gpu\";\n})(WindowMode || (WindowMode = {}));\n/**\n * The render backend of a Ruffle player.\n *\n * The available backends may change in future releases.\n */\nexport var RenderBackend;\n(function (RenderBackend) {\n /**\n * An [in-development API](https://caniuse.com/webgpu) that will be preferred if available in the future.\n * Should behave the same as wgpu-webgl, except with lower overhead and thus better performance.\n */\n RenderBackend[\"WebGpu\"] = \"webgpu\";\n /**\n * The most featureful and currently preferred backend.\n * Rendering is done the same way as in the desktop app, then translated to WebGL on-the-fly.\n */\n RenderBackend[\"WgpuWebgl\"] = \"wgpu-webgl\";\n /**\n * A vanilla WebGL backend. Was the default backend until the start of 2023,\n * but is now used as a fallback for devices that do not support WebGL 2.\n * Supports fewer features and has a faster initialization time;\n * may be useful for content that does not need advanced features like bitmap drawing or blend modes.\n */\n RenderBackend[\"Webgl\"] = \"webgl\";\n /**\n * The slowest and most basic backend, used as a fallback when all else fails.\n * However, this is currently the only backend that accurately scales hairline strokes.\n * If you notice excessively thick strokes in specific content,\n * you may want to use the canvas renderer for that content until the issue is resolved.\n */\n RenderBackend[\"Canvas\"] = \"canvas\";\n})(RenderBackend || (RenderBackend = {}));\n/**\n * Represents the various context menu options that are supported.\n */\nexport var ContextMenu;\n(function (ContextMenu) {\n /**\n * The context menu should appear when right-clicking or long-pressing\n * the Ruffle instance.\n */\n ContextMenu[\"On\"] = \"on\";\n /**\n * The context menu should only appear when right-clicking\n * the Ruffle instance.\n */\n ContextMenu[\"RightClickOnly\"] = \"rightClickOnly\";\n /**\n * The context menu should not appear when right-clicking or long-pressing\n * the Ruffle instance.\n */\n ContextMenu[\"Off\"] = \"off\";\n})(ContextMenu || (ContextMenu = {}));\n/**\n * Represents the player runtime to emulate.\n */\nexport var PlayerRuntime;\n(function (PlayerRuntime) {\n /**\n * Emulate Adobe AIR.\n */\n PlayerRuntime[\"AIR\"] = \"air\";\n /**\n * Emulate Adobe Flash Player.\n */\n PlayerRuntime[\"FlashPlayer\"] = \"flashPlayer\";\n})(PlayerRuntime || (PlayerRuntime = {}));\n/**\n * The handling mode of links opening a new website.\n */\nexport var OpenURLMode;\n(function (OpenURLMode) {\n /**\n * Allow all links to open a new website.\n */\n OpenURLMode[\"Allow\"] = \"allow\";\n /**\n * A confirmation dialog opens with every link trying to open a new website.\n */\n OpenURLMode[\"Confirm\"] = \"confirm\";\n /**\n * Deny all links to open a new website.\n */\n OpenURLMode[\"Deny\"] = \"deny\";\n})(OpenURLMode || (OpenURLMode = {}));\n/**\n * The networking API access mode of the Ruffle player.\n */\nexport var NetworkingAccessMode;\n(function (NetworkingAccessMode) {\n /**\n * All networking APIs are permitted in the SWF file.\n */\n NetworkingAccessMode[\"All\"] = \"all\";\n /**\n * The SWF file may not call browser navigation or browser interaction APIs.\n *\n * The APIs navigateToURL(), fscommand() and ExternalInterface.call() are\n * prevented in this mode.\n */\n NetworkingAccessMode[\"Internal\"] = \"internal\";\n /**\n * The SWF file may not call browser navigation or browser interaction APIs\n * and it cannot use any SWF-to-SWF communication APIs.\n *\n * Additionally to the ones in internal mode, the APIs sendToURL(),\n * FileReference.download(), FileReference.upload(), Loader.load(),\n * LocalConnection.connect(), LocalConnection.send(), NetConnection.connect(),\n * NetStream.play(), Security.loadPolicyFile(), SharedObject.getLocal(),\n * SharedObject.getRemote(), Socket.connect(), Sound.load(), URLLoader.load(),\n * URLStream.load() and XMLSocket.connect() are prevented in this mode.\n *\n * This mode is not implemented yet.\n */\n NetworkingAccessMode[\"None\"] = \"none\";\n})(NetworkingAccessMode || (NetworkingAccessMode = {}));\n","import { AutoPlay, ContextMenu, Letterbox, LogLevel, OpenURLMode, NetworkingAccessMode, PlayerRuntime, UnmuteOverlay, WindowMode, } from \"./load-options\";\nexport const DEFAULT_CONFIG = {\n allowScriptAccess: false,\n parameters: {},\n autoplay: AutoPlay.Auto,\n backgroundColor: null,\n letterbox: Letterbox.Fullscreen,\n unmuteOverlay: UnmuteOverlay.Visible,\n upgradeToHttps: true,\n compatibilityRules: true,\n favorFlash: true,\n warnOnUnsupportedContent: true,\n logLevel: LogLevel.Error,\n showSwfDownload: false,\n contextMenu: ContextMenu.On,\n // Backwards-compatibility option\n preloader: true,\n splashScreen: true,\n maxExecutionDuration: 15,\n base: null,\n menu: true,\n allowFullscreen: false,\n salign: \"\",\n forceAlign: false,\n quality: \"high\",\n scale: \"showAll\",\n forceScale: false,\n frameRate: null,\n wmode: WindowMode.Window,\n publicPath: null,\n polyfills: true,\n playerVersion: null,\n preferredRenderer: null,\n openUrlMode: OpenURLMode.Allow,\n allowNetworking: NetworkingAccessMode.All,\n openInNewTab: null,\n socketProxy: [],\n fontSources: [],\n defaultFonts: {},\n credentialAllowList: [],\n playerRuntime: PlayerRuntime.FlashPlayer,\n};\n","/**\n * The `FluentType` class is the base of Fluent's type system.\n *\n * Fluent types wrap JavaScript values and store additional configuration for\n * them, which can then be used in the `toString` method together with a proper\n * `Intl` formatter.\n */\nexport class FluentType {\n /**\n * Create a `FluentType` instance.\n *\n * @param value The JavaScript value to wrap.\n */\n constructor(value) {\n this.value = value;\n }\n /**\n * Unwrap the raw value stored by this `FluentType`.\n */\n valueOf() {\n return this.value;\n }\n}\n/**\n * A `FluentType` representing no correct value.\n */\nexport class FluentNone extends FluentType {\n /**\n * Create an instance of `FluentNone` with an optional fallback value.\n * @param value The fallback value of this `FluentNone`.\n */\n constructor(value = \"???\") {\n super(value);\n }\n /**\n * Format this `FluentNone` to the fallback string.\n */\n toString(scope) {\n return `{${this.value}}`;\n }\n}\n/**\n * A `FluentType` representing a number.\n *\n * A `FluentNumber` instance stores the number value of the number it\n * represents. It may also store an option bag of options which will be passed\n * to `Intl.NumerFormat` when the `FluentNumber` is formatted to a string.\n */\nexport class FluentNumber extends FluentType {\n /**\n * Create an instance of `FluentNumber` with options to the\n * `Intl.NumberFormat` constructor.\n *\n * @param value The number value of this `FluentNumber`.\n * @param opts Options which will be passed to `Intl.NumberFormat`.\n */\n constructor(value, opts = {}) {\n super(value);\n this.opts = opts;\n }\n /**\n * Format this `FluentNumber` to a string.\n */\n toString(scope) {\n try {\n const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);\n return nf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n return this.value.toString(10);\n }\n }\n}\n/**\n * A `FluentType` representing a date and time.\n *\n * A `FluentDateTime` instance stores the number value of the date it\n * represents, as a numerical timestamp in milliseconds. It may also store an\n * option bag of options which will be passed to `Intl.DateTimeFormat` when the\n * `FluentDateTime` is formatted to a string.\n */\nexport class FluentDateTime extends FluentType {\n /**\n * Create an instance of `FluentDateTime` with options to the\n * `Intl.DateTimeFormat` constructor.\n *\n * @param value The number value of this `FluentDateTime`, in milliseconds.\n * @param opts Options which will be passed to `Intl.DateTimeFormat`.\n */\n constructor(value, opts = {}) {\n super(value);\n this.opts = opts;\n }\n /**\n * Format this `FluentDateTime` to a string.\n */\n toString(scope) {\n try {\n const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);\n return dtf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n return new Date(this.value).toISOString();\n }\n }\n}\n","/* global Intl */\n/**\n * @overview\n *\n * The role of the Fluent resolver is to format a `Pattern` to an instance of\n * `FluentValue`. For performance reasons, primitive strings are considered\n * such instances, too.\n *\n * Translations can contain references to other messages or variables,\n * conditional logic in form of select expressions, traits which describe their\n * grammatical features, and can use Fluent builtins which make use of the\n * `Intl` formatters to format numbers and dates into the bundle's languages.\n * See the documentation of the Fluent syntax for more information.\n *\n * In case of errors the resolver will try to salvage as much of the\n * translation as possible. In rare situations where the resolver didn't know\n * how to recover from an error it will return an instance of `FluentNone`.\n *\n * All expressions resolve to an instance of `FluentValue`. The caller should\n * use the `toString` method to convert the instance to a native value.\n *\n * Functions in this file pass around an instance of the `Scope` class, which\n * stores the data required for successful resolution and error recovery.\n */\nimport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n/**\n * The maximum number of placeables which can be expanded in a single call to\n * `formatPattern`. The limit protects against the Billion Laughs and Quadratic\n * Blowup attacks. See https://msdn.microsoft.com/en-us/magazine/ee335713.aspx.\n */\nconst MAX_PLACEABLES = 100;\n/** Unicode bidi isolation characters. */\nconst FSI = \"\\u2068\";\nconst PDI = \"\\u2069\";\n/** Helper: match a variant key to the given selector. */\nfunction match(scope, selector, key) {\n if (key === selector) {\n // Both are strings.\n return true;\n }\n // XXX Consider comparing options too, e.g. minimumFractionDigits.\n if (key instanceof FluentNumber &&\n selector instanceof FluentNumber &&\n key.value === selector.value) {\n return true;\n }\n if (selector instanceof FluentNumber && typeof key === \"string\") {\n let category = scope\n .memoizeIntlObject(Intl.PluralRules, selector.opts)\n .select(selector.value);\n if (key === category) {\n return true;\n }\n }\n return false;\n}\n/** Helper: resolve the default variant from a list of variants. */\nfunction getDefault(scope, variants, star) {\n if (variants[star]) {\n return resolvePattern(scope, variants[star].value);\n }\n scope.reportError(new RangeError(\"No default\"));\n return new FluentNone();\n}\n/** Helper: resolve arguments to a call expression. */\nfunction getArguments(scope, args) {\n const positional = [];\n const named = Object.create(null);\n for (const arg of args) {\n if (arg.type === \"narg\") {\n named[arg.name] = resolveExpression(scope, arg.value);\n }\n else {\n positional.push(resolveExpression(scope, arg));\n }\n }\n return { positional, named };\n}\n/** Resolve an expression to a Fluent type. */\nfunction resolveExpression(scope, expr) {\n switch (expr.type) {\n case \"str\":\n return expr.value;\n case \"num\":\n return new FluentNumber(expr.value, {\n minimumFractionDigits: expr.precision,\n });\n case \"var\":\n return resolveVariableReference(scope, expr);\n case \"mesg\":\n return resolveMessageReference(scope, expr);\n case \"term\":\n return resolveTermReference(scope, expr);\n case \"func\":\n return resolveFunctionReference(scope, expr);\n case \"select\":\n return resolveSelectExpression(scope, expr);\n default:\n return new FluentNone();\n }\n}\n/** Resolve a reference to a variable. */\nfunction resolveVariableReference(scope, { name }) {\n let arg;\n if (scope.params) {\n // We're inside a TermReference. It's OK to reference undefined parameters.\n if (Object.prototype.hasOwnProperty.call(scope.params, name)) {\n arg = scope.params[name];\n }\n else {\n return new FluentNone(`$${name}`);\n }\n }\n else if (scope.args &&\n Object.prototype.hasOwnProperty.call(scope.args, name)) {\n // We're in the top-level Pattern or inside a MessageReference. Missing\n // variables references produce ReferenceErrors.\n arg = scope.args[name];\n }\n else {\n scope.reportError(new ReferenceError(`Unknown variable: $${name}`));\n return new FluentNone(`$${name}`);\n }\n // Return early if the argument already is an instance of FluentType.\n if (arg instanceof FluentType) {\n return arg;\n }\n // Convert the argument to a Fluent type.\n switch (typeof arg) {\n case \"string\":\n return arg;\n case \"number\":\n return new FluentNumber(arg);\n case \"object\":\n if (arg instanceof Date) {\n return new FluentDateTime(arg.getTime());\n }\n // eslint-disable-next-line no-fallthrough\n default:\n scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));\n return new FluentNone(`$${name}`);\n }\n}\n/** Resolve a reference to another message. */\nfunction resolveMessageReference(scope, { name, attr }) {\n const message = scope.bundle._messages.get(name);\n if (!message) {\n scope.reportError(new ReferenceError(`Unknown message: ${name}`));\n return new FluentNone(name);\n }\n if (attr) {\n const attribute = message.attributes[attr];\n if (attribute) {\n return resolvePattern(scope, attribute);\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${name}.${attr}`);\n }\n if (message.value) {\n return resolvePattern(scope, message.value);\n }\n scope.reportError(new ReferenceError(`No value: ${name}`));\n return new FluentNone(name);\n}\n/** Resolve a call to a Term with key-value arguments. */\nfunction resolveTermReference(scope, { name, attr, args }) {\n const id = `-${name}`;\n const term = scope.bundle._terms.get(id);\n if (!term) {\n scope.reportError(new ReferenceError(`Unknown term: ${id}`));\n return new FluentNone(id);\n }\n if (attr) {\n const attribute = term.attributes[attr];\n if (attribute) {\n // Every TermReference has its own variables.\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, attribute);\n scope.params = null;\n return resolved;\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${id}.${attr}`);\n }\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, term.value);\n scope.params = null;\n return resolved;\n}\n/** Resolve a call to a Function with positional and key-value arguments. */\nfunction resolveFunctionReference(scope, { name, args }) {\n // Some functions are built-in. Others may be provided by the runtime via\n // the `FluentBundle` constructor.\n let func = scope.bundle._functions[name];\n if (!func) {\n scope.reportError(new ReferenceError(`Unknown function: ${name}()`));\n return new FluentNone(`${name}()`);\n }\n if (typeof func !== \"function\") {\n scope.reportError(new TypeError(`Function ${name}() is not callable`));\n return new FluentNone(`${name}()`);\n }\n try {\n let resolved = getArguments(scope, args);\n return func(resolved.positional, resolved.named);\n }\n catch (err) {\n scope.reportError(err);\n return new FluentNone(`${name}()`);\n }\n}\n/** Resolve a select expression to the member object. */\nfunction resolveSelectExpression(scope, { selector, variants, star }) {\n let sel = resolveExpression(scope, selector);\n if (sel instanceof FluentNone) {\n return getDefault(scope, variants, star);\n }\n // Match the selector against keys of each variant, in order.\n for (const variant of variants) {\n const key = resolveExpression(scope, variant.key);\n if (match(scope, sel, key)) {\n return resolvePattern(scope, variant.value);\n }\n }\n return getDefault(scope, variants, star);\n}\n/** Resolve a pattern (a complex string with placeables). */\nexport function resolveComplexPattern(scope, ptn) {\n if (scope.dirty.has(ptn)) {\n scope.reportError(new RangeError(\"Cyclic reference\"));\n return new FluentNone();\n }\n // Tag the pattern as dirty for the purpose of the current resolution.\n scope.dirty.add(ptn);\n const result = [];\n // Wrap interpolations with Directional Isolate Formatting characters\n // only when the pattern has more than one element.\n const useIsolating = scope.bundle._useIsolating && ptn.length > 1;\n for (const elem of ptn) {\n if (typeof elem === \"string\") {\n result.push(scope.bundle._transform(elem));\n continue;\n }\n scope.placeables++;\n if (scope.placeables > MAX_PLACEABLES) {\n scope.dirty.delete(ptn);\n // This is a fatal error which causes the resolver to instantly bail out\n // on this pattern. The length check protects against excessive memory\n // usage, and throwing protects against eating up the CPU when long\n // placeables are deeply nested.\n throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` +\n `max allowed is ${MAX_PLACEABLES}`);\n }\n if (useIsolating) {\n result.push(FSI);\n }\n result.push(resolveExpression(scope, elem).toString(scope));\n if (useIsolating) {\n result.push(PDI);\n }\n }\n scope.dirty.delete(ptn);\n return result.join(\"\");\n}\n/**\n * Resolve a simple or a complex Pattern to a FluentString\n * (which is really the string primitive).\n */\nfunction resolvePattern(scope, value) {\n // Resolve a simple pattern.\n if (typeof value === \"string\") {\n return scope.bundle._transform(value);\n }\n return resolveComplexPattern(scope, value);\n}\n","export class Scope {\n constructor(bundle, errors, args) {\n /**\n * The Set of patterns already encountered during this resolution.\n * Used to detect and prevent cyclic resolutions.\n * @ignore\n */\n this.dirty = new WeakSet();\n /** A dict of parameters passed to a TermReference. */\n this.params = null;\n /**\n * The running count of placeables resolved so far.\n * Used to detect the Billion Laughs and Quadratic Blowup attacks.\n * @ignore\n */\n this.placeables = 0;\n this.bundle = bundle;\n this.errors = errors;\n this.args = args;\n }\n reportError(error) {\n if (!this.errors || !(error instanceof Error)) {\n throw error;\n }\n this.errors.push(error);\n }\n memoizeIntlObject(ctor, opts) {\n let cache = this.bundle._intls.get(ctor);\n if (!cache) {\n cache = {};\n this.bundle._intls.set(ctor, cache);\n }\n let id = JSON.stringify(opts);\n if (!cache[id]) {\n cache[id] = new ctor(this.bundle.locales, opts);\n }\n return cache[id];\n }\n}\n","/**\n * @overview\n *\n * The FTL resolver ships with a number of functions built-in.\n *\n * Each function take two arguments:\n * - args - an array of positional args\n * - opts - an object of key-value args\n *\n * Arguments to functions are guaranteed to already be instances of\n * `FluentValue`. Functions must return `FluentValues` as well.\n */\nimport { FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\nfunction values(opts, allowed) {\n const unwrapped = Object.create(null);\n for (const [name, opt] of Object.entries(opts)) {\n if (allowed.includes(name)) {\n unwrapped[name] = opt.valueOf();\n }\n }\n return unwrapped;\n}\nconst NUMBER_ALLOWED = [\n \"unitDisplay\",\n \"currencyDisplay\",\n \"useGrouping\",\n \"minimumIntegerDigits\",\n \"minimumFractionDigits\",\n \"maximumFractionDigits\",\n \"minimumSignificantDigits\",\n \"maximumSignificantDigits\",\n];\n/**\n * The implementation of the `NUMBER()` builtin available to translations.\n *\n * Translations may call the `NUMBER()` builtin in order to specify formatting\n * options of a number. For example:\n *\n * pi = The value of π is {NUMBER($pi, maximumFractionDigits: 2)}.\n *\n * The implementation expects an array of `FluentValues` representing the\n * positional arguments, and an object of named `FluentValues` representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * unitDisplay\n * currencyDisplay\n * useGrouping\n * minimumIntegerDigits\n * minimumFractionDigits\n * maximumFractionDigits\n * minimumSignificantDigits\n * maximumSignificantDigits\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `NUMBER()`.\n * @param opts The named argments passed to this `NUMBER()`.\n */\nexport function NUMBER(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`NUMBER(${arg.valueOf()})`);\n }\n if (arg instanceof FluentNumber) {\n return new FluentNumber(arg.valueOf(), {\n ...arg.opts,\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n if (arg instanceof FluentDateTime) {\n return new FluentNumber(arg.valueOf(), {\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n throw new TypeError(\"Invalid argument to NUMBER\");\n}\nconst DATETIME_ALLOWED = [\n \"dateStyle\",\n \"timeStyle\",\n \"fractionalSecondDigits\",\n \"dayPeriod\",\n \"hour12\",\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n];\n/**\n * The implementation of the `DATETIME()` builtin available to translations.\n *\n * Translations may call the `DATETIME()` builtin in order to specify\n * formatting options of a number. For example:\n *\n * now = It's {DATETIME($today, month: \"long\")}.\n *\n * The implementation expects an array of `FluentValues` representing the\n * positional arguments, and an object of named `FluentValues` representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * dateStyle\n * timeStyle\n * fractionalSecondDigits\n * dayPeriod\n * hour12\n * weekday\n * era\n * year\n * month\n * day\n * hour\n * minute\n * second\n * timeZoneName\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `DATETIME()`.\n * @param opts The named argments passed to this `DATETIME()`.\n */\nexport function DATETIME(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`DATETIME(${arg.valueOf()})`);\n }\n if (arg instanceof FluentDateTime) {\n return new FluentDateTime(arg.valueOf(), {\n ...arg.opts,\n ...values(opts, DATETIME_ALLOWED),\n });\n }\n if (arg instanceof FluentNumber) {\n return new FluentDateTime(arg.valueOf(), {\n ...values(opts, DATETIME_ALLOWED),\n });\n }\n throw new TypeError(\"Invalid argument to DATETIME\");\n}\n","const cache = new Map();\nexport function getMemoizerForLocale(locales) {\n const stringLocale = Array.isArray(locales) ? locales.join(\" \") : locales;\n let memoizer = cache.get(stringLocale);\n if (memoizer === undefined) {\n memoizer = new Map();\n cache.set(stringLocale, memoizer);\n }\n return memoizer;\n}\n","import { resolveComplexPattern } from \"./resolver.js\";\nimport { Scope } from \"./scope.js\";\nimport { FluentNone } from \"./types.js\";\nimport { NUMBER, DATETIME } from \"./builtins.js\";\nimport { getMemoizerForLocale } from \"./memoizer.js\";\n/**\n * Message bundles are single-language stores of translation resources. They are\n * responsible for formatting message values and attributes to strings.\n */\nexport class FluentBundle {\n /**\n * Create an instance of `FluentBundle`.\n *\n * @example\n * ```js\n * let bundle = new FluentBundle([\"en-US\", \"en\"]);\n *\n * let bundle = new FluentBundle(locales, {useIsolating: false});\n *\n * let bundle = new FluentBundle(locales, {\n * useIsolating: true,\n * functions: {\n * NODE_ENV: () => process.env.NODE_ENV\n * }\n * });\n * ```\n *\n * @param locales - Used to instantiate `Intl` formatters used by translations.\n * @param options - Optional configuration for the bundle.\n */\n constructor(locales, { functions, useIsolating = true, transform = (v) => v, } = {}) {\n /** @ignore */\n this._terms = new Map();\n /** @ignore */\n this._messages = new Map();\n this.locales = Array.isArray(locales) ? locales : [locales];\n this._functions = {\n NUMBER,\n DATETIME,\n ...functions,\n };\n this._useIsolating = useIsolating;\n this._transform = transform;\n this._intls = getMemoizerForLocale(locales);\n }\n /**\n * Check if a message is present in the bundle.\n *\n * @param id - The identifier of the message to check.\n */\n hasMessage(id) {\n return this._messages.has(id);\n }\n /**\n * Return a raw unformatted message object from the bundle.\n *\n * Raw messages are `{value, attributes}` shapes containing translation units\n * called `Patterns`. `Patterns` are implementation-specific; they should be\n * treated as black boxes and formatted with `FluentBundle.formatPattern`.\n *\n * @param id - The identifier of the message to check.\n */\n getMessage(id) {\n return this._messages.get(id);\n }\n /**\n * Add a translation resource to the bundle.\n *\n * @example\n * ```js\n * let res = new FluentResource(\"foo = Foo\");\n * bundle.addResource(res);\n * bundle.getMessage(\"foo\");\n * // → {value: .., attributes: {..}}\n * ```\n *\n * @param res\n * @param options\n */\n addResource(res, { allowOverrides = false, } = {}) {\n const errors = [];\n for (let i = 0; i < res.body.length; i++) {\n let entry = res.body[i];\n if (entry.id.startsWith(\"-\")) {\n // Identifiers starting with a dash (-) define terms. Terms are private\n // and cannot be retrieved from FluentBundle.\n if (allowOverrides === false && this._terms.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing term: \"${entry.id}\"`));\n continue;\n }\n this._terms.set(entry.id, entry);\n }\n else {\n if (allowOverrides === false && this._messages.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing message: \"${entry.id}\"`));\n continue;\n }\n this._messages.set(entry.id, entry);\n }\n }\n return errors;\n }\n /**\n * Format a `Pattern` to a string.\n *\n * Format a raw `Pattern` into a string. `args` will be used to resolve\n * references to variables passed as arguments to the translation.\n *\n * In case of errors `formatPattern` will try to salvage as much of the\n * translation as possible and will still return a string. For performance\n * reasons, the encountered errors are not returned but instead are appended\n * to the `errors` array passed as the third argument.\n *\n * If `errors` is omitted, the first encountered error will be thrown.\n *\n * @example\n * ```js\n * let errors = [];\n * bundle.addResource(\n * new FluentResource(\"hello = Hello, {$name}!\"));\n *\n * let hello = bundle.getMessage(\"hello\");\n * if (hello.value) {\n * bundle.formatPattern(hello.value, {name: \"Jane\"}, errors);\n * // Returns \"Hello, Jane!\" and `errors` is empty.\n *\n * bundle.formatPattern(hello.value, undefined, errors);\n * // Returns \"Hello, {$name}!\" and `errors` is now:\n * // [<ReferenceError: Unknown variable: name>]\n * }\n * ```\n */\n formatPattern(pattern, args = null, errors = null) {\n // Resolve a simple pattern without creating a scope. No error handling is\n // required; by definition simple patterns don't have placeables.\n if (typeof pattern === \"string\") {\n return this._transform(pattern);\n }\n // Resolve a complex pattern.\n let scope = new Scope(this, errors, args);\n try {\n let value = resolveComplexPattern(scope, pattern);\n return value.toString(scope);\n }\n catch (err) {\n if (scope.errors && err instanceof Error) {\n scope.errors.push(err);\n return new FluentNone().toString(scope);\n }\n throw err;\n }\n }\n}\n","// This regex is used to iterate through the beginnings of messages and terms.\n// With the /m flag, the ^ matches at the beginning of every line.\nconst RE_MESSAGE_START = /^(-?[a-zA-Z][\\w-]*) *= */gm;\n// Both Attributes and Variants are parsed in while loops. These regexes are\n// used to break out of them.\nconst RE_ATTRIBUTE_START = /\\.([a-zA-Z][\\w-]*) *= */y;\nconst RE_VARIANT_START = /\\*?\\[/y;\nconst RE_NUMBER_LITERAL = /(-?[0-9]+(?:\\.([0-9]+))?)/y;\nconst RE_IDENTIFIER = /([a-zA-Z][\\w-]*)/y;\nconst RE_REFERENCE = /([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y;\nconst RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;\n// A \"run\" is a sequence of text or string literal characters which don't\n// require any special handling. For TextElements such special characters are: {\n// (starts a placeable), and line breaks which require additional logic to check\n// if the next line is indented. For StringLiterals they are: \\ (starts an\n// escape sequence), \" (ends the literal), and line breaks which are not allowed\n// in StringLiterals. Note that string runs may be empty; text runs may not.\nconst RE_TEXT_RUN = /([^{}\\n\\r]+)/y;\nconst RE_STRING_RUN = /([^\\\\\"\\n\\r]*)/y;\n// Escape sequences.\nconst RE_STRING_ESCAPE = /\\\\([\\\\\"])/y;\nconst RE_UNICODE_ESCAPE = /\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y;\n// Used for trimming TextElements and indents.\nconst RE_LEADING_NEWLINES = /^\\n+/;\nconst RE_TRAILING_SPACES = / +$/;\n// Used in makeIndent to strip spaces from blank lines and normalize CRLF to LF.\nconst RE_BLANK_LINES = / *\\r?\\n/g;\n// Used in makeIndent to measure the indentation.\nconst RE_INDENT = /( *)$/;\n// Common tokens.\nconst TOKEN_BRACE_OPEN = /{\\s*/y;\nconst TOKEN_BRACE_CLOSE = /\\s*}/y;\nconst TOKEN_BRACKET_OPEN = /\\[\\s*/y;\nconst TOKEN_BRACKET_CLOSE = /\\s*] */y;\nconst TOKEN_PAREN_OPEN = /\\s*\\(\\s*/y;\nconst TOKEN_ARROW = /\\s*->\\s*/y;\nconst TOKEN_COLON = /\\s*:\\s*/y;\n// Note the optional comma. As a deviation from the Fluent EBNF, the parser\n// doesn't enforce commas between call arguments.\nconst TOKEN_COMMA = /\\s*,?\\s*/y;\nconst TOKEN_BLANK = /\\s+/y;\n/**\n * Fluent Resource is a structure storing parsed localization entries.\n */\nexport class FluentResource {\n constructor(source) {\n this.body = [];\n RE_MESSAGE_START.lastIndex = 0;\n let cursor = 0;\n // Iterate over the beginnings of messages and terms to efficiently skip\n // comments and recover from errors.\n while (true) {\n let next = RE_MESSAGE_START.exec(source);\n if (next === null) {\n break;\n }\n cursor = RE_MESSAGE_START.lastIndex;\n try {\n this.body.push(parseMessage(next[1]));\n }\n catch (err) {\n if (err instanceof SyntaxError) {\n // Don't report any Fluent syntax errors. Skip directly to the\n // beginning of the next message or term.\n continue;\n }\n throw err;\n }\n }\n // The parser implementation is inlined below for performance reasons,\n // as well as for convenience of accessing `source` and `cursor`.\n // The parser focuses on minimizing the number of false negatives at the\n // expense of increasing the risk of false positives. In other words, it\n // aims at parsing valid Fluent messages with a success rate of 100%, but it\n // may also parse a few invalid messages which the reference parser would\n // reject. The parser doesn't perform any validation and may produce entries\n // which wouldn't make sense in the real world. For best results users are\n // advised to validate translations with the fluent-syntax parser\n // pre-runtime.\n // The parser makes an extensive use of sticky regexes which can be anchored\n // to any offset of the source string without slicing it. Errors are thrown\n // to bail out of parsing of ill-formed messages.\n function test(re) {\n re.lastIndex = cursor;\n return re.test(source);\n }\n // Advance the cursor by the char if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeChar(char, errorClass) {\n if (source[cursor] === char) {\n cursor++;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${char}`);\n }\n return false;\n }\n // Advance the cursor by the token if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeToken(re, errorClass) {\n if (test(re)) {\n cursor = re.lastIndex;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${re.toString()}`);\n }\n return false;\n }\n // Execute a regex, advance the cursor, and return all capture groups.\n function match(re) {\n re.lastIndex = cursor;\n let result = re.exec(source);\n if (result === null) {\n throw new SyntaxError(`Expected ${re.toString()}`);\n }\n cursor = re.lastIndex;\n return result;\n }\n // Execute a regex, advance the cursor, and return the capture group.\n function match1(re) {\n return match(re)[1];\n }\n function parseMessage(id) {\n let value = parsePattern();\n let attributes = parseAttributes();\n if (value === null && Object.keys(attributes).length === 0) {\n throw new SyntaxError(\"Expected message value or attributes\");\n }\n return { id, value, attributes };\n }\n function parseAttributes() {\n let attrs = Object.create(null);\n while (test(RE_ATTRIBUTE_START)) {\n let name = match1(RE_ATTRIBUTE_START);\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected attribute value\");\n }\n attrs[name] = value;\n }\n return attrs;\n }\n function parsePattern() {\n let first;\n // First try to parse any simple text on the same line as the id.\n if (test(RE_TEXT_RUN)) {\n first = match1(RE_TEXT_RUN);\n }\n // If there's a placeable on the first line, parse a complex pattern.\n if (source[cursor] === \"{\" || source[cursor] === \"}\") {\n // Re-use the text parsed above, if possible.\n return parsePatternElements(first ? [first] : [], Infinity);\n }\n // RE_TEXT_VALUE stops at newlines. Only continue parsing the pattern if\n // what comes after the newline is indented.\n let indent = parseIndent();\n if (indent) {\n if (first) {\n // If there's text on the first line, the blank block is part of the\n // translation content in its entirety.\n return parsePatternElements([first, indent], indent.length);\n }\n // Otherwise, we're dealing with a block pattern, i.e. a pattern which\n // starts on a new line. Discrad the leading newlines but keep the\n // inline indent; it will be used by the dedentation logic.\n indent.value = trim(indent.value, RE_LEADING_NEWLINES);\n return parsePatternElements([indent], indent.length);\n }\n if (first) {\n // It was just a simple inline text after all.\n return trim(first, RE_TRAILING_SPACES);\n }\n return null;\n }\n // Parse a complex pattern as an array of elements.\n function parsePatternElements(elements = [], commonIndent) {\n while (true) {\n if (test(RE_TEXT_RUN)) {\n elements.push(match1(RE_TEXT_RUN));\n continue;\n }\n if (source[cursor] === \"{\") {\n elements.push(parsePlaceable());\n continue;\n }\n if (source[cursor] === \"}\") {\n throw new SyntaxError(\"Unbalanced closing brace\");\n }\n let indent = parseIndent();\n if (indent) {\n elements.push(indent);\n commonIndent = Math.min(commonIndent, indent.length);\n continue;\n }\n break;\n }\n let lastIndex = elements.length - 1;\n let lastElement = elements[lastIndex];\n // Trim the trailing spaces in the last element if it's a TextElement.\n if (typeof lastElement === \"string\") {\n elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);\n }\n let baked = [];\n for (let element of elements) {\n if (element instanceof Indent) {\n // Dedent indented lines by the maximum common indent.\n element = element.value.slice(0, element.value.length - commonIndent);\n }\n if (element) {\n baked.push(element);\n }\n }\n return baked;\n }\n function parsePlaceable() {\n consumeToken(TOKEN_BRACE_OPEN, SyntaxError);\n let selector = parseInlineExpression();\n if (consumeToken(TOKEN_BRACE_CLOSE)) {\n return selector;\n }\n if (consumeToken(TOKEN_ARROW)) {\n let variants = parseVariants();\n consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);\n return {\n type: \"select\",\n selector,\n ...variants,\n };\n }\n throw new SyntaxError(\"Unclosed placeable\");\n }\n function parseInlineExpression() {\n if (source[cursor] === \"{\") {\n // It's a nested placeable.\n return parsePlaceable();\n }\n if (test(RE_REFERENCE)) {\n let [, sigil, name, attr = null] = match(RE_REFERENCE);\n if (sigil === \"$\") {\n return { type: \"var\", name };\n }\n if (consumeToken(TOKEN_PAREN_OPEN)) {\n let args = parseArguments();\n if (sigil === \"-\") {\n // A parameterized term: -term(...).\n return { type: \"term\", name, attr, args };\n }\n if (RE_FUNCTION_NAME.test(name)) {\n return { type: \"func\", name, args };\n }\n throw new SyntaxError(\"Function names must be all upper-case\");\n }\n if (sigil === \"-\") {\n // A non-parameterized term: -term.\n return {\n type: \"term\",\n name,\n attr,\n args: [],\n };\n }\n return { type: \"mesg\", name, attr };\n }\n return parseLiteral();\n }\n function parseArguments() {\n let args = [];\n while (true) {\n switch (source[cursor]) {\n case \")\": // End of the argument list.\n cursor++;\n return args;\n case undefined: // EOF\n throw new SyntaxError(\"Unclosed argument list\");\n }\n args.push(parseArgument());\n // Commas between arguments are treated as whitespace.\n consumeToken(TOKEN_COMMA);\n }\n }\n function parseArgument() {\n let expr = parseInlineExpression();\n if (expr.type !== \"mesg\") {\n return expr;\n }\n if (consumeToken(TOKEN_COLON)) {\n // The reference is the beginning of a named argument.\n return {\n type: \"narg\",\n name: expr.name,\n value: parseLiteral(),\n };\n }\n // It's a regular message reference.\n return expr;\n }\n function parseVariants() {\n let variants = [];\n let count = 0;\n let star;\n while (test(RE_VARIANT_START)) {\n if (consumeChar(\"*\")) {\n star = count;\n }\n let key = parseVariantKey();\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected variant value\");\n }\n variants[count++] = { key, value };\n }\n if (count === 0) {\n return null;\n }\n if (star === undefined) {\n throw new SyntaxError(\"Expected default variant\");\n }\n return { variants, star };\n }\n function parseVariantKey() {\n consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);\n let key;\n if (test(RE_NUMBER_LITERAL)) {\n key = parseNumberLiteral();\n }\n else {\n key = {\n type: \"str\",\n value: match1(RE_IDENTIFIER),\n };\n }\n consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);\n return key;\n }\n function parseLiteral() {\n if (test(RE_NUMBER_LITERAL)) {\n return parseNumberLiteral();\n }\n if (source[cursor] === '\"') {\n return parseStringLiteral();\n }\n throw new SyntaxError(\"Invalid expression\");\n }\n function parseNumberLiteral() {\n let [, value, fraction = \"\"] = match(RE_NUMBER_LITERAL);\n let precision = fraction.length;\n return {\n type: \"num\",\n value: parseFloat(value),\n precision,\n };\n }\n function parseStringLiteral() {\n consumeChar('\"', SyntaxError);\n let value = \"\";\n while (true) {\n value += match1(RE_STRING_RUN);\n if (source[cursor] === \"\\\\\") {\n value += parseEscapeSequence();\n continue;\n }\n if (consumeChar('\"')) {\n return { type: \"str\", value };\n }\n // We've reached an EOL of EOF.\n throw new SyntaxError(\"Unclosed string literal\");\n }\n }\n // Unescape known escape sequences.\n function parseEscapeSequence() {\n if (test(RE_STRING_ESCAPE)) {\n return match1(RE_STRING_ESCAPE);\n }\n if (test(RE_UNICODE_ESCAPE)) {\n let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);\n let codepoint = parseInt(codepoint4 || codepoint6, 16);\n return codepoint <= 0xd7ff || 0xe000 <= codepoint\n ? // It's a Unicode scalar value.\n String.fromCodePoint(codepoint)\n : // Lonely surrogates can cause trouble when the parsing result is\n // saved using UTF-8. Use U+FFFD REPLACEMENT CHARACTER instead.\n \"<22>\";\n }\n throw new SyntaxError(\"Unknown escape sequence\");\n }\n // Parse blank space. Return it if it looks like indent before a pattern\n // line. Skip it othwerwise.\n function parseIndent() {\n let start = cursor;\n consumeToken(TOKEN_BLANK);\n // Check the first non-blank character after the indent.\n switch (source[cursor]) {\n case \".\":\n case \"[\":\n case \"*\":\n case \"}\":\n case undefined: // EOF\n // A special character. End the Pattern.\n return false;\n case \"{\":\n // Placeables don't require indentation (in EBNF: block-placeable).\n // Continue the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // If the first character on the line is not one of the special characters\n // listed above, it's a regular text character. Check if there's at least\n // one space of indent before it.\n if (source[cursor - 1] === \" \") {\n // It's an indented text character (in EBNF: indented-char). Continue\n // the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // A not-indented text character is likely the identifier of the next\n // message. End the Pattern.\n return false;\n }\n // Trim blanks in text according to the given regex.\n function trim(text, re) {\n return text.replace(re, \"\");\n }\n // Normalize a blank block and extract the indent details.\n function makeIndent(blank) {\n let value = blank.replace(RE_BLANK_LINES, \"\\n\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let length = RE_INDENT.exec(blank)[1].length;\n return new Indent(value, length);\n }\n }\n}\nclass Indent {\n constructor(value, length) {\n this.value = value;\n this.length = length;\n }\n}\n","/* eslint no-magic-numbers: 0 */\nconst languageCodeRe = \"([a-z]{2,3}|\\\\*)\";\nconst scriptCodeRe = \"(?:-([a-z]{4}|\\\\*))\";\nconst regionCodeRe = \"(?:-([a-z]{2}|\\\\*))\";\nconst variantCodeRe = \"(?:-(([0-9][a-z0-9]{3}|[a-z0-9]{5,8})|\\\\*))\";\n/**\n * Regular expression splitting locale id into four pieces:\n *\n * Example: `en-Latn-US-macos`\n *\n * language: en\n * script: Latn\n * region: US\n * variant: macos\n *\n * It can also accept a range `*` character on any position.\n */\nconst localeRe = new RegExp(`^${languageCodeRe}${scriptCodeRe}?${regionCodeRe}?${variantCodeRe}?$`, \"i\");\nexport class Locale {\n /**\n * Parses a locale id using the localeRe into an array with four elements.\n *\n * If the second argument `range` is set to true, it places range `*` char\n * in place of any missing piece.\n *\n * It also allows skipping the script section of the id, so `en-US` is\n * properly parsed as `en-*-US-*`.\n */\n constructor(locale) {\n const result = localeRe.exec(locale.replace(/_/g, \"-\"));\n if (!result) {\n this.isWellFormed = false;\n return;\n }\n let [, language, script, region, variant] = result;\n if (language) {\n this.language = language.toLowerCase();\n }\n if (script) {\n this.script = script[0].toUpperCase() + script.slice(1);\n }\n if (region) {\n this.region = region.toUpperCase();\n }\n this.variant = variant;\n this.isWellFormed = true;\n }\n isEqual(other) {\n return (this.language === other.language &&\n this.script === other.script &&\n this.region === other.region &&\n this.variant === other.variant);\n }\n matches(other, thisRange = false, otherRange = false) {\n return ((this.language === other.language ||\n (thisRange && this.language === undefined) ||\n (otherRange && other.language === undefined)) &&\n (this.script === other.script ||\n (thisRange && this.script === undefined) ||\n (otherRange && other.script === undefined)) &&\n (this.region === other.region ||\n (thisRange && this.region === undefined) ||\n (otherRange && other.region === undefined)) &&\n (this.variant === other.variant ||\n (thisRange && this.variant === undefined) ||\n (otherRange && other.variant === undefined)));\n }\n toString() {\n return [this.language, this.script, this.region, this.variant]\n .filter(part => part !== undefined)\n .join(\"-\");\n }\n clearVariants() {\n this.variant = undefined;\n }\n clearRegion() {\n this.region = undefined;\n }\n addLikelySubtags() {\n const newLocale = getLikelySubtagsMin(this.toString().toLowerCase());\n if (newLocale) {\n this.language = newLocale.language;\n this.script = newLocale.script;\n this.region = newLocale.region;\n this.variant = newLocale.variant;\n return true;\n }\n return false;\n }\n}\n/**\n * Below is a manually a list of likely subtags corresponding to Unicode\n * CLDR likelySubtags list.\n * This list is curated by the maintainers of Project Fluent and is\n * intended to be used in place of the full likelySubtags list in use cases\n * where full list cannot be (for example, due to the size).\n *\n * This version of the list is based on CLDR 30.0.3.\n */\nconst likelySubtagsMin = {\n ar: \"ar-arab-eg\",\n \"az-arab\": \"az-arab-ir\",\n \"az-ir\": \"az-arab-ir\",\n be: \"be-cyrl-by\",\n da: \"da-latn-dk\",\n el: \"el-grek-gr\",\n en: \"en-latn-us\",\n fa: \"fa-arab-ir\",\n ja: \"ja-jpan-jp\",\n ko: \"ko-kore-kr\",\n pt: \"pt-latn-br\",\n sr: \"sr-cyrl-rs\",\n \"sr-ru\": \"sr-latn-ru\",\n sv: \"sv-latn-se\",\n ta: \"ta-taml-in\",\n uk: \"uk-cyrl-ua\",\n zh: \"zh-hans-cn\",\n \"zh-hant\": \"zh-hant-tw\",\n \"zh-hk\": \"zh-hant-hk\",\n \"zh-mo\": \"zh-hant-mo\",\n \"zh-tw\": \"zh-hant-tw\",\n \"zh-gb\": \"zh-hant-gb\",\n \"zh-us\": \"zh-hant-us\",\n};\nconst regionMatchingLangs = [\n \"az\",\n \"bg\",\n \"cs\",\n \"de\",\n \"es\",\n \"fi\",\n \"fr\",\n \"hu\",\n \"it\",\n \"lt\",\n \"lv\",\n \"nl\",\n \"pl\",\n \"ro\",\n \"ru\",\n];\nfunction getLikelySubtagsMin(loc) {\n if (Object.prototype.hasOwnProperty.call(likelySubtagsMin, loc)) {\n return new Locale(likelySubtagsMin[loc]);\n }\n const locale = new Locale(loc);\n if (locale.language && regionMatchingLangs.includes(locale.language)) {\n locale.region = locale.language.toUpperCase();\n return locale;\n }\n return null;\n}\n","import { filterMatches } from \"./matches.js\";\n/**\n * Negotiates the languages between the list of requested locales against\n * a list of available locales.\n *\n * It accepts three arguments:\n *\n * requestedLocales:\n * an Array of strings with BCP47 locale IDs sorted\n * according to user preferences.\n *\n * availableLocales:\n * an Array of strings with BCP47 locale IDs of locale for which\n * resources are available. Unsorted.\n *\n * options:\n * An object with the following, optional keys:\n *\n * strategy: 'filtering' (default) | 'matching' | 'lookup'\n *\n * defaultLocale:\n * a string with BCP47 locale ID to be used\n * as a last resort locale.\n *\n *\n * It returns an Array of strings with BCP47 locale IDs sorted according to the\n * user preferences.\n *\n * The exact list will be selected differently depending on the strategy:\n *\n * 'filtering': (default)\n * In the filtering strategy, the algorithm will attempt to match\n * as many keys in the available locales in order of the requested locales.\n *\n * 'matching':\n * In the matching strategy, the algorithm will attempt to find the\n * best possible match for each element of the requestedLocales list.\n *\n * 'lookup':\n * In the lookup strategy, the algorithm will attempt to find a single\n * best available locale based on the requested locales list.\n *\n * This strategy requires defaultLocale option to be set.\n */\nexport function negotiateLanguages(requestedLocales, availableLocales, { strategy = \"filtering\", defaultLocale } = {}) {\n const supportedLocales = filterMatches(Array.from(requestedLocales !== null && requestedLocales !== void 0 ? requestedLocales : []).map(String), Array.from(availableLocales !== null && availableLocales !== void 0 ? availableLocales : []).map(String), strategy);\n if (strategy === \"lookup\") {\n if (defaultLocale === undefined) {\n throw new Error(\"defaultLocale cannot be undefined for strategy `lookup`\");\n }\n if (supportedLocales.length === 0) {\n supportedLocales.push(defaultLocale);\n }\n }\n else if (defaultLocale && !supportedLocales.includes(defaultLocale)) {\n supportedLocales.push(defaultLocale);\n }\n return supportedLocales;\n}\n","/* eslint no-magic-numbers: 0 */\nimport { Locale } from \"./locale.js\";\n/**\n * Negotiates the languages between the list of requested locales against\n * a list of available locales.\n *\n * The algorithm is based on the BCP4647 3.3.2 Extended Filtering algorithm,\n * with several modifications:\n *\n * 1) available locales are treated as ranges\n *\n * This change allows us to match a more specific request against\n * more generic available locale.\n *\n * For example, if the available locale list provides locale `en`,\n * and the requested locale is `en-US`, we treat the available locale as\n * a locale that matches all possible english requests.\n *\n * This means that we expect available locale ID to be as precize as\n * the matches they want to cover.\n *\n * For example, if there is only `sr` available, it's ok to list\n * it in available locales. But once the available locales has both,\n * Cyrl and Latn variants, the locale IDs should be `sr-Cyrl` and `sr-Latn`\n * to avoid any `sr-*` request to match against whole `sr` range.\n *\n * What it does ([requested] * [available] = [supported]):\n *\n * ['en-US'] * ['en'] = ['en']\n *\n * 2) likely subtags from LDML 4.3 Likely Subtags has been added\n *\n * The most obvious likely subtag that can be computed is a duplication\n * of the language field onto region field (`fr` => `fr-FR`).\n *\n * On top of that, likely subtags may use a list of mappings, that\n * allow the algorithm to handle non-obvious matches.\n * For example, making sure that we match `en` to `en-US` or `sr` to\n * `sr-Cyrl`, while `sr-RU` to `sr-Latn-RU`.\n *\n * This list can be taken directly from CLDR Supplemental Data.\n *\n * What it does ([requested] * [available] = [supported]):\n *\n * ['fr'] * ['fr-FR'] = ['fr-FR']\n * ['en'] * ['en-US'] = ['en-US']\n * ['sr'] * ['sr-Latn', 'sr-Cyrl'] = ['sr-Cyrl']\n *\n * 3) variant/region range check has been added\n *\n * Lastly, the last form of check is against the requested locale ID\n * but with the variant/region field replaced with a `*` range.\n *\n * The rationale here laid out in LDML 4.4 Language Matching:\n * \"(...) normally the fall-off between the user's languages is\n * substantially greated than regional variants.\"\n *\n * In other words, if we can't match for the given region, maybe\n * we can match for the same language/script but other region, and\n * it will in most cases be preferred over falling back on the next\n * language.\n *\n * What it does ([requested] * [available] = [supported]):\n *\n * ['en-AU'] * ['en-US'] = ['en-US']\n * ['sr-RU'] * ['sr-Latn-RO'] = ['sr-Latn-RO'] // sr-RU -> sr-Latn-RU\n *\n * It works similarly to getParentLocales algo, except that we stop\n * after matching against variant/region ranges and don't try to match\n * ignoring script ranges. That means that `sr-Cyrl` will never match\n * against `sr-Latn`.\n */\nexport function filterMatches(requestedLocales, availableLocales, strategy) {\n const supportedLocales = new Set();\n const availableLocalesMap = new Map();\n for (let locale of availableLocales) {\n let newLocale = new Locale(locale);\n if (newLocale.isWellFormed) {\n availableLocalesMap.set(locale, new Locale(locale));\n }\n }\n outer: for (const reqLocStr of requestedLocales) {\n const reqLocStrLC = reqLocStr.toLowerCase();\n const requestedLocale = new Locale(reqLocStrLC);\n if (requestedLocale.language === undefined) {\n continue;\n }\n // 1) Attempt to make an exact match\n // Example: `en-US` === `en-US`\n for (const key of availableLocalesMap.keys()) {\n if (reqLocStrLC === key.toLowerCase()) {\n supportedLocales.add(key);\n availableLocalesMap.delete(key);\n if (strategy === \"lookup\") {\n return Array.from(supportedLocales);\n }\n else if (strategy === \"filtering\") {\n continue;\n }\n else {\n continue outer;\n }\n }\n }\n // 2) Attempt to match against the available range\n // This turns `en` into `en-*-*-*` and `en-US` into `en-*-US-*`\n // Example: ['en-US'] * ['en'] = ['en']\n for (const [key, availableLocale] of availableLocalesMap.entries()) {\n if (availableLocale.matches(requestedLocale, true, false)) {\n supportedLocales.add(key);\n availableLocalesMap.delete(key);\n if (strategy === \"lookup\") {\n return Array.from(supportedLocales);\n }\n else if (strategy === \"filtering\") {\n continue;\n }\n else {\n continue outer;\n }\n }\n }\n // 3) Attempt to retrieve a maximal version of the requested locale ID\n // If data is available, it'll expand `en` into `en-Latn-US` and\n // `zh` into `zh-Hans-CN`.\n // Example: ['en'] * ['en-GB', 'en-US'] = ['en-US']\n if (requestedLocale.addLikelySubtags()) {\n for (const [key, availableLocale] of availableLocalesMap.entries()) {\n if (availableLocale.matches(requestedLocale, true, false)) {\n supportedLocales.add(key);\n availableLocalesMap.delete(key);\n if (strategy === \"lookup\") {\n return Array.from(supportedLocales);\n }\n else if (strategy === \"filtering\") {\n continue;\n }\n else {\n continue outer;\n }\n }\n }\n }\n // 4) Attempt to look up for a different variant for the same locale ID\n // Example: ['en-US-mac'] * ['en-US-win'] = ['en-US-win']\n requestedLocale.clearVariants();\n for (const [key, availableLocale] of availableLocalesMap.entries()) {\n if (availableLocale.matches(requestedLocale, true, true)) {\n supportedLocales.add(key);\n availableLocalesMap.delete(key);\n if (strategy === \"lookup\") {\n return Array.from(supportedLocales);\n }\n else if (strategy === \"filtering\") {\n continue;\n }\n else {\n continue outer;\n }\n }\n }\n // 5) Attempt to match against the likely subtag without region\n // In the example below, addLikelySubtags will turn\n // `zh-Hant` into `zh-Hant-TW` giving `zh-TW` priority match\n // over `zh-CN`.\n //\n // Example: ['zh-Hant-HK'] * ['zh-TW', 'zh-CN'] = ['zh-TW']\n requestedLocale.clearRegion();\n if (requestedLocale.addLikelySubtags()) {\n for (const [key, availableLocale] of availableLocalesMap.entries()) {\n if (availableLocale.matches(requestedLocale, true, false)) {\n supportedLocales.add(key);\n availableLocalesMap.delete(key);\n if (strategy === \"lookup\") {\n return Array.from(supportedLocales);\n }\n else if (strategy === \"filtering\") {\n continue;\n }\n else {\n continue outer;\n }\n }\n }\n }\n // 6) Attempt to look up for a different region for the same locale ID\n // Example: ['en-US'] * ['en-AU'] = ['en-AU']\n requestedLocale.clearRegion();\n for (const [key, availableLocale] of availableLocalesMap.entries()) {\n if (availableLocale.matches(requestedLocale, true, true)) {\n supportedLocales.add(key);\n availableLocalesMap.delete(key);\n if (strategy === \"lookup\") {\n return Array.from(supportedLocales);\n }\n else if (strategy === \"filtering\") {\n continue;\n }\n else {\n continue outer;\n }\n }\n }\n }\n return Array.from(supportedLocales);\n}\n","import { FluentBundle, FluentResource } from \"@fluent/bundle\";\nimport { negotiateLanguages } from \"@fluent/langneg\";\n// This is automatically populated by `tools/bundle_texts.ts` via a postbuild script\nconst BUNDLED_TEXTS = {\n \"ar-SA\": {\n \"context_menu.ftl\": \"context-menu-download-swf = حمِّل .swf\\ncontext-menu-copy-debug-info = إنسخ معلومات التصحيح\\ncontext-menu-open-save-manager = إفتح مدير الحفظ\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] عن ملحق Ruffle ({ $version })\\n *[other] عن Ruffle ({ $version })\\n }\\ncontext-menu-hide = أخفِ هذه القائمة\\ncontext-menu-exit-fullscreen = إخرج من وضعية الشاشة الكاملة\\ncontext-menu-enter-fullscreen = إدخل وضعية الشاشة الكاملة\\ncontext-menu-volume-controls = التحكم بالصوت\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n لم يكن رفل قادرًا على تشغيل الفلاش المضمنة في هذه الصفحة.\\n يمكنك محاولة فتح الملف في علامة تبويب منفصلة لتجاوز هذه المشكلة.\\npanic-title = لقد حدث خطأ ما :(\\nmore-info = معلومات أكثر\\nrun-anyway = شغِّل على أي حال\\ncontinue = إستمر\\nreport-bug = بلِّغ عن خلل\\nupdate-ruffle = تحديث رفل\\nruffle-demo = العرض التجريبي\\nruffle-desktop = برنامج سطح المكتب\\nruffle-wiki = إعرض ويكي رفل\\nenable-hardware-acceleration = يبدو أن تسريع الجهاز معطل. على الرغم من أن رفل قد يعمل، إلا أنه قد يكون بطيئًا جدًا. يمكنك معرفة كيفية تمكين تسريع الأجهزة بالنقر على الرابط أدناه:\\nenable-hardware-acceleration-link = الأسئلة الشائعة - تسريع أجهزة كروم\\nview-error-details = إعرض تفاصيل الخطأ\\nopen-in-new-tab = إفتح في علامة تبويب جديدة\\nclick-to-unmute = إنقر لإلغاء الكتم\\nclipboard-message-title = النسخ واللصق في رفل\\nclipboard-message-description =\\n {$variant ->\\n *[unsupported] متصفحك لا يدعم الوصول للحافظة الكاملة،\\n [access-denied] تم رفض الوصول للحافظة،\\n } لكن يمكنك إستخدام هذه الاختصارات دائمًا:\\nclipboard-message-copy = { \\\" \\\" } للنسخ\\nclipboard-message-cut = { \\\" \\\" } للقص\\nclipboard-message-paste = { \\\" \\\" } للصق\\nerror-file-protocol =\\n يبدو أنك تقوم بتشغيل رفل على بروتوكول \\\"file:\\\".\\n هذا لن يعمل لأن المتصفحات تمنع العديد من الميزات من العمل لأسباب أمنية.\\n بدلاً من ذلك، ندعوك إلى إعداد خادم محلي أو إستخدام عرض الويب أو تطبيق سطح المكتب.\\nerror-javascript-config =\\n تعرض رفل إلى مشكلة كبيرة بسبب الإعدادات الخاطئة للجافا سكريبت.\\n إذا كنت مسؤول الخادم، نحن ندعوك إلى التحقق من تفاصيل الخطأ لمعرفة سبب المشكلة.\\n يمكنك أيضًا الرجوع إلى ويكي رفل للحصول على المساعدة.\\nerror-wasm-not-found =\\n فشل رفل في تحميل مكون الملف \\\".wasm\\\" المطلوب.\\n إذا كنت مسؤول الخادم، يرجى التأكد من أن الملف قد تم تحميله بشكل صحيح.\\n إذا استمرت المشكلة، قد تحتاج إلى إستخدام إعدادات \\\"publicPath\\\": الرجاء مراجعة ويكي رفل للحصول على المساعدة.\\nerror-wasm-mime-type =\\n واجه رفل مشكلة كبيرة أثناء محاولة التهيئة.\\n خادم الويب هذا لا يخدم ملفات \\\". wasm\\\" مع نوع MIME الصحيح.\\n إذا كنت مسؤول الخادم، يرجى مراجعة ويكي رفل للحصول على المساعدة.\\nerror-invalid-swf =\\n لا يمكن لرفل تحليل الملف المطلوب.\\n السبب الأكثر إحتمالاً هو أن الملف المطلوب ليس صالحًا.\\nerror-swf-fetch =\\n فشل رفل في تحميل ملف فلاش SWF.\\n السبب الأكثر إحتمالاً هو أن الملف لم يعد موجودًا، لذلك لا يوجد شيء ليحمله رفل.\\n حاول الإتصال بمسؤول الموقع للحصول على المساعدة.\\nerror-swf-cors =\\n فشل رفل في تحميل ملف فلاش SWF.\\n من المحتمل أن إحضار الملف قد حُظِر بواسطة سياسة CORS.\\n إذا كنت مسؤول الخادم، يرجى مراجعة رفل ويكي للحصول على المساعدة.\\nerror-wasm-cors =\\n فشل رفل في تحميل مكون ملف \\\".wasm\\\" المطلوب.\\n من المحتمل أن إحضار الملف قد حُظِر بواسطة سياسة CORS.\\n إذا كنت مسؤول الخادم، يرجى مراجعة رفل ويكي للحصول على المساعدة.\\nerror-wasm-invalid =\\n واجه رفل مشكلة كبيرة أثناء محاولة التهيئة.\\n يبدو أن هذه الصفحة تحتوي على ملفات مفقودة أو غير صالحة لتشغيل رفل.\\n إذا كنت مسؤول الخادم، يرجى مراجعة ويكي رفل للحصول على المساعدة.\\nerror-wasm-download =\\n واجه رفل مشكلة كبيرة أثناء محاولتها التهيئة.\\n هذا يمكن أن يحل نفسه في كثير من الأحيان، لذلك يمكنك محاولة إعادة تحميل الصفحة.\\n وإلا يرجى الاتصال بمدير الموقع.\\nerror-wasm-disabled-on-edge =\\n فشل Ruffle في تحميل مكون الملف \\\".wasm\\\" المطلوب.\\n لإصلاح هذه المشكلة، حاول فتح إعدادات متصفحك، ثم إنقر فوق \\\"الخصوصية، البحث، الخدمات\\\"، والتمرير لأسفل، وإيقاف \\\"تعزيز أمانك على الويب\\\".\\n هذا سيسمح لمتصفحك بتحميل الملفات \\\".wasm\\\" المطلوبة.\\n إذا إستمرت المشكلة، قد تحتاج إلى إستخدام متصفح أخر.\\nerror-javascript-conflict =\\n واجه رفل مشكلة كبيرة أثناء محاولة التهيئة.\\n يبدو أن هذه الصفحة تستخدم كود جافا سكريبت الذي يتعارض مع رفل.\\n إذا كنت مسؤول الخادم، فإننا ندعوك إلى محاولة تحميل الملف على صفحة فارغة.\\nerror-javascript-conflict-outdated = يمكنك أيضًا محاولة تحميل نسخة أحدث من رفل التي قد تحل المشكلة (النسخة الحالية قديمة: { $buildDate }).\\nerror-csp-conflict =\\n واجه Ruffle مشكلة كبيرة أثناء محاولة التهيئة.\\n لا تسمح سياسة أمان المحتوى لخادم الويب هذا بتشغيل مكون \\\".wasm\\\" المطلوب.\\n إذا كنت مسؤول الخادم، يرجى الرجوع إلى ويكي Ruffle للحصول على المساعدة.\\nerror-unknown =\\n واجه رفل مشكلة كبيرة أثناء محاولة عرض محتوى الفلاش هذا.\\n { $outdated ->\\n [true] إذا كنت مسؤول الخادم، يرجى محاولة تحميل إصدار أحدث من Ruffle (النسخة الحالية قديمة: { $buildDate }).\\n *[false] ليس من المفترض أن يحدث هذا، لذلك نحن نقدر حقًا إذا بلغت عن الخطأ!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = هل أنت متأكد أنك تريد حذف ملف الحفظ هذا؟\\nsave-reload-prompt =\\n الطريقة الوحيدة لـ { $action ->\\n [delete] حذف\\n *[replace] إستبدال\\n } ملف الحفظ هذا دون تعارض محتمل هي إعادة تحميل هذه الصفحة. هل ترغب في المتابعة على أي حال؟\\nsave-download = حمّل\\nsave-replace = إستبدل\\nsave-delete = إحذف\\nsave-backup-all = حمّل جميع ملفات الحفظ\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = إكتم\\nvolume-controls-unmute = ألغِ الكتم\\n\"\n },\n \"ca-ES\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Baixa el fitxer .swf\\ncontext-menu-copy-debug-info = Copia la informació de depuració\\ncontext-menu-open-save-manager = Obre el gestor d'emmagatzematge\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Quant a l'extensió de Ruffle ({ $version })\\n *[other] Quant a Ruffle ({ $version })\\n }\\ncontext-menu-hide = Amaga aquest menú\\ncontext-menu-exit-fullscreen = Surt de la pantalla completa\\ncontext-menu-enter-fullscreen = Pantalla completa\\ncontext-menu-volume-controls = Controls de volum\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle no ha pogut executar el contingut Flash incrustat en aquesta pàgina.\\n Podeu provar d'obrir el fitxer en una pestanya a part per evitar aquest problema.\\npanic-title = Alguna cosa ha fallat :(\\nmore-info = Més informació\\nrun-anyway = Reprodueix igualment\\ncontinue = Continua\\nreport-bug = Informa d'un error\\nupdate-ruffle = Actualitza Ruffle\\nruffle-demo = Demostració web\\nruffle-desktop = Aplicació d'escriptori\\nruffle-wiki = Obre la wiki de Ruffle\\nview-error-details = Mostra detalls de l'error\\nopen-in-new-tab = Obre en una pestanya nova\\nclick-to-unmute = Feu clic per activar el so\\nerror-file-protocol =\\n Sembla que esteu executant Ruffle al protocol \\\"file:\\\".\\n Això no funcionarà perquè els navegadors bloquegen moltes característiques per raons de seguretat. En comptes d'això, us suggerim que configureu un servidor local o bé utilitzeu la demostració web o l'aplicació d'escriptori.\\nerror-javascript-config =\\n Ruffle ha topat amb un problema greu a causa d'una configuració JavaScript errònia.\\n Si sou l'administrador del servidor, us suggerim que comproveu els detalls de l'error per determinar el paràmetre culpable.\\n També podeu consultar la wiki del Ruffle per obtenir ajuda.\\nerror-wasm-not-found =\\n Ruffle no ha pogut carregar el component de fitxer \\\".wasm\\\" necessari.\\n Si sou l'administrador del servidor, si us plau, comproveu que el fitxer ha estat carregat correctament.\\n Si el problema continua, és possible que hàgiu d'utilitzar el parámetre \\\"publicPath\\\": us preguem que consulteu la wiki de Ruffle per obtenir ajuda.\\nerror-wasm-mime-type =\\n Ruffle ha topat amb un problema greu mentre provava d'inicialitzar-se.\\n Aquest servidor no està servint els fitxers \\\".wasm\\\" amb el tipus MIME adequat.\\n Si sou l'administrador del servidor, us preguem que consulteu la wiki de Ruffle per obtenir ajuda.\\nerror-invalid-swf =\\n Ruffle no ha pogut llegir el fitxer sol·licitat.\\n La raó més probable és que no sigui un fitxer SWF vàlid.\\nerror-swf-fetch =\\n Ruffle no ha pogut carregar el fitxer SWF Flash.\\n La raó més probable és que el fitxer ja no existeixi, així que no hi ha res que el Ruffle pugui carregar.\\n Proveu de contactar a l'administrador del lloc per obtenir ajuda.\\nerror-swf-cors =\\n Ruffle no ha pogut carregar el fitxer SWF Flash.\\n És probable que l'accés a la càrrega hagi estat denegat per una política CORS.\\n Si sou l'administrador del servidor, us preguem que consulteu la wiki del Ruffle per obtenir ajuda.\\nerror-wasm-cors =\\n Ruffle no ha pogut carregar el component de fitxer \\\".wasm\\\" necessari.\\n És probable que l'accés a la càrrega hagi estat denegat per una política CORS.\\n Si sou l'administrador del servidor, us preguem que consulteu la wiki del Ruffle per obtenir ajuda.\\nerror-wasm-invalid =\\n Ruffle ha topat amb un problema greu mentre provava d'inicialitzar-se.\\n Sembla que a aquest lloc li manquen fitxers o aquests no són vàlids per a l'execució de Ruffle.\\n Si sou l'administrador del servidor, us preguem que consulteu la wiki de Ruffle per obtenir ajuda.\\nerror-wasm-download =\\n Ruffle ha topat amb un problema greu mentre provava d'inicialitzar-se.\\n Això sovint això pot resoldre's sol, així que podeu provar de recarregar la pàgina.\\n En cas contrari, us preguem que contacteu l'administrador del lloc.\\nerror-wasm-disabled-on-edge =\\n Ruffle no ha pogut carregar el component de fitxer \\\".wasm\\\" necessari.\\n Per a arreglar-ho, proveu d'obrir els paràmetres del navegador, feu clic sobre \\\"Privadesa, cerca i serveis\\\", i desactiveu \\\"Prevenció de seguiment\\\".\\n Això permetrà que el vostre navegador carregui els fitxers \\\".wasm\\\" necessaris.\\n Si el problema continua, possiblement haureu d'utilitzar un altre navegador.\\nerror-javascript-conflict =\\n Ruffle ha topat amb un problema greu mentre provava d'inicialitzar-se.\\n Sembla que aquest lloc fa servir codi JavaScript que entra en conflicte amb Ruffle.\\n Si sou l'administrador del servidor, us preguem que consulteu la wiki de Ruffle per obtenir ajuda.\\nerror-javascript-conflict-outdated = També podeu provar de carregar una versió més recent de Ruffle que podria resoldre el problema (la compilació actual està desactualitzada: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle ha topat amb un problema greu mentre provava d'inicialitzar-se.\\n La política de seguretat del contingut (CSP) no permet l'execució del component \\\".wasm\\\" necessari.\\n Si sou l'administrador del servidor, us preguem que consulteu la wiki de Ruffle per obtenir ajuda.\\nerror-unknown =\\n Ruffle ha topat amb un problema greu mentre provava de mostrar aquest contingut Flash.\\n { $outdated ->\\n [true] Si sou l'administrador del servidor, us preguem que proveu de carregar una versió més recent de Ruffle (la compilació actual està desactualitzada: { $buildDate }).\\n *[false] Això no hauria d'haver passat, així que us agrairíem molt que n'informéssiu l'error!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Segur que vols esborrar aquest fitxer desat?\\nsave-reload-prompt =\\n L'única forma d{ $action ->\\n [delete] 'eliminar\\n *[replace] e substituir\\n } aquest fitxer desat sense crear un potencial conflicte és recarregant el contingut. Voleu continuar igualment?\\nsave-download = Baixa\\nsave-replace = Substitueix\\nsave-delete = Elimina\\nsave-backup-all = Baixa tots els fitxers desats\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Silenci\\n\"\n },\n \"cs-CZ\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Stáhnout .swf\\ncontext-menu-copy-debug-info = Zkopírovat debug info\\ncontext-menu-open-save-manager = Otevřít správce uložení\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] O Ruffle rozšíření ({ $version })\\n *[other] O Ruffle ({ $version })\\n }\\ncontext-menu-hide = Skrýt menu\\ncontext-menu-exit-fullscreen = Ukončit režim celé obrazovky\\ncontext-menu-enter-fullscreen = Přejít do režimu celé obrazovky\\ncontext-menu-volume-controls = Ovládání hlasitosti\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle nemohl spustit Flash vložený na této stránce.\\n Můžete se pokusit otevřít soubor na samostatné kartě, abyste se vyhnuli tomuto problému.\\npanic-title = Něco se pokazilo :(\\nmore-info = Další informace\\nrun-anyway = Přesto spustit\\ncontinue = Pokračovat\\nreport-bug = Nahlásit chybu\\nupdate-ruffle = Aktualizovat Ruffle\\nruffle-demo = Web Demo\\nruffle-desktop = Desktopová aplikace\\nruffle-wiki = Zobrazit Ruffle Wiki\\nenable-hardware-acceleration = Zdá se, že hardwarová akcelerace je vypnutá. I když Ruffle funguje správně, může být nepřiměřeně pomalý. Jak povolit hardwarovou akceleraci zjistíte na tomto odkazu:\\nenable-hardware-acceleration-link = Časté dotazy - Hardwarová akcelerace Chrome\\nview-error-details = Zobrazit podrobnosti o chybě\\nopen-in-new-tab = Otevřít na nové kartě\\nclick-to-unmute = Kliknutím zrušíte ztlumení\\nclipboard-message-title = Kopírování a vkládání v Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Váš prohlížeč nepodporuje plný přístup ke schránce,\\n [access-denied] Přístup ke schránce byl odepřen,\\n } ale místo toho můžete vždy použít tyto zkratky:\\nclipboard-message-copy = { \\\" \\\" } pro kopírování\\nclipboard-message-cut = { \\\" \\\" } pro vystřihování\\nclipboard-message-paste = { \\\" \\\" } pro vkládání\\nerror-file-protocol =\\n Zdá se, že používáte Ruffle na protokolu \\\"file:\\\".\\n To není možné, protože prohlížeče blokují fungování mnoha funkcí z bezpečnostních důvodů.\\n Namísto toho vám doporučujeme nastavit lokální server nebo použít web demo či desktopovou aplikaci.\\nerror-javascript-config =\\n Ruffle narazil na problém v důsledku nesprávné konfigurace JavaScriptu.\\n Pokud jste správcem serveru, doporučujeme vám zkontrolovat podrobnosti o chybě, abyste zjistili, který parametr je vadný.\\n Pomoc můžete získat také na wiki Ruffle.\\nerror-wasm-not-found =\\n Ruffle se nepodařilo načíst požadovanou komponentu souboru „.wasm“.\\n Pokud jste správcem serveru, zkontrolujte, zda byl soubor správně nahrán.\\n Pokud problém přetrvává, možná budete muset použít nastavení „publicPath“: pomoc naleznete na wiki Ruffle.\\nerror-wasm-mime-type =\\n Ruffle narazil na problém při pokusu o inicializaci.\\n Tento webový server neposkytuje soubory „.wasm“ se správným typem MIME.\\n Pokud jste správcem serveru, nápovědu najdete na Ruffle wiki.\\nerror-invalid-swf =\\n Ruffle nemůže zpracovat požadovaný soubor.\\n Nejpravděpodobnějším důvodem je, že požadovaný soubor není platným souborem SWF.\\nerror-swf-fetch =\\n Ruffle se nepodařilo načíst SWF soubor Flash.\\n Nejpravděpodobnějším důvodem je, že soubor již neexistuje, takže Ruffle nemá co načíst.\\n Zkuste požádat o pomoc správce webu.\\nerror-swf-cors =\\n Ruffle se nepodařilo načíst SWF soubor Flash.\\n Přístup k načítání byl pravděpodobně zablokován politikou CORS.\\n Pokud jste správcem serveru, nápovědu najdete na Ruffle wiki.\\nerror-wasm-cors =\\n Ruffle se nepodařilo načíst požadovanou komponentu souboru „.wasm“.\\n Přístup k načítání byl pravděpodobně zablokován politikou CORS.\\n Pokud jste správcem serveru, nápovědu najdete na Ruffle wiki.\\nerror-wasm-invalid =\\n Ruffle narazil na problém při pokusu o inicializaci.\\n Zdá se, že na této stránce chybí nebo jsou neplatné soubory ke spuštění Ruffle.\\n Pokud jste správcem serveru, nápovědu najdete na Ruffle wiki.\\nerror-wasm-download =\\n Ruffle narazil na problém při pokusu o inicializaci.\\n Problém se může vyřešit i sám, takže můžete zkusit stránku načíst znovu.\\n V opačném případě kontaktujte administrátora stránky.\\nerror-wasm-disabled-on-edge =\\n Ruffle se nepodařilo načíst požadovanou komponentu souboru „.wasm“.\\n Chcete-li tento problém vyřešit, zkuste otevřít nastavení prohlížeče, klikněte na položku „Ochrana osobních údajů, vyhledávání a služby“, přejděte dolů a vypněte možnost „Zvyšte svou bezpečnost na webu“.\\n Vašemu prohlížeči to umožní načíst požadované soubory „.wasm“.\\n Pokud problém přetrvává, budete možná muset použít jiný prohlížeč.\\nerror-javascript-conflict =\\n Ruffle narazil na problém při pokusu o inicializaci.\\n Zdá se, že tato stránka používá kód JavaScript, který je v konfliktu s Ruffle.\\n Pokud jste správcem serveru, doporučujeme vám zkusit načíst soubor na prázdnou stránku.\\nerror-javascript-conflict-outdated = Můžete se také pokusit nahrát novější verzi Ruffle, která může daný problém vyřešit (aktuální build je zastaralý: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle narazil na problém při pokusu o inicializaci.\\n Zásady zabezpečení obsahu tohoto webového serveru nepovolují spuštění požadované komponenty „.wasm“.\\n Pokud jste správcem serveru, nápovědu najdete na Ruffle wiki.\\nerror-unknown =\\n Ruffle narazil na problém při pokusu zobrazit tento Flash obsah.\\n { $outdated ->\\n [true] Pokud jste správcem serveru, zkuste nahrát novější verzi Ruffle (aktuální build je zastaralý: { $buildDate }).\\n *[false] Toto by se nemělo stát, takže bychom opravdu ocenili, kdybyste mohli nahlásit chybu!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Opravdu chcete odstranit tento soubor s uloženými pozicemi?\\nsave-reload-prompt =\\n Jediný způsob, jak { $action ->\\n [delete] vymazat\\n *[replace] nahradit\\n } tento soubor s uloženými pozicemi bez potenciálního konfliktu je opětovné načtení tohoto obsahu. Chcete přesto pokračovat?\\nsave-download = Stáhnout\\nsave-replace = Nahradit\\nsave-delete = Vymazat\\nsave-backup-all = Stáhnout všechny soubory s uloženými pozicemi\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Ztlumit\\nvolume-controls-unmute = Zrušit ztlumení\\n\"\n },\n \"de-DE\": {\n \"context_menu.ftl\": \"context-menu-download-swf = .swf herunterladen\\ncontext-menu-copy-debug-info = Debug-Info kopieren\\ncontext-menu-open-save-manager = Dateimanager öffnen\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Über Ruffle Erweiterung ({ $version })\\n *[other] Über Ruffle ({ $version })\\n }\\ncontext-menu-hide = Menü ausblenden\\ncontext-menu-exit-fullscreen = Vollbild verlassen\\ncontext-menu-enter-fullscreen = Vollbildmodus aktivieren\\ncontext-menu-volume-controls = Lautstärke einstellen\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle konnte den Flash in dieser Seite nicht ausführen.\\n Du kannst versuchen, die Datei in einem separaten Tab zu öffnen, um dieses Problem zu umgehen.\\npanic-title = Etwas ist schief gelaufen\\nmore-info = Weitere Informationen\\nrun-anyway = Trotzdem ausführen\\ncontinue = Fortfahren\\nreport-bug = Fehler melden\\nupdate-ruffle = Ruffle aktuallisieren\\nruffle-demo = Web-Demo\\nruffle-desktop = Desktop-Anwendung\\nruffle-wiki = Ruffle-Wiki anzeigen\\nenable-hardware-acceleration-link = FAQ - Chrome Hardwarebeschleunigung\\nview-error-details = Fehlerdetails anzeigen\\nopen-in-new-tab = In einem neuen Tab öffnen\\nclick-to-unmute = Klicke zum Entmuten\\nclipboard-message-title = Kopieren und Einfügen in Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Dein Browser unterstützt keinen vollständigen Zugriff auf die Zwischenablage,\\n [access-denied] Zugriff auf die Zwischenablage wurde verweigert,\\n } aber du kannst stattdessen auch diese Tastenkombinationen verwenden:\\nclipboard-message-copy = { \\\" \\\" } zum Kopieren\\nclipboard-message-cut = { \\\" \\\" } zum Ausschneiden\\nclipboard-message-paste = { \\\" \\\" } zum Einfügen\\nerror-file-protocol =\\n Es scheint, dass Sie Ruffle auf dem \\\"file:\\\"-Protokoll ausführen.\\n Jedoch werden aus Sicherheitsgründen viele Funktionen vom Browser blockiert, weswegen die Datei nicht geladen werden kann.\\n Setzen Sie stattdessen einen lokalen Server auf, verwenden Sie die Webdemo oder die Desktop-Anwendung.\\nerror-javascript-config =\\n Ruffle ist aufgrund einer falschen JavaScript-Konfiguration auf ein Problem gestoßen.\\n Wenn du der Server-Administrator bist, laden wir dich ein, die Fehlerdetails zu überprüfen, um herauszufinden, welcher Parameter fehlerhaft ist.\\n Sie können auch das Ruffle-Wiki für Hilfe konsultieren.\\nerror-wasm-not-found =\\n Ruffle konnte die erforderliche \\\".wasm\\\"-Datei-Komponente nicht laden.\\n Wenn Sie der Server-Administrator sind, stellen Sie bitte sicher, dass die Datei korrekt hochgeladen wurde.\\n Wenn das Problem weiterhin besteht, müssen Sie unter Umständen die \\\"publicPath\\\"-Einstellung verwenden: Bitte konsultieren Sie das Ruffle-Wiki für Hilfe.\\nerror-wasm-mime-type =\\n Ruffle ist auf ein Fehler beim Initialisieren gestoßen.\\n Dieser Webserver dient nicht \\\". asm\\\"-Dateien mit dem korrekten MIME-Typ.\\n Wenn Sie der Server-Administrator sind, konsultieren Sie bitte das Ruffle-Wiki für Hilfe.\\nerror-invalid-swf =\\n Ruffle konnte die angegebene Datei nicht lesen.\\n Am wahrscheinlichsten ist die angegebene Datei keine gültige SWF.\\nerror-swf-fetch =\\n Ruffle konnte die Flash-SWF-Datei nicht laden.\\n Der wahrscheinlichste Grund ist, dass die Datei nicht mehr existiert, so dass Ruffle nicht geladen werden kann.\\n Kontaktieren Sie den Website-Administrator für Hilfe.\\nerror-swf-cors =\\n Ruffle konnte die Flash-SWF-Datei nicht laden.\\n Der Zugriff auf den Abruf wurde wahrscheinlich durch die CORS-Richtlinie blockiert.\\n Wenn Sie der Server-Administrator sind, konsultieren Sie bitte das Ruffle-Wiki für Hilfe.\\nerror-wasm-cors =\\n Ruffle konnte die Flash-SWF-Datei nicht laden.\\n Der Zugriff auf den Abruf wurde wahrscheinlich durch die CORS-Richtlinie blockiert.\\n Wenn Sie der Server-Administrator sind, konsultieren Sie bitte das Ruffle-Wiki für Hilfe.\\nerror-wasm-invalid =\\n Ruffle ist auf ein Fehler beim Initialisieren gestoßen.\\n Dieser Webserver dient nicht \\\". asm\\\"-Dateien mit dem korrekten MIME-Typ.\\n Wenn Sie der Server-Administrator sind, konsultieren Sie bitte das Ruffle-Wiki für Hilfe.\\nerror-wasm-download =\\n Ruffle ist auf ein Fehler beim Initialisieren gestoßen.\\n Dies kann sich oft selbst beheben, so dass Sie versuchen können, die Seite neu zu laden.\\n Andernfalls kontaktieren Sie bitte den Website-Administrator.\\nerror-wasm-disabled-on-edge =\\n Ruffle konnte die erforderliche \\\".wasm\\\"-Datei-Komponente nicht laden.\\n Um dies zu beheben, versuche die Einstellungen deines Browsers zu öffnen, klicke auf \\\"Privatsphäre, Suche und Dienste\\\", scrollen nach unten und schalte \\\"Verbessere deine Sicherheit im Web\\\" aus.\\n Dies erlaubt Ihrem Browser die erforderlichen \\\".wasm\\\"-Dateien zu laden.\\n Wenn das Problem weiterhin besteht, müssen Sie möglicherweise einen anderen Browser verwenden.\\nerror-javascript-conflict =\\n Ruffle ist auf ein Fehler beim Initialisieren gestoßen.\\n Es scheint, als ob diese Seite JavaScript-Code verwendet, der mit Ruffle kollidiert.\\n Wenn Sie der Server-Administrator sind, laden wir Sie ein, die Datei auf einer leeren Seite zu laden.\\nerror-javascript-conflict-outdated = Du kannst auch versuchen, eine neuere Version von Ruffle hochzuladen, die das Problem umgehen könnte (aktuelle Version ist veraltet: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle ist auf ein Fehler beim Initialisieren gestoßen.\\n Dieser Webserver dient nicht \\\". asm\\\"-Dateien mit dem korrekten MIME-Typ.\\n Wenn Sie der Server-Administrator sind, konsultieren Sie bitte das Ruffle-Wiki für Hilfe.\\nerror-unknown =\\n Bei dem Versuch, diesen Flash-Inhalt anzuzeigen, ist Ruffle auf ein großes Problem gestoßen.\\n { $outdated ->\\n [true] Wenn Sie der Server-Administrator sind, Bitte versuchen Sie, eine neuere Version von Ruffle hochzuladen (aktuelle Version ist veraltet: { $buildDate }).\\n *[false] Dies soll nicht passieren, deshalb würden wir uns sehr darüber freuen, wenn Sie einen Fehler melden könnten!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Sind Sie sicher, dass Sie diese Speicherdatei löschen möchten?\\nsave-reload-prompt =\\n Der einzige Weg zu { $action ->\\n [delete] löschen\\n *[replace] ersetzen\\n } diese Speicherdatei ohne möglichen Konflikt ist das erneute Laden dieses Inhalts. Möchten Sie trotzdem fortfahren?\\nsave-download = Herunterladen\\nsave-replace = Ersetzen\\nsave-delete = Löschen\\nsave-backup-all = Alle gespeicherten Dateien herunterladen\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Stummschalten\\nvolume-controls-unmute = Stummschaltung aufheben\\n\"\n },\n \"en-US\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Download .swf\\ncontext-menu-copy-debug-info = Copy debug info\\ncontext-menu-open-save-manager = Open Save Manager\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] About Ruffle Extension ({$version})\\n *[other] About Ruffle ({$version})\\n }\\ncontext-menu-hide = Hide this menu\\ncontext-menu-exit-fullscreen = Exit fullscreen\\ncontext-menu-enter-fullscreen = Enter fullscreen\\ncontext-menu-volume-controls = Volume controls\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle wasn't able to run the Flash embedded in this page.\\n You can try to open the file in a separate tab, to sidestep this issue.\\npanic-title = Something went wrong :(\\nmore-info = More info\\nrun-anyway = Run anyway\\ncontinue = Continue\\nreport-bug = Report Bug\\nupdate-ruffle = Update Ruffle\\nruffle-demo = Web Demo\\nruffle-desktop = Desktop Application\\nruffle-wiki = View Ruffle Wiki\\nenable-hardware-acceleration = It looks like hardware acceleration is disabled. While Ruffle may work, it could be very slow. You can find out how to enable hardware acceleration by following the link below:\\nenable-hardware-acceleration-link = FAQ - Chrome Hardware Acceleration\\nview-error-details = View Error Details\\nopen-in-new-tab = Open in a new tab\\nclick-to-unmute = Click to unmute\\nclipboard-message-title = Copying and pasting in Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Your browser does not support full clipboard access,\\n [access-denied] Access to the clipboard has been denied,\\n } but you can always use these shortcuts instead:\\nclipboard-message-copy = { \\\" \\\" } for copy\\nclipboard-message-cut = { \\\" \\\" } for cut\\nclipboard-message-paste = { \\\" \\\" } for paste\\nerror-file-protocol =\\n It appears you are running Ruffle on the \\\"file:\\\" protocol.\\n This doesn't work as browsers block many features from working for security reasons.\\n Instead, we invite you to setup a local server or either use the web demo or the desktop application.\\nerror-javascript-config =\\n Ruffle has encountered a major issue due to an incorrect JavaScript configuration.\\n If you are the server administrator, we invite you to check the error details to find out which parameter is at fault.\\n You can also consult the Ruffle wiki for help.\\nerror-wasm-not-found =\\n Ruffle failed to load the required \\\".wasm\\\" file component.\\n If you are the server administrator, please ensure the file has correctly been uploaded.\\n If the issue persists, you may need to use the \\\"publicPath\\\" setting: please consult the Ruffle wiki for help.\\nerror-wasm-mime-type =\\n Ruffle has encountered a major issue whilst trying to initialize.\\n This web server is not serving \\\".wasm\\\" files with the correct MIME type.\\n If you are the server administrator, please consult the Ruffle wiki for help.\\nerror-invalid-swf =\\n Ruffle cannot parse the requested file.\\n The most likely reason is that the requested file is not a valid SWF.\\nerror-swf-fetch =\\n Ruffle failed to load the Flash SWF file.\\n The most likely reason is that the file no longer exists, so there is nothing for Ruffle to load.\\n Try contacting the website administrator for help.\\nerror-swf-cors =\\n Ruffle failed to load the Flash SWF file.\\n Access to fetch has likely been blocked by CORS policy.\\n If you are the server administrator, please consult the Ruffle wiki for help.\\nerror-wasm-cors =\\n Ruffle failed to load the required \\\".wasm\\\" file component.\\n Access to fetch has likely been blocked by CORS policy.\\n If you are the server administrator, please consult the Ruffle wiki for help.\\nerror-wasm-invalid =\\n Ruffle has encountered a major issue whilst trying to initialize.\\n It seems like this page has missing or invalid files for running Ruffle.\\n If you are the server administrator, please consult the Ruffle wiki for help.\\nerror-wasm-download =\\n Ruffle has encountered a major issue whilst trying to initialize.\\n This can often resolve itself, so you can try reloading the page.\\n Otherwise, please contact the website administrator.\\nerror-wasm-disabled-on-edge =\\n Ruffle failed to load the required \\\".wasm\\\" file component.\\n To fix this, try opening your browser's settings, clicking \\\"Privacy, search, and services\\\", scrolling down, and turning off \\\"Enhance your security on the web\\\".\\n This will allow your browser to load the required \\\".wasm\\\" files.\\n If the issue persists, you might have to use a different browser.\\nerror-javascript-conflict =\\n Ruffle has encountered a major issue whilst trying to initialize.\\n It seems like this page uses JavaScript code that conflicts with Ruffle.\\n If you are the server administrator, we invite you to try loading the file on a blank page.\\nerror-javascript-conflict-outdated = You can also try to upload a more recent version of Ruffle that may circumvent the issue (current build is outdated: {$buildDate}).\\nerror-csp-conflict =\\n Ruffle has encountered a major issue whilst trying to initialize.\\n This web server's Content Security Policy does not allow the required \\\".wasm\\\" component to run.\\n If you are the server administrator, please consult the Ruffle wiki for help.\\nerror-unknown =\\n Ruffle has encountered a major issue whilst trying to display this Flash content.\\n {$outdated ->\\n [true] If you are the server administrator, please try to upload a more recent version of Ruffle (current build is outdated: {$buildDate}).\\n *[false] This isn't supposed to happen, so we'd really appreciate if you could file a bug!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Are you sure you want to delete this save file?\\nsave-reload-prompt =\\n The only way to {$action ->\\n [delete] delete\\n *[replace] replace\\n } this save file without potential conflict is to reload this content. Do you wish to continue anyway?\\nsave-download = Download\\nsave-replace = Replace\\nsave-delete = Delete\\nsave-backup-all = Download all save files\",\n \"volume-controls.ftl\": \"volume-controls-mute = Mute\\nvolume-controls-unmute = Unmute\\n\"\n },\n \"es-ES\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Descargar .swf\\ncontext-menu-copy-debug-info = Copiar Información de depuración\\ncontext-menu-open-save-manager = Abrir gestor de guardado\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Sobre la extensión de Ruffle ({ $version })\\n *[other] Sobre Ruffle ({ $version })\\n }\\ncontext-menu-hide = Ocultar este menú\\ncontext-menu-exit-fullscreen = Salir de pantalla completa\\ncontext-menu-enter-fullscreen = Entrar a pantalla completa\\ncontext-menu-volume-controls = Controles de volumen\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle no pudo ejecutar el Flash incrustado en esta página.\\n Puedes intentar abrir el archivo en una pestaña aparte, para evitar este problema.\\npanic-title = Algo salió mal :(\\nmore-info = Más info\\nrun-anyway = Ejecutar de todos modos\\ncontinue = Continuar\\nreport-bug = Reportar un Error\\nupdate-ruffle = Actualizar Ruffle\\nruffle-demo = Demostración de web\\nruffle-desktop = Aplicación de Desktop\\nruffle-wiki = Ver la página wiki\\nenable-hardware-acceleration = Al parecer, la aceleración de hardware está deshabilitada. Puede que Ruffle funcione, pero este podría funcionar muy lentamente. Puedes averiguar como habilitar aceleración de hardware presionando el enlace:\\nenable-hardware-acceleration-link = Preguntas frecuentes sobre la aceleración de hardware en Chrome\\nview-error-details = Ver los detalles del error\\nopen-in-new-tab = Abrir en una pestaña nueva\\nclick-to-unmute = Haz clic para dejar de silenciar\\nclipboard-message-title = Para copiar y pegar en Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Este navegador no apoya acceso completo al portapapeles,\\n [access-denied] Se ha denegado el acceso al portapapeles,\\n } pero siempre se puede utilizar estos atajos:\\nclipboard-message-copy = Para copiar\\nclipboard-message-cut = Para cortar\\nclipboard-message-paste = Para pegar\\nerror-file-protocol =\\n Parece que está ejecutando Ruffle en el protocolo \\\"archivo:\\\".\\n Esto no funciona porque los navegadores bloquean que muchas características funcionen por razones de seguridad.\\n En su lugar, le invitamos a configurar un servidor local o bien usar la demostración web o la aplicación de desktop.\\nerror-javascript-config =\\n Ruffle ha encontrado un problema crítico debido a una configuración JavaScript incorrecta.\\n Si usted es el administrador del servidor, le invitamos a comprobar los detalles del error para averiguar qué parámetro está en falta.\\n También puedes consultar la wiki de Ruffle para obtener ayuda.\\nerror-wasm-not-found =\\n Ruffle no pudo cargar el componente de archivo \\\".wasm\\\" requerido.\\n Si usted es el administrador del servidor, asegúrese de que el archivo ha sido subido correctamente.\\n Si el problema persiste, puede que necesite usar la configuración \\\"publicPath\\\": por favor consulte la wiki de Ruffle para obtener ayuda.\\nerror-wasm-mime-type =\\n Ruffle ha encontrado un problema crítico al intentar inicializar.\\n Este servidor web no está sirviendo archivos wasm\\\" con el tipo MIME correcto.\\n Si usted es el administrador del servidor, consulte la wiki de Ruffle para obtener ayuda.\\nerror-invalid-swf = Ruffle no puede analizar el archivo solicitado. La razón más probable es que no es un archivo válido SWF.\\nerror-swf-fetch =\\n Ruffle no pudo cargar el archivo Flash SWF.\\n La razón más probable es que el archivo ya no existe, así que no hay nada para cargar Ruffle.\\n Intente ponerse en contacto con el administrador del sitio web para obtener ayuda.\\nerror-swf-cors =\\n Ruffle no pudo cargar el archivo Flash SWF.\\n Es probable que el acceso a la búsqueda haya sido bloqueado por la política CORS.\\n Si usted es el administrador del servidor, consulte la wiki de Ruffle para obtener ayuda.\\nerror-wasm-cors =\\n Ruffle no pudo cargar el archivo \\\".wasm.\\\"\\n Es probable que el acceso a la búsqueda o la llamada a la función fetch haya sido bloqueado por la política CORS.\\n Si usted es el administrador del servidor, consulte la wiki de Ruffle para obtener ayuda.\\nerror-wasm-invalid =\\n Ruffle ha encontrado un problema crítico al intentar inicializar.\\n Este servidor web no está sirviendo archivos wasm\\\" con el tipo Mime correcto.\\n Si usted es el administrador del servidor, consulte la wiki de Ruffle para obtener ayuda.\\nerror-wasm-download =\\n Ruffle ha encontrado un problema crítico mientras intentaba inicializarse.\\n Esto a menudo puede resolverse por sí mismo, así que puede intentar recargar la página.\\n De lo contrario, póngase en contacto con el administrador del sitio web.\\nerror-wasm-disabled-on-edge =\\n Ruffle no pudo cargar el componente de archivo \\\".wasm\\\" requerido.\\n Para solucionar esto, intenta abrir la configuración de tu navegador, haciendo clic en \\\"Privacidad, búsqueda y servicios\\\", desplazándote y apagando \\\"Mejore su seguridad en la web\\\".\\n Esto permitirá a su navegador cargar los archivos \\\".wasm\\\" necesarios.\\n Si el problema persiste, puede que tenga que utilizar un navegador diferente.\\nerror-javascript-conflict =\\n Ruffle ha encontrado un problema crítico mientras intentaba inicializarse.\\n Parece que esta página utiliza código JavaScript que entra en conflicto con Ruffle.\\n Si usted es el administrador del servidor, le invitamos a intentar cargar el archivo en una página en blanco.\\nerror-javascript-conflict-outdated = También puedes intentar subir una versión más reciente de Ruffle que puede eludir el problema (la versión actual está desactualizada: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle encontró un problema al intentar inicializarse.\\n La Política de Seguridad de Contenido de este servidor web no permite el componente requerido \\\".wasm\\\". \\n Si usted es el administrador del servidor, por favor consulta la wiki de Ruffle para obtener ayuda.\\nerror-unknown =\\n Ruffle ha encontrado un problema al tratar de mostrar el contenido Flash.\\n { $outdated ->\\n [true] Si usted es el administrador del servidor, intenta cargar una version más reciente de Ruffle (la version actual esta desactualizada: { $buildDate }).\\n *[false] Esto no deberia suceder! apreciariamos que reportes el error!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = ¿Está seguro de querer eliminar este archivo de guardado?\\nsave-reload-prompt =\\n La única forma de { $action ->\\n [delete] eliminar\\n *[replace] sobreescribir\\n } este archivo de guardado sin conflictos potenciales es reiniciando el contenido. ¿Desea continuar de todos modos?\\nsave-download = Descargar\\nsave-replace = Sobreescribir\\nsave-delete = Borrar\\nsave-backup-all = Borrar todos los archivos de guardado\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Silenciar\\nvolume-controls-unmute = Desmutear\\n\"\n },\n \"fr-FR\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Télécharger en tant que .swf\\ncontext-menu-copy-debug-info = Copier les infos de débogage\\ncontext-menu-open-save-manager = Ouvrir le gestionnaire de stockage\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] À propos de l'Extension Ruffle ({ $version })\\n *[other] À propos de Ruffle ({ $version })\\n }\\ncontext-menu-hide = Masquer ce menu\\ncontext-menu-exit-fullscreen = Sortir du mode plein écran\\ncontext-menu-enter-fullscreen = Afficher en plein écran\\ncontext-menu-volume-controls = Contrôles du volume\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle n'a pas été en mesure de lire le fichier Flash intégré dans cette page.\\n Vous pouvez essayer d'ouvrir le fichier dans un onglet isolé, pour contourner le problème.\\npanic-title = Une erreur est survenue :(\\nmore-info = Plus d'infos\\nrun-anyway = Exécuter quand même\\ncontinue = Continuer\\nreport-bug = Signaler le bug\\nupdate-ruffle = Mettre à jour Ruffle\\nruffle-demo = Démo en ligne\\nruffle-desktop = Application de bureau\\nruffle-wiki = Wiki de Ruffle\\nenable-hardware-acceleration = Il semblerait que l'accélération matérielle soit désactivée. Cela n'empêche généralement pas Ruffle de fonctionner, mais il peut être beaucoup plus lent. Vous pouvez trouver comment activer l'accélération matérielle en suivant le lien ci-dessous :\\nenable-hardware-acceleration-link = FAQ - Accélération matérielle dans Chrome\\nview-error-details = Détails de l'erreur\\nopen-in-new-tab = Ouvrir dans un nouvel onglet\\nclick-to-unmute = Cliquez pour activer le son\\nclipboard-message-title = Copier et coller dans Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Votre navigateur ne prend pas en charge l'accès au presse-papiers,\\n [access-denied] L'accès au presse-papiers a été refusé,\\n } mais vous pouvez toujours utiliser ces raccourcis clavier à la place :\\nclipboard-message-copy = { \\\" \\\" } pour copier\\nclipboard-message-cut = { \\\" \\\" } pour couper\\nclipboard-message-paste = { \\\" \\\" } pour coller\\nerror-file-protocol =\\n Il semblerait que vous exécutiez Ruffle sur le protocole \\\"file:\\\".\\n Cela ne fonctionne pas car les navigateurs bloquent de nombreuses fonctionnalités pour des raisons de sécurité.\\n Nous vous invitons soit à configurer un serveur local, soit à utiliser la démo en ligne ou l'application de bureau.\\nerror-javascript-config =\\n Ruffle a rencontré un problème majeur en raison d'une configuration JavaScript incorrecte.\\n Si vous êtes l'administrateur du serveur, nous vous invitons à vérifier les détails de l'erreur pour savoir quel est le paramètre en cause.\\n Vous pouvez également consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-wasm-not-found =\\n Ruffle n'a pas réussi à charger son fichier \\\".wasm\\\".\\n Si vous êtes l'administrateur du serveur, veuillez vous assurer que ce fichier a bien été mis en ligne.\\n Si le problème persiste, il vous faudra peut-être utiliser le paramètre \\\"publicPath\\\" : veuillez consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-wasm-mime-type =\\n Ruffle a rencontré un problème majeur durant sa phase d'initialisation.\\n Ce serveur web ne renvoie pas le bon type MIME pour les fichiers \\\".wasm\\\".\\n Si vous êtes l'administrateur du serveur, veuillez consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-invalid-swf =\\n Ruffle n'a pas été en mesure de lire le fichier demandé.\\n La raison la plus probable est que ce fichier n'est pas un SWF valide.\\nerror-swf-fetch =\\n Ruffle n'a pas réussi à charger le fichier Flash.\\n La raison la plus probable est que le fichier n'existe pas ou plus.\\n Vous pouvez essayer de prendre contact avec l'administrateur du site pour obtenir plus d'informations.\\nerror-swf-cors =\\n Ruffle n'a pas réussi à charger le fichier Flash.\\n La requête a probablement été rejetée en raison de la configuration du CORS.\\n Si vous êtes l'administrateur du serveur, veuillez consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-wasm-cors =\\n Ruffle n'a pas réussi à charger son fichier \\\".wasm\\\".\\n La requête a probablement été rejetée en raison de la configuration du CORS.\\n Si vous êtes l'administrateur du serveur, veuillez consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-wasm-invalid =\\n Ruffle a rencontré un problème majeur durant sa phase d'initialisation.\\n Il semblerait que cette page comporte des fichiers manquants ou invalides pour exécuter Ruffle.\\n Si vous êtes l'administrateur du serveur, veuillez consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-wasm-download =\\n Ruffle a rencontré un problème majeur durant sa phase d'initialisation.\\n Le problème détecté peut souvent se résoudre de lui-même, donc vous pouvez essayer de recharger la page.\\n Si le problème persiste, veuillez prendre contact avec l'administrateur du site.\\nerror-wasm-disabled-on-edge =\\n Ruffle n'a pas réussi à charger son fichier \\\".wasm\\\".\\n Pour résoudre ce problème, essayez d'ouvrir les paramètres de votre navigateur et de cliquer sur \\\"Confidentialité, recherche et services\\\". Puis, vers le bas de la page, désactivez l'option \\\"Améliorez votre sécurité sur le web\\\".\\n Cela permettra à votre navigateur de charger les fichiers \\\".wasm\\\".\\n Si le problème persiste, vous devrez peut-être utiliser un autre navigateur.\\nerror-javascript-conflict =\\n Ruffle a rencontré un problème majeur durant sa phase d'initialisation.\\n Il semblerait que cette page contienne du code JavaScript qui entre en conflit avec Ruffle.\\n Si vous êtes l'administrateur du serveur, nous vous invitons à essayer de charger le fichier dans une page vide.\\nerror-javascript-conflict-outdated = Vous pouvez également essayer de mettre en ligne une version plus récente de Ruffle qui pourrait avoir corrigé le problème (la version que vous utilisez est obsolète : { $buildDate }).\\nerror-csp-conflict =\\n Ruffle a rencontré un problème majeur durant sa phase d'initialisation.\\n La stratégie de sécurité du contenu (CSP) de ce serveur web n'autorise pas l'exécution de fichiers \\\".wasm\\\".\\n Si vous êtes l'administrateur du serveur, veuillez consulter le wiki de Ruffle pour obtenir de l'aide.\\nerror-unknown =\\n Ruffle a rencontré un problème majeur durant l'exécution de ce contenu Flash.\\n { $outdated ->\\n [true] Si vous êtes l'administrateur du serveur, veuillez essayer de mettre en ligne une version plus récente de Ruffle (la version que vous utilisez est obsolète : { $buildDate }).\\n *[false] Cela n'est pas censé se produire, donc nous vous serions reconnaissants si vous pouviez nous signaler ce bug !\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Voulez-vous vraiment supprimer ce fichier de sauvegarde ?\\nsave-reload-prompt =\\n La seule façon de { $action ->\\n [delete] supprimer\\n *[replace] remplacer\\n } ce fichier de sauvegarde sans conflit potentiel est de recharger ce contenu. Souhaitez-vous quand même continuer ?\\nsave-download = Télécharger\\nsave-replace = Remplacer\\nsave-delete = Supprimer\\nsave-backup-all = Télécharger tous les fichiers de sauvegarde\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Rendre muet\\nvolume-controls-unmute = Rendre audible\\n\"\n },\n \"he-IL\": {\n \"context_menu.ftl\": \"context-menu-download-swf = הורדת קובץ הswf.\\ncontext-menu-copy-debug-info = העתקת נתוני ניפוי שגיאות\\ncontext-menu-open-save-manager = פתח את מנהל השמירות\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] אודות התוסף Ruffle ({ $version })\\n *[other] אודות Ruffle ({ $version })\\n }\\ncontext-menu-hide = הסתר תפריט זה\\ncontext-menu-exit-fullscreen = יציאה ממסך מלא\\ncontext-menu-enter-fullscreen = מסך מלא\\ncontext-menu-volume-controls = בקרת עוצמת קול\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle לא הצליח להריץ את תוכן הפלאש המוטמע בדף זה.\\n אתה יכול לפתוח את הקובץ בלשונית נפרדת, על מנת לעקוף בעיה זו.\\npanic-title = משהו השתבש :(\\nmore-info = מידע נוסף\\nrun-anyway = הפעל בכל זאת\\ncontinue = המשך\\nreport-bug = דווח על תקלה\\nupdate-ruffle = עדכן את Ruffle\\nruffle-demo = הדגמה\\nruffle-desktop = אפליקציית שולחן עבודה\\nruffle-wiki = ראה את Ruffle wiki\\nview-error-details = ראה פרטי שגיאה\\nopen-in-new-tab = פתח בכרטיסייה חדשה\\nclick-to-unmute = לחץ על מנת לבטל השתקה\\nclipboard-message-title = העתקה והדבקה בRuffle\\nclipboard-message-copy = { \\\" \\\" } עבור העתקה\\nclipboard-message-cut = { \\\" \\\" } עבור גזירה\\nclipboard-message-paste = { \\\" \\\" } עבור הדבקה\\nerror-file-protocol =\\n נדמה שאתה מריץ את Ruffle תחת פרוטוקול \\\"file:\\\".\\n זה לא יעבוד מכיוון שדפדפנים חוסמים אפשרויות רבות מלעבוד עקב סיבות אבטחה.\\n במקום זה, אנו מזמינים אותך לאחסן אתר זה תחת שרת מקומי או הדגמה ברשת או דרך אפליקציית שולחן העבודה.\\nerror-javascript-config =\\n Ruffle נתקל בתקלה חמורה עקב הגדרת JavaScript שגויה.\\n אם אתה מנהל האתר, אנו מזמינים אותך לבדוק את פרטי השגיאה על מנת למצוא איזה פרמטר הוא שגוי.\\n אתה יכול לעיין ולהועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-wasm-not-found =\\n Ruffle נכשל לטעון את קובץ ה\\\"wasm.\\\" הדרוש.\\n אם אתה מנהל האתר, אנא וודא כי הקובץ הועלה כשורה.\\n אם הבעיה ממשיכה, ייתכן ותצטרך להשתמש בהגדרת \\\"publicPath\\\": אנא עיין והועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-wasm-mime-type =\\n Ruffle נתקל בבעיה חמורה תוך כדי ניסיון לאתחל.\\n שרתו של אתר זה לא משייך קבצי \\\".wasm\\\" עם סוג הMIME הנכון.\\n אם אתה מנהל האתר, אנא עיין והועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-invalid-swf =\\n Ruffle לא יכול לנתח את הקובץ המבוקש.\\n הסיבה הסבירה ביותר לבעיה זו היא בגלל שהקובץ המבוקש אינו SWF חוקי.\\nerror-swf-fetch =\\n Ruffle נכשל לטעון את קובץ הפלאש/swf. .\\n זה נובע ככל הנראה מכיוון והקובץ לא קיים יותר, אז אין לRuffle מה לטעון.\\n נסה ליצור קשר עם מנהל האתר על מנת לקבל עזרה.\\nerror-swf-cors =\\n Ruffle נכשל לטעון את קובץ הפלאש/swf. .\\n גישה לfetch ככל הנראה נחסמה על ידי מדיניות CORS.\\n אם אתה מנהל האתר, אנא עיין והועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-wasm-cors =\\n Ruffle נכשל לטעון את קובץ ה\\\".wasm\\\" הדרוש.\\n גישה לfetch ככל הנראה נחסמה על ידי מדיניות CORS.\\n אם אתה מנהל האתר, אנא עיין והועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-wasm-invalid =\\n Ruffle נתקל בבעיה חמורה תוך כדי ניסיון לאתחל.\\n נדמה כי בדף זה חסרים או לא עובדים כראוי קבצים אשר משמשים את Ruffle כדי לפעול\\n אם אתה מנהל האתר, אנא עיין והועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-wasm-download =\\n Ruffle נתקל בבעיה חמורה תוך כדי ניסיון לאתחל.\\n לעיתים בעיה זו יכולה לפתור את עצמה, אז אתה יכול לנסות לטעון מחדש את הדף זה.\\n אם לא, אנא פנה למנהל האתר.\\nerror-wasm-disabled-on-edge =\\n Ruffle נכשל לטעון את קובץ ה\\\".wasm\\\" הדרוש.\\n על מנת לתקן בעיה זו, נסה לפתוח את הגדרות הדפדפן שלך, לחץ על \\\"אבטחה, חיפוש ושירות\\\",\\n גלול מטה, וכבה את \\\"הגבר את האבטחה שלך ברשת\\\".\\n זה יאפשר לדפדפן שלך לטעון את קובץ ה\\\".wasm\\\" הדרוש.\\n אם הבעיה ממשיכה, ייתכן ועליך להשתמש בדפדפן אחר.\\nerror-javascript-conflict =\\n Ruffle נתקל בבעיה חמורה תוך כדי ניסיון לאתחל.\\n נדמה כי דף זה משתמש בקוד JavaScript אשר מתנגש עם Ruffle.\\n אם אתה מנהל האתר, אנו מזמינים אותך לנסות לטעון את הדף תחת עמוד ריק.\\nerror-javascript-conflict-outdated = בנוסף, אתה יכול לנסות ולהעלות גרסאות עדכניות של Ruffle אשר עלולים לעקוף בעיה זו (גרסה זו הינה מיושנת : { $buildDate }).\\nerror-csp-conflict =\\n Ruffle נתקל בבעיה חמורה תוך כדי ניסיון לאתחל.\\n מדיניות אבטחת התוכן של שרתו של אתר זה אינה מאפשרת לקובץ ה\\\"wasm.\\\" הדרוש לפעול.\\n אם אתה מנהל האתר, אנא עיין והועץ בwiki של Ruffle על מנת לקבל עזרה.\\nerror-unknown =\\n Ruffle נתקל בבעיה חמורה בניסיון להציג את תוכן פלאש זה.\\n { $outdated ->\\n [true] אם אתה מנהל האתר, אנא נסה להעלות גרסה עדכנית יותר של Ruffle (גרסה זו הינה מיושנת: { $buildDate }).\\n *[false] זה לא אמור לקרות, נשמח אם תוכל לשתף תקלה זו!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = האם אתה בטוח שברצונך למחוק את קובץ שמירה זה?\\nsave-reload-prompt =\\n הדרך היחידה { $action ->\\n [delete] למחוק\\n *[replace] להחליף\\n } את קובץ השמירה הזה מבלי לגרום לו להתנגש היא לטעון מחדש את תוכן זה. האם אתה רוצה להמשיך בכל זאת?\\nsave-download = הורדה\\nsave-replace = החלפה\\nsave-delete = מחיקה\\nsave-backup-all = הורדת כל קבצי השמירה\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = השתק\\n\"\n },\n \"hu-HU\": {\n \"context_menu.ftl\": \"context-menu-download-swf = .swf fájl letöltése\\ncontext-menu-copy-debug-info = Hibakeresési információk másolása\\ncontext-menu-open-save-manager = Mentéskezelő megnyitása\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] A Ruffle kiegészítő ({ $version }) névjegye\\n *[other] A Ruffle ({ $version }) névjegye\\n }\\ncontext-menu-hide = Ezen menü elrejtése\\ncontext-menu-exit-fullscreen = Kilépés a teljes képernyőből\\ncontext-menu-enter-fullscreen = Váltás teljes képernyőre\\ncontext-menu-volume-controls = Hangerőszabályzó\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n A Ruffle nem tudta futtatni az oldalba ágyazott Flash tartalmat.\\n A probléma kikerüléséhez megpróbálhatod megnyitni a fájlt egy külön lapon.\\npanic-title = Valami baj történt :(\\nmore-info = További információ\\nrun-anyway = Futtatás mégis\\ncontinue = Folytatás\\nreport-bug = Hiba jelentése\\nupdate-ruffle = Ruffle frissítése\\nruffle-demo = Webes demó\\nruffle-desktop = Asztali alkalmazás\\nruffle-wiki = Ruffle Wiki megnyitása\\nenable-hardware-acceleration = Úgy tűnik, a hardveres gyorsítás ki van kapcsolva. Bár a Ruffle működhet, nagyon lassú lehet. Az alábbi hivatkozást követve megtudhatod, hogyan engedélyezd a hardveres gyorsítást:\\nenable-hardware-acceleration-link = GYIK - Chrome hardveres gyorsítás\\nview-error-details = Hiba részletei\\nopen-in-new-tab = Megnyitás új lapon\\nclick-to-unmute = Kattints a némítás feloldásához\\nclipboard-message-title = Másolás és beíllesztés a Ruffle-ben\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] A böngésződ nem támogatja a vágólaphoz való teljes hozzáférést,\\n [access-denied] A vágólaphoz való hozzáférés el lett utasítva,\\n } de mindig használhatod ezeket a gyorsbillentyűket helyette:\\nclipboard-message-copy = { \\\" \\\" } másoláshoz\\nclipboard-message-cut = { \\\" \\\" } kivágáshoz\\nclipboard-message-paste = { \\\" \\\" } beillesztéshez\\nerror-file-protocol =\\n Úgy tűnik, a Ruffle-t a \\\"file:\\\" protokollon futtatod.\\n Ez nem működik, mivel így a böngészők biztonsági okokból számos funkció működését letiltják.\\n Ehelyett azt ajánljuk hogy indíts egy helyi kiszolgálót, vagy használd a webes demót vagy az asztali alkalmazást.\\nerror-javascript-config =\\n A Ruffle komoly problémába ütközött egy helytelen JavaScript-konfiguráció miatt.\\n Ha a szerver rendszergazdája vagy, kérjük, ellenőrizd a hiba részleteit, hogy megtudd, melyik paraméter a hibás.\\n A Ruffle wikiben is találhatsz ehhez segítséget.\\nerror-wasm-not-found =\\n A Ruffle nem tudta betölteni a szükséges \\\".wasm\\\" összetevőt.\\n Ha a szerver rendszergazdája vagy, kérjük ellenőrizd, hogy a fájl megfelelően lett-e feltöltve.\\n Ha a probléma továbbra is fennáll, előfordulhat, hogy a \\\"publicPath\\\" beállítást kell használnod: segítségért keresd fel a Ruffle wikit.\\nerror-wasm-mime-type =\\n A Ruffle komoly problémába ütközött az inicializálás során.\\n Ez a webszerver a \\\".wasm\\\" fájlokat nem a megfelelő MIME-típussal szolgálja ki.\\n Ha a szerver rendszergazdája vagy, kérjük, keresd fel a Ruffle wikit segítségért.\\nerror-invalid-swf =\\n A Ruffle nem tudta értelmezni a kért fájlt.\\n Ennek a legvalószínűbb oka az, hogy a kért fájl nem érvényes SWF.\\nerror-swf-fetch =\\n A Ruffle nem tudta betölteni a Flash SWF fájlt.\\n A legvalószínűbb ok az, hogy a fájl már nem létezik, így a Ruffle számára nincs mit betölteni.\\n Próbáld meg felvenni a kapcsolatot a webhely rendszergazdájával segítségért.\\nerror-swf-cors =\\n A Ruffle nem tudta betölteni a Flash SWF fájlt.\\n A lekéréshez való hozzáférést valószínűleg letiltotta a CORS-házirend.\\n Ha a szerver rendszergazdája vagy, kérjük, keresd fel a Ruffle wikit segítségért.\\nerror-wasm-cors =\\n A Ruffle nem tudta betölteni a szükséges \\\".wasm\\\" összetevőt.\\n A lekéréshez való hozzáférést valószínűleg letiltotta a CORS-házirend.\\n Ha a szerver rendszergazdája vagy, kérjük keresd fel a Ruffle wikit segítségért.\\nerror-wasm-invalid =\\n A Ruffle komoly problémába ütközött az inicializálás során.\\n Úgy tűnik, hogy ezen az oldalon hiányoznak vagy hibásak a Ruffle futtatásához szükséges fájlok.\\n Ha a szerver rendszergazdája vagy, kérjük keresd fel a Ruffle wikit segítségért.\\nerror-wasm-download =\\n A Ruffle komoly problémába ütközött az inicializálás során.\\n Ez gyakran magától megoldódik, ezért megpróbálhatod újratölteni az oldalt.\\n Ellenkező esetben fordulj a webhely rendszergazdájához.\\nerror-wasm-disabled-on-edge =\\n A Ruffle nem tudta betölteni a szükséges \\\".wasm\\\" összetevőt.\\n A probléma megoldásához nyisd meg a böngésző beállításait, kattints az „Adatvédelem, keresés és szolgáltatások” elemre, görgess le, és kapcsold ki a „Fokozott biztonság a weben” opciót.\\n Ez lehetővé teszi a böngésző számára, hogy betöltse a szükséges \\\".wasm\\\" fájlokat.\\n Ha a probléma továbbra is fennáll, lehet, hogy másik böngészőt kell használnod.\\nerror-javascript-conflict =\\n A Ruffle komoly problémába ütközött az inicializálás során.\\n Úgy tűnik, ez az oldal olyan JavaScript-kódot használ, amely ütközik a Ruffle-lel.\\n Ha a kiszolgáló rendszergazdája vagy, kérjük, próbáld meg a fájlt egy üres oldalon betölteni.\\nerror-javascript-conflict-outdated = Megpróbálhatod továbbá feltölteni a Ruffle egy újabb verzióját is, amely megkerülheti a problémát (a jelenlegi elavult: { $buildDate }).\\nerror-csp-conflict =\\n A Ruffle komoly problémába ütközött az inicializálás során.\\n A kiszolgáló tartalombiztonsági házirendje nem teszi lehetővé a szükséges „.wasm” összetevők futtatását.\\n Ha a szerver rendszergazdája vagy, kérjük, keresd fel a Ruffle wikit segítségért.\\nerror-unknown =\\n A Ruffle komoly problémába ütközött, miközben megpróbálta megjeleníteni ezt a Flash-tartalmat.\\n { $outdated ->\\n [true] Ha a szerver rendszergazdája vagy, kérjük, próbáld meg feltölteni a Ruffle egy újabb verzióját (a jelenlegi elavult: { $buildDate }).\\n *[false] Ennek nem lett volna szabad megtörténnie, ezért nagyon hálásak lennénk, ha jeleznéd a hibát!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Biztosan törölni akarod ezt a mentést?\\nsave-reload-prompt =\\n Ennek a mentésnek az esetleges konfliktus nélküli { $action ->\\n [delete] törléséhez\\n *[replace] cseréjéhez\\n } újra kell tölteni a tartalmat. Mégis szeretnéd folytatni?\\nsave-download = Letöltés\\nsave-replace = Csere\\nsave-delete = Törlés\\nsave-backup-all = Az összes fájl letöltése\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Némítás\\nvolume-controls-unmute = Némítás feloldása\\n\"\n },\n \"id-ID\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Unduh .swf\\ncontext-menu-copy-debug-info = Salin info debug\\ncontext-menu-open-save-manager = Buka Manager Save\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Tentang Ekstensi Ruffle ({ $version })\\n *[other] Tentang Ruffle ({ $version })\\n }\\ncontext-menu-hide = Sembunyikan Menu ini\\ncontext-menu-exit-fullscreen = Keluar dari layar penuh\\ncontext-menu-enter-fullscreen = Masuk mode layar penuh\\ncontext-menu-volume-controls = Pengaturan Volume\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle tidak dapat menjalankan Flash yang disematkan di halaman ini.\\n Anda dapat mencoba membuka file di tab terpisah, untuk menghindari masalah ini.\\npanic-title = Terjadi kesalahan :(\\nmore-info = Info lebih lanjut\\nrun-anyway = Jalankan\\ncontinue = Lanjutkan\\nreport-bug = Laporkan Bug\\nupdate-ruffle = Perbarui Ruffle\\nruffle-demo = Demo Web\\nruffle-desktop = Aplikasi Desktop\\nruffle-wiki = Kunjungi Wiki Ruffle\\nview-error-details = Tunjukan Detail Error\\nopen-in-new-tab = Buka di Tab Baru\\nclick-to-unmute = Tekan untuk menyalakan suara\\nerror-file-protocol =\\n Sepertinya anda menjalankan Ruffle di protokol \\\"file:\\\". \\n Ini tidak berfungsi karena browser memblokir fitur ini dengan alasan keamanan.\\n Sebagai gantinya, kami mengajak anda untuk membuat server lokal, menggunakan demo web atau aplikasi desktop.\\nerror-javascript-config =\\n Ruffle mengalami masalah besar karena konfigurasi JavaScript yang salah.\\n Jika Anda adalah administrator server ini, kami mengajak Anda untuk memeriksa detail kesalahan untuk mengetahui parameter mana yang salah.\\n Anda juga dapat membaca wiki Ruffle untuk mendapatkan bantuan.\\nerror-wasm-not-found =\\n Ruffle gagal memuat komponen file \\\".wasm\\\" yang diperlukan.\\n Jika Anda adalah administrator server ini, pastikan file telah diunggah dengan benar.\\n Jika masalah terus berlanjut, Anda mungkin perlu menggunakan pengaturan \\\"publicPath\\\": silakan baca wiki Ruffle untuk mendapatkan bantuan.\\nerror-wasm-mime-type =\\n Ruffle mengalami masalah ketika mencoba melakukan inisialisasi.\\n Server web ini tidak melayani file \\\".wasm\\\" dengan tipe MIME yang benar.\\n Jika Anda adalah administrator server ini, silakan baca wiki Ruffle untuk mendapatkan bantuan.\\nerror-swf-fetch =\\n Ruffle gagal memuat file SWF Flash.\\n Kemungkinan file tersebut sudah tidak ada, sehingga tidak dapat dimuat oleh Ruffle.\\n Coba hubungi administrator situs web ini untuk mendapatkan bantuan.\\nerror-swf-cors =\\n Ruffle gagal memuat file SWF Flash.\\n Akses untuk memuat kemungkinan telah diblokir oleh kebijakan CORS.\\n Jika Anda adalah administrator server ini, silakan baca wiki Ruffle untuk mendapatkan bantuan.\\nerror-wasm-cors =\\n Ruffle gagal memuat komponen file \\\".wasm\\\" yang diperlukan.\\n Akses untuk mengambil kemungkinan telah diblokir oleh kebijakan CORS.\\n Jika Anda adalah administrator server ini, silakan baca wiki Ruffle untuk mendapatkan bantuan.\\nerror-wasm-invalid =\\n Ruffle mengalami masalah besar ketika mencoba melakukan inisialisasi.\\n Sepertinya halaman ini memiliki file yang hilang atau tidak valid untuk menjalankan Ruffle.\\n Jika Anda adalah administrator server ini, silakan baca wiki Ruffle untuk mendapatkan bantuan.\\nerror-wasm-download =\\n Ruffle mengalami masalah besar ketika mencoba melakukan inisialisasi.\\n Hal ini sering kali dapat teratasi dengan sendirinya, sehingga Anda dapat mencoba memuat ulang halaman.\\n Jika tidak, silakan hubungi administrator situs web ini.\\nerror-wasm-disabled-on-edge =\\n Ruffle gagal memuat komponen file \\\".wasm\\\" yang diperlukan.\\n Untuk mengatasinya, coba buka pengaturan peramban Anda, klik \\\"Privasi, pencarian, dan layanan\\\", turun ke bawah, dan matikan \\\"Tingkatkan keamanan Anda di web\\\".\\n Ini akan memungkinkan browser Anda memuat file \\\".wasm\\\" yang diperlukan.\\n Jika masalah berlanjut, Anda mungkin harus menggunakan browser yang berbeda.\\nerror-javascript-conflict =\\n Ruffle mengalami masalah besar ketika mencoba melakukan inisialisasi.\\n Sepertinya situs web ini menggunakan kode JavaScript yang bertentangan dengan Ruffle.\\n Jika Anda adalah administrator server ini, kami mengajak Anda untuk mencoba memuat file pada halaman kosong.\\nerror-javascript-conflict-outdated = Anda juga dapat mencoba mengunggah versi Ruffle yang lebih baru yang mungkin dapat mengatasi masalah ini (versi saat ini sudah kedaluwarsa: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle mengalami masalah besar ketika mencoba melakukan inisialisasi.\\n Kebijakan Keamanan Konten server web ini tidak mengizinkan komponen \\\".wasm\\\" yang diperlukan untuk dijalankan.\\n Jika Anda adalah administrator server ini, silakan baca wiki Ruffle untuk mendapatkan bantuan.\\nerror-unknown =\\n Ruffle telah mengalami masalah besar saat menampilkan konten Flash ini.\\n { $outdated ->\\n [true] Jika Anda administrator server ini, cobalah untuk mengganti versi Ruffle yang lebih baru (versi saat ini sudah kedaluwarsa: { $buildDate }).\\n *[false] Hal ini seharusnya tidak terjadi, jadi kami sangat menghargai jika Anda dapat melaporkan bug ini!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Anda yakin ingin menghapus berkas ini?\\nsave-reload-prompt =\\n Satu-satunya cara untuk { $action ->\\n [delete] menghapus\\n *[replace] mengganti\\n } berkas penyimpanan ini tanpa potensi konflik adalah dengan memuat ulang konten ini. Apakah Anda ingin melanjutkannya?\\nsave-download = Unduh\\nsave-replace = Ganti\\nsave-delete = Hapus\\nsave-backup-all = Unduh semua berkas penyimpanan\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Bisukan\\n\"\n },\n \"it-IT\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Scarica .swf\\ncontext-menu-copy-debug-info = Copia informazioni di debug\\ncontext-menu-open-save-manager = Apri Gestione salvataggi\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Informazioni su Ruffle Extension ({ $version })\\n *[other] Informazioni su Ruffle ({ $version })\\n }\\ncontext-menu-hide = Nascondi questo menu\\ncontext-menu-exit-fullscreen = Esci dallo schermo intero\\ncontext-menu-enter-fullscreen = Entra a schermo intero\\ncontext-menu-volume-controls = Controlli volume\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle non è stato in grado di eseguire il Flash incorporato in questa pagina.\\n Puoi provare ad aprire il file in una scheda separata, per evitare questo problema.\\npanic-title = Qualcosa è andato storto :(\\nmore-info = Maggiori informazioni\\nrun-anyway = Esegui comunque\\ncontinue = Continua\\nreport-bug = Segnala Un Bug\\nupdate-ruffle = Aggiorna Ruffle\\nruffle-demo = Demo Web\\nruffle-desktop = Applicazione Desktop\\nruffle-wiki = Visualizza Ruffle Wiki\\nview-error-details = Visualizza Dettagli Errore\\nopen-in-new-tab = Apri in una nuova scheda\\nclick-to-unmute = Clicca per riattivare l'audio\\nerror-file-protocol =\\n Sembra che tu stia eseguendo Ruffle sul protocollo \\\"file:\\\".\\n Questo non funziona come browser blocca molte funzionalità di lavoro per motivi di sicurezza.\\n Invece, ti invitiamo a configurare un server locale o a utilizzare la demo web o l'applicazione desktop.\\nerror-javascript-config =\\n Ruffle ha incontrato un problema importante a causa di una configurazione JavaScript non corretta.\\n Se sei l'amministratore del server, ti invitiamo a controllare i dettagli dell'errore per scoprire quale parametro è in errore.\\n Puoi anche consultare il wiki Ruffle per aiuto.\\nerror-wasm-not-found =\\n Ruffle non è riuscito a caricare il componente di file \\\".wasm\\\".\\n Se sei l'amministratore del server, assicurati che il file sia stato caricato correttamente.\\n Se il problema persiste, potrebbe essere necessario utilizzare l'impostazione \\\"publicPath\\\": si prega di consultare il wiki Ruffle per aiuto.\\nerror-wasm-mime-type =\\n Ruffle ha incontrato un problema importante durante il tentativo di inizializzazione.\\n Questo server web non serve \\\". asm\\\" file con il tipo MIME corretto.\\n Se sei l'amministratore del server, consulta la wiki Ruffle per aiuto.\\nerror-swf-fetch =\\n Ruffle non è riuscito a caricare il file Flash SWF.\\n La ragione più probabile è che il file non esiste più, quindi non c'è nulla che Ruffle possa caricare.\\n Prova a contattare l'amministratore del sito web per aiuto.\\nerror-swf-cors =\\n Ruffle non è riuscito a caricare il file SWF Flash.\\n L'accesso al recupero probabilmente è stato bloccato dalla politica CORS.\\n Se sei l'amministratore del server, consulta la wiki Ruffle per ricevere aiuto.\\nerror-wasm-cors =\\n Ruffle non è riuscito a caricare il componente di file \\\".wasm\\\".\\n L'accesso al recupero probabilmente è stato bloccato dalla politica CORS.\\n Se sei l'amministratore del server, consulta la wiki Ruffle per ricevere aiuto.\\nerror-wasm-invalid =\\n Ruffle ha incontrato un problema importante durante il tentativo di inizializzazione.\\n Sembra che questa pagina abbia file mancanti o non validi per l'esecuzione di Ruffle.\\n Se sei l'amministratore del server, consulta la wiki Ruffle per ricevere aiuto.\\nerror-wasm-download =\\n Ruffle ha incontrato un problema importante durante il tentativo di inizializzazione.\\n Questo può spesso risolversi da solo, quindi puoi provare a ricaricare la pagina.\\n Altrimenti, contatta l'amministratore del sito.\\nerror-wasm-disabled-on-edge =\\n Ruffle non ha caricato il componente di file \\\".wasm\\\" richiesto.\\n Per risolvere il problema, prova ad aprire le impostazioni del tuo browser, facendo clic su \\\"Privacy, search, and services\\\", scorrendo verso il basso e disattivando \\\"Migliora la tua sicurezza sul web\\\".\\n Questo permetterà al tuo browser di caricare i file \\\".wasm\\\" richiesti.\\n Se il problema persiste, potresti dover usare un browser diverso.\\nerror-javascript-conflict =\\n Ruffle ha riscontrato un problema importante durante il tentativo di inizializzazione.\\n Sembra che questa pagina utilizzi il codice JavaScript che è in conflitto con Ruffle.\\n Se sei l'amministratore del server, ti invitiamo a provare a caricare il file su una pagina vuota.\\nerror-javascript-conflict-outdated = Puoi anche provare a caricare una versione più recente di Ruffle che potrebbe aggirare il problema (l'attuale build è obsoleta: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle ha incontrato un problema importante durante il tentativo di inizializzare.\\n La Politica di Sicurezza dei Contenuti di questo server web non consente l'impostazione richiesta\\\". asm\\\" componente da eseguire.\\n Se sei l'amministratore del server, consulta la Ruffle wiki per aiuto.\\nerror-unknown =\\n Ruffle ha incontrato un problema importante durante il tentativo di visualizzare questo contenuto Flash.\\n { $outdated ->\\n [true] Se sei l'amministratore del server, prova a caricare una versione più recente di Ruffle (la versione attuale è obsoleta: { $buildDate }).\\n *[false] Questo non dovrebbe accadere, quindi ci piacerebbe molto se si potesse inviare un bug!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Sei sicuro di voler eliminare questo file di salvataggio?\\nsave-reload-prompt =\\n L'unico modo per { $action ->\\n [delete] delete\\n *[replace] replace\\n } questo salvataggio file senza potenziali conflitti è quello di ricaricare questo contenuto. Volete continuare comunque?\\nsave-download = Scarica\\nsave-replace = Sostituisci\\nsave-delete = Elimina\\nsave-backup-all = Scarica tutti i file di salvataggio\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Silenzia\\n\"\n },\n \"ja-JP\": {\n \"context_menu.ftl\": \"context-menu-download-swf = .swfをダウンロード\\ncontext-menu-copy-debug-info = デバッグ情報をコピー\\ncontext-menu-open-save-manager = セーブマネージャーを開く\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Ruffle拡張機能について ({ $version })\\n *[other] Ruffleについて ({ $version })\\n }\\ncontext-menu-hide = メニューを隠す\\ncontext-menu-exit-fullscreen = フルスクリーンを終了\\ncontext-menu-enter-fullscreen = フルスクリーンにする\\ncontext-menu-volume-controls = 音量\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffleはこのページに埋め込まれた Flash を実行できませんでした。\\n 別のタブでファイルを開くことで、この問題を解決できるかもしれません。\\npanic-title = エラーが発生しました :(\\nmore-info = 詳細情報\\nrun-anyway = とにかく実行する\\ncontinue = 続行\\nreport-bug = バグを報告\\nupdate-ruffle = Ruffleを更新\\nruffle-demo = Webデモ\\nruffle-desktop = デスクトップアプリケーション\\nruffle-wiki = Ruffle Wikiを表示\\nenable-hardware-acceleration = ハードウェア アクセラレーションが無効になっているようです。Ruffle は動作するかもしれませんが、非常に遅くなる可能性があります。ハードウェア アクセラレーションを有効にする方法については、以下のリンクを参照してください。\\nenable-hardware-acceleration-link = よくある質問 - Chromeのハードウェア アクセラレーション\\nview-error-details = エラーの詳細を表示\\nopen-in-new-tab = 新しいタブで開く\\nclick-to-unmute = クリックでミュートを解除\\nclipboard-message-title = コピーしてRuffleに貼り付け\\nerror-file-protocol =\\n Ruffleを\\\"file:\\\"プロトコルで使用しているようです。\\n ブラウザはセキュリティ上の理由から殆どの機能を制限しているため、正しく動作しません。\\n ローカルサーバーをセットアップするか、ウェブデモまたはデスクトップアプリをご利用ください。\\nerror-javascript-config =\\n JavaScriptの設定が正しくないため、Ruffleで問題が発生しました。\\n サーバー管理者の方は、エラーの詳細から、どのパラメーターに問題があるのかを確認してください。\\n Ruffleのwikiを参照することで、解決方法が見つかるかもしれません。\\nerror-wasm-not-found =\\n Ruffleの初期化時に重大な問題が発生しました。\\n このWebサーバーのコンテンツセキュリティポリシーが、実行に必要となる「.wasm」コンポーネントの実行を許可していません。サーバーの管理者の場合は、ファイルが正しくアップロードされているか確認をしてください。この問題が解決しない場合は、「publicPath」の設定を使用する必要があります。\\n サーバーの管理者は、Ruffleのwikiを参照してください。\\nerror-wasm-mime-type =\\n Ruffleの初期化に失敗する大きな問題が発生しました。\\n このWebサーバーは正しいMIMEタイプの「.wasm」ファイルを提供していません。\\n サーバーの管理者は、Ruffleのwikiを参照してください。\\nerror-invalid-swf =\\n Ruffle は要求されたファイルを解析できません。\\n 最も考えられる原因は、要求されたファイルが有効な SWF でないことです。\\nerror-swf-fetch =\\n RuffleがFlash SWFファイルの読み込みに失敗しました。\\n 最も考えられる原因は、SWFファイルが既に存在しない事でRuffleが読み込みに失敗するという問題です。\\n Webサイトの管理者にお問い合わせください。\\nerror-swf-cors =\\n RuffleはSWFファイルの読み込みに失敗しました。\\n CORSポリシーの設定により、fetchへのアクセスがブロックされている可能性があります。\\n サーバー管理者の方は、Ruffleのwikiを参照してください。\\nerror-wasm-cors =\\n Ruffleに必要となる「.wasm」ファイルコンポーネントの読み込みに失敗しました。\\n CORSポリシーによってfetchへのアクセスがブロックされている可能性があります。\\n サーバーの管理者は、Ruffle wikiを参照してください。\\nerror-wasm-invalid =\\n Ruffleの初期化時に重大な問題が発生しました。\\n このページにはRuffleを実行するためのファイルが存在しないか、無効なファイルがあるかもしれません。\\n サーバーの管理者は、Ruffleのwikiを参照してください。\\nerror-wasm-download =\\n Ruffleの初期化時に重大な問題が発生しました。\\n この問題はページを再読み込みする事で大抵は解決するはずなので行なってみてください。\\n もしも解決しない場合は、Webサイトの管理者にお問い合わせください。\\nerror-wasm-disabled-on-edge =\\n Ruffleに必要となる「.wasm」ファイルコンポーネントの読み込みに失敗しました。\\n この問題を解決するにはブラウザーの設定を開き、「プライバシー、検索、サービス」をクリックし、下にスクロールで「Web上のセキュリティを強化する」をオフにしてみてください。\\n これで必要となる「.wasm」ファイルが読み込まれるようになります。\\n それでも問題が解決しない場合、別のブラウザーを使用する必要があるかもしれません。\\nerror-javascript-conflict =\\n Ruffleの初期化時に重大な問題が発生しました。\\n このページではRuffleと競合するJavaScriptコードが使用されているかもしれません。\\n サーバーの管理者は、空白のページでファイルを読み込みし直してみてください。\\nerror-javascript-conflict-outdated = 新しいバージョンのRuffleをアップロードすることで、この問題を回避できる可能性があります。(現在のビルドは古い物です:{ $buildDate })\\nerror-csp-conflict =\\n Ruffleの初期化時に重大な問題が発生しました。\\n このWebサーバーのコンテンツセキュリティポリシーが実行に必要となる「.wasm」コンポーネントの実行を許可していません。\\n サーバーの管理者は、Ruffleのwikiを参照してください。\\nerror-unknown =\\n Flashコンテンツを表示する際にRuffleで問題が発生しました。\\n { $outdated ->\\n [true] 現在使用しているビルドは最新ではないため、サーバー管理者の方は、最新版のRuffleに更新してみてください(現在利用中のビルド: { $buildDate })。\\n *[false] 想定外の問題なので、バグとして報告していただけると嬉しいです!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = このセーブファイルを削除してもよろしいですか?\\nsave-reload-prompt =\\n セーブファイルを競合の可能性なく { $action ->\\n [delete] 削除する\\n *[replace] 置き換える\\n } ために、このコンテンツを再読み込みすることを推奨します。続行しますか?\\nsave-download = ダウンロード\\nsave-replace = 置き換え\\nsave-delete = 削除\\nsave-backup-all = すべてのセーブファイルをダウンロード\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = 消音\\nvolume-controls-unmute = 消音をやめる\\n\"\n },\n \"ko-KR\": {\n \"context_menu.ftl\": \"context-menu-download-swf = .swf 다운로드\\ncontext-menu-copy-debug-info = 디버그 정보 복사\\ncontext-menu-open-save-manager = 저장 관리자 열기\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Ruffle 확장 프로그램 정보 ({ $version })\\n *[other] Ruffle 정보 ({ $version })\\n }\\ncontext-menu-hide = 이 메뉴 숨기기\\ncontext-menu-exit-fullscreen = 전체화면 나가기\\ncontext-menu-enter-fullscreen = 전체화면으로 열기\\ncontext-menu-volume-controls = 음량 조절\\n\",\n \"messages.ftl\": \"message-cant-embed = Ruffle이 이 페이지에 포함된 플래시를 실행할 수 없었습니다. 별도의 탭에서 파일을 열어봄으로서 이 문제를 해결할 수 있습니다.\\npanic-title = 문제가 발생했습니다 :(\\nmore-info = 추가 정보\\nrun-anyway = 그래도 실행하기\\ncontinue = 계속하기\\nreport-bug = 버그 제보\\nupdate-ruffle = Ruffle 업데이트\\nruffle-demo = 웹 데모\\nruffle-desktop = 데스크톱 애플리케이션\\nruffle-wiki = Ruffle 위키 보기\\nenable-hardware-acceleration = 하드웨어 가속이 비활성화되어 있는 것 같습니다. Ruffle은 계속 작동하지만 매우 느릴 수 있습니다. 아래 링크를 참고하여 하드웨어 가속을 활성화하는 방법을 찾아보세요:\\nenable-hardware-acceleration-link = FAQ - 크롬 하드웨어 가속\\nview-error-details = 오류 세부 정보 보기\\nopen-in-new-tab = 새 탭에서 열기\\nclick-to-unmute = 클릭하여 음소거 해제\\nclipboard-message-title = Ruffle에서 복사하고 붙여넣기\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] 이 브라우저는 클립보드 액세스를 지원하지 않습니다,\\n [access-denied] 클립보드 액세스가 거절되었습니다,\\n } 하지만 다음 단축키를 대신 사용할 수 있습니다:\\nclipboard-message-copy = { \\\" \\\" } 복사\\nclipboard-message-cut = { \\\" \\\" } 잘라내기\\nclipboard-message-paste = { \\\" \\\" } 붙여넣기\\nerror-file-protocol =\\n Ruffle을 \\\"file:\\\" 프로토콜에서 실행하고 있는 것으로 보입니다.\\n 브라우저에서는 이 프로토콜을 보안상의 이유로 많은 기능을 작동하지 않게 차단하므로 이 방법은 작동하지 않습니다.\\n 대신, 로컬 서버를 직접 열어서 설정하거나 웹 데모 또는 데스크톱 애플리케이션을 사용하시기 바랍니다.\\nerror-javascript-config =\\n 잘못된 자바스크립트 설정으로 인해 Ruffle에서 중대한 문제가 발생했습니다.\\n 만약 당신이 서버 관리자인 경우, 오류 세부사항을 확인하여 어떤 매개변수가 잘못되었는지 알아보세요.\\n 또는 Ruffle 위키를 통해 도움을 받아 볼 수도 있습니다.\\nerror-wasm-not-found =\\n Ruffle이 \\\".wasm\\\" 필수 파일 구성요소를 로드하지 못했습니다.\\n 만약 당신이 서버 관리자라면 파일이 올바르게 업로드되었는지 확인하세요.\\n 문제가 지속된다면 \\\"publicPath\\\" 옵션을 사용해야 할 수도 있습니다: Ruffle 위키를 참조하여 도움을 받으세요.\\nerror-wasm-mime-type =\\n Ruffle이 초기화를 시도하는 동안 중대한 문제가 발생했습니다.\\n 이 웹 서버는 올바른 MIME 유형의 \\\".wasm\\\" 파일을 제공하지 않습니다.\\n 만약 당신이 서버 관리자라면 Ruffle 위키를 통해 도움을 받으세요.\\nerror-invalid-swf =\\n Ruffle이 요청한 파일을 분석하지 못했습니다.\\n 요청한 파일이 유효한 SWF 파일이 아닐 가능성이 높습니다.\\nerror-swf-fetch =\\n Ruffle이 플래시 SWF 파일을 로드하는 데 실패하였습니다.\\n 이는 주로 파일이 더 이상 존재하지 않아 Ruffle이 로드할 수 있는 것이 없을 가능성이 높습니다.\\n 웹사이트 관리자에게 문의하여 도움을 받아보세요.\\nerror-swf-cors =\\n Ruffle이 플래시 SWF 파일을 로드하는 데 실패하였습니다.\\n CORS 정책에 의해 데이터 가져오기에 대한 액세스가 차단되었을 수 있습니다.\\n 만약 당신이 서버 관리자라면 Ruffle 위키를 참조하여 도움을 받아볼 수 있습니다.\\nerror-wasm-cors =\\n Ruffle이 \\\".wasm\\\" 필수 파일 구성요소를 로드하지 못했습니다.\\n CORS 정책에 의해 데이터 가져오기에 대한 액세스가 차단되었을 수 있습니다.\\n 만약 당신이 서버 관리자라면 Ruffle 위키를 참조하여 도움을 받아볼 수 있습니다.\\nerror-wasm-invalid =\\n Ruffle이 초기화를 시도하는 동안 중대한 문제가 발생했습니다.\\n 이 페이지에 Ruffle을 실행하기 위한 파일이 누락되었거나 잘못된 것 같습니다.\\n 만약 당신이 서버 관리자라면 Ruffle 위키를 참조하여 도움을 받아볼 수 있습니다.\\nerror-wasm-download =\\n Ruffle이 초기화를 시도하는 동안 중대한 문제가 발생했습니다.\\n 이 문제는 때때로 바로 해결될 수 있으므로 페이지를 새로고침하여 다시 시도해보세요.\\n 그래도 문제가 지속된다면, 웹사이트 관리자에게 문의해주세요.\\nerror-wasm-disabled-on-edge =\\n Ruffle이 \\\".wasm\\\" 필수 파일 구성요소를 로드하지 못했습니다.\\n 이를 해결하려면 브라우저 설정에서 \\\"개인 정보, 검색 및 서비스\\\"를 클릭한 후, 하단으로 스크롤하여 \\\"웹에서 보안 강화\\\" 기능을 꺼야 합니다.\\n 이는 필요한 \\\".wasm\\\" 파일을 브라우저에서 로드할 수 있도록 허용합니다.\\n 이 문제가 지속될 경우 다른 브라우저를 사용해야 할 수 있습니다.\\nerror-javascript-conflict =\\n Ruffle이 초기화를 시도하는 동안 중대한 문제가 발생했습니다.\\n 이 페이지에서 사용되는 자바스크립트 코드가 Ruffle과 충돌하는 것으로 보입니다.\\n 만약 당신이 서버 관리자라면 빈 페이지에서 파일을 로드해보세요.\\nerror-javascript-conflict-outdated = 또한 Ruffle의 최신 버전을 업로드하는 것을 시도하여 문제를 우회해볼 수 있습니다. (현재 빌드가 오래되었습니다: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle이 초기화를 시도하는 동안 중대한 문제가 발생했습니다.\\n 이 웹 서버의 CSP(Content Security Policy) 정책이 \\\".wasm\\\" 필수 구성요소를 실행하는 것을 허용하지 않습니다.\\n 만약 당신이 서버 관리자라면 Ruffle 위키를 참조하여 도움을 받아볼 수 있습니다.\\nerror-unknown =\\n Ruffle이 플래시 콘텐츠를 표시하려고 시도하는 동안 중대한 문제가 발생했습니다.\\n { $outdated ->\\n [true] 만약 당신이 서버 관리자라면, Ruffle의 최신 버전을 업로드하여 다시 시도해보세요. (현재 빌드가 오래되었습니다: { $buildDate }).\\n *[false] 이런 현상이 발생해서는 안되므로, 버그를 제보해주신다면 감사하겠습니다!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = 정말로 이 세이브 파일을 삭제하시겠습니까?\\nsave-reload-prompt =\\n \\b이 파일을 잠재적인 충돌 없이 { $action ->\\n [delete] 삭제\\n *[replace] 교체\\n }하려면 콘텐츠를 다시 로드해야 합니다. 그래도 계속하시겠습니까?\\nsave-download = 다운로드\\nsave-replace = 교체\\nsave-delete = 삭제\\nsave-backup-all = 모든 저장 파일 다운로드\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = 음소거\\nvolume-controls-unmute = 음소거 해제\\n\"\n },\n \"nl-NL\": {\n \"context_menu.ftl\": \"context-menu-download-swf = .swf downloaden\\ncontext-menu-copy-debug-info = Kopieer debuginformatie\\ncontext-menu-open-save-manager = Open opgeslagen-data-manager\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Over Ruffle Uitbreiding ({ $version })\\n *[other] Over Ruffle ({ $version })\\n }\\ncontext-menu-hide = Verberg dit menu\\ncontext-menu-exit-fullscreen = Verlaat volledig scherm\\ncontext-menu-enter-fullscreen = Naar volledig scherm\\ncontext-menu-volume-controls = Geluidsniveaus\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle kon de Flash-inhoud op de pagina niet draaien.\\n Je kan proberen het bestand in een apart tabblad te openen, om hier omheen te werken.\\npanic-title = Er ging iets mis :(\\nmore-info = Meer informatie\\nrun-anyway = Toch starten\\ncontinue = Doorgaan\\nreport-bug = Bug rapporteren\\nupdate-ruffle = Ruffle updaten\\nruffle-demo = Web Demo\\nruffle-desktop = Desktopapplicatie\\nruffle-wiki = Bekijk de Ruffle Wiki\\nenable-hardware-acceleration = Het lijkt erop dat hardwareversnelling is uitgeschakeld. Ruffle zou hierdoor erg traag kunnen zijn. In de link hieronder wordt uitgelegd hoe je hardwareversnelling kunt inschakelen:\\nenable-hardware-acceleration-link = FAQ - Chrome Hardwareversnelling\\nview-error-details = Foutdetails tonen\\nopen-in-new-tab = Openen in een nieuw tabblad\\nclick-to-unmute = Klik om te ontdempen\\nclipboard-message-title = Kopiëren en plakken in Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Je browser heeft geen ondersteuning voor volledige toegang tot het klembord,\\n [access-denied] Toegang tot het klembord werd geweigerd,\\n } maar je kunt altijd nog de volgende sneltoetsen gebruiken:\\nclipboard-message-copy = { \\\" \\\" } om te kopiëren\\nclipboard-message-cut = { \\\" \\\" } om te knippen\\nclipboard-message-paste = { \\\" \\\" } om te plakken\\nerror-file-protocol =\\n Het lijkt erop dat je Ruffle gebruikt met het \\\"file\\\" protocol.\\n De meeste browsers blokkeren dit om veiligheidsredenen, waardoor het niet werkt.\\n In plaats hiervan raden we aan om een lokale server te draaien, de web demo te gebruiken, of de desktopapplicatie.\\nerror-javascript-config =\\n Ruffle heeft een groot probleem ondervonden vanwege een onjuiste JavaScript configuratie.\\n Als je de serverbeheerder bent, kijk dan naar de foutdetails om te zien wat er verkeerd is.\\n Je kan ook in de Ruffle wiki kijken voor hulp.\\nerror-wasm-not-found =\\n Ruffle kon het vereiste \\\".wasm\\\" bestandscomponent niet laden.\\n Als je de serverbeheerder bent, controleer dan of het bestaand juist is geüpload.\\n Mocht het probleem blijven voordoen, moet je misschien de \\\"publicPath\\\" instelling gebruiken: zie ook de Ruffle wiki voor hulp.\\nerror-wasm-mime-type =\\n Ruffle heeft een groot probleem ondervonden tijdens het initialiseren.\\n Deze webserver serveert \\\".wasm\\\" bestanden niet met het juiste MIME type.\\n Als je de serverbeheerder bent, kijk dan in de Ruffle wiki voor hulp.\\nerror-invalid-swf =\\n Ruffle kon het gevraagde bestand niet verwerken.\\n Waarschijnlijk is het geen geldig SWF bestand.\\nerror-swf-fetch =\\n Ruffle kon het Flash SWF bestand niet inladen.\\n De meest waarschijnlijke reden is dat het bestand niet langer bestaat, en er dus niets is om in te laden.\\n Probeer contact op te nemen met de websitebeheerder voor hulp.\\nerror-swf-cors =\\n Ruffle kon het Flash SWD bestand niet inladen.\\n Toegang is waarschijnlijk geblokeerd door het CORS beleid.\\n Als je de serverbeheerder bent, kijk dan in de Ruffle wiki voor hulp.\\nerror-wasm-cors =\\n Ruffle kon het vereiste \\\".wasm\\\" bestandscomponent niet laden.\\n Toegang is waarschijnlijk geblokeerd door het CORS beleid.\\n Als je de serverbeheerder bent, kijk dan in de Ruffle wiki voor hulp.\\nerror-wasm-invalid =\\n Ruffle heeft een groot probleem ondervonden tijdens het initialiseren.\\n Het lijkt erop dat de Ruffle bestanden ontbreken of ongeldig zijn.\\n Als je de serverbeheerder bent, kijk dan in de Ruffle wiki voor hulp.\\nerror-wasm-download =\\n Ruffle heeft een groot probleem ondervonden tijdens het initialiseren.\\n Dit lost zichzelf vaak op als je de bladzijde opnieuw inlaadt.\\n Zo niet, neem dan contact op met de websitebeheerder.\\nerror-wasm-disabled-on-edge =\\n Ruffle kon het vereiste \\\".wasm\\\" bestandscomponent niet laden.\\n Om dit op te lossen, ga naar je browserinstellingen, klik op \\\"Privacy, zoeken en diensten\\\", scroll omlaag, en schakel \\\"Verbeter je veiligheid op he web\\\" uit.\\n Dan kan je browser wel de vereiste \\\".wasm\\\" bestanden inladen.\\n Als het probleem zich blijft voordoen, moet je misschien een andere browser gebruiken.\\nerror-javascript-conflict =\\n Ruffle heeft een groot probleem ondervonden tijdens het initialiseren.\\n Het lijkt erop dat deze pagina JavaScript code gebruikt die conflicteert met Ruffle.\\n Als je de serverbeheerder bent, raden we aan om het bestand op een lege pagina te proberen in te laden.\\nerror-javascript-conflict-outdated = Je kan ook proberen een nieuwe versie van Ruffle te installeren, om om het probleem heen te werken (huidige versie is oud: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle heeft een groot probleem ondervonden tijdens het initialiseren.\\n Het CSP-beleid staat niet toe dat het vereiste \\\".wasm\\\" component kan draaien.\\n Als je de serverbeheerder bent, kijk dan in de Ruffle wiki voor hulp.\\nerror-unknown =\\n Ruffle heeft een groot probleem onderbonden tijdens het weergeven van deze Flash-inhoud.\\n { $outdated ->\\n [true] Als je de serverbeheerder bent, upload dan een nieuwe versie van Ruffle (huidige versie is oud: { $buildDate }).\\n *[false] Dit hoort niet te gebeuren, dus we stellen het op prijs als je de fout aan ons rapporteert!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Weet je zeker dat je deze opgeslagen data wilt verwijderen?\\nsave-reload-prompt =\\n De enige manier om deze opgeslagen data te { $action ->\\n [delete] verwijderen\\n *[replace] vervangen\\n } zonder potentiële problemen is door de inhoud opnieuw te laden. Toch doorgaan?\\nsave-download = Downloaden\\nsave-replace = Vervangen\\nsave-delete = Verwijderen\\nsave-backup-all = Download alle opgeslagen data\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Dempen\\nvolume-controls-unmute = Dempen opheffen\\n\"\n },\n \"pl-PL\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Pobierz .swf\\ncontext-menu-copy-debug-info = Kopiuj informacje debugowania\\ncontext-menu-open-save-manager = Otwórz Menadżer Zapisów\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] O Rozszerzeniu Ruffle ({ $version })\\n *[other] O Ruffle ({ $version })\\n }\\ncontext-menu-hide = Ukryj to menu\\ncontext-menu-exit-fullscreen = Zamknij pełny ekran\\ncontext-menu-enter-fullscreen = Pełny ekran\\ncontext-menu-volume-controls = Sterowanie głośnością\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle nie było w stanie uruchomić zawartości Flash w tej stronie.\\n Możesz spróbować otworzyć plik w nowej karcie, aby uniknąć tego problemu.\\npanic-title = Coś poszło nie tak :(\\nmore-info = Więcej informacji\\nrun-anyway = Uruchom mimo tego\\ncontinue = Kontynuuj\\nreport-bug = Zgłoś błąd\\nupdate-ruffle = Zaktualizuj Ruffle\\nruffle-demo = Webowe demo\\nruffle-desktop = Aplikacja na komputer\\nruffle-wiki = Zobacz Wiki Ruffle\\nenable-hardware-acceleration = Wygląda na to, że akceleracja grafiki jest wyłączona. Chociaż Ruffle może działać, może być bardzo powolny. Możesz dowiedzieć się, jak włączyć akcelerację grafiki, klikając poniższy link:\\nenable-hardware-acceleration-link = FAQ — Akceleracja Grafiki Chrome\\nview-error-details = Zobacz szczegóły błędu\\nopen-in-new-tab = Otwórz w nowej karcie\\nclick-to-unmute = Kliknij aby wyłączyć wyciszenie\\nclipboard-message-title = Kopiowanie i wklejanie w Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Twoja przeglądarka nie obsługuje pełnego dostępu do schowka,\\n [access-denied] Odmówiono dostępu do schowka,\\n } ale zawsze możesz stosować te skróty klawiszowe:\\nclipboard-message-copy = { \\\" \\\" } w celu skopiowania\\nclipboard-message-cut = { \\\" \\\" } w celu wycięcia\\nclipboard-message-paste = { \\\" \\\" } w celu wklejenia\\nerror-file-protocol =\\n Wygląda na to, że używasz Ruffle z protokołem \\\"file:\\\".\\n To nie działa, ponieważ przeglądarka blokuje wiele funkcji przed działaniem ze względów bezpieczeństwa.\\n Zamiast tego zachęcamy do konfiguracji lokalnego serwera lub użycia webowego demo lub aplikacji desktopowej.\\nerror-javascript-config =\\n Ruffle napotkał poważny problem z powodu nieprawidłowej konfiguracji JavaScript.\\n Jeśli jesteś administratorem serwera, prosimy o sprawdzenie szczegółów błędu, aby dowiedzieć się, który parametr jest błędny.\\n Możesz również zapoznać się z wiki Ruffle, aby uzyskać pomoc.\\nerror-wasm-not-found =\\n Nie udało się załadować wymaganego komponentu pliku \\\".wasm\\\".\\n Jeśli jesteś administratorem serwera, upewnij się, że plik został poprawnie przesłany.\\n Jeśli problem będzie się powtarzał, być może będziesz musiał użyć ustawienia \\\"publicPath\\\": zapoznaj się z wiki Ruffle, aby uzyskać pomoc.\\nerror-wasm-mime-type =\\n Ruffle napotkał poważny problem podczas próby zainicjowania.\\n Ten serwer nie serwuje plików \\\".wasm\\\" z poprawnym typem MIME.\\n Jeśli jesteś administratorem serwera, zasięgnij pomocy na wiki Ruffle.\\nerror-invalid-swf =\\n Ruffle nie może przetworzyć żądanego pliku.\\n Prawdopodobnie to nie jest poprawny plik SWF.\\nerror-swf-fetch =\\n Nie udało się załadować pliku Flash SWF.\\n Najbardziej prawdopodobnym powodem jest to, że plik już nie istnieje, więc Ruffle nie ma co załadować.\\n Spróbuj skontaktować się z administratorem witryny, aby uzyskać pomoc.\\nerror-swf-cors =\\n Nie udało się załadować pliku Flash SWF.\\n Pobieranie zostało prawdopodobnie zablokowane przez politykę CORS.\\n Jeśli jesteś administratorem serwera, zasięgnij pomocy na wiki Ruffle.\\nerror-wasm-cors =\\n Nie udało się załadować wymaganego komponentu pliku \\\".wasm\\\".\\n Pobieranie zostało prawdopodobnie zablokowane przez politykę CORS.\\n Jeśli jesteś administratorem serwera, zasięgnij pomocy na wiki Ruffle.\\nerror-wasm-invalid =\\n Ruffle napotkał poważny problem podczas próby zainicjowania.\\n Wygląda na to, że ta strona ma brakujące lub nieprawidłowe pliki niezbędne do uruchomienia Ruffle.\\n Jeśli jesteś administratorem serwera, zasięgnij pomocy na wiki Ruffle.\\nerror-wasm-download =\\n Ruffle napotkał poważny problem podczas próby zainicjowania.\\n Ten problem często sam się rozwiązuje, więc możesz spróbować odświeżyć stronę.\\n W przeciwnym razie skontaktuj się z administratorem witryny.\\nerror-wasm-disabled-on-edge =\\n Ruffle nie udało się załadować wymaganego komponentu pliku \\\".wasm\\\".\\n Aby to naprawić, spróbuj otworzyć ustawienia przeglądarki, klikając \\\"Prywatność, wyszukiwanie i usługi\\\", przewijając w dół i wyłączając \\\"Zwiększ bezpieczeństwo w sieci\\\".\\n Pozwoli to przeglądarce załadować wymagane pliki \\\".wasm\\\".\\n Jeśli problem będzie się powtarzał, być może będziesz musiał użyć innej przeglądarki.\\nerror-javascript-conflict =\\n Ruffle napotkał poważny problem podczas próby zainicjowania.\\n Wygląda na to, że ta strona używa kodu JavaScript, który koliduje z Ruffle.\\n Jeśli jesteś administratorem serwera, zapraszamy Cię do ładowania pliku na pustej stronie.\\nerror-javascript-conflict-outdated = Możesz również spróbować przesłać nowszą wersję Ruffle, która może ominąć problem (obecna wersja jest przestarzała: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle napotkał poważny problem podczas próby zainicjowania.\\n Polityka bezpieczeństwa zawartości tego serwera (CSP) nie zezwala na komponent \\\".wasm\\\" wymagany do uruchomienia.\\n Jeśli jesteś administratorem serwera, zasięgnij pomocy na wiki Ruffle.\\nerror-unknown =\\n Ruffle napotkał poważny problem podczas próby wyświetlenia tej zawartości Flash.\\n { $outdated ->\\n [true] Jeśli jesteś administratorem serwera, spróbuj zaktualizować Ruffle (obecna wersja jest przestarzała: { $buildDate }).\\n *[false] To nie powinno się wydarzyć, więc bylibyśmy wdzięczni, gdybyś zgłosił błąd!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Czy na pewno chcesz skasować ten plik zapisu?\\nsave-reload-prompt =\\n Jedyną opcją, aby { $action ->\\n [delete] usunąć\\n *[replace] zamienić\\n } ten plik zapisu bez potencjalnych konfliktów jest przeładowanie zawartości. Czy chcesz kontynuować?\\nsave-download = Pobierz\\nsave-replace = Zamień\\nsave-delete = Usuń\\nsave-backup-all = Pobierz wszystkie pliki zapisu\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Wycisz\\nvolume-controls-unmute = Wyłącz wyciszenie\\n\"\n },\n \"pt-BR\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Baixar .swf\\ncontext-menu-copy-debug-info = Copiar informação de depuração\\ncontext-menu-open-save-manager = Abrir o Gerenciador de Salvamento\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Sobre a extensão do Ruffle ({ $version })\\n *[other] Sobre o Ruffle ({ $version })\\n }\\ncontext-menu-hide = Esconder este menu\\ncontext-menu-exit-fullscreen = Sair da tela cheia\\ncontext-menu-enter-fullscreen = Entrar em tela cheia\\ncontext-menu-volume-controls = Controles de volume\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle não conseguiu executar o Flash incorporado nesta página.\\n Você pode tentar abrir o arquivo em uma guia separada para evitar esse problema.\\npanic-title = Algo deu errado :(\\nmore-info = Mais informação\\nrun-anyway = Executar mesmo assim\\ncontinue = Continuar\\nreport-bug = Reportar Bug\\nupdate-ruffle = Atualizar Ruffle\\nruffle-demo = Demo Web\\nruffle-desktop = Aplicativo de Desktop\\nruffle-wiki = Ver Wiki do Ruffle\\nenable-hardware-acceleration = Parece que a aceleração de hardware está desabilitada. Embora o Ruffle possa funcionar, ele pode ser muito lento. Você pode descobrir como habilitar a aceleração de hardware seguindo o link abaixo:\\nview-error-details = Ver detalhes do erro\\nopen-in-new-tab = Abrir em uma nova guia\\nclick-to-unmute = Clique para ativar o som\\nclipboard-message-title = Copiando e colando no Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Seu navegador não suporta acesso total à área de transferência,\\n [access-denied] O acesso à área de transferência foi negado,\\n } mas você sempre pode usar estes atalhos:\\nclipboard-message-copy = { \\\" \\\" } para copiar\\nclipboard-message-cut = { \\\" \\\" } para recortar\\nclipboard-message-paste = { \\\" \\\" } para colar\\nerror-file-protocol =\\n Parece que você está executando o Ruffle no protocolo \\\"file:\\\".\\n Isto não funciona como navegadores bloqueiam muitos recursos de funcionar por razões de segurança.\\n Ao invés disso, convidamos você a configurar um servidor local ou a usar a demonstração da web, ou o aplicativo de desktop.\\nerror-javascript-config =\\n O Ruffle encontrou um grande problema devido a uma configuração incorreta do JavaScript.\\n Se você for o administrador do servidor, convidamos você a verificar os detalhes do erro para descobrir qual parâmetro está com falha.\\n Você também pode consultar o wiki do Ruffle para obter ajuda.\\nerror-wasm-not-found =\\n Ruffle falhou ao carregar o componente de arquivo \\\".wasm\\\" necessário.\\n Se você é o administrador do servidor, por favor, certifique-se de que o arquivo foi carregado corretamente.\\n Se o problema persistir, você pode precisar usar a configuração \\\"publicPath\\\": por favor consulte a wiki do Ruffle para obter ajuda.\\nerror-wasm-mime-type =\\n Ruffle encontrou um grande problema ao tentar inicializar.\\n Este servidor de web não está servindo \\\".wasm\\\" arquivos com o tipo MIME correto.\\n Se você é o administrador do servidor, por favor consulte o wiki do Ruffle para obter ajuda.\\nerror-invalid-swf =\\n Ruffle não pode analisar o arquivo solicitado.\\n O motivo provável é que o arquivo solicitado não seja um SWF válido.\\nerror-swf-fetch =\\n Ruffle falhou ao carregar o arquivo Flash SWF.\\n A razão provável é que o arquivo não existe mais, então não há nada para o Ruffle carregar.\\n Tente contatar o administrador do site para obter ajuda.\\nerror-swf-cors =\\n Ruffle falhou ao carregar o arquivo Flash SWF.\\n O acesso para fetch provavelmente foi bloqueado pela política CORS.\\n Se você for o administrador do servidor, consulte o wiki do Ruffle para obter ajuda.\\nerror-wasm-cors =\\n Ruffle falhou ao carregar o componente de arquivo \\\".wasm\\\" necessário.\\n O acesso para fetch foi provavelmente bloqueado pela política CORS.\\n Se você é o administrador do servidor, por favor consulte a wiki do Ruffle para obter ajuda.\\nerror-wasm-invalid =\\n Ruffle encontrou um grande problema ao tentar inicializar.\\n Parece que esta página tem arquivos ausentes ou inválidos para executar o Ruffle.\\n Se você for o administrador do servidor, consulte o wiki do Ruffle para obter ajuda.\\nerror-wasm-download =\\n O Ruffle encontrou um grande problema ao tentar inicializar.\\n Muitas vezes isso pode se resolver sozinho, então você pode tentar recarregar a página.\\n Caso contrário, contate o administrador do site.\\nerror-wasm-disabled-on-edge =\\n O Ruffle falhou ao carregar o componente de arquivo \\\".wasm\\\" necessário.\\n Para corrigir isso, tente abrir configurações do seu navegador, clicando em \\\"Privacidade, pesquisa e serviços\\\", rolando para baixo e desativando \\\"Melhore sua segurança na web\\\".\\n Isso permitirá que seu navegador carregue os arquivos \\\".wasm\\\" necessários.\\n Se o problema persistir, talvez seja necessário usar um navegador diferente.\\nerror-javascript-conflict =\\n Ruffle encontrou um grande problema ao tentar inicializar.\\n Parece que esta página usa código JavaScript que entra em conflito com o Ruffle.\\n Se você for o administrador do servidor, convidamos você a tentar carregar o arquivo em uma página em branco.\\nerror-javascript-conflict-outdated = Você também pode tentar fazer o upload de uma versão mais recente do Ruffle que pode contornar o problema (a compilação atual está desatualizada: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle encontrou um grande problema ao tentar inicializar.\\n A política de segurança de conteúdo deste servidor da web não permite a execução do componente \\\".wasm\\\" necessário.\\n Se você for o administrador do servidor, consulte o wiki do Ruffle para obter ajuda.\\nerror-unknown =\\n O Ruffle encontrou um grande problema enquanto tentava exibir este conteúdo em Flash.\\n { $outdated ->\\n [true] Se você é o administrador do servidor, por favor tente fazer o upload de uma versão mais recente do Ruffle (a compilação atual está desatualizada: { $buildDate }).\\n *[false] Isso não deveria acontecer, então apreciaríamos muito se você pudesse arquivar um bug!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Tem certeza que deseja excluir este arquivo de salvamento?\\nsave-reload-prompt =\\n A única maneira de { $action ->\\n [delete] excluir\\n *[replace] substituir\\n } este arquivo sem potencial conflito é recarregar este conteúdo. Deseja continuar mesmo assim?\\nsave-download = Baixar\\nsave-replace = Substituir\\nsave-delete = Excluir\\nsave-backup-all = Baixar todos os arquivos de salvamento\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Silenciar\\nvolume-controls-unmute = Ativar som\\n\"\n },\n \"pt-PT\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Descarga.swf\\ncontext-menu-copy-debug-info = Copiar informações de depuração\\ncontext-menu-open-save-manager = Abrir Gestor de Gravações\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Sobre a extensão do Ruffle ({ $version })\\n *[other] Sobre o Ruffle ({ $version })\\n }\\ncontext-menu-hide = Esconder este menu\\ncontext-menu-exit-fullscreen = Fechar Ecrã Inteiro\\ncontext-menu-enter-fullscreen = Abrir Ecrã Inteiro\\ncontext-menu-volume-controls = Controlos de volume\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n O Ruffle não conseguiu abrir o Flash integrado nesta página.\\n Para tentar resolver o problema, pode abrir o ficheiro num novo separador.\\npanic-title = Algo correu mal :(\\nmore-info = Mais informações\\nrun-anyway = Executar mesmo assim\\ncontinue = Continuar\\nreport-bug = Reportar falha\\nupdate-ruffle = Atualizar o Ruffle\\nruffle-demo = Demonstração na Web\\nruffle-desktop = Aplicação para Desktop\\nruffle-wiki = Ver a Wiki do Ruffle\\nenable-hardware-acceleration = Parece que a aceleração de hardware está desativada. Mesmo que o Ruffle funcione, pode estar excessivamente lento. Descubra como ativar a aceleração de hardware seguindo este link:\\nenable-hardware-acceleration-link = Perguntas Frequentes - Aceleração de Hardware no Chrome\\nview-error-details = Ver detalhes do erro\\nopen-in-new-tab = Abrir num novo separador\\nclick-to-unmute = Clique para ativar o som\\nclipboard-message-title = Copiar e colar no Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] O seu navegador não suporta acesso total à área de transferência,\\n [access-denied] O acesso à área de transferência foi negado,\\n } mas pode sempre usar estes atalhos em alternativa:\\nclipboard-message-copy = { \\\" \\\" } para copiar\\nclipboard-message-cut = { \\\" \\\" } para cortar\\nclipboard-message-paste = { \\\" \\\" } para colar\\nerror-file-protocol =\\n Parece que executa o Ruffle no protocolo \\\"file:\\\".\\n Isto não funciona, já que os navegadores bloqueiam muitas funcionalidades por razões de segurança.\\n Em vez disto, recomendados configurar um servidor local ou usar a demonstração na web, ou a aplicação para desktop.\\nerror-javascript-config =\\n O Ruffle encontrou um problema maior devido a uma configuração de JavaScript incorreta.\\n Se é o administrador do servidor, convidamo-lo a verificar os detalhes do erro para descobrir o parâmetro problemático.\\n Pode ainda consultar a wiki do Ruffle para obter ajuda.\\nerror-wasm-not-found =\\n O Ruffle falhou ao carregar o componente de ficheiro \\\".wasm\\\" necessário.\\n Se é o administrador do servidor, por favor certifique-se de que o ficheiro foi devidamente carregado.\\n Se o problema persistir, poderá querer usar a configuração \\\"publicPath\\\": consulte a wiki do Ruffle para obter ajuda.\\nerror-wasm-mime-type =\\n O Ruffle encontrou um problema maior ao tentar inicializar.\\n Este servidor de web não suporta ficheiros \\\".wasm\\\" com o tipo MIME correto.\\n Se é o administrador do servidor, por favor consulte o wiki do Ruffle para obter ajuda.\\nerror-invalid-swf =\\n O Ruffle não consegue analisar o ficheiro solicitado.\\n O motivo provável é que o ficheiro solicitado não seja um SWF válido.\\nerror-swf-fetch =\\n Ruffle falhou ao carregar o arquivo SWF do Flash\\n A razão mais provável é que o arquivo não existe mais, então não há nada para o Ruffle carregar.\\n Tente contactar o administrador do site para obter ajuda.\\nerror-swf-cors =\\n O Ruffle falhou ao carregar o ficheiro Flash SWF.\\n Acesso a buscar foi provavelmente bloqueado pela política de CORS.\\n Se é o administrador do servidor, por favor consulte a wiki do Ruffle para obter ajuda.\\nerror-wasm-cors =\\n O Ruffle falhou ao carregar o componente de ficheiro \\\".wasm\\\" necessário.\\n O acesso a buscar foi provavelmente bloqueado pela política CORS.\\n Se é o administrador do servidor, por favor consulte a wiki do Ruffle para obter ajuda.\\nerror-wasm-invalid =\\n Ruffle encontrou um grande problema ao tentar inicializar.\\n Parece que esta página está ausente ou arquivos inválidos para executar o Ruffle.\\n Se você é o administrador do servidor, por favor consulte a wiki do Ruffle para obter ajuda.\\nerror-wasm-download =\\n O Ruffle encontrou um problema maior ao tentar inicializar.\\n Isto frequentemente resolve-se sozinho, portanto experimente recarregar a página.\\n Caso contrário, por favor contacte o administrador do site.\\nerror-wasm-disabled-on-edge =\\n O Ruffle falhou ao carregar o componente de ficheiro \\\".wasm\\\" necessário.\\n Para corrigir isso, tente abrir as opções do seu navegador, clicando em \\\"Privacidade, pesquisa e serviços\\\", rolando para baixo e desativando \\\"Melhore a sua segurança na web\\\".\\n Isto permitirá ao seu navegador carregar os ficheiros \\\".wasm\\\" necessários.\\n Se o problema persistir, talvez seja necessário usar um navegador diferente.\\nerror-javascript-conflict =\\n O Ruffle encontrou um problema maior ao tentar inicializar.\\n Parece que esta página usa código JavaScript que entra em conflito com o Ruffle.\\n Se é o administrador do servidor, convidamo-lo a tentar carregar o ficheiro em numa página em branco.\\nerror-javascript-conflict-outdated = Pode ainda tentar carregar uma versão mais recente do Ruffle que talvez contorne o problema (a compilação atual está desatualizada: { $buildDate }).\\nerror-csp-conflict =\\n O Ruffle encontrou um problema maior ao tentar inicializar.\\n A Política de Segurança de Conteúdo deste servidor não permite que o componente \\\".wasm\\\" necessário seja executado.\\n Se é o administrador do servidor, por favor consulte o wiki do Ruffle para obter ajuda.\\nerror-unknown =\\n O Ruffle encontrou um problema maior enquanto tentava mostrar este conteúdo em Flash.\\n { $outdated ->\\n [true] Se é o administrador do servidor, por favor tente carregar uma versão mais recente do Ruffle (a compilação atual está desatualizada: { $buildDate }).\\n *[false] Não era suposto isto ter acontecido, por isso agradeceríamos muito se pudesse reportar a falha!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Tem a certeza de que quer apagar esta gravação?\\nsave-reload-prompt =\\n A única forma de { $action ->\\n [delete] apagar\\n *[replace] substituir\\n } esta gravação sem um potencial conflito é recarregar este conteúdo. Deseja continuar mesmo assim?\\nsave-download = Descarregar\\nsave-replace = Substituir\\nsave-delete = Apagar\\nsave-backup-all = Descarregar todas as gravações\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Silenciar\\nvolume-controls-unmute = Ativar o som\\n\"\n },\n \"ro-RO\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Descarcă .swf\\ncontext-menu-copy-debug-info = Copiază informațiile de depanare\\ncontext-menu-open-save-manager = Deschide managerul de salvări\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Despre extensia Ruffle ({ $version })\\n *[other] Despre Ruffle ({ $version })\\n }\\ncontext-menu-hide = Ascunde acest meniu\\ncontext-menu-exit-fullscreen = Ieși din ecranul complet\\ncontext-menu-enter-fullscreen = Intră în ecran complet\\ncontext-menu-volume-controls = Comenzi pentru volum\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle nu a putut să ruleze Flash încorporat în această pagină.\\n Poți încerca să deschizi fișierul într-o filă separată, pentru a evita această problemă.\\npanic-title = Ceva a mers prost :(\\nmore-info = Mai multe informații\\nrun-anyway = Rulează oricum\\ncontinue = Continuă\\nreport-bug = Raportează un bug\\nupdate-ruffle = Actualizează Ruffle\\nruffle-demo = Demo web\\nruffle-desktop = Aplicație desktop\\nruffle-wiki = Vezi wikiul Ruffle\\nview-error-details = Vezi detaliile erorii\\nopen-in-new-tab = Deschide într-o filă nouă\\nclick-to-unmute = Dă click pentru a dezmuți\\nerror-file-protocol =\\n Se pare că rulezi Ruffle pe protocolul „file:”.\\n Acesta nu funcționează, deoarece browserele blochează funcționarea multor funcții din motive de securitate.\\n În schimb, te invităm să configurezi un server local sau să folosești fie demoul web, fie aplicația desktop.\\nerror-javascript-config =\\n Ruffle a întâmpinat o problemă majoră din cauza unei configurări incorecte a JavaScript.\\n Dacă ești administratorul serverului, te invităm să verifici detaliile erorii pentru a afla care parametru este defect.\\n De asemenea, poți consulta wikiul Ruffle pentru ajutor.\\nerror-wasm-not-found =\\n Ruffle a eșuat la încărcarea componentei de fișier „.wasm”.\\n Dacă ești administratorul serverului, te rugăm să te asiguri că fișierul a fost încărcat corect.\\n Dacă problema persistă, poate fi necesar să folosești setarea „publicPath”: te rugăm să consulți wikiul Ruffle pentru ajutor.\\nerror-wasm-mime-type =\\n Ruffle a întâmpinat o problemă majoră în timp ce încerca să se inițializeze.\\n Acest server web nu servește fișiere „.wasm” cu tipul MIME corect.\\n Dacă ești administratorul serverului, te rugăm să consulți wikiul Ruffle pentru ajutor.\\nerror-swf-fetch =\\n Ruffle a eșuat la încărcarea fișierului SWF.\\n Motivul cel mai probabil este că fișierul nu mai există, deci Ruffle nu mai are ce să încarce.\\n Încearcă să contactezi administratorul site-ului web pentru ajutor.\\nerror-swf-cors =\\n Ruffle a eșuat la încărcarea fișierului SWF.\\n Accesul de preluare a fost probabil blocat de politica CORS.\\n Dacă ești administratorul serverului, te rugăm să consulți wikiul Ruffle pentru ajutor.\\nerror-wasm-cors =\\n Ruffle a eșuat la încărcarea componentei de fișier „.wasm”.\\n Accesul de preluare a fost probabil blocat de politica CORS.\\n Dacă ești administratorul serverului, te rugăm să consulți wikiul Ruffle pentru ajutor.\\nerror-wasm-invalid =\\n Ruffle a întâmpinat o problemă majoră în timp ce încerca să se inițializeze.\\n Se pare că această pagină are fișiere lipsă sau nevalide pentru a rula Ruffle.\\n Dacă ești administratorul serverului, te rugăm să consulți wikiul Ruffle pentru ajutor.\\nerror-wasm-download =\\n Ruffle a întâmpinat o problemă majoră în timp ce încerca să inițializeze.\\n Acest lucru se poate rezolva adesea de la sine, așa că poți încerca să reîncarci pagina.\\n În caz contrar, te rugăm să contactezi administratorul site-ului web.\\nerror-wasm-disabled-on-edge =\\n Ruffle a eșuat la încărcarea componentei de fișier „.wasm”.\\n Pentru a remedia acest lucru, încearcă să deschizi setările browserului, să faci clic pe „Confidențialitate, căutare și servicii”, să derulezi în jos și să dezactivezi „Îmbunătățiți-vă securitatea pe web”.\\n Acest lucru va permite browserului să încarce fișierele „.wasm” necesare.\\n Dacă problema persistă, este posibil să trebuiască să folosești un alt browser.\\nerror-javascript-conflict =\\n Ruffle a întâmpinat o problemă majoră în timp ce încerca să se inițializeze.\\n Se pare că această pagină folosește cod JavaScript care intră în conflict cu Ruffle.\\n Dacă ești administratorul serverului, te invităm să încerci încărcarea fișierului pe o pagină goală.\\nerror-javascript-conflict-outdated = De asemenea, poți încerca să încarci o versiune mai recentă de Ruffle care ar putea ocoli problema (versiunea actuală este învechită: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle a întâmpinat o problemă majoră în timp ce încerca să se inițializeze.\\n Politica de securitate a conținutului a acestui server web nu permite rularea componentei „.wasm” necesare.\\n Dacă ești administratorul serverului, te rugăm să consulți wikiul Ruffle pentru ajutor.\\nerror-unknown =\\n Ruffle a întâmpinat o problemă majoră în timp ce încerca să afișeze acest conținut Flash.\\n { $outdated ->\\n [true] Dacă ești administratorul serverului, te rugăm să încerci să încarci o versiune mai recentă de Ruffle (versiunea actuală este învechită: { $buildDate }).\\n *[false] Acest lucru nu ar trebui să se întâmple, așa că am aprecia foarte mult dacă ai putea trimite un bug!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Sigur vrei să ștergi acest fișier de salvare?\\nsave-reload-prompt =\\n Singura cale de a { $action ->\\n [delete] șterge\\n *[replace] înlocui\\n } acest fișier de salvare fără un conflict potențial este de a reîncărca acest conținut. Dorești să continui oricum?\\nsave-download = Descarcă\\nsave-replace = Înlocuiește\\nsave-delete = Șterge\\n\",\n \"volume-controls.ftl\": \"\"\n },\n \"ru-RU\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Скачать .swf\\ncontext-menu-copy-debug-info = Копировать отладочную информацию\\ncontext-menu-open-save-manager = Менеджер сохранений\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] О расширении Ruffle ({ $version })\\n *[other] О Ruffle ({ $version })\\n }\\ncontext-menu-hide = Скрыть это меню\\ncontext-menu-exit-fullscreen = Оконный режим\\ncontext-menu-enter-fullscreen = Полноэкранный режим\\ncontext-menu-volume-controls = Громкость\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle не смог запустить Flash, используемый на этой странице.\\n Чтобы обойти эту проблему, вы можете попробовать открыть файл в отдельной вкладке.\\npanic-title = Что-то пошло не так :(\\nmore-info = Подробнее\\nrun-anyway = Всё равно запустить\\ncontinue = Продолжить\\nreport-bug = Сообщить об ошибке\\nupdate-ruffle = Обновить Ruffle\\nruffle-demo = Веб-демо\\nruffle-desktop = Настольное приложение\\nruffle-wiki = Открыть вики Ruffle\\nenable-hardware-acceleration = Похоже, что аппаратное ускорение отключено. Хотя Ruffle может работать, но он может быть очень медленным. Вы можете узнать, как включить аппаратное ускорение, перейдя по ссылке ниже:\\nenable-hardware-acceleration-link = FAQ - Аппаратное ускорение Chrome\\nview-error-details = Сведения об ошибке\\nopen-in-new-tab = Открыть в новой вкладке\\nclick-to-unmute = Включить звук\\nclipboard-message-title = Копирование и вставка в Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Ваш браузер не поддерживает полный доступ к буферу обмена.\\n [access-denied] Доступ к буферу обмена был отклонён.\\n } Используйте сочетания клавиш для вырезания, копирования и вставки:\\nclipboard-message-copy = { \\\" \\\" } копировать\\nclipboard-message-cut = { \\\" \\\" } вырезать\\nclipboard-message-paste = { \\\" \\\" } вставить\\nerror-file-protocol =\\n Похоже, что вы запускаете Ruffle по протоколу \\\"file:\\\".\\n Это не работает, поскольку браузеры блокируют работу многих функций по соображениям безопасности.\\n Вместо этого мы предлагаем вам использовать настольное приложение, веб-демо или настроить локальный сервер.\\nerror-javascript-config =\\n Возникла серьёзная ошибка из-за неправильной конфигурации JavaScript.\\n Если вы являетесь администратором сервера, мы предлагаем вам проверить детали ошибки, чтобы выяснить, какой параметр дал сбой.\\n Вы также можете обратиться за помощью к вики Ruffle.\\nerror-wasm-not-found =\\n Ruffle не удалось запустить необходимый компонент файла \\\".wasm\\\".\\n Если вы администратор сервера, пожалуйста, убедитесь, что файл был загружен правильно.\\n Если проблема не устраняется, вам может потребоваться использовать настройку \\\"publicPath\\\": обратитесь к вики Ruffle.\\nerror-wasm-mime-type =\\n Ruffle столкнулся с серьёзной проблемой во время инициализации.\\n Этот веб-сервер не предоставляет файлы \\\".wasm\\\" с правильным типом MIME.\\n Если вы администратор сервера, обратитесь за помощью к вики Ruffle.\\nerror-invalid-swf =\\n Ruffle не удалось обработать запрашиваемый файл.\\n Вероятнее всего, данный SWF повреждён или не является таковым.\\nerror-swf-fetch =\\n Ruffle не удалось запустить SWF-файл Flash.\\n Вероятнее всего, файл больше не существует, поэтому Ruffle нечего загружать.\\n Попробуйте связаться с администратором сайта для получения помощи.\\nerror-swf-cors =\\n Ruffle не удалось запустить SWF-файл Flash.\\n Скорее всего, доступ к файлу был заблокирован политикой CORS.\\n Если вы администратор сервера, обратитесь за помощью к вики Ruffle.\\nerror-wasm-cors =\\n Ruffle не удалось загрузить необходимый компонент файла \\\".wasm\\\".\\n Скорее всего, доступ к файлу был заблокирован политикой CORS.\\n Если вы администратор сервера, обратитесь за помощью к вики Ruffle.\\nerror-wasm-invalid =\\n Ruffle столкнулся с серьёзной проблемой во время инициализации.\\n Похоже, что на этой странице отсутствуют файлы для запуска Ruffle или они недействительны.\\n Если вы администратор сервера, обратитесь за помощью к вики Ruffle.\\nerror-wasm-download =\\n Ruffle столкнулся с серьёзной проблемой во время инициализации.\\n Чаще всего эта проблема устраняется сама собою, поэтому вы можете просто перезагрузить страницу.\\n Если ошибка продолжает появляться, свяжитесь с администратором сайта.\\nerror-wasm-disabled-on-edge =\\n Ruffle не удалось загрузить необходимый компонент файла \\\".wasm\\\".\\n Чтобы исправить эту ошибку, попробуйте отключить в настройках браузера дополнительную конфиденциальность. Это позволит браузеру загрузить необходимые WASM-файлы.\\n Если проблема осталась, вам может потребоваться другой браузер.\\nerror-javascript-conflict =\\n Ruffle столкнулся с серьёзной проблемой во время инициализации.\\n Похоже, что эта страница использует конфликтующий с Ruffle код JavaScript.\\n Если вы являетесь администратором сервера, мы предлагаем вам попробовать запустить файл на пустой странице.\\nerror-javascript-conflict-outdated = Вы также можете попробовать загрузить последнюю версию Ruffle, которая может обойти проблему (текущая версия устарела: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle столкнулся с серьёзной проблемой во время инициализации.\\n Политика безопасности содержимого этого веб-сервера не позволяет использовать требуемые компоненты для запуска \\\".wasm\\\".\\n Если вы являетесь администратором сервера, обратитесь за помощью к вики Ruffle.\\nerror-unknown =\\n Ruffle столкнулся с серьёзной проблемой при попытке отобразить этот Flash-контент.\\n { $outdated ->\\n [true] Если вы администратор сервера, попробуйте загрузить более новую версию Ruffle (текущая версия устарела: { $buildDate }).\\n *[false] Этого не должно происходить, поэтому мы будем очень признательны, если вы сообщите нам об ошибке!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Удалить этот файл сохранения?\\nsave-reload-prompt =\\n Единственный способ { $action ->\\n [delete] удалить\\n *[replace] заменить\\n } этот файл сохранения без потенциального конфликта – перезапустить запущенный контент. Всё равно продолжить?\\nsave-download = Скачать\\nsave-replace = Заменить\\nsave-delete = Удалить\\nsave-backup-all = Скачать все сохранения\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Без звука\\nvolume-controls-unmute = Включить звук\\n\"\n },\n \"sk-SK\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Stiahnuť .swf\\ncontext-menu-copy-debug-info = Skopírovať debug info\\ncontext-menu-open-save-manager = Otvoriť správcu uložení\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] O Ruffle rozšírení ({ $version })\\n *[other] O Ruffle ({ $version })\\n }\\ncontext-menu-hide = Skryť menu\\ncontext-menu-exit-fullscreen = Ukončiť režim celej obrazovky\\ncontext-menu-enter-fullscreen = Prejsť do režimu celej obrazovky\\ncontext-menu-volume-controls = Ovládanie hlasitosti\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle nemohol spustiť Flash vložený na tejto stránke.\\n Môžete sa pokúsiť otvoriť súbor na samostatnej karte, aby ste sa vyhli tomuto problému.\\npanic-title = Niečo sa pokazilo :(\\nmore-info = Viac informácií\\nrun-anyway = Spustiť aj tak\\ncontinue = Pokračovať\\nreport-bug = Nahlásiť chybu\\nupdate-ruffle = Aktualizovať Ruffle\\nruffle-demo = Web Demo\\nruffle-desktop = Desktopová aplikácia\\nruffle-wiki = Zobraziť Ruffle Wiki\\nenable-hardware-acceleration = Zdá sa, že hardvérová akcelerácia je vypnutá. Aj keď Ruffle funguje správne, môže byť neprimerane pomalý. Ako povoliť hardvérovú akceleráciu zistíte na tomto odkaze:\\nenable-hardware-acceleration-link = Časté otázky - Hardvérová akcelerácia Chrome\\nview-error-details = Zobraziť podrobnosti o chybe\\nopen-in-new-tab = Otvoriť na novej karte\\nclick-to-unmute = Kliknutím zapnete zvuk\\nclipboard-message-title = Kopírovanie a vkladanie v Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Váš prehliadač nepodporuje plný prístup k schránke,\\n [access-denied] Prístup k schránke bol odmietnutý,\\n } ale namiesto toho môžete vždy použiť tieto skratky:\\nclipboard-message-copy = { \\\" \\\" } pre kopírovanie\\nclipboard-message-cut = { \\\" \\\" } pre vystrihovanie\\nclipboard-message-paste = { \\\" \\\" } pre vloženie\\nerror-file-protocol =\\n Zdá sa, že používate Ruffle na protokole \\\"file:\\\".\\n To nie je možné, pretože prehliadače blokujú fungovanie mnohých funkcií z bezpečnostných dôvodov.\\n Namiesto toho vám odporúčame nastaviť lokálny server alebo použiť web demo či desktopovú aplikáciu.\\nerror-javascript-config =\\n Ruffle narazil na problém v dôsledku nesprávnej konfigurácie JavaScriptu.\\n Ak ste správcom servera, odporúčame vám skontrolovať podrobnosti o chybe, aby ste zistili, ktorý parameter je chybný.\\n Pomoc môžete získať aj na wiki Ruffle.\\nerror-wasm-not-found =\\n Ruffle sa nepodarilo načítať požadovaný komponent súboru „.wasm“.\\n Ak ste správcom servera, skontrolujte, či bol súbor správne nahraný.\\n Ak problém pretrváva, možno budete musieť použiť nastavenie „publicPath“: pomoc nájdete na wiki Ruffle.\\nerror-wasm-mime-type =\\n Ruffle narazil na problém pri pokuse o inicializáciu.\\n Tento webový server neposkytuje súbory „.wasm“ so správnym typom MIME.\\n Ak ste správcom servera, pomoc nájdete na Ruffle wiki.\\nerror-invalid-swf =\\n Ruffle nemôže spracovať požadovaný súbor.\\n Najpravdepodobnejším dôvodom je, že požadovaný súbor nie je platným súborom SWF.\\nerror-swf-fetch =\\n Ruffle sa nepodarilo načítať SWF súbor Flash.\\n Najpravdepodobnejším dôvodom je, že súbor už neexistuje, takže Ruffle nemá čo načítať.\\n Skúste požiadať o pomoc správcu webovej lokality.\\nerror-swf-cors =\\n Ruffle sa nepodarilo načítať SWF súbor Flash.\\n Prístup k načítaniu bol pravdepodobne zablokovaný politikou CORS.\\n Ak ste správcom servera, pomoc nájdete na Ruffle wiki.\\nerror-wasm-cors =\\n Ruffle sa nepodarilo načítať požadovaný komponent súboru „.wasm“.\\n Prístup k načítaniu bol pravdepodobne zablokovaný politikou CORS.\\n Ak ste správcom servera, pomoc nájdete na Ruffle wiki.\\nerror-wasm-invalid =\\n Ruffle narazil na problém pri pokuse o inicializáciu.\\n Zdá sa, že na tejto stránke chýbajú alebo sú neplatné súbory na spustenie Ruffle.\\n Ak ste správcom servera, pomoc nájdete na Ruffle wiki.\\nerror-wasm-download =\\n Ruffle narazil na problém pri pokuse o inicializáciu.\\n Problém sa môže vyriešiť aj sám, takže môžete skúsiť stránku načítať znova.\\n V opačnom prípade kontaktujte administrátora stránky.\\nerror-wasm-disabled-on-edge =\\n Ruffle sa nepodarilo načítať požadovaný komponent súboru „.wasm“.\\n Ak chcete tento problém vyriešiť, skúste otvoriť nastavenia prehliadača, kliknite na položku „Ochrana osobných údajov, vyhľadávanie a služby“, prejdite nadol a vypnite možnosť „Zvýšte svoju bezpečnosť na webe“.\\n Vášmu prehliadaču to umožní načítať požadované súbory „.wasm“.\\n Ak problém pretrváva, možno budete musieť použiť iný prehliadač.\\nerror-javascript-conflict =\\n Ruffle narazil na problém pri pokuse o inicializáciu.\\n Zdá sa, že táto stránka používa kód JavaScript, ktorý je v konflikte s Ruffle.\\n Ak ste správcom servera, odporúčame vám skúsiť načítať súbor na prázdnu stránku.\\nerror-javascript-conflict-outdated = Môžete sa tiež pokúsiť nahrať novšiu verziu Ruffle, ktorá môže daný problém vyriešiť (aktuálny build je zastaraný: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle narazil na problém pri pokuse o inicializáciu.\\n Zásady zabezpečenia obsahu tohto webového servera nepovoľujú spustenie požadovaného komponentu „.wasm“.\\n Ak ste správcom servera, pomoc nájdete na Ruffle wiki.\\nerror-unknown =\\n Ruffle narazil na problém pri pokuse zobraziť tento Flash obsah.\\n { $outdated ->\\n [true] Ak ste správcom servera, skúste nahrať novšiu verziu Ruffle (aktuálny build je zastaraný: { $buildDate }).\\n *[false] Toto by sa nemalo stať, takže by sme naozaj ocenili, keby ste mohli nahlásiť chybu!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Naozaj chcete odstrániť tento súbor s uloženými pozíciami?\\nsave-reload-prompt =\\n Jediný spôsob, ako { $action ->\\n [delete] vymazať\\n *[replace] nahradiť\\n } tento súbor s uloženými pozíciami bez potenciálneho konfliktu je opätovné načítanie tohto obsahu. Chcete napriek tomu pokračovať?\\nsave-download = Stiahnuť\\nsave-replace = Nahradiť\\nsave-delete = Vymazať\\nsave-backup-all = Stiahnuť všetky súbory s uloženými pozíciami\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Stlmiť\\nvolume-controls-unmute = Zrušiť stlmenie\\n\"\n },\n \"sv-SE\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Ladda ner .swf\\ncontext-menu-copy-debug-info = Kopiera felsökningsinfo\\ncontext-menu-open-save-manager = Öppna Sparhanteraren\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Om Ruffle-tillägget ({ $version })\\n *[other] Om Ruffle ({ $version })\\n }\\ncontext-menu-hide = Dölj denna meny\\ncontext-menu-exit-fullscreen = Avsluta helskärm\\ncontext-menu-enter-fullscreen = Helskärm\\ncontext-menu-volume-controls = Ljudkontroller\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle kunde inte köra det inbäddade Flashinnehållet på denna sida.\\n Du kan försöka öppna filen i en separat flik för att kringgå problemet.\\npanic-title = Något gick fel :(\\nmore-info = Mer info\\nrun-anyway = Kör ändå\\ncontinue = Fortsätt\\nreport-bug = Rapportera Bugg\\nupdate-ruffle = Uppdatera Ruffle\\nruffle-demo = Webbdemo\\nruffle-desktop = Skrivbordsprogram\\nruffle-wiki = Se Ruffle-wiki\\nenable-hardware-acceleration = Det ser ut som att hårdvaruacceleration är avstängt. På grund av det kan Ruffle fungera långsamt. Du kan ta reda på hur man sätter på hårdvaruacceleration genom länken nedan:\\nenable-hardware-acceleration-link = FAQ - Chrome Hårdvaruacceleration\\nview-error-details = Visa Felinformation\\nopen-in-new-tab = Öppna i en ny flik\\nclick-to-unmute = Klicka för ljud\\nclipboard-message-title = Kopierar och klistrar in i Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Din webbläsare har inte fullständig åtkomst till urklipp,\\n [access-denied] Urklippsåtkomst har nekats,\\n } men du kan använda dom här kortkommandon istället:\\nclipboard-message-copy = { \\\" \\\" } för att kopiera\\nclipboard-message-cut = { \\\" \\\" } för att klippa\\nclipboard-message-paste = { \\\" \\\" } för att klistra in\\nerror-file-protocol =\\n Det verkar som att du kör Ruffle på \\\"fil:\\\"-protokollet.\\n Detta fungerar inte eftersom webbläsare blockerar många funktioner från att fungera av säkerhetsskäl.\\n Istället bjuder vi in dig att sätta upp en lokal server eller antingen använda webbdemon eller skrivbordsprogrammet.\\nerror-javascript-config =\\n Ruffle har stött på ett stort fel på grund av en felaktig JavaScript-konfiguration.\\n Om du är serveradministratören bjuder vi in dig att kontrollera feldetaljerna för att ta reda på vilken parameter som är felaktig.\\n Du kan också konsultera Ruffle-wikin för hjälp.\\nerror-wasm-not-found =\\n Ruffle misslyckades ladda \\\".wasm\\\"-filkomponenten.\\n Om du är serveradministratören se till att filen har laddats upp korrekt.\\n Om problemet kvarstår kan du behöva använda inställningen \\\"publicPath\\\": konsultera vänligen Ruffle-wikin för hjälp.\\nerror-wasm-mime-type =\\n Ruffle har stött på ett stort fel under initialiseringen.\\n Denna webbserver serverar inte \\\".wasm\\\"-filer med korrekt MIME-typ.\\n Om du är serveradministratören konsultera vänligen Ruffle-wikin för hjälp.\\nerror-invalid-swf =\\n Ruffle kan inte läsa den begärda filen.\\n Det mest sannolika skälet är att den begärda filen inte är en giltig SWF.\\nerror-swf-fetch =\\n Ruffle misslyckades ladda SWF-filen.\\n Det mest sannolika skälet är att filen inte längre existerar, så det finns inget för Ruffle att köra.\\n Försök att kontakta webbplatsadministratören för hjälp.\\nerror-swf-cors =\\n Ruffle misslyckades ladda SWF-filen.\\n Åtkomst att hämta har sannolikt blockerats av CORS-policy.\\n Om du är serveradministratören konsultera vänligen Ruffle-wikin för hjälp.\\nerror-wasm-cors =\\n Ruffle misslyckades ladda \\\".wasm\\\"-filkomponenten.\\n Åtkomst att hämta har sannolikt blockerats av CORS-policy.\\n Om du är serveradministratören konsultera vänligen Ruffle-wikin för hjälp.\\nerror-wasm-invalid =\\n Ruffle har stött på ett stort fel under initialiseringen.\\n Det verkar som att den här sidan har saknade eller ogiltiga filer för att köra Ruffle.\\n Om du är serveradministratören konsultera vänligen Ruffle-wikin för hjälp.\\nerror-wasm-download =\\n Ruffle har stött på ett stort fel under initialiseringen.\\n Detta kan ofta lösas av sig själv så du kan prova att ladda om sidan.\\n Kontakta annars vänligen webbplatsens administratör.\\nerror-wasm-disabled-on-edge =\\n Ruffle misslyckades ladda \\\".wasm\\\"-filkomponenten.\\n För att åtgärda detta försök att öppna webbläsarens inställningar, klicka på \\\"Sekretess, sökning och tjänster\\\", bläddra ner och stäng av \\\"Förbättra säkerheten på webben\\\".\\n Detta tillåter din webbläsare att ladda \\\".wasm\\\"-filerna.\\n Om problemet kvarstår kan du behöva använda en annan webbläsare.\\nerror-javascript-conflict =\\n Ruffle har stött på ett stort fel under initialiseringen.\\n Det verkar som att den här sidan använder JavaScript-kod som stör Ruffle.\\n Om du är serveradministratören bjuder vi in dig att försöka köra filen på en blank sida.\\nerror-javascript-conflict-outdated = Du kan också försöka ladda upp en nyare version av Ruffle, vilket kan kringgå problemet (nuvarande version är utdaterad: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle har stött på ett stort fel under initialiseringen.\\n Webbserverns Content Security Policy tillåter inte \\\".wasm\\\"-komponenten att köra.\\n Om du är serveradministratören konsultera vänligen Ruffle-wikin för hjälp.\\nerror-unknown =\\n Ruffle har stött på ett stort fel medan den försökte visa Flashinnehållet.\\n { $outdated ->\\n [true] Om du är serveradministratören försök att ladda upp en nyare version av Ruffle (nuvarande version är utdaterad: { $buildDate }).\\n *[false] Detta är inte tänkt att hända så vi skulle verkligen uppskatta om du kunde rapportera in en bugg!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Är du säker på att du vill radera sparfilen?\\nsave-reload-prompt =\\n Det enda sättet att { $action ->\\n [delete] radera\\n *[replace] ersätta\\n } denna sparfil utan potentiell konflikt är att ladda om innehållet. Vill du fortsätta ändå?\\nsave-download = Ladda ner\\nsave-replace = Ersätt\\nsave-delete = Radera\\nsave-backup-all = Ladda ner alla sparfiler\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Stäng av ljud\\n\"\n },\n \"tr-TR\": {\n \"context_menu.ftl\": \"context-menu-download-swf = İndir .swf\\ncontext-menu-copy-debug-info = Hata ayıklama bilgisini kopyala\\ncontext-menu-open-save-manager = Kayıt Yöneticisini Aç\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Ruffle Uzantısı Hakkında ({ $version })\\n *[other] Ruffle Hakkında ({ $version })\\n }\\ncontext-menu-hide = Bu menüyü gizle\\ncontext-menu-exit-fullscreen = Tam ekrandan çık\\ncontext-menu-enter-fullscreen = Tam ekran yap\\ncontext-menu-volume-controls = Ses kontrolleri\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle, bu sayfaya gömülü Flash'ı çalıştıramadı.\\n Bu sorunu ortadan kaldırmak için dosyayı ayrı bir sekmede açmayı deneyebilirsiniz.\\npanic-title = Bir şeyler yanlış gitti :(\\nmore-info = Daha fazla bilgi\\nrun-anyway = Yine de çalıştır\\ncontinue = Devam et\\nreport-bug = Hata Bildir\\nupdate-ruffle = Ruffle'ı Güncelle\\nruffle-demo = Ağ Demosu\\nruffle-desktop = Masaüstü Uygulaması\\nruffle-wiki = Ruffle Wiki'yi Görüntüle\\nenable-hardware-acceleration = Görünüşe göre donanım hızlandırma etkin değil. Ruffle çalışabilir ancak fazlasıyla yavaş olabilir. Donanım hızlandırmayı nasıl etkinleştirebiliceğiniz hakkında bu linkten bilgi edinebilirsiniz:\\nenable-hardware-acceleration-link = SSS - Chrome Donanım Hızlandırma\\nview-error-details = Hata Ayrıntılarını Görüntüle\\nopen-in-new-tab = Yeni sekmede aç\\nclick-to-unmute = Sesi açmak için tıklayın\\nclipboard-message-title = Ruffle'da kopyalama ve yapıştırma\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Tarayıcınız tam panoya erişimi desteklemiyor,\\n [access-denied] Pano erişimi reddedildi,\\n } ancak pano yerine her zaman bu kısayolları kullanabilirsiniz:\\nclipboard-message-copy = { \\\" \\\" } kopyalamak için\\nclipboard-message-cut = { \\\" \\\" } kesmek için\\nclipboard-message-paste = { \\\" \\\" } yapıştırmak için\\nerror-file-protocol =\\n Görünüşe göre Ruffle'ı \\\"dosya:\\\" protokolünde çalıştırıyorsunuz.\\n Tarayıcılar güvenlik nedenleriyle birçok özelliğin çalışmasını engellediğinden bu işe yaramaz.\\n Bunun yerine, sizi yerel bir sunucu kurmaya veya ağın demosunu ya da masaüstü uygulamasını kullanmaya davet ediyoruz.\\nerror-javascript-config =\\n Ruffle, yanlış bir JavaScript yapılandırması nedeniyle önemli bir sorunla karşılaştı.\\n Sunucu yöneticisiyseniz, hangi parametrenin hatalı olduğunu bulmak için sizi hata ayrıntılarını kontrol etmeye davet ediyoruz.\\n Yardım için Ruffle wiki'sine de başvurabilirsiniz.\\nerror-wasm-not-found =\\n Ruffle gerekli \\\".wasm\\\" dosya bileşenini yükleyemedi.\\n Sunucu yöneticisi iseniz, lütfen dosyanın doğru bir şekilde yüklendiğinden emin olun.\\n Sorun devam ederse, \\\"publicPath\\\" ayarını kullanmanız gerekebilir: yardım için lütfen Ruffle wiki'sine başvurun.\\nerror-wasm-mime-type =\\n Ruffle, başlatmaya çalışırken önemli bir sorunla karşılaştı.\\n Bu web sunucusu, doğru MIME tipinde \\\".wasm\\\" dosyaları sunmuyor.\\n Sunucu yöneticisiyseniz, yardım için lütfen Ruffle wiki'sine başvurun.\\nerror-invalid-swf =\\n Ruffle istenen dosyayı ayrıştıramıyor.\\n Bunun en olası nedeni, istenen dosyanın geçerli bir SWF olmamasıdır.\\nerror-swf-fetch =\\n Ruffle, Flash SWF dosyasını yükleyemedi.\\n Bunun en olası nedeni, dosyanın artık mevcut olmaması ve bu nedenle Ruffle'ın yükleyeceği hiçbir şeyin olmamasıdır.\\n Yardım için web sitesi yöneticisiyle iletişime geçmeyi deneyin.\\nerror-swf-cors =\\n Ruffle, Flash SWF dosyasını yükleyemedi.\\n Getirme erişimi muhtemelen CORS politikası tarafından engellenmiştir.\\n Sunucu yöneticisiyseniz, yardım için lütfen Ruffle wiki'sine başvurun.\\nerror-wasm-cors =\\n Ruffle gerekli \\\".wasm\\\" dosya bileşenini yükleyemedi.\\n Getirme erişimi muhtemelen CORS politikası tarafından engellenmiştir.\\n Sunucu yöneticisiyseniz, yardım için lütfen Ruffle wiki'sine başvurun.\\nerror-wasm-invalid =\\n Ruffle, başlatmaya çalışırken önemli bir sorunla karşılaştı.\\n Görünüşe göre bu sayfada Ruffle'ı çalıştırmak için eksik veya geçersiz dosyalar var.\\n Sunucu yöneticisiyseniz, yardım için lütfen Ruffle wiki'sine başvurun.\\nerror-wasm-download =\\n Ruffle, başlatmaya çalışırken önemli bir sorunla karşılaştı.\\n Bu genellikle kendi kendine çözülebilir, bu nedenle sayfayı yeniden yüklemeyi deneyebilirsiniz.\\n Aksi takdirde, lütfen site yöneticisiyle iletişime geçin.\\nerror-wasm-disabled-on-edge =\\n Ruffle gerekli \\\".wasm\\\" dosya bileşenini yükleyemedi.\\n Bunu düzeltmek için tarayıcınızın ayarlarını açın, \\\"Gizlilik, arama ve hizmetler\\\"i tıklayın, aşağı kaydırın ve \\\"Web'de güvenliğinizi artırın\\\"ı kapatmayı deneyin.\\n Bu, tarayıcınızın gerekli \\\".wasm\\\" dosyalarını yüklemesine izin verecektir.\\n Sorun devam ederse, farklı bir tarayıcı kullanmanız gerekebilir.\\nerror-javascript-conflict =\\n Ruffle, başlatmaya çalışırken önemli bir sorunla karşılaştı.\\n Görünüşe göre bu sayfa, Ruffle ile çakışan JavaScript kodu kullanıyor.\\n Sunucu yöneticisiyseniz, sizi dosyayı boş bir sayfaya yüklemeyi denemeye davet ediyoruz.\\nerror-javascript-conflict-outdated = Ayrıca sorunu giderebilecek daha yeni bir Ruffle sürümü yüklemeyi de deneyebilirsiniz (mevcut yapım eskimiş: { $buildDate }).\\nerror-csp-conflict =\\n Ruffle, başlatmaya çalışırken önemli bir sorunla karşılaştı.\\n Bu web sunucusunun İçerik Güvenliği Politikası, gerekli \\\".wasm\\\" bileşeninin çalışmasına izin vermiyor.\\n Sunucu yöneticisiyseniz, yardım için lütfen Ruffle wiki'sine bakın.\\nerror-unknown =\\n Ruffle, bu Flash içeriğini görüntülemeye çalışırken önemli bir sorunla karşılaştı.\\n { $outdated ->\\n [true] Sunucu yöneticisiyseniz, lütfen Ruffle'ın daha yeni bir sürümünü yüklemeyi deneyin (mevcut yapım eskimiş: { $buildDate }).\\n *[false] Bunun olmaması gerekiyor, bu yüzden bir hata bildirebilirseniz çok memnun oluruz!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Bu kayıt dosyasını silmek istediğinize emin misiniz?\\nsave-reload-prompt =\\n Bu kaydetme dosyasını potansiyel çakışma olmadan { $action ->\\n [delete] silmenin\\n *[replace] değiştirmenin\\n } tek yolu, bu içeriği yeniden yüklemektir. Yine de devam etmek istiyor musunuz?\\nsave-download = İndir\\nsave-replace = Değiştir\\nsave-delete = Sil\\nsave-backup-all = Tüm kayıt dosyalarını indir\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Sustur\\nvolume-controls-unmute = Susturmayı kaldır\\n\"\n },\n \"uk-UA\": {\n \"context_menu.ftl\": \"context-menu-download-swf = Завантажити .swf\\ncontext-menu-copy-debug-info = Копіювати інформацію про налагодження\\ncontext-menu-open-save-manager = Відкрити менеджер збереження\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] Про розширення Ruffle ({ $version })\\n *[other] Про Ruffle ({ $version })\\n }\\ncontext-menu-hide = Приховати це меню\\ncontext-menu-exit-fullscreen = Вийти з повноекранного режиму\\ncontext-menu-enter-fullscreen = Перейти в повноекранний режим\\ncontext-menu-volume-controls = Елементи керування гучністю\\n\",\n \"messages.ftl\": \"message-cant-embed = Ruffle не вдалося запустити Flash, вбудований у цю сторінку. Ви можете спробувати відкрити файл в окремій вкладці, щоб уникнути цієї проблеми.\\npanic-title = Щось пішло не так :(\\nmore-info = Більше інформації\\nrun-anyway = Запустити все одно\\ncontinue = Продовжити\\nreport-bug = Повідомити про помилку\\nupdate-ruffle = Оновити Ruffle\\nruffle-demo = Вебдемонстрація\\nruffle-desktop = Застосунок робочого столу\\nruffle-wiki = Переглянути Ruffle Wiki\\nenable-hardware-acceleration = Схоже, апаратне прискорення вимкнено. Хоча Ruffle може працювати, це може бути дуже повільним. Ви можете дізнатися, як увімкнути апаратне прискорення, перейшовши за посиланням нижче:\\nenable-hardware-acceleration-link = FAQ - Апаратне прискорення Chrome\\nview-error-details = Переглянути деталі помилки\\nopen-in-new-tab = Відкрити в новій вкладці\\nclick-to-unmute = Натисніть, щоб увімкнути звук\\nclipboard-message-title = Копіювання та вставлення в Ruffle\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] Ваш браузер не підтримує повний доступ до буфера обміну,\\n [access-denied] У доступі до буфера обміну відмовлено,\\n } але ви завжди можете скористатися цими ярликами:\\nclipboard-message-copy = { \\\" \\\" } для копіювання\\nclipboard-message-cut = { \\\" \\\" } для вирізання\\nclipboard-message-paste = { \\\" \\\" } для вставлення\\nerror-file-protocol = Здається, ви запускаєте Ruffle за протоколом \\\"file:\\\". Це не працює, оскільки браузери блокують роботу багатьох функцій з міркувань безпеки. Замість цього ми запрошуємо вас налаштувати локальний сервер або скористатися вебдемонстрацією чи застосунком робочого столу.\\nerror-javascript-config = Ruffle зіткнувся з серйозною проблемою через неправильну конфігурацію JavaScript. Якщо ви адміністратор сервера, ми пропонуємо вам перевірити деталі помилки, щоб дізнатися, який параметр є несправним. Ви також можете звернутися за допомогою до Ruffle Wiki.\\nerror-wasm-not-found = Ruffle не вдалося завантажити необхідний файловий компонент \\\".wasm\\\". Якщо ви адміністратор сервера, переконайтеся, що файл завантажено правильно. Якщо проблема не зникає, можливо, вам знадобиться скористатися налаштуванням \\\"publicPath\\\": будь ласка, зверніться до Ruffle Wiki, щоб отримати допомогу.\\nerror-wasm-mime-type = Ruffle зіткнувся з серйозною проблемою під час спроби ініціалізації. Цей вебсервер не обслуговує файли \\\".wasm\\\" із правильним типом MIME. Якщо ви адміністратор сервера, зверніться до Ruffle Wiki, щоб отримати допомогу.\\nerror-invalid-swf = Ruffle не може проаналізувати файл запиту. Найімовірніша причина полягає в тому, що файл запиту не є дійсним SWF.\\nerror-swf-fetch = Ruffle не вдалося завантажити файл Flash SWF. Найімовірніша причина полягає в тому, що файл більше не існує, тому Ruffle нема чого завантажити. Спробуйте звернутися по допомогу до адміністратора сайту.\\nerror-swf-cors = Ruffle не вдалося завантажити файл Flash SWF. Можливо, доступ до отримання було заблоковано політикою CORS. Якщо ви адміністратор сервера, зверніться до Ruffle Wiki, щоб отримати допомогу.\\nerror-wasm-cors = Ruffle не вдалося завантажити необхідний файловий компонент \\\".wasm\\\". Можливо, доступ до отримання було заблоковано політикою CORS. Якщо ви адміністратор сервера, зверніться до Ruffle Wiki, щоб отримати допомогу.\\nerror-wasm-invalid = Ruffle зіткнувся з серйозною проблемою під час спроби ініціалізації. Здається, на цій сторінці відсутні або недійсні файли для запуску Ruffle. Якщо ви адміністратор сервера, зверніться до Ruffle Wiki, щоб отримати допомогу.\\nerror-wasm-download = Ruffle зіткнувся з серйозною проблемою під час спроби ініціалізації. Часто це може вирішитися само собою, тому ви можете спробувати оновити сторінку. В іншому випадку зверніться до адміністратора сайту.\\nerror-wasm-disabled-on-edge = Ruffle не вдалося завантажити необхідний файловий компонент \\\".wasm\\\". Щоб виправити це, спробуйте відкрити налаштування вашого браузера, натиснути «Конфіденційність, пошук і служби», прокрутити вниз і вимкнути «Підвищити безпеку в інтернеті». Це дозволить вашому браузеру завантажити необхідні файли «.wasm». Якщо проблема не зникає, можливо, вам доведеться скористатися іншим браузером.\\nerror-javascript-conflict = Ruffle зіткнувся з серйозною проблемою під час спроби ініціалізації. Схоже, що ця сторінка використовує код JavaScript, який конфліктує з Ruffle. Якщо ви адміністратор сервера, ми запрошуємо вас спробувати завантажити файл на порожній сторінці.\\nerror-javascript-conflict-outdated = Ви також можете спробувати завантажити новішу версію Ruffle, яка може уникнути проблеми (поточна збірка застаріла: { $buildDate }).\\nerror-csp-conflict = Ruffle зіткнувся з серйозною проблемою під час спроби ініціалізації. Політика безпеки контенту цього вебсервера не дозволяє запускати необхідний компонент \\\".wasm\\\". Якщо ви адміністратор сервера, зверніться до Ruffle Wiki, щоб отримати допомогу.\\nerror-unknown =\\n Ruffle зіткнувся з серйозною проблемою під час спроби відобразити цей Flash контент.\\n { $outdated ->\\n [true] Якщо ви адміністратор сервера, спробуйте завантажити новішу версію Ruffle (поточна збірка застаріла: { $buildDate }).\\n *[false] Цього не повинно відбуватися, тому ми будемо дуже вдячні, якщо ви повідомите про помилку!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = Ви впевнені, що хочете видалити цей файл збереження?\\nsave-reload-prompt =\\n Єдиний спосіб { $action ->\\n [delete] видалити\\n *[replace] замінити\\n } цей файл збереження без потенційного конфлікту є перезавантаження цього контенту. Ви все одно бажаєте продовжити?\\nsave-download = Завантажити\\nsave-replace = Замінити\\nsave-delete = Видалити\\nsave-backup-all = Завантажити всі файли збереження\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = Вимкнути звук\\nvolume-controls-unmute = Увімкнути звук\\n\"\n },\n \"zh-CN\": {\n \"context_menu.ftl\": \"context-menu-download-swf = 下载 .swf\\ncontext-menu-copy-debug-info = 复制调试信息\\ncontext-menu-open-save-manager = 打开存档管理器\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] 关于 Ruffle 扩展 ({ $version })\\n *[other] 关于 Ruffle ({ $version })\\n }\\ncontext-menu-hide = 隐藏此菜单\\ncontext-menu-exit-fullscreen = 退出全屏\\ncontext-menu-enter-fullscreen = 进入全屏\\ncontext-menu-volume-controls = 音量控制\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle 无法运行嵌入在此页面中的 Flash。\\n 您可以尝试在单独的标签页中打开该文件,以回避此问题。\\npanic-title = 出了些问题 :(\\nmore-info = 更多信息\\nrun-anyway = 仍然运行\\ncontinue = 继续\\nreport-bug = 反馈问题\\nupdate-ruffle = 更新 Ruffle\\nruffle-demo = 网页演示\\nruffle-desktop = 桌面应用程序\\nruffle-wiki = 查看 Ruffle Wiki\\nenable-hardware-acceleration = 看起来硬件加速已被禁用。虽然Ruffle可能可以运行,但速度可能会非常慢。您可以通过下面的链接了解如何启用硬件加速:\\nenable-hardware-acceleration-link = 常见问题 - Chrome 硬件加速\\nview-error-details = 查看错误详情\\nopen-in-new-tab = 在新标签页中打开\\nclick-to-unmute = 点击取消静音\\nclipboard-message-title = 在Ruffle中复制粘贴\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] 您的浏览器不支持完全剪贴板访问,\\n [access-denied] 对剪贴板的访问已被拒绝,\\n } 但您仍然可以使用以下快捷键:\\nclipboard-message-copy = { \\\" \\\" } 复制\\nclipboard-message-cut = { \\\" \\\" } 剪切\\nclipboard-message-paste = { \\\" \\\" } 粘贴\\nerror-file-protocol =\\n 看来您正在 \\\"file:\\\" 协议上使用 Ruffle。\\n 由于浏览器以安全原因阻止许多功能,因此这不起作用。\\n 相反我们邀请您设置本地服务器或使用网页演示或桌面应用程序。\\nerror-javascript-config =\\n 由于错误的 JavaScript 配置,Ruffle 遇到了一个重大问题。\\n 如果您是服务器管理员,我们邀请您检查错误详细信息,以找出哪个参数有故障。\\n 您也可以查阅 Ruffle 的 Wiki 获取帮助。\\nerror-wasm-not-found =\\n Ruffle 无法加载所需的 “.wasm” 文件组件。\\n 如果您是服务器管理员,请确保文件已正确上传。\\n 如果问题仍然存在,您可能需要使用 “publicPath” 设置:请查看 Ruffle 的 Wiki 获取帮助。\\nerror-wasm-mime-type =\\n Ruffle 在试图初始化时遇到了一个重大问题。\\n 该网站服务器没有提供 \\\".asm” 文件正确的 MIME 类型。\\n 如果您是服务器管理员,请查阅 Ruffle Wiki 获取帮助。\\nerror-invalid-swf =\\n Ruffle无法解析请求的文件。\\n 最有可能的原因是该请求文件不是一个合法的SWF文件。\\nerror-swf-fetch =\\n Ruffle 无法加载 Flash SWF 文件。\\n 最可能的原因是文件不再存在所以 Ruffle 没有要加载的内容。\\n 请尝试联系网站管理员寻求帮助。\\nerror-swf-cors =\\n Ruffle 无法加载 Flash SWF 文件。\\n 获取权限可能被 CORS 策略阻止。\\n 如果您是服务器管理员,请参考 Ruffle Wiki 获取帮助。\\nerror-wasm-cors =\\n Ruffle 无法加载所需的“.wasm”文件组件。\\n 获取权限可能被 CORS 策略阻止。\\n 如果您是服务器管理员,请查阅 Ruffle Wiki 获取帮助。\\nerror-wasm-invalid =\\n Ruffle 在试图初始化时遇到了一个重大问题。\\n 这个页面似乎缺少文件来运行 Curl。\\n 如果您是服务器管理员,请查阅 Ruffle Wiki 获取帮助。\\nerror-wasm-download =\\n Ruffle 在试图初始化时遇到了一个重大问题。\\n 这通常可以自行解决,因此您可以尝试重新加载页面。\\n 否则请联系网站管理员。\\nerror-wasm-disabled-on-edge =\\n Ruffle 无法加载所需的 “.wasm” 文件组件。\\n 要解决这个问题,请尝试打开您的浏览器设置,单击\\\"隐私、搜索和服务\\\",向下滚动并关闭\\\"增强 Web 安全性\\\"。\\n 这将允许您的浏览器加载所需的 “.wasm” 文件。\\n 如果问题仍然存在,您可能必须使用不同的浏览器。\\nerror-javascript-conflict =\\n Ruffle 在试图初始化时遇到了一个重大问题。\\n 这个页面似乎使用了与 Ruffle 冲突的 JavaScript 代码。\\n 如果您是服务器管理员,我们建议您尝试在空白页面上加载文件。\\nerror-javascript-conflict-outdated = 您还可以尝试上传可能规避该问题的最新版本的 (当前构建已过时: { $buildDate })。\\nerror-csp-conflict =\\n Ruffle 在试图初始化时遇到了一个重大问题。\\n 该网站服务器的内容安全策略不允许运行所需的 “.wasm” 组件。\\n 如果您是服务器管理员,请查阅 Ruffle Wiki 获取帮助。\\nerror-unknown =\\n Ruffle 在试图显示此 Flash 内容时遇到了一个重大问题。\\n { $outdated ->\\n [true] 如果您是服务器管理员,请尝试上传更新的 Ruffle 版本 (当前版本已过时: { $buildDate }).\\n *[false] 这不应该发生,因此如果您可以报告错误,我们将非常感谢!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = 确定要删除此存档吗?\\nsave-reload-prompt =\\n 为了避免潜在的冲突,{ $action ->\\n [delete] 删除\\n *[replace] 替换\\n } 此存档文件需要重新加载当前内容。是否仍然继续?\\nsave-download = 下载\\nsave-replace = 替换\\nsave-delete = 删除\\nsave-backup-all = 下载所有存档文件\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = 静音\\nvolume-controls-unmute = 取消静音\\n\"\n },\n \"zh-TW\": {\n \"context_menu.ftl\": \"context-menu-download-swf = 下載SWF檔案\\ncontext-menu-copy-debug-info = 複製除錯資訊\\ncontext-menu-open-save-manager = 開啟存檔管理器\\ncontext-menu-about-ruffle =\\n { $flavor ->\\n [extension] 關於Ruffle擴充功能 ({ $version })\\n *[other] 關於Ruffle ({ $version })\\n }\\ncontext-menu-hide = 隱藏菜單\\ncontext-menu-exit-fullscreen = 退出全螢幕\\ncontext-menu-enter-fullscreen = 進入全螢幕\\ncontext-menu-volume-controls = 音量控制\\n\",\n \"messages.ftl\": \"message-cant-embed =\\n Ruffle 無法執行本頁面內嵌的 Flash。\\n 您可以嘗試在單獨的標籤頁中開啟檔案,以避免此問題。\\npanic-title = 發生了某些錯誤 :(\\nmore-info = 更多資訊\\nrun-anyway = 直接執行\\ncontinue = 繼續\\nreport-bug = 回報BUG\\nupdate-ruffle = 更新Ruffle\\nruffle-demo = 網頁展示\\nruffle-desktop = 桌面應用程式\\nruffle-wiki = 查看Ruffle Wiki\\nenable-hardware-acceleration = 看起來硬體加速已停用。雖然 Ruffle 可以運作,但速度可能很慢。您可以透過以下連結瞭解如何啟用硬體加速:\\nenable-hardware-acceleration-link = FAQ - Chrome硬體加速\\nview-error-details = 檢視錯誤詳細資料\\nopen-in-new-tab = 開啟新增分頁\\nclick-to-unmute = 點擊以取消靜音\\nclipboard-message-title = 在 Ruffle 中複製和貼上\\nclipboard-message-description =\\n { $variant ->\\n *[unsupported] 您的瀏覽器不支援完整的剪貼板存取、\\n [access-denied] 已拒絕存取剪貼簿、\\n } 但您可以使用這些捷徑來代替:\\nclipboard-message-copy = { \\\" \\\" } 複製\\nclipboard-message-cut = { \\\" \\\" } 剪下\\nclipboard-message-paste = { \\\" \\\" } 貼上\\nerror-file-protocol =\\n 您似乎是在 「file: 」協定上執行 Ruffle。\\n 這並不可行,因為瀏覽器基於安全理由會阻擋許多功能的運作。\\n 相反,我們邀請您設定本機伺服器,或使用網頁示範或桌面應用程式。\\nerror-javascript-config =\\n 由於 JavaScript 設定不正確,Ruffle 遇到了重大問題。\\n 如果您是伺服器管理員,我們邀請您檢查錯誤細節,找出是哪個參數出了問題。\\n 您也可以參考 Ruffle wiki 以獲得協助。\\nerror-wasm-not-found =\\n Ruffle 未能載入所需的 「.wasm」 檔案元件。\\n 如果您是伺服器管理員,請確認檔案已正確上傳。\\n 如果問題仍然存在,您可能需要使用「publicPath」設定:請參閱 Ruffle wiki 以獲得協助。\\nerror-wasm-mime-type =\\n Ruffle 在嘗試初始化時遇到重大問題。\\n 此 Web 伺服器無法提供 MIME 類型正確的 「.wasm 」檔案。\\n 如果您是伺服器管理員,請參閱 Ruffle wiki 以獲得協助。\\nerror-invalid-swf =\\n Ruffle 無法解析請求的檔案。\\n 最可能的原因是請求的檔案不是有效的 SWF。\\nerror-swf-fetch =\\n Ruffle 未能載入 Flash SWF 檔案。\\n 最可能的原因是該檔案已不存在,因此 Ruffle 無法載入任何內容。\\n 請嘗試聯絡網站管理員尋求協助。\\nerror-swf-cors =\\n Ruffle 未能載入 Flash SWF 檔案。\\n 訪問 fetch 可能已被 CORS 策略封鎖。\\n 如果您是伺服器管理員,請參閱 Ruffle wiki 以獲得協助。\\nerror-wasm-cors =\\n Ruffle 未能載入所需的 「.wasm」 檔案元件。\\n 訪問 fetch 可能已被 CORS 策略封鎖。\\n 如果您是伺服器管理員,請參閱 Ruffle wiki 以獲得協助。\\nerror-wasm-invalid =\\n Ruffle 在嘗試初始化時遇到重大問題。\\n 此頁面似乎有遺失或無效的檔案,無法執行 Ruffle。\\n 如果您是伺服器管理員,請參閱 Ruffle wiki 以獲得協助。\\nerror-wasm-download =\\n Ruffle 在嘗試初始化時遇到重大問題。\\n 這通常可以自行解決,因此您可以嘗試重新載入頁面。\\n 否則,請聯絡網站管理員。\\nerror-wasm-disabled-on-edge =\\n Ruffle 未能載入所需的「.wasm 」檔案元件。\\n 要解決這個問題,請嘗試打開瀏覽器的設定,按一下「隱私、搜尋和服務」,向下捲動,然後關閉「加強您在網路上的安全性」。\\n 這將允許您的瀏覽器載入所需的「.wasm 」檔案。\\n 如果問題仍然存在,您可能必須使用其他瀏覽器。\\nerror-javascript-conflict =\\n Ruffle 在嘗試初始化時遇到重大問題。\\n 這個頁面似乎使用了與 Ruffle 相衝突的 JavaScript 程式碼。\\n 如果您是伺服器管理員,請嘗試在空白頁面上載入檔案。\\nerror-javascript-conflict-outdated = 您也可以嘗試上傳較新版本的 Ruffle,可能會避免此問題 (目前的版本已過時:{ $buildDate })。\\nerror-csp-conflict =\\n Ruffle 在嘗試初始化時遇到重大問題。\\n 此網頁伺服器的內容安全政策不允許執行所需的 「.wasm 」元件。\\n 如果您是伺服器管理員,請參閱 Ruffle wiki 以取得協助。\\nerror-unknown =\\n Ruffle 在嘗試顯示此 Flash 內容時遇到了重大問題。\\n { $outdated ->\\n [true] 如果您是伺服器管理員,請嘗試上傳較新版本的 Ruffle (目前的版本已經過時 { $buildDate })。\\n *[false] 這不應該發生,所以如果您能提出錯誤,我們會非常感激!\\n }\\n\",\n \"save-manager.ftl\": \"save-delete-prompt = 你確定要刪除這個存檔嗎?\\nsave-reload-prompt =\\n 唯一方法只有 { $action ->\\n [delete] 刪除\\n *[replace] 取代\\n } 這個存檔不會完全取代直到重新啟動。 你需要繼續嗎?\\nsave-download = 下載\\nsave-replace = 取代\\nsave-delete = 刪除\\nsave-backup-all = 下載所有存檔檔案。\\n\",\n \"volume-controls.ftl\": \"volume-controls-mute = 靜音\\nvolume-controls-unmute = 取消靜音\\n\"\n }\n};\nconst bundles = {};\nfor (const [locale, files] of Object.entries(BUNDLED_TEXTS)) {\n const bundle = new FluentBundle(locale);\n if (files) {\n for (const [filename, text] of Object.entries(files)) {\n if (text) {\n for (const error of bundle.addResource(new FluentResource(text))) {\n console.error(`Error in text for ${locale} ${filename}: ${error}`);\n }\n }\n }\n }\n bundles[locale] = bundle;\n}\n/**\n * Gets the localised text for the given locale and text ID.\n *\n * If the locale does not contain a text for this ID, it will return null.\n *\n * @param locale Locale to prefer when retrieving text, ie \"en-US\"\n * @param id ID of the text to retrieve\n * @param args Any arguments to use when creating the localised text\n * @returns Localised text or null if not found\n */\nfunction tryText(locale, id, args) {\n const bundle = bundles[locale];\n if (bundle !== undefined) {\n const message = bundle.getMessage(id);\n if (message !== undefined && message.value) {\n return bundle.formatPattern(message.value, args);\n }\n }\n return null;\n}\n/**\n * Gets the localised text for the given text ID.\n *\n * The users preferred locales are used, in priority order, to find the given text.\n *\n * If no text is found for any preferred locale, en-US will be used.\n * If en-US does not contain a text for this ID, an error will be logged and the ID itself will be returned.\n *\n * @param id ID of the text to retrieve\n * @param args Any arguments to use when creating the localised text\n * @returns Localised text\n */\nexport function text(id, args) {\n const locales = negotiateLanguages(navigator.languages, Object.keys(bundles), { defaultLocale: \"en-US\" });\n for (const i in locales) {\n const result = tryText(locales[i], id, args);\n if (result) {\n return result;\n }\n }\n console.error(`Unknown text key '${id}'`);\n return id;\n}\n/**\n * Gets the localised text for the given text ID, as <p>paragraphs</p> and HTML entities safely encoded.\n *\n * The users preferred locales are used, in priority order, to find the given text.\n *\n * If no text is found for any preferred locale, en-US will be used.\n * If en-US does not contain a text for this ID, an error will be logged and the ID itself will be returned.\n *\n * @param id ID of the text to retrieve\n * @param args Any arguments to use when creating the localised text\n * @returns Localised text with each line in a Paragraph element\n */\nexport function textAsParagraphs(id, args) {\n const result = document.createElement(\"div\");\n text(id, args)\n .split(\"\\n\")\n .forEach((line) => {\n const p = document.createElement(\"p\");\n p.innerText = line;\n result.appendChild(p);\n });\n return result;\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nimport { text } from \"../i18n\";\nconst shortcutModifier = navigator.userAgent.includes(\"Mac OS X\")\n ? \"Command\"\n : \"Ctrl\";\nexport function ClipboardPermission() {\n return (_jsx(\"div\", { id: \"clipboard-modal\", class: \"modal hidden\", children: _jsxs(\"div\", { class: \"modal-area\", children: [_jsx(\"span\", { class: \"close-modal\" }), _jsx(\"h2\", { children: text(\"clipboard-message-title\") }), _jsx(\"p\", { id: \"clipboard-modal-description\" }), _jsxs(\"p\", { children: [_jsxs(\"b\", { children: [shortcutModifier, \"+C\"] }), _jsx(\"span\", { children: text(\"clipboard-message-copy\") })] }), _jsxs(\"p\", { children: [_jsxs(\"b\", { children: [shortcutModifier, \"+X\"] }), _jsx(\"span\", { children: text(\"clipboard-message-cut\") })] }), _jsxs(\"p\", { children: [_jsxs(\"b\", { children: [shortcutModifier, \"+V\"] }), _jsx(\"span\", { children: text(\"clipboard-message-paste\") })] })] }) }));\n}\n","import { jsx as _jsx } from \"tsx-dom/jsx-runtime\";\nimport { StaticStyles } from \"./static-styles\";\nimport { DynamicStyles } from \"./dynamic-styles\";\nimport { MainContainer } from \"./container\";\nimport { SplashScreen } from \"./splash-screen\";\nimport { SaveManager } from \"./save-manager\";\nimport { VolumeControls } from \"./volume-controls\";\nimport { UnsupportedVideo } from \"./unsupported-video\";\nimport { HardwareAcceleration } from \"./hardware-acceleration\";\nimport { ClipboardPermission } from \"./clipboard-permission\";\nimport { ContextMenuOverlay } from \"./context-menu-overlay\";\n/*\n *\n * The shadow template which is used to fill the actual Ruffle player element\n * on the page.\n *\n */\nexport const ruffleShadowTemplate = document.createElement(\"template\");\nruffleShadowTemplate.content.appendChild(_jsx(StaticStyles, {}));\nruffleShadowTemplate.content.appendChild(_jsx(DynamicStyles, {}));\nruffleShadowTemplate.content.appendChild(_jsx(MainContainer, {}));\nruffleShadowTemplate.content.appendChild(_jsx(SplashScreen, {}));\nruffleShadowTemplate.content.appendChild(_jsx(SaveManager, {}));\nruffleShadowTemplate.content.appendChild(_jsx(VolumeControls, {}));\nruffleShadowTemplate.content.appendChild(_jsx(UnsupportedVideo, {}));\nruffleShadowTemplate.content.appendChild(_jsx(HardwareAcceleration, {}));\nruffleShadowTemplate.content.appendChild(_jsx(ClipboardPermission, {}));\nruffleShadowTemplate.content.appendChild(_jsx(ContextMenuOverlay, {}));\n","import { jsx as _jsx } from \"tsx-dom/jsx-runtime\";\n// This is automatically populated by `tools/bundle_css.ts` via a postbuild script\nconst CSS = \":host{all:initial;pointer-events:inherit;--ruffle-blue:#37528c;--ruffle-orange:#ffad33;display:inline-block;font-family:Arial,sans-serif;height:400px;letter-spacing:.4px;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:550px;-webkit-tap-highlight-color:transparent}:host(:-webkit-full-screen){display:block;height:100%!important;width:100%!important}.hidden{display:none!important}#container,#message-overlay,#panic,#play-button,#splash-screen,#unmute-overlay,#unmute-overlay .background{inset:0;position:absolute}#container{outline:none;overflow:hidden}#container canvas{height:100%;width:100%}#play-button,#unmute-overlay{cursor:pointer;display:none}#unmute-overlay .background{background:#000;opacity:.7}#play-button .icon,#unmute-overlay .icon{height:50%;left:50%;max-height:384px;max-width:384px;opacity:.8;position:absolute;top:50%;transform:translate(-50%,-50%);width:50%}#play-button:hover .icon,#unmute-overlay:hover .icon{opacity:1}#unmute-overlay-svg{scale:.8}#panic{background:linear-gradient(180deg,#fd3a40,#fda138);color:#fff;display:flex;flex-flow:column;font-size:20px;justify-content:space-around;text-align:center}#panic a{color:var(--ruffle-blue);font-weight:700}#panic-title{font-size:xxx-large;font-weight:700}#panic-body.details{flex:0.9;margin:0 10px}#panic-body textarea{height:100%;resize:none;width:100%}#panic ul{display:flex;justify-content:space-evenly;list-style-type:none;padding:0}#message-overlay{align-items:center;background:var(--ruffle-blue);color:var(--ruffle-orange);display:flex;justify-content:center;opacity:1;overflow:auto;position:absolute;z-index:2}#message-overlay .message{font-size:20px;max-height:100%;max-width:100%;padding:5%;text-align:center}#message-overlay p{margin:.5em 0}#message-overlay .message div{-moz-column-gap:1em;column-gap:1em;display:flex;flex-wrap:wrap;justify-content:center}#message-overlay a,#message-overlay button{background:var(--ruffle-blue);border:2px solid var(--ruffle-orange);border-radius:.6em;color:var(--ruffle-orange);cursor:pointer;font-size:1.25em;font-weight:700;margin:2% 0;padding:10px;text-decoration:none}#message-overlay a:hover,#message-overlay button:hover{background:#ffffff4c}#continue-btn{background:var(--ruffle-blue);border:2px solid var(--ruffle-orange);border-radius:20px;color:var(--ruffle-orange);cursor:pointer;font-size:20px;font-weight:700;padding:10px}#continue-btn:hover{background:#ffffff4c}#context-menu-overlay,.modal{height:100%;position:absolute;width:100%;z-index:1}#context-menu{background-color:var(--modal-background);border:1px solid gray;box-shadow:0 5px 10px -5px #000;color:rgb(var(--modal-foreground-rgb));font-size:14px;list-style:none;margin:0;padding:3px 0;position:absolute;text-align:left;white-space:nowrap}#context-menu .menu-item{color:rgb(var(--modal-foreground-rgb));padding:5px 10px}#context-menu .menu-item.disabled{color:rgba(var(--modal-foreground-rgb),.5);cursor:default}#context-menu .menu-item:not(.disabled):hover{background-color:rgba(var(--modal-foreground-rgb),.15)}#context-menu .menu-separator hr{border:none;border-bottom:1px solid rgba(var(--modal-foreground-rgb),.2);margin:3px}#splash-screen{align-items:center;background:var(\\n --splash-screen-background,var(--preloader-background,var(--ruffle-blue))\\n );display:flex;flex-direction:column;justify-content:center}.loadbar{background:#253559;height:20%;max-height:10px;max-width:316px;width:100%}.loadbar-inner{background:var(--ruffle-orange);height:100%;max-width:100%;width:0}.logo{display:var(--logo-display,block);max-height:150px;max-width:380px}.loading-animation{aspect-ratio:1;margin-bottom:2%;max-height:28px;max-width:28px;width:10%}.spinner{stroke-dasharray:180;stroke-dashoffset:135;stroke:var(--ruffle-orange);animation:a 1.5s linear infinite;transform-origin:50% 50%}@keyframes a{to{transform:rotate(1turn)}}#virtual-keyboard{height:1px;opacity:0;position:absolute;top:-100px;width:1px}.modal{background-color:#0008}.modal-area{background-color:var(--modal-background);border-radius:12px;box-shadow:0 2px 6px 0 #0008;color:rgb(var(--modal-foreground-rgb));left:50%;padding:8px 12px;position:relative;transform:translateX(-50%);width:-moz-fit-content;width:fit-content}#modal-area{height:300px;width:450px}.close-modal{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 -960 960 960'%3E%3Cpath d='M480-392 300-212q-18 18-44 18t-44-18-18-44 18-44l180-180-180-180q-18-18-18-44t18-44 44-18 44 18l180 180 180-180q18-18 44-18t44 18 18 44-18 44L568-480l180 180q18 18 18 44t-18 44-44 18-44-18z'/%3E%3C/svg%3E\\\");cursor:pointer;filter:var(--modal-foreground-filter);height:16px;width:16px}.modal-button{background-color:rgba(var(--modal-foreground-rgb),.2);border-radius:6px;color:rgb(var(--modal-foreground-rgb));cursor:pointer;display:inline-block;padding:4px 8px;text-decoration:none}:not(#volume-controls)>.close-modal{position:absolute;right:16px;top:14px}.general-save-options{border-bottom:2px solid rgba(var(--modal-foreground-rgb),.3);padding-bottom:8px;text-align:center}#local-saves{border-collapse:collapse;color:inherit;display:block;height:calc(100% - 45px);min-height:30px;overflow-y:auto}#local-saves td{border-bottom:2px solid rgba(var(--modal-foreground-rgb),.15);height:30px}#local-saves td:first-child{width:100%;word-break:break-all}.save-option{cursor:pointer;display:inline-block;filter:var(--modal-foreground-filter);height:24px;opacity:.4;vertical-align:middle;width:24px}#local-saves>tr:hover .save-option{opacity:1}#download-save{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 -960 960 960'%3E%3Cpath d='M480-337q-8 0-15-2.5t-13-8.5L308-492q-12-12-11.5-28t11.5-28q12-12 28.5-12.5T365-549l75 75v-286q0-17 11.5-28.5T480-800t28.5 11.5T520-760v286l75-75q12-12 28.5-11.5T652-548q11 12 11.5 28T652-492L508-348q-6 6-13 8.5t-15 2.5M240-160q-33 0-56.5-23.5T160-240v-80q0-17 11.5-28.5T200-360t28.5 11.5T240-320v80h480v-80q0-17 11.5-28.5T760-360t28.5 11.5T800-320v80q0 33-23.5 56.5T720-160z'/%3E%3C/svg%3E\\\")}#replace-save{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 -1080 960 1200'%3E%3Cpath d='M440-367v127q0 17 11.5 28.5T480-200t28.5-11.5T520-240v-127l36 36q6 6 13.5 9t15 2.5T599-323t13-9q11-12 11.5-28T612-388L508-492q-6-6-13-8.5t-15-2.5-15 2.5-13 8.5L348-388q-12 12-11.5 28t12.5 28q12 11 28 11.5t28-11.5zM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80zm280-560q0 17 11.5 28.5T560-600h160L520-800z'/%3E%3C/svg%3E\\\")}#delete-save{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 -1020 960 1080'%3E%3Cpath d='M280-120q-33 0-56.5-23.5T200-200v-520q-17 0-28.5-11.5T160-760t11.5-28.5T200-800h160q0-17 11.5-28.5T400-840h160q17 0 28.5 11.5T600-800h160q17 0 28.5 11.5T800-760t-11.5 28.5T760-720v520q0 33-23.5 56.5T680-120zm120-160q17 0 28.5-11.5T440-320v-280q0-17-11.5-28.5T400-640t-28.5 11.5T360-600v280q0 17 11.5 28.5T400-280m160 0q17 0 28.5-11.5T600-320v-280q0-17-11.5-28.5T560-640t-28.5 11.5T520-600v280q0 17 11.5 28.5T560-280'/%3E%3C/svg%3E\\\")}.replace-save{display:none}#video-modal .modal-area{box-sizing:border-box;height:95%;width:95%}#video-holder{box-sizing:border-box;height:100%;padding:36px 4px 6px}#video-holder video{background-color:#000;height:100%;width:100%}#volume-controls{align-items:center;display:flex;gap:6px}#mute-checkbox{display:none}label[for=mute-checkbox]{cursor:pointer;filter:var(--modal-foreground-filter);height:24px;line-height:0;width:24px}#volume-mute{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 -960 960 960'%3E%3Cpath d='m719.13-419.35-71.67 71.68Q634.78-335 617.13-335t-30.33-12.67q-12.67-12.68-12.67-30.33t12.67-30.33L658.48-480l-71.68-71.67q-12.67-12.68-12.67-30.33t12.67-30.33Q599.48-625 617.13-625t30.33 12.67l71.67 71.68 71.67-71.68Q803.48-625 821.13-625t30.33 12.67q12.67 12.68 12.67 30.33t-12.67 30.33L779.78-480l71.68 71.67q12.67 12.68 12.67 30.33t-12.67 30.33Q838.78-335 821.13-335t-30.33-12.67zM278-357.87H161.22q-17.66 0-30.33-12.67-12.67-12.68-12.67-30.33v-158.26q0-17.65 12.67-30.33 12.67-12.67 30.33-12.67H278l130.15-129.91q20.63-20.63 46.98-9.45 26.35 11.19 26.35 39.77v443.44q0 28.58-26.35 39.77-26.35 11.18-46.98-9.45z'/%3E%3C/svg%3E\\\")}#volume-min{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='161 -960 960 960'%3E%3Cpath d='M438.65-357.87H321.87q-17.65 0-30.33-12.67-12.67-12.68-12.67-30.33v-158.26q0-17.65 12.67-30.33 12.68-12.67 30.33-12.67h116.78L568.8-732.04q20.63-20.63 46.98-9.45 26.35 11.19 26.35 39.77v443.44q0 28.58-26.35 39.77-26.35 11.18-46.98-9.45z'/%3E%3C/svg%3E\\\")}#volume-mid{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='80 -960 960 960'%3E%3Cpath d='M357.98-357.87H241.2q-17.66 0-30.33-12.67-12.67-12.68-12.67-30.33v-158.26q0-17.65 12.67-30.33 12.67-12.67 30.33-12.67h116.78L487.65-731.8q20.63-20.64 47.1-9.57t26.47 39.65v443.44q0 28.58-26.47 39.65t-47.1-9.57zM741.8-480q0 42.48-20.47 80.09-20.48 37.61-54.94 60.82-10.22 5.98-20.19.25-9.98-5.73-9.98-17.44v-248.44q0-11.71 9.98-17.32 9.97-5.61 20.19.37 34.46 23.71 54.94 61.45Q741.8-522.48 741.8-480'/%3E%3C/svg%3E\\\")}#volume-max{background-image:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='9 -960 960 960'%3E%3Cpath d='M754.22-480.5q0-78.52-41.88-143.9t-111.91-98.62q-14.47-6.74-20.47-20.96t-.53-28.93q5.74-15.72 20.34-22.46t29.58 0q92.48 42.46 147.97 127.05 55.48 84.6 55.48 187.82t-55.48 187.82q-55.49 84.59-147.97 127.05-14.98 6.74-29.58 0t-20.34-22.46q-5.47-14.71.53-28.93t20.47-20.96q70.03-33.24 111.91-98.62t41.88-143.9M286.98-357.87H170.2q-17.66 0-30.33-12.67-12.67-12.68-12.67-30.33v-158.26q0-17.65 12.67-30.33 12.67-12.67 30.33-12.67h116.78L416.65-731.8q20.63-20.64 47.1-9.57t26.47 39.65v443.44q0 28.58-26.47 39.65t-47.1-9.57zM670.8-480q0 42.48-20.47 80.09-20.48 37.61-54.94 60.82-10.22 5.98-20.19.25-9.98-5.73-9.98-17.44v-248.44q0-11.71 9.98-17.32 9.97-5.61 20.19.37 34.46 23.71 54.94 61.45Q670.8-522.48 670.8-480'/%3E%3C/svg%3E\\\")}#volume-slider-text{text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:4.8ch}#hardware-acceleration-modal .modal-area{box-sizing:border-box;padding:16px 48px;text-align:center;width:95%}#acceleration-text{display:block;margin-bottom:8px}#clipboard-modal h2{margin-right:36px;margin-top:4px}#clipboard-modal p:last-child{margin-bottom:2px}@media (prefers-color-scheme:light){:host{--modal-background:#fafafa;--modal-foreground-rgb:0,0,0;--modal-foreground-filter:none}}@media (prefers-color-scheme:dark){:host{--modal-background:#282828;--modal-foreground-rgb:221,221,221;--modal-foreground-filter:invert(90%)}}\";\nexport function StaticStyles() {\n return _jsx(\"style\", { children: CSS });\n}\n","import { jsx as _jsx } from \"tsx-dom/jsx-runtime\";\nexport function DynamicStyles() {\n return (_jsx(\"style\", { id: \"dynamic-styles\" }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nexport function MainContainer() {\n return (_jsxs(\"div\", { id: \"container\", children: [_jsx(\"div\", { id: \"play-button\", children: _jsx(\"div\", { class: \"icon\", children: _jsxs(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", preserveAspectRatio: \"xMidYMid\", viewBox: \"0 0 250 250\", width: \"100%\", height: \"100%\", children: [_jsxs(\"defs\", { xmlns: \"http://www.w3.org/2000/svg\", children: [_jsxs(\"linearGradient\", { xmlns: \"http://www.w3.org/2000/svg\", id: \"a\", gradientUnits: \"userSpaceOnUse\", x1: \"125\", y1: \"0\", x2: \"125\", y2: \"250\", spreadMethod: \"pad\", children: [_jsx(\"stop\", { xmlns: \"http://www.w3.org/2000/svg\", offset: \"0%\", \"stop-color\": \"#FDA138\" }), _jsx(\"stop\", { xmlns: \"http://www.w3.org/2000/svg\", offset: \"100%\", \"stop-color\": \"#FD3A40\" })] }), _jsxs(\"g\", { xmlns: \"http://www.w3.org/2000/svg\", id: \"b\", children: [_jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"url(#a)\", d: \"M250 125q0-52-37-88-36-37-88-37T37 37Q0 73 0 125t37 88q36 37 88 37t88-37q37-36 37-88M87 195V55l100 70-100 70z\" }), _jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"#FFF\", d: \"M87 55v140l100-70L87 55z\" })] })] }), _jsx(\"use\", { xmlns: \"http://www.w3.org/2000/svg\", href: \"#b\" })] }) }) }), _jsxs(\"div\", { id: \"unmute-overlay\", children: [_jsx(\"div\", { class: \"background\" }), _jsx(\"div\", { class: \"icon\", children: _jsxs(\"svg\", { id: \"unmute-overlay-svg\", xmlns: \"http://www.w3.org/2000/svg\", preserveAspectRatio: \"xMidYMid\", viewBox: \"0 0 512 584\", width: \"100%\", height: \"100%\", children: [_jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"#FFF\", stroke: \"#FFF\", d: \"m457.941 256 47.029-47.029c9.372-9.373 9.372-24.568 0-33.941-9.373-9.373-24.568-9.373-33.941 0l-47.029 47.029-47.029-47.029c-9.373-9.373-24.568-9.373-33.941 0-9.372 9.373-9.372 24.568 0 33.941l47.029 47.029-47.029 47.029c-9.372 9.373-9.372 24.568 0 33.941 4.686 4.687 10.827 7.03 16.97 7.03s12.284-2.343 16.971-7.029l47.029-47.03 47.029 47.029c4.687 4.687 10.828 7.03 16.971 7.03s12.284-2.343 16.971-7.029c9.372-9.373 9.372-24.568 0-33.941z\" }), _jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"#FFF\", stroke: \"#FFF\", d: \"m99 160h-55c-24.301 0-44 19.699-44 44v104c0 24.301 19.699 44 44 44h55c2.761 0 5-2.239 5-5v-182c0-2.761-2.239-5-5-5z\" }), _jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"#FFF\", stroke: \"#FFF\", d: \"m280 56h-24c-5.269 0-10.392 1.734-14.578 4.935l-103.459 79.116c-1.237.946-1.963 2.414-1.963 3.972v223.955c0 1.557.726 3.026 1.963 3.972l103.459 79.115c4.186 3.201 9.309 4.936 14.579 4.936h23.999c13.255 0 24-10.745 24-24v-352.001c0-13.255-10.745-24-24-24z\" }), _jsx(\"text\", { xmlns: \"http://www.w3.org/2000/svg\", id: \"unmute-text\", x: \"256\", y: \"560\", \"text-anchor\": \"middle\", \"font-size\": \"60px\", fill: \"#FFF\", stroke: \"#FFF\", children: \"Click to unmute\" })] }) })] }), _jsx(\"input\", { \"aria-hidden\": \"true\", id: \"virtual-keyboard\", type: \"text\", autocomplete: \"off\", autocorrect: \"off\", autocapitalize: \"none\" })] }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nexport function SplashScreen() {\n return (_jsxs(\"div\", { id: \"splash-screen\", class: \"hidden\", children: [_jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", class: \"logo\", preserveAspectRatio: \"xMidYMid\", viewBox: \"0 0 380 150\", children: _jsxs(\"g\", { xmlns: \"http://www.w3.org/2000/svg\", children: [_jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"#966214\", d: \"M58.75 85.6q.75-.1 1.5-.35.85-.25 1.65-.75.55-.35 1.05-.8.5-.45.95-1 .5-.5.75-1.2-.05.05-.15.1-.1.15-.25.25l-.1.2q-.15.05-.25.1-.4 0-.8.05-.5-.25-.9-.5-.3-.1-.55-.3l-.6-.6-4.25-6.45-1.5 11.25h3.45m83.15-.2h3.45q.75-.1 1.5-.35.25-.05.45-.15.35-.15.65-.3l.5-.3q.25-.15.5-.35.45-.35.9-.75.45-.35.75-.85l.1-.1q.1-.2.2-.35.2-.3.35-.6l-.3.4-.15.15q-.5.15-1.1.1-.25 0-.4-.05-.5-.15-.8-.4-.15-.1-.25-.25-.3-.3-.55-.6l-.05-.05v-.05l-4.25-6.4-1.5 11.25m-21.15-3.95q-.3-.3-.55-.6l-.05-.05v-.05l-4.25-6.4-1.5 11.25h3.45q.75-.1 1.5-.35.85-.25 1.6-.75.75-.5 1.4-1.1.45-.35.75-.85.35-.5.65-1.05l-.45.55q-.5.15-1.1.1-.9 0-1.45-.7m59.15.3q-.75-.5-1.4-1-3.15-2.55-3.5-6.4l-1.5 11.25h21q-3.1-.25-5.7-.75-5.6-1.05-8.9-3.1m94.2 3.85h3.45q.6-.1 1.2-.3.4-.1.75-.2.35-.15.65-.3.7-.35 1.35-.8.75-.55 1.3-1.25.1-.15.25-.3-2.55-.25-3.25-1.8l-4.2-6.3-1.5 11.25m-45.3-4.85q-.5-.4-.9-.8-2.3-2.35-2.6-5.6l-1.5 11.25h21q-11.25-.95-16-4.85m97.7 4.85q-.3-.05-.6-.05-10.8-1-15.4-4.8-3.15-2.55-3.5-6.35l-1.5 11.2h21Z\" }), _jsx(\"path\", { xmlns: \"http://www.w3.org/2000/svg\", fill: \"var(--ruffle-orange)\", d: \"M92.6 54.8q-1.95-1.4-4.5-1.4H60.35q-1.35 0-2.6.45-1.65.55-3.15 1.8-2.75 2.25-3.25 5.25l-1.65 12h.05v.3l5.85 1.15h-9.5q-.5.05-1 .15-.5.15-1 .35-.5.2-.95.45-.5.3-.95.7-.45.35-.85.8-.35.4-.65.85-.3.45-.5.9-.15.45-.3.95l-5.85 41.6H50.3l5-35.5 1.5-11.25 4.25 6.45.6.6q.25.2.55.3.4.25.9.5.4-.05.8-.05.1-.05.25-.1l.1-.2q.15-.1.25-.25.1-.05.15-.1l.3-1.05 1.75-12.3h11.15L75.8 82.6h16.5l2.3-16.25h-.05l.8-5.7q.4-2.45-1-4.2-.35-.4-.75-.8-.25-.25-.55-.5-.2-.2-.45-.35m16.2 18.1h.05l-.05.3 5.85 1.15H105.2q-.5.05-1 .15-.5.15-1 .35-.5.2-.95.45-.5.3-1 .65-.4.4-.8.85-.25.3-.55.65-.05.1-.15.2-.25.45-.4.9-.2.45-.3.95-.1.65-.2 1.25-.2 1.15-.4 2.25l-4.3 30.6q-.25 3 1.75 5.25 1.6 1.8 4 2.15.6.1 1.25.1h27.35q3.25 0 6-2.25.35-.35.7-.55l.3-.2q2-2 2.25-4.5l1.65-11.6q.05-.05.1-.05l1.65-11.35h.05l.7-5.2 1.5-11.25 4.25 6.4v.05l.05.05q.25.3.55.6.1.15.25.25.3.25.8.4.15.05.4.05.6.05 1.1-.1l.15-.15.3-.4.3-1.05 1.3-9.05h-.05l.7-5.05h-.05l.15-1.25h-.05l1.65-11.7h-16.25l-2.65 19.5h.05v.2l-.05.1h.05l5.8 1.15H132.7q-.5.05-1 .15-.5.15-1 .35-.15.05-.3.15-.3.1-.55.25-.05 0-.1.05-.5.3-1 .65-.4.35-.7.7-.55.7-.95 1.45-.35.65-.55 1.4-.15.7-.25 1.4v.05q-.15 1.05-.35 2.05l-1.2 8.75v.1l-2.1 14.7H111.4l2.25-15.55h.05l.7-5.2 1.5-11.25 4.25 6.4v.05l.05.05q.25.3.55.6.55.7 1.45.7.6.05 1.1-.1l.45-.55.3-1.05 1.3-9.05h-.05l.7-5.05h-.05l.15-1.25h-.05l1.65-11.7h-16.25l-2.65 19.5m106.5-41.75q-2.25-2.25-5.5-2.25h-27.75q-3 0-5.75 2.25-1.3.95-2.05 2.1-.45.6-.7 1.2-.2.5-.35 1-.1.45-.15.95l-4.15 29.95h-.05l-.7 5.2h-.05l-.2 1.35h.05l-.05.3 5.85 1.15h-9.45q-2.1.05-3.95 1.6-1.9 1.55-2.25 3.55l-.5 3.5h-.05l-5.3 38.1h16.25l5-35.5 1.5-11.25q.35 3.85 3.5 6.4.65.5 1.4 1 3.3 2.05 8.9 3.1 2.6.5 5.7.75l1.75-11.25h-12.2l.4-2.95h-.05l.7-5.05h-.05q.1-.9.3-1.9.1-.75.2-1.6.85-5.9 2.15-14.9 0-.15.05-.25l.1-.9q.2-1.55.45-3.15h11.25l-3.1 20.8h16.5l4.1-28.05q.15-1.7-.4-3.15-.5-1.1-1.35-2.1m46.65 44.15q-.5.3-1 .65-.4.4-.8.85-.35.4-.7.85-.25.45-.45.9-.15.45-.3.95l-5.85 41.6h16.25l5-35.5 1.5-11.25 4.2 6.3q.7 1.55 3.25 1.8l.05-.1q.25-.4.35-.85l.3-1.05 1.8-14.05v-.05l5.35-37.45h-16.25l-6.15 44.3 5.85 1.15h-9.45q-.5.05-1 .15-.5.15-1 .35-.5.2-.95.45m5.4-38.9q.15-1.7-.4-3.15-.5-1.1-1.35-2.1-2.25-2.25-5.5-2.25h-27.75q-2.3 0-4.45 1.35-.65.35-1.3.9-1.3.95-2.05 2.1-.45.6-.7 1.2-.4.9-.5 1.95l-4.15 29.95h-.05l-.7 5.2h-.05l-.2 1.35h.05l-.05.3 5.85 1.15h-9.45q-2.1.05-3.95 1.6-1.9 1.55-2.25 3.55l-.5 3.5h-.05l-1.2 8.75v.1l-4.1 29.25h16.25l5-35.5 1.5-11.25q.3 3.25 2.6 5.6.4.4.9.8 4.75 3.9 16 4.85l1.75-11.25h-12.2l.4-2.95h-.05l.7-5.05h-.05q.15-.9.3-1.9.1-.75.25-1.6.15-1.25.35-2.65v-.05q.95-6.7 2.35-16.5h11.25l-3.1 20.8h16.5l4.1-28.05M345 66.35h-.05l1.15-8.2q.5-3-1.75-5.25-1.25-1.25-3-1.75-1-.5-2.25-.5h-27.95q-.65 0-1.3.1-2.5.35-4.7 2.15-2.75 2.25-3.25 5.25l-1.95 14.7v.05l-.05.3 5.85 1.15h-9.45q-1.9.05-3.6 1.35-.2.1-.35.25-1.9 1.55-2.25 3.55l-4.85 34.1q-.25 3 1.75 5.25 1.25 1.4 3 1.95 1.05.3 2.25.3H320q3.25 0 6-2.25 2.75-2 3.25-5l2.75-18.5h-16.5l-1.75 11H302.5l2.1-14.75h.05l.85-6 1.5-11.2q.35 3.8 3.5 6.35 4.6 3.8 15.4 4.8.3 0 .6.05h15.75L345 66.35m-16.4-.95-1.25 8.95h-11.3l.4-2.95h-.05l.7-5.05h-.1l.15-.95h11.45Z\" })] }) }), _jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", class: \"loading-animation\", viewBox: \"0 0 66 66\", children: _jsx(\"circle\", { xmlns: \"http://www.w3.org/2000/svg\", class: \"spinner\", fill: \"none\", \"stroke-width\": \"6\", \"stroke-linecap\": \"round\", cx: \"33\", cy: \"33\", r: \"30\" }) }), _jsx(\"div\", { class: \"loadbar\", children: _jsx(\"div\", { class: \"loadbar-inner\" }) })] }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nexport function SaveManager() {\n return (_jsx(\"div\", { id: \"save-manager\", class: \"modal hidden\", children: _jsxs(\"div\", { id: \"modal-area\", class: \"modal-area\", children: [_jsx(\"span\", { class: \"close-modal\" }), _jsx(\"div\", { class: \"general-save-options\", children: _jsx(\"span\", { class: \"modal-button\" }) }), _jsx(\"table\", { id: \"local-saves\" })] }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nimport { text } from \"../i18n\";\nexport function VolumeControls() {\n return (_jsx(\"div\", { id: \"volume-controls-modal\", class: \"modal hidden\", children: _jsx(\"div\", { class: \"modal-area\", children: _jsxs(\"div\", { id: \"volume-controls\", children: [_jsx(\"input\", { id: \"mute-checkbox\", type: \"checkbox\" }), _jsx(\"label\", { id: \"volume-mute\", for: \"mute-checkbox\", title: text(\"volume-controls-unmute\") }), _jsx(\"label\", { id: \"volume-min\", for: \"mute-checkbox\", title: text(\"volume-controls-mute\") }), _jsx(\"label\", { id: \"volume-mid\", for: \"mute-checkbox\", title: text(\"volume-controls-mute\") }), _jsx(\"label\", { id: \"volume-max\", for: \"mute-checkbox\", title: text(\"volume-controls-mute\") }), _jsx(\"input\", { id: \"volume-slider\", type: \"range\", min: \"0\", max: \"100\", step: \"1\" }), _jsx(\"span\", { id: \"volume-slider-text\" }), _jsx(\"span\", { class: \"close-modal\" })] }) }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nexport function UnsupportedVideo() {\n return (_jsx(\"div\", { id: \"video-modal\", class: \"modal hidden\", children: _jsxs(\"div\", { class: \"modal-area\", children: [_jsx(\"span\", { class: \"close-modal\" }), _jsx(\"div\", { id: \"video-holder\" })] }) }));\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nimport { text } from \"../i18n\";\nexport function HardwareAcceleration() {\n return (_jsx(\"div\", { id: \"hardware-acceleration-modal\", class: \"modal hidden\", children: _jsxs(\"div\", { class: \"modal-area\", children: [_jsx(\"span\", { class: \"close-modal\" }), _jsx(\"span\", { id: \"acceleration-text\", children: text(\"enable-hardware-acceleration\") }), _jsx(\"a\", { href: \"https://github.com/ruffle-rs/ruffle/wiki/Frequently-Asked-Questions-For-Users#chrome-hardware-acceleration\", target: \"_blank\", class: \"modal-button\", children: text(\"enable-hardware-acceleration-link\") })] }) }));\n}\n","import { jsx as _jsx } from \"tsx-dom/jsx-runtime\";\nexport function ContextMenuOverlay() {\n return (_jsx(\"div\", { id: \"context-menu-overlay\", class: \"hidden\", children: _jsx(\"ul\", { id: \"context-menu\" }) }));\n}\n","export const FLASH_MIMETYPE = \"application/x-shockwave-flash\";\nexport const FUTURESPLASH_MIMETYPE = \"application/futuresplash\";\nexport const FLASH7_AND_8_MIMETYPE = \"application/x-shockwave-flash2-preview\";\nexport const FLASH_MOVIE_MIMETYPE = \"application/vnd.adobe.flash.movie\";\nexport const FLASH_ACTIVEX_CLASSID = \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\";\n","import { FLASH_MIMETYPE, FUTURESPLASH_MIMETYPE, FLASH7_AND_8_MIMETYPE, FLASH_MOVIE_MIMETYPE, } from \"./flash-identifiers\";\n/**\n * Returns whether the given filename ends in a known Flash extension.\n *\n * @param filename The filename to test.\n * @returns True if the filename is a Flash movie (swf or spl).\n */\nfunction isSwfFilename(filename) {\n let pathname = \"\";\n try {\n // A base URL is required if `filename` is a relative URL, but we don't need to detect the real URL origin.\n pathname = new URL(filename, \"https://example.com\").pathname;\n }\n catch (_err) {\n // Some invalid filenames, like `///`, could raise a TypeError. Let's fail silently in this situation.\n }\n if (pathname && pathname.length >= 4) {\n const extension = pathname.slice(-4).toLowerCase();\n if (extension === \".swf\" || extension === \".spl\") {\n return true;\n }\n }\n return false;\n}\n/**\n * Returns whether the given MIME type is a known Flash type.\n *\n * @param mimeType The MIME type to test.\n * @param allowExtraMimes Whether extra MIME types, non-Flash related, are allowed.\n * @returns True if the MIME type is a Flash MIME type.\n */\nfunction isSwfMimeType(mimeType, allowExtraMimes) {\n mimeType = mimeType.toLowerCase();\n switch (mimeType) {\n case FLASH_MIMETYPE.toLowerCase():\n case FUTURESPLASH_MIMETYPE.toLowerCase():\n case FLASH7_AND_8_MIMETYPE.toLowerCase():\n case FLASH_MOVIE_MIMETYPE.toLowerCase():\n return true;\n default:\n if (allowExtraMimes) {\n // Allow extra MIME types to improve detection of Flash content.\n // Extension: Some sites (e.g. swfchan.net) might (wrongly?) serve files with octet-stream.\n // Polyfill: Other sites (e.g. #11050) might use octet-stream when defining an <embed> tag.\n switch (mimeType) {\n case \"application/octet-stream\":\n case \"binary/octet-stream\":\n return true;\n }\n }\n }\n return false;\n}\n/**\n * Returns whether the given filename and MIME type resolve as a Flash content.\n *\n * @param filename The filename to test.\n * @param mimeType The MIME type to test.\n * @returns True if the given arguments resolve as a Flash content.\n */\nexport function isSwf(filename, mimeType) {\n const isSwfExtension = isSwfFilename(filename);\n if (!mimeType) {\n // If no MIME type is specified (null or empty string), returns whether the movie ends in a known Flash extension.\n return isSwfExtension;\n }\n else {\n return isSwfMimeType(mimeType, isSwfExtension);\n }\n}\n/**\n * Create a filename to save a downloaded SWF into.\n *\n * @param swfUrl The URL of the SWF file.\n * @returns The filename the SWF file can be saved at.\n */\nexport function swfFileName(swfUrl) {\n const pathName = swfUrl.pathname;\n const name = pathName.substring(pathName.lastIndexOf(\"/\") + 1);\n return name;\n}\n","// This must be in global scope because `document.currentScript`\n// works only while the script is initially being processed.\nexport let currentScriptURL = null;\nexport let isExtension = false;\ntry {\n if (document.currentScript !== undefined &&\n document.currentScript !== null &&\n \"src\" in document.currentScript &&\n document.currentScript.src !== \"\") {\n let src = document.currentScript.src;\n // CDNs allow omitting the filename. If it's omitted, append a slash to\n // prevent the last component from being dropped.\n if (!src.endsWith(\".js\") && !src.endsWith(\"/\")) {\n src += \"/\";\n }\n currentScriptURL = new URL(\".\", src);\n isExtension = currentScriptURL.protocol.includes(\"extension\");\n }\n}\ncatch (_e) {\n console.warn(\"Unable to get currentScript URL\");\n}\n","export const RUFFLE_ORIGIN = \"https://ruffle.rs\";\n","export class LoadSwfError extends Error {\n constructor(swfUrl) {\n super(`Failed to fetch ${swfUrl}`);\n this.swfUrl = swfUrl;\n this.swfUrl = swfUrl;\n }\n}\nexport class InvalidSwfError extends Error {\n constructor(swfUrl) {\n super(`Not a valid swf: ${swfUrl}`);\n }\n}\nexport class LoadRuffleWasmError extends Error {\n constructor(cause) {\n super(\"Failed to load Ruffle WASM\");\n this.cause = cause;\n }\n}\nexport class InvalidOptionsError extends Error {\n constructor(message) {\n super(`Invalid options: ${message}`);\n }\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"tsx-dom/jsx-runtime\";\nimport { text, textAsParagraphs } from \"../i18n\";\nimport { createRef } from \"tsx-dom\";\nimport { buildInfo } from \"../../build-info\";\nimport { RUFFLE_ORIGIN } from \"../constants\";\nimport { InvalidOptionsError, InvalidSwfError, LoadRuffleWasmError, LoadSwfError, } from \"../errors\";\nfunction createPanicAction({ action, showDetails, errorArray, errorText, swfUrl, }) {\n if (action.type == \"show_details\") {\n const onClick = () => {\n showDetails();\n return false;\n };\n return (_jsx(\"li\", { children: _jsx(\"a\", { href: \"#\", id: \"panic-view-details\", onClick: onClick, children: text(\"view-error-details\") }) }));\n }\n else if (action.type == \"open_link\") {\n return (_jsx(\"li\", { children: _jsx(\"a\", { href: action.url, target: \"_top\", children: action.label }) }));\n }\n else {\n let url;\n if (document.location.protocol.includes(\"extension\") && swfUrl) {\n url = swfUrl.href;\n }\n else {\n url = document.location.href;\n }\n // Remove query params for the issue title.\n url = url.split(/[?#]/, 1)[0];\n const issueTitle = `Error on ${url}`;\n let issueLink = `https://github.com/ruffle-rs/ruffle/issues/new?title=${encodeURIComponent(issueTitle)}&template=error_report.md&labels=error-report&body=`;\n let issueBody = encodeURIComponent(errorText);\n if (errorArray.stackIndex > -1 &&\n String(issueLink + issueBody).length > 8195) {\n // Strip the stack error from the array when the produced URL is way too long.\n // This should prevent \"414 Request-URI Too Large\" errors on GitHub.\n errorArray[errorArray.stackIndex] = null;\n if (errorArray.avmStackIndex > -1) {\n errorArray[errorArray.avmStackIndex] = null;\n }\n issueBody = encodeURIComponent(errorArray.join(\"\"));\n }\n issueLink += issueBody;\n return (_jsx(\"li\", { children: _jsx(\"a\", { href: issueLink, target: \"_top\", children: text(\"report-bug\") }) }));\n }\n}\nfunction isBuildOutdated() {\n const buildDate = new Date(buildInfo.buildDate);\n const monthsPrior = new Date();\n monthsPrior.setMonth(monthsPrior.getMonth() - 6); // 6 months prior\n return monthsPrior > buildDate;\n}\nexport const CommonActions = {\n OpenDemo: {\n type: \"open_link\",\n url: RUFFLE_ORIGIN + \"/demo\",\n label: text(\"ruffle-demo\"),\n },\n DownloadDesktop: {\n type: \"open_link\",\n url: RUFFLE_ORIGIN + \"/downloads#desktop-app\",\n label: text(\"ruffle-desktop\"),\n },\n UpdateRuffle: {\n type: \"open_link\",\n url: RUFFLE_ORIGIN + \"/downloads\",\n label: text(\"update-ruffle\"),\n },\n CreateReport: {\n type: \"create_report\",\n },\n ShowDetails: {\n type: \"show_details\",\n },\n createReportOrUpdate() {\n return isBuildOutdated() ? this.UpdateRuffle : this.CreateReport;\n },\n openWiki(page, label) {\n return {\n type: \"open_link\",\n url: `https://github.com/ruffle-rs/ruffle/wiki/${page}`,\n label: label ?? text(\"ruffle-wiki\"),\n };\n },\n};\nfunction createPanicError(error) {\n if (error instanceof LoadSwfError) {\n if (error.swfUrl && !error.swfUrl.protocol.includes(\"http\")) {\n // Loading a swf on the `file:` protocol\n return {\n body: textAsParagraphs(\"error-file-protocol\"),\n actions: [\n CommonActions.OpenDemo,\n CommonActions.DownloadDesktop,\n ],\n };\n }\n if (window.location.origin === error.swfUrl?.origin ||\n // The extension's internal player page is not restricted by CORS\n window.location.protocol.includes(\"extension\")) {\n return {\n body: textAsParagraphs(\"error-swf-fetch\"),\n actions: [CommonActions.ShowDetails],\n };\n }\n // This is a selfhosted build of Ruffle that tried to make a cross-origin request\n return {\n body: textAsParagraphs(\"error-swf-cors\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#configure-cors-header\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n if (error instanceof InvalidSwfError) {\n return {\n body: textAsParagraphs(\"error-invalid-swf\"),\n actions: [CommonActions.ShowDetails],\n };\n }\n if (error instanceof LoadRuffleWasmError) {\n if (window.location.protocol === \"file:\") {\n // Loading the wasm from the `file:` protocol\n return {\n body: textAsParagraphs(\"error-file-protocol\"),\n actions: [\n CommonActions.OpenDemo,\n CommonActions.DownloadDesktop,\n ],\n };\n }\n const message = String(error.cause.message).toLowerCase();\n if (message.includes(\"mime\")) {\n // Self hosted: Cannot load `.wasm` file - incorrect MIME type\n return {\n body: textAsParagraphs(\"error-wasm-mime-type\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#configure-webassembly-mime-type\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n if (message.includes(\"networkerror\") ||\n message.includes(\"failed to fetch\")) {\n // Self hosted: Cannot load `.wasm` file - CORS issues\n return {\n body: textAsParagraphs(\"error-wasm-cors\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#configure-cors-header\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n if (message.includes(\"disallowed by embedder\")) {\n // General error: Cannot load `.wasm` file - a native object / function is overridden\n return {\n body: textAsParagraphs(\"error-csp-conflict\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#configure-wasm-csp\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n if (error.cause.name === \"CompileError\") {\n // Self hosted: Cannot load `.wasm` file - incorrect configuration or missing files\n return {\n body: textAsParagraphs(\"error-wasm-invalid\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#addressing-a-compileerror\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n if ((message.includes(\"could not download wasm module\") ||\n message.includes(\"webassembly compilation aborted\")) &&\n error.cause.name === \"TypeError\") {\n // Usually a transient network error or botched deployment\n return {\n body: textAsParagraphs(\"error-wasm-download\"),\n actions: [CommonActions.ShowDetails],\n };\n }\n if (error.cause.name === \"TypeError\") {\n // Self hosted: Cannot load `.wasm` file - a native object / function is overridden\n const body = textAsParagraphs(\"error-javascript-conflict\");\n if (isBuildOutdated()) {\n body.appendChild(textAsParagraphs(\"error-javascript-conflict-outdated\", {\n buildDate: buildInfo.buildDate,\n }));\n }\n return {\n body,\n actions: [\n CommonActions.createReportOrUpdate(),\n CommonActions.ShowDetails,\n ],\n };\n }\n if (navigator.userAgent.includes(\"Edg\") &&\n message.includes(\"webassembly is not defined\")) {\n // Self hosted: User has disabled WebAssembly in Microsoft Edge through the\n // \"Enhance your Security on the web\" setting.\n return {\n body: textAsParagraphs(\"error-wasm-disabled-on-edge\"),\n actions: [\n CommonActions.openWiki(\"Frequently-Asked-Questions-For-Users#edge-webassembly-error\", text(\"more-info\")),\n CommonActions.ShowDetails,\n ],\n };\n }\n // Self hosted: Cannot load `.wasm` file - file not found\n return {\n body: textAsParagraphs(\"error-wasm-not-found\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#configuration-options\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n if (error instanceof InvalidOptionsError) {\n // General error: Incorrect JavaScript configuration\n return {\n body: textAsParagraphs(\"error-javascript-config\"),\n actions: [\n CommonActions.openWiki(\"Using-Ruffle#javascript-api\"),\n CommonActions.ShowDetails,\n ],\n };\n }\n return {\n body: textAsParagraphs(\"error-unknown\", {\n buildDate: buildInfo.buildDate,\n outdated: String(isBuildOutdated),\n }),\n actions: [\n CommonActions.createReportOrUpdate(),\n CommonActions.ShowDetails,\n ],\n };\n}\nexport function showPanicScreen(container, error, errorArray, swfUrl) {\n const errorText = errorArray.join(\"\");\n let { body, actions } = createPanicError(error);\n const panicBody = createRef();\n const showDetails = () => {\n panicBody.current.classList.add(\"details\");\n panicBody.current.replaceChildren(_jsx(\"textarea\", { readOnly: true, children: errorText }));\n };\n container.textContent = \"\";\n container.appendChild(_jsxs(\"div\", { id: \"panic\", children: [_jsx(\"div\", { id: \"panic-title\", children: text(\"panic-title\") }), _jsx(\"div\", { id: \"panic-body\", ref: panicBody, children: body }), _jsx(\"div\", { id: \"panic-footer\", children: _jsx(\"ul\", { children: actions.map((action) => createPanicAction({\n action,\n showDetails,\n errorText,\n errorArray,\n swfUrl,\n })) }) })] }));\n}\n","export const bigInt=()=>(async e=>{try{return(await WebAssembly.instantiate(e)).instance.exports.b(BigInt(0))===BigInt(0)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,126,1,126,3,2,1,0,7,5,1,1,98,0,0,10,6,1,4,0,32,0,11])),bulkMemory=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11])),exceptions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),exceptionsFinal=()=>(async()=>{try{return new WebAssembly.Module(Uint8Array.from(atob(\"AGFzbQEAAAABBAFgAAADAgEAChABDgACaR9AAQMAAAsACxoL\"),(e=>e.codePointAt(0)))),!0}catch(e){return!1}})(),extendedConst=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,0,1,11,9,1,0,65,1,65,2,106,11,0])),gc=()=>(async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,95,1,120,0])))(),jsStringBuiltins=()=>(async()=>{try{return await WebAssembly.instantiate(Uint8Array.from(atob(\"AGFzbQEAAAABBgFgAW8BfwIXAQ53YXNtOmpzLXN0cmluZwR0ZXN0AAA=\"),(e=>e.codePointAt(0))),{},{builtins:[\"js-string\"]}),!0}catch(e){return!1}})(),jspi=()=>(async()=>\"Suspending\"in WebAssembly)(),memory64=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,4,1])),multiMemory=()=>(async()=>{try{return new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,5,5,2,0,0,0,0])),!0}catch(e){return!1}})(),multiValue=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,0,2,127,127,3,2,1,0,10,8,1,6,0,65,0,65,0,11])),mutableGlobals=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,2,8,1,1,97,1,98,3,127,1,6,6,1,127,1,65,0,11,7,5,1,1,97,3,1])),referenceTypes=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,7,1,5,0,208,112,26,11])),relaxedSimd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11])),saturatedFloatToInt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,12,1,10,0,67,0,0,0,0,252,0,26,11])),signExtensions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,65,0,192,26,11])),simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),streamingCompilation=()=>(async()=>\"compileStreaming\"in WebAssembly)(),tailCall=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11])),threads=()=>(async e=>{try{return\"undefined\"!=typeof MessageChannel&&(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(e)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11])),typeReflection=()=>(async()=>\"Function\"in WebAssembly)(),typedFunctionReferences=()=>(async()=>{try{return new WebAssembly.Module(Uint8Array.from(atob(\"AGFzbQEAAAABEANgAX8Bf2ABZAABf2AAAX8DBAMBAAIJBQEDAAEBChwDCwBBCkEqIAAUAGoLBwAgAEEBagsGANIBEAAL\"),(e=>e.codePointAt(0)))),!0}catch(e){return!1}})();\n","/**\n * Polyfills the `Array.prototype.reduce` method.\n *\n * Production steps of ECMA-262, Edition 5, 15.4.4.21\n * Reference: https://es5.github.io/#x15.4.4.21\n * https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n */\nfunction polyfillArrayPrototypeReduce() {\n Object.defineProperty(Array.prototype, \"reduce\", {\n value(...args) {\n if (args.length === 0 &&\n window.Prototype &&\n window.Prototype.Version &&\n window.Prototype.Version < \"1.6.1\") {\n // Off-spec: compatibility with prototype.js\n return this.length > 1 ? this : this[0];\n }\n const callback = args[0];\n if (this === null) {\n throw new TypeError(\"Array.prototype.reduce called on null or undefined\");\n }\n if (typeof callback !== \"function\") {\n throw new TypeError(`${callback} is not a function`);\n }\n const o = Object(this);\n const len = o.length >>> 0;\n let k = 0;\n let value;\n if (args.length >= 2) {\n value = args[1];\n }\n else {\n while (k < len && !(k in o)) {\n k++;\n }\n if (k >= len) {\n throw new TypeError(\"Reduce of empty array with no initial value\");\n }\n value = o[k++];\n }\n while (k < len) {\n if (k in o) {\n value = callback(value, o[k], k, o);\n }\n k++;\n }\n return value;\n },\n });\n}\n/**\n * Polyfills the `Window` function.\n */\nfunction polyfillWindow() {\n if (typeof window.constructor !== \"function\" ||\n !isNativeFunction(window.constructor)) {\n // Don't polyfill `Window` if `window.constructor` has been overridden.\n return;\n }\n // @ts-expect-error: `Function not assignable to { new (): Window; prototype: Window; }`\n window.Window = window.constructor;\n}\n/**\n * Polyfills the `Reflect` object and members.\n *\n * This is a partial implementation, just enough to match our needs.\n */\nfunction tryPolyfillReflect() {\n if (window.Reflect === undefined || window.Reflect === null) {\n // @ts-expect-error: {} indeed doesn't implement Reflect's interface.\n window.Reflect = {};\n }\n if (typeof Reflect.get !== \"function\") {\n Object.defineProperty(Reflect, \"get\", {\n value(target, key) {\n return target[key];\n },\n });\n }\n if (typeof Reflect.set !== \"function\") {\n Object.defineProperty(Reflect, \"set\", {\n value(target, key, value) {\n target[key] = value;\n },\n });\n }\n if (typeof Reflect.has !== \"function\") {\n Object.defineProperty(Reflect, \"has\", {\n value(target, key) {\n // @ts-expect-error: Type 'T' is not assignable to type 'object'.\n return key in target;\n },\n });\n }\n if (typeof Reflect.ownKeys !== \"function\") {\n Object.defineProperty(Reflect, \"ownKeys\", {\n value(target) {\n return [\n ...Object.getOwnPropertyNames(target),\n ...Object.getOwnPropertySymbols(target),\n ];\n },\n });\n }\n}\n/**\n * Determines whether a function is native or not.\n *\n * @param func The function to test.\n * @returns True if the function hasn't been overridden.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction isNativeFunction(func) {\n const val = typeof Function.prototype.toString === \"function\"\n ? Function.prototype.toString()\n : null;\n if (typeof val === \"string\" && val.indexOf(\"[native code]\") >= 0) {\n return (Function.prototype.toString.call(func).indexOf(\"[native code]\") >= 0);\n }\n return false;\n}\n/**\n * Checks and applies the polyfills to the current window, if needed.\n */\nexport function setPolyfillsOnLoad() {\n if (typeof Array.prototype.reduce !== \"function\" ||\n !isNativeFunction(Array.prototype.reduce)) {\n // Some external libraries override the `Array.prototype.reduce` method in a way\n // that causes Webpack to crash (#1507, #1865), so we need to override it again.\n polyfillArrayPrototypeReduce();\n }\n if (typeof Window !== \"function\" || !isNativeFunction(Window)) {\n // Overriding the native `Window` function causes issues in wasm-bindgen, as a\n // code like `window instanceof Window` will no longer work.\n polyfillWindow();\n }\n // Some pages override the native `Reflect` object, which causes various issues:\n // 1- wasm-bindgen's stdlib may crash (#3173).\n // 2- FlashVars may be ignored (#8537).\n tryPolyfillReflect();\n}\n","/**\n * Conditional ruffle loader\n */\nimport { bulkMemory, simd, saturatedFloatToInt, signExtensions, referenceTypes, } from \"wasm-feature-detect\";\nimport { setPolyfillsOnLoad } from \"./js-polyfills\";\nimport { internalSourceApi } from \"./internal/internal-source-api\";\n/**\n * Load ruffle from an automatically-detected location.\n *\n * This function returns a new instance of Ruffle and downloads it every time.\n * You should not use it directly; this module will memoize the resource\n * download.\n *\n * @param progressCallback The callback that will be run with Ruffle's download progress.\n * @returns A ruffle-builder constructor that may be used to create new RuffleInstanceBuilder\n * instances.\n */\nasync function fetchRuffle(progressCallback) {\n // Apply some pure JavaScript polyfills to prevent conflicts with external\n // libraries, if needed.\n setPolyfillsOnLoad();\n // NOTE: Keep this list in sync with $RUSTFLAGS in the CI build config!\n const extensionsSupported = (await Promise.all([\n bulkMemory(),\n simd(),\n saturatedFloatToInt(),\n signExtensions(),\n referenceTypes(),\n ])).every(Boolean);\n if (!extensionsSupported) {\n console.log(\"Some WebAssembly extensions are NOT available, falling back to the vanilla WebAssembly module\");\n }\n // Easy \"on first load\": just set it to something else after the call.\n internalSourceApi.options.onFirstLoad?.();\n internalSourceApi.options.onFirstLoad = () => { };\n // Note: The argument passed to import() has to be a simple string literal,\n // otherwise some bundler will get confused and won't include the module?\n const { default: init, RuffleInstanceBuilder, ZipWriter, } = await (extensionsSupported\n ? import(\"../dist/ruffle_web-wasm_extensions\")\n : import(\"../dist/ruffle_web\"));\n let response;\n const wasmUrl = extensionsSupported\n ? new URL(\"../dist/ruffle_web-wasm_extensions_bg.wasm\", import.meta.url)\n : new URL(\"../dist/ruffle_web_bg.wasm\", import.meta.url);\n const wasmResponse = await fetch(wasmUrl);\n // The Pale Moon browser lacks full support for ReadableStream.\n // However, ReadableStream itself is defined.\n const readableStreamProperlyDefined = typeof ReadableStreamDefaultController === \"function\";\n if (progressCallback && readableStreamProperlyDefined) {\n const contentLength = wasmResponse?.headers?.get(\"content-length\") || \"\";\n let bytesLoaded = 0;\n // Use parseInt rather than Number so the empty string is coerced to NaN instead of 0\n const bytesTotal = parseInt(contentLength);\n response = new Response(new ReadableStream({\n async start(controller) {\n const reader = wasmResponse.body?.getReader();\n if (!reader) {\n throw \"Response had no body\";\n }\n progressCallback(bytesLoaded, bytesTotal);\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value?.byteLength) {\n bytesLoaded += value?.byteLength;\n }\n controller.enqueue(value);\n progressCallback(bytesLoaded, bytesTotal);\n }\n controller.close();\n },\n }), wasmResponse);\n }\n else {\n response = wasmResponse;\n }\n await init(response);\n return [RuffleInstanceBuilder, ZipWriter];\n}\nlet nativeConstructors = null;\n/**\n * Obtain an instance of `Ruffle`.\n *\n * This function returns a promise which yields a new `RuffleInstanceBuilder` asynchronously.\n *\n * @param progressCallback The callback that will be run with Ruffle's download progress.\n * @returns A ruffle instance builder.\n */\nexport async function createRuffleBuilder(progressCallback) {\n if (nativeConstructors === null) {\n nativeConstructors = fetchRuffle(progressCallback);\n }\n const constructors = await nativeConstructors;\n return [new constructors[0](), () => new constructors[1]()];\n}\n","/**\n * Number of times to try defining a custom element.\n */\nconst MAX_TRIES = 999;\n/**\n * A mapping between internal element IDs and DOM element IDs.\n */\nconst privateRegistry = {};\n/**\n * Lookup a previously registered custom element.\n *\n * The returned object will have `name`, `class`, and `internal_name`\n * properties listing the external name, implementing class, and internal name\n * respectively.\n *\n * @param elementName The internal element name, previously used to\n * register the element with the private registry.\n * @returns The element data in the registry, or null if there is\n * no such element name registered.\n */\nexport function lookupElement(elementName) {\n const data = privateRegistry[elementName];\n if (data !== undefined) {\n return {\n internalName: elementName,\n name: data.name,\n class: data.class,\n };\n }\n else {\n return null;\n }\n}\n/**\n * Register a custom element.\n *\n * This function is designed to be tolerant of naming conflicts. If\n * registration fails, we modify the name, and try again. As a result, this\n * function returns the real element name to use.\n *\n * Calling this function multiple times will *not* register multiple elements.\n * We store a private registry mapping internal element names to DOM names.\n * Thus, the proper way to use this function is to call it every time you are\n * about to work with custom element names.\n *\n * @param elementName The internal name of the element.\n * @param elementClass The class of the element.\n *\n * You must call this function with the same class every time.\n * @returns The actual element name.\n * @throws Throws an error if two different elements were registered with the\n * same internal name.\n */\nexport function registerElement(elementName, elementClass) {\n const registration = privateRegistry[elementName];\n if (registration !== undefined) {\n if (registration.class !== elementClass) {\n throw new Error(\"Internal naming conflict on \" + elementName);\n }\n else {\n return registration.name;\n }\n }\n let tries = 0;\n if (window.customElements !== undefined) {\n while (tries < MAX_TRIES) {\n let externalName = elementName;\n if (tries > 0) {\n externalName = externalName + \"-\" + tries;\n }\n if (window.customElements.get(externalName) !== undefined) {\n tries += 1;\n continue;\n }\n else {\n window.customElements.define(externalName, elementClass);\n }\n privateRegistry[elementName] = {\n class: elementClass,\n name: externalName,\n internalName: elementName,\n };\n return externalName;\n }\n }\n throw new Error(\"Failed to assign custom element \" + elementName);\n}\n","/**\n * Checks if the given value is explicitly `T` (not null, not undefined)\n *\n * @param value The value to test\n * @returns true if the value isn't null or undefined\n */\nfunction isExplicit(value) {\n return value !== null && value !== undefined;\n}\n/**\n * Configures the given RuffleInstanceBuilder for the general options provided.\n *\n * This is the translation layer between what we allow users to provide through e.g. `window.RufflePlayer.config`,\n * which is quite relaxed and may evolve over time,\n * and the actual values we accept inside Rust (which is quite strict).\n *\n * This allows us to change the rust side at will, and without needing to worry about backwards compatibility, parsing, etc.\n *\n * @param builder The builder to set the options on\n * @param config The options to apply\n */\nexport function configureBuilder(builder, config) {\n // Guard things for being explicitly set, so that we don't need to specify defaults in yet another place...\n if (isExplicit(config.allowScriptAccess)) {\n builder.setAllowScriptAccess(config.allowScriptAccess);\n }\n if (isExplicit(config.backgroundColor)) {\n builder.setBackgroundColor(parseColor(config.backgroundColor));\n }\n if (isExplicit(config.upgradeToHttps)) {\n builder.setUpgradeToHttps(config.upgradeToHttps);\n }\n if (isExplicit(config.compatibilityRules)) {\n builder.setCompatibilityRules(config.compatibilityRules);\n }\n if (isExplicit(config.letterbox)) {\n builder.setLetterbox(config.letterbox.toLowerCase());\n }\n if (isExplicit(config.base)) {\n builder.setBaseUrl(config.base);\n }\n if (isExplicit(config.menu)) {\n builder.setShowMenu(config.menu);\n }\n if (isExplicit(config.allowFullscreen)) {\n builder.setAllowFullscreen(config.allowFullscreen);\n }\n if (isExplicit(config.salign)) {\n builder.setStageAlign(config.salign.toLowerCase());\n }\n if (isExplicit(config.forceAlign)) {\n builder.setForceAlign(config.forceAlign);\n }\n if (isExplicit(config.quality)) {\n builder.setQuality(config.quality.toLowerCase());\n }\n else if (isMobileOrTablet()) {\n console.log(\"Running on a mobile device; defaulting to low quality\");\n builder.setQuality(\"low\");\n }\n if (isExplicit(config.scale)) {\n builder.setScale(config.scale.toLowerCase());\n }\n if (isExplicit(config.forceScale)) {\n builder.setForceScale(config.forceScale);\n }\n if (isExplicit(config.frameRate)) {\n builder.setFrameRate(config.frameRate);\n }\n if (isExplicit(config.wmode)) {\n builder.setWmode(config.wmode);\n }\n if (isExplicit(config.logLevel)) {\n builder.setLogLevel(config.logLevel);\n }\n if (isExplicit(config.maxExecutionDuration)) {\n builder.setMaxExecutionDuration(parseDuration(config.maxExecutionDuration));\n }\n if (isExplicit(config.playerVersion)) {\n builder.setPlayerVersion(config.playerVersion);\n }\n if (isExplicit(config.preferredRenderer)) {\n builder.setPreferredRenderer(config.preferredRenderer);\n }\n if (isExplicit(config.openUrlMode)) {\n builder.setOpenUrlMode(config.openUrlMode.toLowerCase());\n }\n if (isExplicit(config.allowNetworking)) {\n builder.setAllowNetworking(config.allowNetworking.toLowerCase());\n }\n if (isExplicit(config.credentialAllowList)) {\n builder.setCredentialAllowList(config.credentialAllowList);\n }\n if (isExplicit(config.playerRuntime)) {\n builder.setPlayerRuntime(config.playerRuntime);\n }\n if (isExplicit(config.socketProxy)) {\n for (const proxy of config.socketProxy) {\n builder.addSocketProxy(proxy.host, proxy.port, proxy.proxyUrl);\n }\n }\n}\n/**\n * Parses a color into an RGB value.\n *\n * @param color The color string to parse\n * @returns A valid RGB number, or undefined if invalid\n */\nexport function parseColor(color) {\n if (color.startsWith(\"#\")) {\n color = color.substring(1);\n }\n if (color.length < 6) {\n return undefined;\n }\n let result = 0;\n for (let i = 0; i < 6; i++) {\n const digit = parseInt(color[i], 16);\n if (!isNaN(digit)) {\n result = (result << 4) | digit;\n }\n else {\n result = result << 4;\n }\n }\n return result;\n}\n/**\n * Parses a duration into number of seconds.\n *\n * @param value The duration to parse\n * @returns A valid number of seconds\n */\nexport function parseDuration(value) {\n if (typeof value === \"number\") {\n return value;\n }\n return value.secs;\n}\n/**\n * Very bad way to guess if we're running on a tablet/mobile.\n *\n * @returns True if we believe this may be a mobile or tablet device\n */\nfunction isMobileOrTablet() {\n // noinspection JSDeprecatedSymbols\n return typeof window.orientation !== \"undefined\";\n}\n","import { jsx as _jsx } from \"tsx-dom/jsx-runtime\";\nimport { AutoPlay, ContextMenu, UnmuteOverlay, WindowMode, DEFAULT_CONFIG, } from \"../../public/config\";\nimport { ruffleShadowTemplate } from \"../ui/shadow-template\";\nimport { text, textAsParagraphs } from \"../i18n\";\nimport { swfFileName } from \"../../swf-utils\";\nimport { isExtension } from \"../../current-script\";\nimport { buildInfo } from \"../../build-info\";\nimport { RUFFLE_ORIGIN } from \"../constants\";\nimport { InvalidOptionsError, InvalidSwfError, LoadRuffleWasmError, LoadSwfError, } from \"../errors\";\nimport { showPanicScreen } from \"../ui/panic\";\nimport { createRuffleBuilder } from \"../../load-ruffle\";\nimport { lookupElement } from \"../register-element\";\nimport { configureBuilder } from \"../builder\";\nconst DIMENSION_REGEX = /^\\s*(\\d+(\\.\\d+)?(%)?)/;\nlet isAudioContextUnmuted = false;\n/**\n * Converts arbitrary input to an easy to use record object.\n *\n * @param parameters Parameters to sanitize\n * @returns A sanitized map of param name to param value\n */\nfunction sanitizeParameters(parameters) {\n if (parameters === null || parameters === undefined) {\n return {};\n }\n if (!(parameters instanceof URLSearchParams)) {\n parameters = new URLSearchParams(parameters);\n }\n const output = {};\n for (const [key, value] of parameters) {\n // Every value must be type of string\n output[key] = value.toString();\n }\n return output;\n}\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n distanceTo(other) {\n const dx = other.x - this.x;\n const dy = other.y - this.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n}\n/**\n * This is the backing logic behind a HTML \"player\" element, and bridges the gap to the Rust codebase.\n */\nexport class InnerPlayer {\n constructor(element, debugPlayerInfo, onCallbackAvailable) {\n // Allows the user to permanently disable the context menu.\n this.contextMenuForceDisabled = false;\n // Whether the most recent pointer event was from a touch (or pen).\n this.isTouch = false;\n // Whether this device sends contextmenu events.\n // Set to true when a contextmenu event is seen.\n this.contextMenuSupported = false;\n // When set to `true`, the next context menu event will\n // not show the context menu.\n this._suppressContextMenu = false;\n this.panicked = false;\n this.rendererDebugInfo = \"\";\n this.longPressTimer = null;\n this.pointerDownPosition = null;\n this.pointerMoveMaxDistance = 0;\n /**\n * Any configuration that should apply to this specific player.\n * This will be defaulted with any global configuration.\n */\n this.config = {};\n this.element = element;\n this.debugPlayerInfo = debugPlayerInfo;\n this.onCallbackAvailable = onCallbackAvailable;\n this.shadow = this.element.attachShadow({ mode: \"open\", delegatesFocus: true });\n this.shadow.appendChild(ruffleShadowTemplate.content.cloneNode(true));\n this.dynamicStyles = this.shadow.getElementById(\"dynamic-styles\");\n this.container = this.shadow.getElementById(\"container\");\n this.playButton = this.shadow.getElementById(\"play-button\");\n this.playButton.addEventListener(\"click\", () => this.play());\n this.unmuteOverlay = this.shadow.getElementById(\"unmute-overlay\");\n this.splashScreen = this.shadow.getElementById(\"splash-screen\");\n this.virtualKeyboard = this.shadow.getElementById(\"virtual-keyboard\");\n this.virtualKeyboard.addEventListener(\"input\", this.virtualKeyboardInput.bind(this));\n this.saveManager = this.shadow.getElementById(\"save-manager\");\n this.videoModal = this.shadow.getElementById(\"video-modal\");\n this.hardwareAccelerationModal = this.shadow.getElementById(\"hardware-acceleration-modal\");\n this.volumeControls = this.shadow.getElementById(\"volume-controls-modal\");\n this.clipboardModal = this.shadow.getElementById(\"clipboard-modal\");\n this.addModalJavaScript(this.saveManager);\n this.addModalJavaScript(this.volumeControls);\n this.addModalJavaScript(this.videoModal);\n this.addModalJavaScript(this.hardwareAccelerationModal);\n this.addModalJavaScript(this.clipboardModal);\n this.volumeSettings = new VolumeControls(false, 100);\n this.addVolumeControlsJavaScript(this.volumeControls);\n const backupSaves = this.saveManager.querySelector(\".modal-button\");\n if (backupSaves) {\n backupSaves.addEventListener(\"click\", this.backupSaves.bind(this));\n backupSaves.innerText = text(\"save-backup-all\");\n }\n const unmuteSvg = this.unmuteOverlay.querySelector(\"#unmute-overlay-svg\");\n if (unmuteSvg) {\n const unmuteText = unmuteSvg.querySelector(\"#unmute-text\");\n unmuteText.textContent = text(\"click-to-unmute\");\n }\n this.contextMenuOverlay = this.shadow.getElementById(\"context-menu-overlay\");\n this.contextMenuElement = this.shadow.getElementById(\"context-menu\");\n const preserveMenu = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n this.contextMenuElement.addEventListener(\"contextmenu\", preserveMenu);\n this.contextMenuElement.addEventListener(\"click\", preserveMenu);\n document.documentElement.addEventListener(\"pointerdown\", this.checkIfTouch.bind(this));\n this.element.addEventListener(\"contextmenu\", this.showContextMenu.bind(this));\n this.container.addEventListener(\"pointerdown\", this.pointerDown.bind(this));\n this.container.addEventListener(\"pointermove\", this.checkLongPressMovement.bind(this));\n this.container.addEventListener(\"pointerup\", this.checkLongPress.bind(this));\n this.container.addEventListener(\"pointercancel\", this.clearLongPressTimer.bind(this));\n this.element.addEventListener(\"fullscreenchange\", this.fullScreenChange.bind(this));\n this.element.addEventListener(\"webkitfullscreenchange\", this.fullScreenChange.bind(this));\n this.instance = null;\n this.newZipWriter = null;\n this.onFSCommand = null;\n this._readyState = ReadyState.HaveNothing;\n this.metadata = null;\n this.lastActivePlayingState = false;\n this.setupPauseOnTabHidden();\n }\n /**\n * Add functions to open and close a modal.\n *\n * @param modalElement The element containing the modal.\n */\n addModalJavaScript(modalElement) {\n const videoHolder = modalElement.querySelector(\"#video-holder\");\n const hideModal = () => {\n modalElement.classList.add(\"hidden\");\n if (videoHolder) {\n videoHolder.textContent = \"\";\n }\n };\n modalElement.parentNode.addEventListener(\"click\", hideModal);\n const modalArea = modalElement.querySelector(\".modal-area\");\n if (modalArea) {\n modalArea.addEventListener(\"click\", (event) => event.stopPropagation());\n }\n const closeModal = modalElement.querySelector(\".close-modal\");\n if (closeModal) {\n closeModal.addEventListener(\"click\", hideModal);\n }\n }\n /**\n * Add the volume control texts, set the controls to the current settings and\n * add event listeners to update the settings and controls when being changed.\n *\n * @param volumeControlsModal The element containing the volume controls modal.\n */\n addVolumeControlsJavaScript(volumeControlsModal) {\n const volumeMuteCheckbox = volumeControlsModal.querySelector(\"#mute-checkbox\");\n const volumeMuteIcon = volumeControlsModal.querySelector(\"#volume-mute\");\n const volumeIcons = [\n volumeControlsModal.querySelector(\"#volume-min\"),\n volumeControlsModal.querySelector(\"#volume-mid\"),\n volumeControlsModal.querySelector(\"#volume-max\"),\n ];\n const volumeSlider = volumeControlsModal.querySelector(\"#volume-slider\");\n const volumeSliderText = volumeControlsModal.querySelector(\"#volume-slider-text\");\n const setVolumeIcon = () => {\n if (this.volumeSettings.isMuted) {\n volumeMuteIcon.style.display = \"inline\";\n volumeIcons.forEach((icon) => {\n icon.style.display = \"none\";\n });\n }\n else {\n volumeMuteIcon.style.display = \"none\";\n const iconIndex = Math.round(this.volumeSettings.volume / 50);\n volumeIcons.forEach((icon, i) => {\n icon.style.display = i === iconIndex ? \"inline\" : \"none\";\n });\n }\n };\n // Set the controls to the current settings.\n volumeMuteCheckbox.checked = this.volumeSettings.isMuted;\n volumeSlider.disabled = volumeMuteCheckbox.checked;\n volumeSlider.valueAsNumber = this.volumeSettings.volume;\n volumeSliderText.textContent = volumeSlider.value + \"%\";\n setVolumeIcon();\n // Add event listeners to update the settings and controls.\n volumeMuteCheckbox.addEventListener(\"change\", () => {\n volumeSlider.disabled = volumeMuteCheckbox.checked;\n this.volumeSettings.isMuted = volumeMuteCheckbox.checked;\n this.instance?.set_volume(this.volumeSettings.get_volume());\n setVolumeIcon();\n });\n volumeSlider.addEventListener(\"input\", () => {\n volumeSliderText.textContent = volumeSlider.value + \"%\";\n this.volumeSettings.volume = volumeSlider.valueAsNumber;\n this.instance?.set_volume(this.volumeSettings.get_volume());\n setVolumeIcon();\n });\n }\n /**\n * Setup event listener to detect when tab is not active to pause instance playback.\n * this.instance.play() is called when the tab becomes visible only if the\n * the instance was not paused before tab became hidden.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API\n * @ignore\n * @internal\n */\n setupPauseOnTabHidden() {\n document.addEventListener(\"visibilitychange\", () => {\n if (!this.instance) {\n return;\n }\n // Tab just changed to be inactive. Record whether instance was playing.\n if (document.hidden) {\n this.lastActivePlayingState = this.instance.is_playing();\n this.instance.pause();\n }\n // Play only if instance was playing originally.\n if (!document.hidden && this.lastActivePlayingState === true) {\n this.instance.play();\n }\n }, false);\n }\n /**\n * Updates the internal shadow DOM to reflect any set attributes from\n * this element.\n */\n updateStyles() {\n if (this.dynamicStyles.sheet) {\n if (this.dynamicStyles.sheet.cssRules) {\n for (let i = this.dynamicStyles.sheet.cssRules.length - 1; i >= 0; i--) {\n this.dynamicStyles.sheet.deleteRule(i);\n }\n }\n const widthAttr = this.element.attributes.getNamedItem(\"width\");\n if (widthAttr !== undefined && widthAttr !== null) {\n const width = InnerPlayer.htmlDimensionToCssDimension(widthAttr.value);\n if (width !== null) {\n this.dynamicStyles.sheet.insertRule(`:host { width: ${width}; }`);\n }\n }\n const heightAttr = this.element.attributes.getNamedItem(\"height\");\n if (heightAttr !== undefined && heightAttr !== null) {\n const height = InnerPlayer.htmlDimensionToCssDimension(heightAttr.value);\n if (height !== null) {\n this.dynamicStyles.sheet.insertRule(`:host { height: ${height}; }`);\n }\n }\n }\n }\n /**\n * Determine if this element is the fallback content of another Ruffle\n * player.\n *\n * This heuristic assumes Ruffle objects will never use their fallback\n * content. If this changes, then this code also needs to change.\n *\n * @private\n */\n isUnusedFallbackObject() {\n const element = lookupElement(\"ruffle-object\");\n if (element !== null) {\n let parent = this.element.parentNode;\n while (parent !== document && parent !== null) {\n if (parent.nodeName === element.name) {\n return true;\n }\n parent = parent.parentNode;\n }\n }\n return false;\n }\n /**\n * Ensure a fresh Ruffle instance is ready on this player before continuing.\n *\n * @throws Any exceptions generated by loading Ruffle Core will be logged\n * and passed on.\n *\n * @private\n */\n async ensureFreshInstance() {\n this.destroy();\n if (this.loadedConfig &&\n this.loadedConfig.splashScreen !== false &&\n this.loadedConfig.preloader !== false) {\n this.showSplashScreen();\n }\n if (this.loadedConfig && this.loadedConfig.preloader === false) {\n console.warn(\"The configuration option preloader has been replaced with splashScreen. If you own this website, please update the configuration.\");\n }\n if (this.loadedConfig &&\n this.loadedConfig.maxExecutionDuration &&\n typeof this.loadedConfig.maxExecutionDuration !== \"number\") {\n console.warn(\"Configuration: An obsolete format for duration for 'maxExecutionDuration' was used, \" +\n \"please use a single number indicating seconds instead. For instance '15' instead of \" +\n \"'{secs: 15, nanos: 0}'.\");\n }\n if (this.loadedConfig &&\n typeof this.loadedConfig.contextMenu === \"boolean\") {\n console.warn('The configuration option contextMenu no longer takes a boolean. Use \"on\", \"off\", or \"rightClickOnly\".');\n }\n const [builder, zipWriterClass] = await createRuffleBuilder(this.onRuffleDownloadProgress.bind(this)).catch((e) => {\n console.error(`Serious error loading Ruffle: ${e}`);\n const error = new LoadRuffleWasmError(e);\n this.panic(error);\n throw error;\n });\n this.newZipWriter = zipWriterClass;\n configureBuilder(builder, this.loadedConfig || {});\n builder.setVolume(this.volumeSettings.get_volume());\n if (this.loadedConfig?.fontSources) {\n for (const url of this.loadedConfig.fontSources) {\n try {\n const response = await fetch(url);\n builder.addFont(url, new Uint8Array(await response.arrayBuffer()));\n }\n catch (error) {\n console.warn(`Couldn't download font source from ${url}`, error);\n }\n }\n }\n for (const key in this.loadedConfig?.defaultFonts) {\n const names = this.loadedConfig.defaultFonts[key];\n if (names) {\n builder.setDefaultFont(key, names);\n }\n }\n this.instance = await builder.build(this.container, this).catch((e) => {\n console.error(`Serious error loading Ruffle: ${e}`);\n this.panic(e);\n throw e;\n });\n this.rendererDebugInfo = this.instance.renderer_debug_info();\n if (this.rendererDebugInfo.includes(\"Adapter Device Type: Cpu\")) {\n this.container.addEventListener(\"mouseover\", this.openHardwareAccelerationModal.bind(this), {\n once: true,\n });\n }\n const actuallyUsedRendererName = this.instance.renderer_name();\n const constructor = this.instance.constructor;\n console.log(\"%c\" +\n \"New Ruffle instance created (Version: \" +\n buildInfo.versionName +\n \" | WebAssembly extensions: \" +\n (constructor.is_wasm_simd_used() ? \"ON\" : \"OFF\") +\n \" | Used renderer: \" +\n (actuallyUsedRendererName ?? \"\") +\n \")\", \"background: #37528C; color: #FFAD33\");\n // In Firefox, AudioContext.state is always \"suspended\" when the object has just been created.\n // It may change by itself to \"running\" some milliseconds later. So we need to wait a little\n // bit before checking if autoplay is supported and applying the instance config.\n if (this.audioState() !== \"running\") {\n this.container.style.visibility = \"hidden\";\n await new Promise((resolve) => {\n window.setTimeout(() => {\n resolve();\n }, 200);\n });\n this.container.style.visibility = \"\";\n }\n this.unmuteAudioContext();\n // Treat invalid values as `AutoPlay.Auto`.\n if (!this.loadedConfig ||\n this.loadedConfig.autoplay === AutoPlay.On ||\n (this.loadedConfig.autoplay !== AutoPlay.Off &&\n this.audioState() === \"running\")) {\n this.play();\n if (this.audioState() !== \"running\") {\n // Treat invalid values as `UnmuteOverlay.Visible`.\n if (!this.loadedConfig ||\n this.loadedConfig.unmuteOverlay !== UnmuteOverlay.Hidden) {\n this.unmuteOverlay.style.display = \"block\";\n }\n this.container.addEventListener(\"click\", this.unmuteOverlayClicked.bind(this), {\n once: true,\n });\n const audioContext = this.instance?.audio_context();\n if (audioContext) {\n audioContext.onstatechange = () => {\n if (audioContext.state === \"running\") {\n this.unmuteOverlayClicked();\n }\n audioContext.onstatechange = null;\n };\n }\n }\n }\n else {\n this.playButton.style.display = \"block\";\n }\n }\n /**\n * Uploads the splash screen progress bar.\n *\n * @param bytesLoaded The size of the Ruffle WebAssembly file downloaded so far.\n * @param bytesTotal The total size of the Ruffle WebAssembly file.\n */\n onRuffleDownloadProgress(bytesLoaded, bytesTotal) {\n const loadBar = this.splashScreen.querySelector(\".loadbar-inner\");\n const outerLoadbar = this.splashScreen.querySelector(\".loadbar\");\n if (Number.isNaN(bytesTotal)) {\n if (outerLoadbar) {\n outerLoadbar.style.display = \"none\";\n }\n }\n else {\n loadBar.style.width = `${100.0 * (bytesLoaded / bytesTotal)}%`;\n }\n }\n /**\n * Destroys the currently running instance of Ruffle.\n */\n destroy() {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n this.metadata = null;\n this._readyState = ReadyState.HaveNothing;\n console.log(\"Ruffle instance destroyed.\");\n }\n }\n checkOptions(options) {\n if (typeof options === \"string\") {\n return { url: options };\n }\n const check = (condition, message) => {\n if (!condition) {\n const error = new InvalidOptionsError(message);\n this.panic(error);\n throw error;\n }\n };\n check(options !== null && typeof options === \"object\", \"Argument 0 must be a string or object\");\n check(\"url\" in options || \"data\" in options, \"Argument 0 must contain a `url` or `data` key\");\n check(!(\"url\" in options) || typeof options.url === \"string\", \"`url` must be a string\");\n return options;\n }\n /**\n * Reloads the player, as if you called {@link RufflePlayer.load} with the same config as the last time it was called.\n *\n * If this player has never been loaded, this method will return an error.\n */\n async reload() {\n if (this.loadedConfig) {\n await this.load(this.loadedConfig);\n }\n else {\n throw new Error(\"Cannot reload if load wasn't first called\");\n }\n }\n /**\n * Loads a specified movie into this player.\n *\n * This will replace any existing movie that may be playing.\n *\n * @param options One of the following:\n * - A URL, passed as a string, which will load a URL with default options.\n * - A [[URLLoadOptions]] object, to load a URL with options.\n * - A [[DataLoadOptions]] object, to load data with options.\n * The options, if provided, must only contain values provided for this specific movie.\n * They must not contain any default values, since those would overwrite other configuration\n * settings with a lower priority (e.g. the general RufflePlayer config).\n * @param isPolyfillElement Whether the element is a polyfilled Flash element or not.\n * This is used to determine a default value of the configuration.\n *\n * The options will be defaulted by the [[config]] field, which itself\n * is defaulted by a global `window.RufflePlayer.config`.\n */\n async load(options, isPolyfillElement = false) {\n options = this.checkOptions(options);\n if (!this.element.isConnected || this.isUnusedFallbackObject()) {\n console.warn(\"Ignoring attempt to play a disconnected or suspended Ruffle element\");\n return;\n }\n if (isFallbackElement(this.element)) {\n // Silently fail on attempt to play a Ruffle element inside a specific node.\n return;\n }\n try {\n this.loadedConfig = {\n ...DEFAULT_CONFIG,\n // The default allowScriptAccess value for polyfilled elements is samedomain.\n ...(isPolyfillElement && \"url\" in options\n ? {\n allowScriptAccess: parseAllowScriptAccess(\"samedomain\", options.url),\n }\n : {}),\n ...(window.RufflePlayer?.config ?? {}),\n ...this.config,\n ...options,\n };\n // Pre-emptively set background color of container while Ruffle/SWF loads.\n if (this.loadedConfig.backgroundColor &&\n this.loadedConfig.wmode !== WindowMode.Transparent) {\n this.container.style.backgroundColor =\n this.loadedConfig.backgroundColor;\n }\n await this.ensureFreshInstance();\n if (\"url\" in options) {\n console.log(`Loading SWF file ${options.url}`);\n this.swfUrl = new URL(options.url, document.baseURI);\n this.instance.stream_from(this.swfUrl.href, sanitizeParameters(options.parameters));\n }\n else if (\"data\" in options) {\n console.log(\"Loading SWF data\");\n delete this.swfUrl;\n this.instance.load_data(new Uint8Array(options.data), sanitizeParameters(options.parameters), options.swfFileName || \"movie.swf\");\n }\n }\n catch (e) {\n console.error(`Serious error occurred loading SWF file: ${e}`);\n const err = new Error(e);\n this.panic(err);\n throw err;\n }\n }\n /**\n * Plays or resumes the movie.\n */\n play() {\n if (this.instance) {\n this.instance.play();\n this.playButton.style.display = \"none\";\n }\n }\n /**\n * Whether this player is currently playing.\n *\n * @returns True if this player is playing, false if it's paused or hasn't started yet.\n */\n get isPlaying() {\n if (this.instance) {\n return this.instance.is_playing();\n }\n return false;\n }\n /**\n * Returns the master volume of the player.\n *\n * The volume is linear and not adapted for logarithmic hearing.\n *\n * @returns The volume. 1.0 is 100% volume.\n */\n get volume() {\n if (this.instance) {\n return this.instance.volume();\n }\n return 1.0;\n }\n /**\n * Sets the master volume of the player.\n *\n * The volume should be linear and not adapted for logarithmic hearing.\n *\n * @param value The volume. 1.0 is 100% volume.\n */\n set volume(value) {\n if (this.instance) {\n this.instance.set_volume(value);\n }\n }\n /**\n * Checks if this player is allowed to be fullscreen by the browser.\n *\n * @returns True if you may call [[enterFullscreen]].\n */\n get fullscreenEnabled() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled);\n }\n /**\n * Checks if this player is currently fullscreen inside the browser.\n *\n * @returns True if it is fullscreen.\n */\n get isFullscreen() {\n return ((document.fullscreenElement || document.webkitFullscreenElement) ===\n this.element);\n }\n /**\n * Exported function that requests the browser to change the fullscreen state if\n * it is allowed.\n *\n * @param isFull Whether to set to fullscreen or return to normal.\n */\n setFullscreen(isFull) {\n if (this.fullscreenEnabled && isFull !== this.isFullscreen) {\n if (isFull) {\n this.enterFullscreen();\n }\n else {\n this.exitFullscreen();\n }\n }\n }\n /**\n * Requests the browser to make this player fullscreen.\n *\n * This is not guaranteed to succeed, please check [[fullscreenEnabled]] first.\n */\n enterFullscreen() {\n const options = {\n navigationUI: \"hide\",\n };\n if (this.element.requestFullscreen) {\n this.element.requestFullscreen(options);\n }\n else if (this.element.webkitRequestFullscreen) {\n this.element.webkitRequestFullscreen(options);\n }\n else if (this.element.webkitRequestFullScreen) {\n this.element.webkitRequestFullScreen(options);\n }\n }\n /**\n * Requests the browser to no longer make this player fullscreen.\n */\n exitFullscreen() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n }\n }\n /**\n * Called when entering / leaving fullscreen.\n */\n fullScreenChange() {\n this.instance?.set_fullscreen(this.isFullscreen);\n }\n /**\n * Prompt the user to download a file.\n *\n * @param blob The content to download.\n * @param name The name to give the file.\n */\n saveFile(blob, name) {\n const blobURL = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobURL;\n link.download = name;\n link.click();\n URL.revokeObjectURL(blobURL);\n }\n checkIfTouch(event) {\n this.isTouch =\n event.pointerType === \"touch\" || event.pointerType === \"pen\";\n }\n base64ToArray(bytesBase64) {\n const byteString = atob(bytesBase64);\n const ia = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return ia;\n }\n base64ToBlob(bytesBase64, mimeString) {\n const ab = this.base64ToArray(bytesBase64);\n const blob = new Blob([ab], { type: mimeString });\n return blob;\n }\n /**\n * @returns If the string represent a base-64 encoded SOL file\n * Check if string is a base-64 encoded SOL file\n * @param solData The base-64 encoded SOL string\n */\n isB64SOL(solData) {\n try {\n const decodedData = atob(solData);\n return decodedData.slice(6, 10) === \"TCSO\";\n }\n catch (e) {\n return false;\n }\n }\n confirmReloadSave(solKey, b64SolData, replace) {\n if (this.isB64SOL(b64SolData)) {\n if (localStorage[solKey]) {\n if (!replace) {\n const confirmDelete = confirm(text(\"save-delete-prompt\"));\n if (!confirmDelete) {\n return;\n }\n }\n const swfPath = this.swfUrl ? this.swfUrl.pathname : \"\";\n const swfHost = this.swfUrl\n ? this.swfUrl.hostname\n : document.location.hostname;\n const savePath = solKey.split(\"/\").slice(1, -1).join(\"/\");\n if (swfPath.includes(savePath) && solKey.startsWith(swfHost)) {\n const confirmReload = confirm(text(\"save-reload-prompt\", {\n action: replace ? \"replace\" : \"delete\",\n }));\n if (confirmReload && this.loadedConfig) {\n this.destroy();\n replace\n ? localStorage.setItem(solKey, b64SolData)\n : localStorage.removeItem(solKey);\n this.reload();\n this.populateSaves();\n this.saveManager.classList.add(\"hidden\");\n }\n return;\n }\n replace\n ? localStorage.setItem(solKey, b64SolData)\n : localStorage.removeItem(solKey);\n this.populateSaves();\n this.saveManager.classList.add(\"hidden\");\n }\n }\n }\n /**\n * Replace save from SOL file.\n *\n * @param event The change event fired\n * @param solKey The localStorage save file key\n */\n replaceSOL(event, solKey) {\n const fileInput = event.target;\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n if (reader.result && typeof reader.result === \"string\") {\n const b64Regex = new RegExp(\"data:.*;base64,\");\n const b64SolData = reader.result.replace(b64Regex, \"\");\n this.confirmReloadSave(solKey, b64SolData, true);\n }\n });\n if (fileInput &&\n fileInput.files &&\n fileInput.files.length > 0 &&\n fileInput.files[0]) {\n reader.readAsDataURL(fileInput.files[0]);\n }\n }\n /**\n * Check if there are any saves.\n *\n * @returns True if there is at least one save.\n */\n checkSaves() {\n if (!this.saveManager.querySelector(\"#local-saves\")) {\n return false;\n }\n try {\n if (localStorage === null) {\n return false;\n }\n }\n catch (e) {\n return false;\n }\n return Object.keys(localStorage).some((key) => {\n const solName = key.split(\"/\").pop();\n const solData = localStorage.getItem(key);\n return solName && solData && this.isB64SOL(solData);\n });\n }\n /**\n * Delete local save.\n *\n * @param key The key to remove from local storage\n */\n deleteSave(key) {\n const b64SolData = localStorage.getItem(key);\n if (b64SolData) {\n this.confirmReloadSave(key, b64SolData, false);\n }\n }\n /**\n * Puts the local save SOL file keys in a table.\n */\n populateSaves() {\n if (!this.checkSaves()) {\n return;\n }\n const saveTable = this.saveManager.querySelector(\"#local-saves\");\n saveTable.textContent = \"\";\n Object.keys(localStorage).forEach((key) => {\n const solName = key.split(\"/\").pop();\n const solData = localStorage.getItem(key);\n if (solName && solData && this.isB64SOL(solData)) {\n const row = document.createElement(\"TR\");\n const keyCol = document.createElement(\"TD\");\n keyCol.textContent = solName;\n keyCol.title = key;\n const downloadCol = document.createElement(\"TD\");\n const downloadSpan = document.createElement(\"SPAN\");\n downloadSpan.className = \"save-option\";\n downloadSpan.id = \"download-save\";\n downloadSpan.title = text(\"save-download\");\n downloadSpan.addEventListener(\"click\", () => {\n const blob = this.base64ToBlob(solData, \"application/octet-stream\");\n this.saveFile(blob, solName + \".sol\");\n });\n downloadCol.appendChild(downloadSpan);\n const replaceCol = document.createElement(\"TD\");\n const replaceInput = document.createElement(\"INPUT\");\n replaceInput.type = \"file\";\n replaceInput.accept = \".sol\";\n replaceInput.className = \"replace-save\";\n replaceInput.id = \"replace-save-\" + key;\n const replaceLabel = document.createElement(\"LABEL\");\n replaceLabel.htmlFor = \"replace-save-\" + key;\n replaceLabel.className = \"save-option\";\n replaceLabel.id = \"replace-save\";\n replaceLabel.title = text(\"save-replace\");\n replaceInput.addEventListener(\"change\", (event) => this.replaceSOL(event, key));\n replaceCol.appendChild(replaceInput);\n replaceCol.appendChild(replaceLabel);\n const deleteCol = document.createElement(\"TD\");\n const deleteSpan = document.createElement(\"SPAN\");\n deleteSpan.className = \"save-option\";\n deleteSpan.id = \"delete-save\";\n deleteSpan.title = text(\"save-delete\");\n deleteSpan.addEventListener(\"click\", () => this.deleteSave(key));\n deleteCol.appendChild(deleteSpan);\n row.appendChild(keyCol);\n row.appendChild(downloadCol);\n row.appendChild(replaceCol);\n row.appendChild(deleteCol);\n saveTable.appendChild(row);\n }\n });\n }\n /**\n * Gets the local save information as SOL files and downloads them as a single ZIP file.\n */\n async backupSaves() {\n const zip = this.newZipWriter();\n const duplicateNames = [];\n Object.keys(localStorage).forEach((key) => {\n let solName = String(key.split(\"/\").pop());\n const solData = localStorage.getItem(key);\n if (solData && this.isB64SOL(solData)) {\n const array = this.base64ToArray(solData);\n const duplicate = duplicateNames.filter((value) => value === solName).length;\n duplicateNames.push(solName);\n if (duplicate > 0) {\n solName += ` (${duplicate + 1})`;\n }\n zip.addFile(solName + \".sol\", array);\n }\n });\n const blob = new Blob([zip.save()], { type: \"application/zip\" });\n this.saveFile(blob, \"saves.zip\");\n }\n /**\n * Opens the hardware acceleration info modal.\n */\n openHardwareAccelerationModal() {\n this.hardwareAccelerationModal.classList.remove(\"hidden\");\n }\n /**\n * Opens the save manager.\n */\n async openSaveManager() {\n this.populateSaves();\n this.saveManager.classList.remove(\"hidden\");\n }\n /**\n * Opens the volume controls.\n */\n openVolumeControls() {\n this.volumeControls.classList.remove(\"hidden\");\n }\n /**\n * Fetches the loaded SWF and downloads it.\n */\n async downloadSwf() {\n try {\n if (this.swfUrl) {\n console.log(\"Downloading SWF: \" + this.swfUrl);\n const response = await fetch(this.swfUrl.href);\n if (!response.ok) {\n console.error(\"SWF download failed\");\n return;\n }\n const blob = await response.blob();\n this.saveFile(blob, swfFileName(this.swfUrl));\n }\n else {\n console.error(\"SWF download failed\");\n }\n }\n catch (err) {\n console.error(\"SWF download failed\");\n }\n }\n virtualKeyboardInput() {\n const input = this.virtualKeyboard;\n const string = input.value;\n for (const char of string) {\n for (const eventType of [\"keydown\", \"keyup\"]) {\n this.element.dispatchEvent(new KeyboardEvent(eventType, {\n key: char,\n bubbles: true,\n }));\n }\n }\n input.value = \"\";\n }\n openVirtualKeyboard() {\n // Virtual keyboard is opened/closed synchronously from core,\n // and opening/closing it is basically dispatching\n // focus events (which may also be dispatched to the player).\n // In order not to deadlock here (or rather throw an error),\n // these actions should be performed asynchronously.\n // However, some browsers (i.e. Safari) require user interaction\n // in order to open the virtual keyboard.\n // That is why we are checking whether Ruffle already has focus:\n // 1. if it does, no focus events will be dispatched to\n // the player when we focus the virtual keyboard, and\n // 2. if it doesn't, the action shouldn't be a result of user\n // interaction and focusing synchronously wouldn't work anyway.\n if (this.instance?.has_focus()) {\n this.virtualKeyboard.focus({ preventScroll: true });\n }\n else {\n setTimeout(() => {\n this.virtualKeyboard.focus({ preventScroll: true });\n }, 0);\n }\n }\n closeVirtualKeyboard() {\n // Note that closing the keyboard is a little tricky, as we cannot\n // just remove the focus here, as the player should still be focused.\n // We want to switch the focus to the container instead, but the user may also\n // click away from the player, and in that case we do not want to re-focus it.\n // We also have to take into account that the keyboard may be\n // closed even if the player doesn't have focus at all.\n // That's why we have to \"transfer\" the focus from the keyboard to the container.\n if (this.isVirtualKeyboardFocused()) {\n this.container.focus({ preventScroll: true });\n }\n }\n isVirtualKeyboardFocused() {\n return this.shadow.activeElement === this.virtualKeyboard;\n }\n contextMenuItems() {\n const CHECKMARK = String.fromCharCode(0x2713);\n const items = [];\n const addSeparator = () => {\n // Don't start with or duplicate separators.\n if (items.length > 0 && items[items.length - 1] !== null) {\n items.push(null);\n }\n };\n if (this.instance && this.isPlaying) {\n const customItems = this.instance.prepare_context_menu();\n customItems.forEach((item, index) => {\n if (item.separatorBefore) {\n addSeparator();\n }\n items.push({\n // TODO: better checkboxes\n text: item.caption + (item.checked ? ` (${CHECKMARK})` : ``),\n onClick: async () => this.instance?.run_context_menu_callback(index),\n enabled: item.enabled,\n });\n });\n addSeparator();\n }\n if (this.fullscreenEnabled) {\n if (this.isFullscreen) {\n items.push({\n text: text(\"context-menu-exit-fullscreen\"),\n onClick: async () => this.setFullscreen(false),\n });\n }\n else {\n items.push({\n text: text(\"context-menu-enter-fullscreen\"),\n onClick: async () => this.setFullscreen(true),\n });\n }\n }\n items.push({\n text: text(\"context-menu-volume-controls\"),\n onClick: async () => {\n this.openVolumeControls();\n },\n });\n if (this.instance &&\n this.swfUrl &&\n this.loadedConfig &&\n this.loadedConfig.showSwfDownload === true) {\n addSeparator();\n items.push({\n text: text(\"context-menu-download-swf\"),\n onClick: this.downloadSwf.bind(this),\n });\n }\n if (navigator.clipboard && window.isSecureContext) {\n items.push({\n text: text(\"context-menu-copy-debug-info\"),\n onClick: () => navigator.clipboard.writeText(this.getPanicData()),\n });\n }\n if (this.checkSaves()) {\n items.push({\n text: text(\"context-menu-open-save-manager\"),\n onClick: this.openSaveManager.bind(this),\n });\n }\n addSeparator();\n items.push({\n text: text(\"context-menu-about-ruffle\", {\n flavor: isExtension ? \"extension\" : \"\",\n version: buildInfo.versionName,\n }),\n async onClick() {\n window.open(RUFFLE_ORIGIN, \"_blank\");\n },\n });\n // Give option to disable context menu when touch support is being used\n // to avoid a long press triggering the context menu. (#1972)\n if (this.isTouch) {\n addSeparator();\n items.push({\n text: text(\"context-menu-hide\"),\n onClick: async () => {\n this.contextMenuForceDisabled = true;\n },\n });\n }\n return items;\n }\n pointerDown(event) {\n this.pointerDownPosition = new Point(event.pageX, event.pageY);\n this.pointerMoveMaxDistance = 0;\n this.startLongPressTimer();\n }\n clearLongPressTimer() {\n if (this.longPressTimer) {\n clearTimeout(this.longPressTimer);\n this.longPressTimer = null;\n }\n }\n startLongPressTimer() {\n const longPressTimeout = 800;\n this.clearLongPressTimer();\n this.longPressTimer = setTimeout(() => this.clearLongPressTimer(), longPressTimeout);\n }\n checkLongPressMovement(event) {\n if (this.pointerDownPosition !== null) {\n const currentPosition = new Point(event.pageX, event.pageY);\n const distance = this.pointerDownPosition.distanceTo(currentPosition);\n if (distance > this.pointerMoveMaxDistance) {\n this.pointerMoveMaxDistance = distance;\n }\n }\n }\n checkLongPress(event) {\n const maxAllowedDistance = 15;\n if (this.longPressTimer) {\n this.clearLongPressTimer();\n // The pointerType condition is to ensure right-click does not trigger\n // a context menu the wrong way the first time you right-click,\n // before contextMenuSupported is set.\n }\n else if (!this.contextMenuSupported &&\n event.pointerType !== \"mouse\" &&\n this.pointerMoveMaxDistance < maxAllowedDistance) {\n // TODO Implement handling right clicks for mobile.\n this.showContextMenu(event);\n }\n }\n suppressContextMenu() {\n this._suppressContextMenu = true;\n }\n showContextMenu(event) {\n if (this.panicked) {\n return;\n }\n event.preventDefault();\n if (this._suppressContextMenu) {\n this._suppressContextMenu = false;\n return;\n }\n if (this.shadow.querySelectorAll(\".modal:not(.hidden)\").length !== 0) {\n return;\n }\n // TODO Currently when opening context menu,\n // mouse up event is fired on mouse up,\n // but should be on context menu close.\n if (event.type === \"contextmenu\") {\n this.contextMenuSupported = true;\n document.documentElement.addEventListener(\"click\", this.hideContextMenu.bind(this), {\n once: true,\n });\n }\n else {\n document.documentElement.addEventListener(\"pointerup\", this.hideContextMenu.bind(this), { once: true });\n event.stopPropagation();\n }\n if ([false, ContextMenu.Off].includes(this.loadedConfig?.contextMenu ?? ContextMenu.On) ||\n (this.isTouch &&\n this.loadedConfig?.contextMenu ===\n ContextMenu.RightClickOnly) ||\n this.contextMenuForceDisabled) {\n return;\n }\n // Clear all context menu items.\n while (this.contextMenuElement.firstChild) {\n this.contextMenuElement.removeChild(this.contextMenuElement.firstChild);\n }\n // Populate context menu items.\n for (const item of this.contextMenuItems()) {\n if (item === null) {\n this.contextMenuElement.appendChild(_jsx(\"li\", { class: \"menu-separator\", children: _jsx(\"hr\", {}) }));\n }\n else {\n const { text, onClick, enabled } = item;\n const menuItem = (_jsx(\"li\", { class: {\n \"menu-item\": true,\n disabled: enabled === false,\n }, \"data-text\": text, children: text }));\n this.contextMenuElement.appendChild(menuItem);\n if (enabled !== false) {\n const itemAction = async (event) => {\n // Prevent right-clicks from displaying the browser context menu.\n event.preventDefault();\n // Prevent the menu from being destroyed.\n // It's required when we're dealing with async callbacks,\n // as the async callback may still use the menu in the future.\n event.stopPropagation();\n await onClick(event);\n // Then we have to close the context menu manually after the callback finishes.\n this.hideContextMenu();\n };\n if (this.contextMenuSupported) {\n menuItem.addEventListener(\"click\", itemAction);\n menuItem.addEventListener(\"contextmenu\", itemAction);\n }\n else {\n menuItem.addEventListener(\"pointerup\", itemAction);\n }\n }\n }\n }\n this.contextMenuOverlay.classList.remove(\"hidden\");\n const playerRect = this.element.getBoundingClientRect();\n const contextMenuRect = this.contextMenuElement.getBoundingClientRect();\n // Keep the entire context menu inside the viewport.\n // TODO: Allow the context menu to escape the document body while being mindful of scrollbars.\n const overflowX = Math.max(0, event.clientX +\n contextMenuRect.width -\n document.documentElement.clientWidth);\n const overflowY = Math.max(0, event.clientY +\n contextMenuRect.height -\n document.documentElement.clientHeight);\n const x = event.clientX - playerRect.x - overflowX;\n const y = event.clientY - playerRect.y - overflowY;\n this.contextMenuElement.style.transform = `translate(${x}px, ${y}px)`;\n }\n hideContextMenu() {\n this.instance?.clear_custom_menu_items();\n this.contextMenuOverlay.classList.add(\"hidden\");\n }\n /**\n * Pauses this player.\n *\n * No more frames, scripts or sounds will be executed.\n * This movie will be considered inactive and will not wake up until resumed.\n */\n pause() {\n if (this.instance) {\n this.instance.pause();\n this.playButton.style.display = \"block\";\n }\n }\n audioState() {\n if (this.instance) {\n const audioContext = this.instance.audio_context();\n return (audioContext && audioContext.state) || \"running\";\n }\n return \"suspended\";\n }\n unmuteOverlayClicked() {\n if (this.instance) {\n if (this.audioState() !== \"running\") {\n const audioContext = this.instance.audio_context();\n if (audioContext) {\n audioContext.resume();\n }\n }\n this.unmuteOverlay.style.display = \"none\";\n }\n }\n /**\n * Plays a silent sound based on the AudioContext's sample rate.\n *\n * This is used to unmute audio on iOS and iPadOS when silent mode is enabled on the device (issue 1552).\n */\n unmuteAudioContext() {\n // No need to play the dummy sound again once audio is unmuted.\n if (isAudioContextUnmuted) {\n return;\n }\n // TODO: Use `navigator.userAgentData` to detect the platform when support improves?\n if (navigator.maxTouchPoints < 1) {\n isAudioContextUnmuted = true;\n return;\n }\n this.container.addEventListener(\"click\", () => {\n if (isAudioContextUnmuted) {\n return;\n }\n const audioContext = this.instance?.audio_context();\n if (!audioContext) {\n return;\n }\n const audio = new Audio();\n audio.src = (() => {\n // Returns a seven samples long 8 bit mono WAVE file.\n // This is required to prevent the AudioContext from desyncing and crashing.\n const arrayBuffer = new ArrayBuffer(10);\n const dataView = new DataView(arrayBuffer);\n const sampleRate = audioContext.sampleRate;\n dataView.setUint32(0, sampleRate, true);\n dataView.setUint32(4, sampleRate, true);\n dataView.setUint16(8, 1, true);\n const missingCharacters = window\n .btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)))\n .slice(0, 13);\n return `data:audio/wav;base64,UklGRisAAABXQVZFZm10IBAAAAABAAEA${missingCharacters}AgAZGF0YQcAAACAgICAgICAAAA=`;\n })();\n audio.load();\n audio\n .play()\n .then(() => {\n isAudioContextUnmuted = true;\n })\n .catch((err) => {\n console.warn(`Failed to play dummy sound: ${err}`);\n });\n }, { once: true });\n }\n /**\n * Converts a dimension attribute on an HTML embed/object element to a valid CSS dimension.\n * HTML element dimensions are unitless, but can also be percentages.\n * Add a 'px' unit unless the value is a percentage.\n * Returns null if this is not a valid dimension.\n *\n * @param attribute The attribute to convert\n *\n * @private\n */\n static htmlDimensionToCssDimension(attribute) {\n if (attribute) {\n const match = attribute.match(DIMENSION_REGEX);\n if (match) {\n let out = match[1];\n if (!match[3]) {\n // Unitless -- add px for CSS.\n out += \"px\";\n }\n return out;\n }\n }\n return null;\n }\n callExternalInterface(name, args) {\n return this.instance?.call_exposed_callback(name, args);\n }\n getObjectId() {\n return this.element.getAttribute(\"name\");\n }\n /**\n * Sets a trace observer on this flash player.\n *\n * The observer will be called, as a function, for each message that the playing movie will \"trace\" (output).\n *\n * @param observer The observer that will be called for each trace.\n */\n set traceObserver(observer) {\n this.instance?.set_trace_observer(observer);\n }\n /**\n * Get data included in any panic of this ruffle-player\n *\n * @returns A string containing all the data included in the panic.\n */\n getPanicData() {\n let result = \"\\n# Player Info\\n\";\n result += `Allows script access: ${this.loadedConfig ? this.loadedConfig.allowScriptAccess : false}\\n`;\n result += `${this.rendererDebugInfo}\\n`;\n result += this.debugPlayerInfo();\n result += \"\\n# Page Info\\n\";\n result += `Page URL: ${document.location.href}\\n`;\n if (this.swfUrl) {\n result += `SWF URL: ${this.swfUrl}\\n`;\n }\n result += \"\\n# Browser Info\\n\";\n result += `User Agent: ${window.navigator.userAgent}\\n`;\n result += `Platform: ${window.navigator.platform}\\n`;\n result += `Has touch support: ${window.navigator.maxTouchPoints > 0}\\n`;\n result += \"\\n# Ruffle Info\\n\";\n result += `Version: ${buildInfo.versionNumber}\\n`;\n result += `Name: ${buildInfo.versionName}\\n`;\n result += `Channel: ${buildInfo.versionChannel}\\n`;\n result += `Built: ${buildInfo.buildDate}\\n`;\n result += `Commit: ${buildInfo.commitHash}\\n`;\n result += `Is extension: ${isExtension}\\n`;\n result += \"\\n# Metadata\\n\";\n if (this.metadata) {\n for (const [key, value] of Object.entries(this.metadata)) {\n result += `${key}: ${value}\\n`;\n }\n }\n return result;\n }\n /**\n * Panics this specific player, forcefully destroying all resources and displays an error message to the user.\n *\n * This should be called when something went absolutely, incredibly and disastrously wrong and there is no chance\n * of recovery.\n *\n * Ruffle will attempt to isolate all damage to this specific player instance, but no guarantees can be made if there\n * was a core issue which triggered the panic. If Ruffle is unable to isolate the cause to a specific player, then\n * all players will panic and Ruffle will become \"poisoned\" - no more players will run on this page until it is\n * reloaded fresh.\n *\n * @param error The error, if any, that triggered this panic.\n */\n panic(error) {\n if (this.panicked) {\n // Only show the first major error, not any repeats - they aren't as important\n return;\n }\n this.panicked = true;\n this.hideSplashScreen();\n const originalError = error;\n if (error instanceof Error &&\n (error.name === \"AbortError\" ||\n error.message.includes(\"AbortError\"))) {\n // Firefox: Don't display the panic screen if the user leaves the page while something is still loading\n return;\n }\n else if (error instanceof LoadRuffleWasmError) {\n const openInNewTab = this.loadedConfig?.openInNewTab;\n const swfUrl = this.loadedConfig && \"url\" in this.loadedConfig\n ? new URL(this.loadedConfig.url, document.baseURI)\n : undefined;\n if (openInNewTab && swfUrl) {\n // If it is possible to open the SWF in a new tab offer that option if the WASM failed to load\n this.addOpenInNewTabMessage(openInNewTab, swfUrl);\n return;\n }\n error = error.cause;\n }\n const errorArray = Object.assign([], {\n stackIndex: -1,\n avmStackIndex: -1,\n });\n errorArray.push(\"# Error Info\\n\");\n if (error instanceof Error) {\n errorArray.push(`Error name: ${error.name}\\n`);\n errorArray.push(`Error message: ${error.message}\\n`);\n if (error.stack) {\n const stackIndex = errorArray.push(`Error stack:\\n\\`\\`\\`\\n${error.stack}\\n\\`\\`\\`\\n`) - 1;\n if (error.avmStack) {\n const avmStackIndex = errorArray.push(`AVM2 stack:\\n\\`\\`\\`\\n ${error.avmStack\n .trim()\n .replace(/\\t/g, \" \")}\\n\\`\\`\\`\\n`) - 1;\n errorArray.avmStackIndex = avmStackIndex;\n }\n errorArray.stackIndex = stackIndex;\n }\n }\n else {\n errorArray.push(`Error: ${error}\\n`);\n }\n errorArray.push(this.getPanicData());\n // Clears out any existing content (ie play button or canvas) and replaces it with the error screen\n showPanicScreen(this.container, originalError, errorArray, this.swfUrl);\n // Do this last, just in case it causes any cascading issues.\n this.destroy();\n }\n addOpenInNewTabMessage(openInNewTab, swfUrl) {\n const url = new URL(swfUrl);\n if (this.loadedConfig?.parameters) {\n const parameters = sanitizeParameters(this.loadedConfig?.parameters);\n Object.entries(parameters).forEach(([key, value]) => {\n url.searchParams.set(key, value);\n });\n }\n this.hideSplashScreen();\n const div = document.createElement(\"div\");\n div.id = \"message-overlay\";\n const innerDiv = document.createElement(\"div\");\n innerDiv.className = \"message\";\n innerDiv.appendChild(textAsParagraphs(\"message-cant-embed\"));\n const buttonDiv = document.createElement(\"div\");\n const link = document.createElement(\"a\");\n link.innerText = text(\"open-in-new-tab\");\n link.onclick = () => openInNewTab(url);\n buttonDiv.appendChild(link);\n innerDiv.appendChild(buttonDiv);\n div.appendChild(innerDiv);\n this.container.prepend(div);\n }\n displayRootMovieDownloadFailedMessage(invalidSwf) {\n const openInNewTab = this.loadedConfig?.openInNewTab;\n if (openInNewTab &&\n this.swfUrl &&\n window.location.origin !== this.swfUrl.origin) {\n this.addOpenInNewTabMessage(openInNewTab, this.swfUrl);\n }\n else {\n const error = invalidSwf\n ? new InvalidSwfError(this.swfUrl)\n : new LoadSwfError(this.swfUrl);\n this.panic(error);\n }\n }\n /**\n * Show a dismissible message in front of the player.\n *\n * @param message The message shown to the user.\n */\n displayMessage(message) {\n const div = document.createElement(\"div\");\n div.id = \"message-overlay\";\n const messageDiv = document.createElement(\"div\");\n messageDiv.className = \"message\";\n const messageP = document.createElement(\"p\");\n messageP.textContent = message;\n messageDiv.appendChild(messageP);\n const buttonDiv = document.createElement(\"div\");\n const continueButton = document.createElement(\"button\");\n continueButton.id = \"continue-btn\";\n continueButton.textContent = text(\"continue\");\n buttonDiv.appendChild(continueButton);\n messageDiv.appendChild(buttonDiv);\n div.appendChild(messageDiv);\n this.container.prepend(div);\n this.container.querySelector(\"#continue-btn\").onclick = () => {\n div.parentNode.removeChild(div);\n };\n }\n /**\n * Show a video that uses an unsupported codec in a pop up.\n *\n * @param url The url of the video to be shown over the canvas.\n */\n displayUnsupportedVideo(url) {\n const videoHolder = this.videoModal.querySelector(\"#video-holder\");\n if (videoHolder) {\n const video = document.createElement(\"video\");\n video.addEventListener(\"contextmenu\", (event) => event.stopPropagation());\n video.src = url;\n video.autoplay = true;\n video.controls = true;\n videoHolder.textContent = \"\";\n videoHolder.appendChild(video);\n this.videoModal.classList.remove(\"hidden\");\n }\n }\n displayClipboardModal(accessDenied) {\n const description = this.clipboardModal.querySelector(\"#clipboard-modal-description\");\n if (description) {\n description.textContent = text(\"clipboard-message-description\", {\n variant: accessDenied ? \"access-denied\" : \"unsupported\",\n });\n this.clipboardModal.classList.remove(\"hidden\");\n }\n }\n hideSplashScreen() {\n this.splashScreen.classList.add(\"hidden\");\n this.container.classList.remove(\"hidden\");\n }\n showSplashScreen() {\n this.splashScreen.classList.remove(\"hidden\");\n this.container.classList.add(\"hidden\");\n }\n setMetadata(metadata) {\n this.metadata = metadata;\n // TODO: Switch this to ReadyState.Loading when we have streaming support.\n this._readyState = ReadyState.Loaded;\n this.hideSplashScreen();\n this.element.dispatchEvent(new CustomEvent(InnerPlayer.LOADED_METADATA));\n // TODO: Move this to whatever function changes the ReadyState to Loaded when we have streaming support.\n this.element.dispatchEvent(new CustomEvent(InnerPlayer.LOADED_DATA));\n }\n}\n/**\n * Triggered when a movie metadata has been loaded (such as movie width and height).\n *\n * @event RufflePlayer#loadedmetadata\n */\nInnerPlayer.LOADED_METADATA = \"loadedmetadata\";\n/**\n * Triggered when a movie is fully loaded.\n *\n * @event RufflePlayer#loadeddata\n */\nInnerPlayer.LOADED_DATA = \"loadeddata\";\n/**\n * Describes the loading state of an SWF movie.\n */\nexport var ReadyState;\n(function (ReadyState) {\n /**\n * No movie is loaded, or no information is yet available about the movie.\n */\n ReadyState[ReadyState[\"HaveNothing\"] = 0] = \"HaveNothing\";\n /**\n * The movie is still loading, but it has started playback, and metadata is available.\n */\n ReadyState[ReadyState[\"Loading\"] = 1] = \"Loading\";\n /**\n * The movie has completely loaded.\n */\n ReadyState[ReadyState[\"Loaded\"] = 2] = \"Loaded\";\n})(ReadyState || (ReadyState = {}));\n/**\n * The volume controls of the Ruffle web GUI.\n */\nclass VolumeControls {\n constructor(isMuted, volume) {\n this.isMuted = isMuted;\n this.volume = volume;\n }\n /**\n * Returns the volume between 0 and 1 (calculated out of the\n * checkbox and the slider).\n *\n * @returns The volume between 0 and 1.\n */\n get_volume() {\n return !this.isMuted ? this.volume / 100 : 0;\n }\n}\n/**\n * Returns the URLLoadOptions that have been provided for a specific movie.\n *\n * The function getOptionString is given as an argument and used to get values of configuration\n * options that have been overwritten for this specific movie.\n *\n * The returned URLLoadOptions interface only contains values for the configuration options\n * that have been overwritten for the movie and no default values.\n * This is necessary because any default values would overwrite other configuration\n * settings with a lower priority (e.g. the general RufflePlayer config).\n *\n * @param url The url of the movie.\n * @param getOptionString A function that takes the name of a configuration option.\n * If that configuration option has been overwritten for this specific movie, it returns that value.\n * Otherwise, it returns null.\n * @returns The URLLoadOptions for the movie.\n */\nexport function getPolyfillOptions(url, getOptionString) {\n const options = { url };\n const allowNetworking = getOptionString(\"allowNetworking\");\n if (allowNetworking !== null) {\n options.allowNetworking = allowNetworking;\n }\n const allowScriptAccess = parseAllowScriptAccess(getOptionString(\"allowScriptAccess\"), url);\n if (allowScriptAccess !== null) {\n options.allowScriptAccess = allowScriptAccess;\n }\n const backgroundColor = getOptionString(\"bgcolor\");\n if (backgroundColor !== null) {\n options.backgroundColor = backgroundColor;\n }\n const base = getOptionString(\"base\");\n if (base !== null) {\n // \".\" tells Flash Player to load relative URLs from the SWF's directory\n // All other base values are evaluated relative to the page URL\n if (base === \".\") {\n const swfUrl = new URL(url, document.baseURI);\n options.base = new URL(base, swfUrl).href;\n }\n else {\n options.base = base;\n }\n }\n const menu = parseBoolean(getOptionString(\"menu\"));\n if (menu !== null) {\n options.menu = menu;\n }\n const allowFullscreen = parseBoolean(getOptionString(\"allowFullScreen\"));\n if (allowFullscreen !== null) {\n options.allowFullscreen = allowFullscreen;\n }\n const parameters = getOptionString(\"flashvars\");\n if (parameters !== null) {\n options.parameters = parameters;\n }\n const quality = getOptionString(\"quality\");\n if (quality !== null) {\n options.quality = quality;\n }\n const salign = getOptionString(\"salign\");\n if (salign !== null) {\n options.salign = salign;\n }\n const scale = getOptionString(\"scale\");\n if (scale !== null) {\n options.scale = scale;\n }\n const wmode = getOptionString(\"wmode\");\n if (wmode !== null) {\n options.wmode = wmode;\n }\n return options;\n}\n/**\n * Returns whether the given filename is a Youtube Flash source.\n *\n * @param filename The filename to test.\n * @returns True if the filename is a Youtube Flash source.\n */\nexport function isYoutubeFlashSource(filename) {\n if (filename) {\n let pathname = \"\";\n let hostname = \"\";\n try {\n // A base URL is required if `filename` is a relative URL, but we don't need to detect the real URL origin.\n const url = new URL(filename, RUFFLE_ORIGIN);\n pathname = url.pathname;\n hostname = url.hostname;\n }\n catch (err) {\n // Some invalid filenames, like `///`, could raise a TypeError. Let's fail silently in this situation.\n }\n // See https://wiki.mozilla.org/QA/Youtube_Embedded_Rewrite\n if (pathname.startsWith(\"/v/\") &&\n /^(?:(?:www\\.|m\\.)?youtube(?:-nocookie)?\\.com)|(?:youtu\\.be)$/i.test(hostname)) {\n return true;\n }\n }\n return false;\n}\n/**\n * Workaround Youtube mixed content if upgradeToHttps is true.\n *\n * @param elem The element to change.\n * @param attr The attribute to adjust.\n */\nexport function workaroundYoutubeMixedContent(elem, attr) {\n const value = elem.getAttribute(attr);\n const config = window.RufflePlayer?.config ?? {};\n if (value) {\n try {\n const url = new URL(value);\n if (url.protocol === \"http:\" &&\n window.location.protocol === \"https:\" &&\n (!(\"upgradeToHttps\" in config) ||\n config.upgradeToHttps !== false)) {\n url.protocol = \"https:\";\n elem.setAttribute(attr, url.toString());\n }\n }\n catch (err) {\n // Some invalid filenames, like `///`, could raise a TypeError. Let's fail silently in this situation.\n }\n }\n}\n/**\n * Determine if an element is a child of a node that was not supported\n * in non-HTML5 compliant browsers. If so, the element was meant to be\n * used as a fallback content.\n *\n * @param elem The element to test.\n * @returns True if the element is inside an <audio> or <video> node.\n */\nexport function isFallbackElement(elem) {\n let parent = elem.parentElement;\n while (parent !== null) {\n switch (parent.tagName) {\n case \"AUDIO\":\n case \"VIDEO\":\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\n}\n/**\n * Parses a given string or null value to a boolean or null and returns it.\n *\n * @param value The string or null value that should be parsed to a boolean or null.\n * @returns The string as a boolean, if it exists and contains a boolean, otherwise null.\n */\nfunction parseBoolean(value) {\n switch (value?.toLowerCase()) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n return null;\n }\n}\n/**\n * Parses a string with script access options or null and returns whether the script\n * access options allow the SWF file with the given URL to call JavaScript code in\n * the surrounding HTML file if they exist correctly, otherwise null.\n *\n * @param access The string with the script access options or null.\n * @param url The URL of the SWF file.\n * @returns Whether the script access options allow the SWF file with the given URL to\n * call JavaScript code in the surrounding HTML file if they exist correctly, otherwise null.\n */\nfunction parseAllowScriptAccess(access, url) {\n switch (access?.toLowerCase()) {\n case \"always\":\n return true;\n case \"never\":\n return false;\n case \"samedomain\":\n try {\n return (new URL(window.location.href).origin ===\n new URL(url, window.location.href).origin);\n }\n catch {\n return false;\n }\n default:\n return null;\n }\n}\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _RufflePlayerElement_inner;\nimport { InnerPlayer, ReadyState } from \"./inner\";\n/**\n * The ruffle player element that should be inserted onto the page.\n *\n * This element will represent the rendered and intractable flash movie.\n */\nexport class RufflePlayerElement extends HTMLElement {\n get onFSCommand() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").onFSCommand;\n }\n set onFSCommand(value) {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").onFSCommand = value;\n }\n get readyState() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\")._readyState;\n }\n get metadata() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").metadata;\n }\n constructor() {\n super();\n _RufflePlayerElement_inner.set(this, void 0);\n __classPrivateFieldSet(this, _RufflePlayerElement_inner, new InnerPlayer(this, () => this.debugPlayerInfo(), (name) => {\n try {\n Object.defineProperty(this, name, {\n value: (...args) => {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").callExternalInterface(name, args);\n },\n configurable: true,\n });\n }\n catch (error) {\n console.warn(`Error setting ExternalInterface legacy callback for ${name}`, error);\n }\n }), \"f\");\n }\n get loadedConfig() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").loadedConfig ?? null;\n }\n connectedCallback() {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").updateStyles();\n }\n static get observedAttributes() {\n return [\"width\", \"height\"];\n }\n attributeChangedCallback(name, _oldValue, _newValue) {\n if (name === \"width\" || name === \"height\") {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").updateStyles();\n }\n }\n disconnectedCallback() {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").destroy();\n }\n async reload() {\n await __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").reload();\n }\n async load(options, isPolyfillElement = false) {\n await __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").load(options, isPolyfillElement);\n }\n play() {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").play();\n }\n get isPlaying() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").isPlaying;\n }\n get volume() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").volume;\n }\n set volume(value) {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").volume = value;\n }\n get fullscreenEnabled() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").fullscreenEnabled;\n }\n get isFullscreen() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").isFullscreen;\n }\n setFullscreen(isFull) {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").setFullscreen(isFull);\n }\n enterFullscreen() {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").enterFullscreen();\n }\n exitFullscreen() {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").exitFullscreen();\n }\n async downloadSwf() {\n await __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").downloadSwf();\n }\n pause() {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").pause();\n }\n set traceObserver(observer) {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").traceObserver = observer;\n }\n debugPlayerInfo() {\n return \"\";\n }\n PercentLoaded() {\n // [NA] This is a stub - we need to research how this is actually implemented (is it just base swf loadedBytes?)\n if (this.readyState === ReadyState.Loaded) {\n return 100;\n }\n else {\n return 0;\n }\n }\n get config() {\n return __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").config;\n }\n set config(value) {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").config = value;\n }\n displayMessage(message) {\n __classPrivateFieldGet(this, _RufflePlayerElement_inner, \"f\").displayMessage(message);\n }\n}\n_RufflePlayerElement_inner = new WeakMap();\n/**\n * Copies attributes and children from another element to a target element.\n * Used by the polyfill elements, RuffleObject and RuffleEmbed.\n *\n * @param element The element to copy all attributes from.\n * @param destination The element to copy all attributes to.\n */\nexport function copyElement(element, destination) {\n if (element) {\n for (const attribute of element.attributes) {\n if (attribute.specified) {\n // Issue 468: Chrome \"Click to Active Flash\" box stomps on title attribute\n if (attribute.name === \"title\" &&\n attribute.value === \"Adobe Flash Player\") {\n continue;\n }\n try {\n destination.setAttribute(attribute.name, attribute.value);\n }\n catch (err) {\n // The embed may have invalid attributes, so handle these gracefully.\n console.warn(`Unable to set attribute ${attribute.name} on Ruffle instance`);\n }\n }\n }\n for (const node of Array.from(element.children)) {\n destination.appendChild(node);\n }\n }\n}\n","import { copyElement, RufflePlayerElement } from \"./ruffle-player-element\";\nimport { getPolyfillOptions, isFallbackElement, isYoutubeFlashSource, workaroundYoutubeMixedContent, } from \"./inner\";\nimport { registerElement } from \"../register-element\";\nimport { isSwf } from \"../../swf-utils\";\n/**\n * A polyfill html element.\n *\n * This specific class tries to polyfill existing `<embed>` tags,\n * and should not be used. Prefer {@link RufflePlayer} instead.\n *\n * @internal\n */\nexport class RuffleEmbedElement extends RufflePlayerElement {\n /**\n * @ignore\n * @internal\n */\n connectedCallback() {\n super.connectedCallback();\n const src = this.attributes.getNamedItem(\"src\");\n if (src) {\n // Get the configuration options that have been overwritten for this movie.\n const getOptionString = (optionName) => this.attributes.getNamedItem(optionName)?.value ?? null;\n const options = getPolyfillOptions(src.value, getOptionString);\n // Kick off the SWF download.\n this.load(options, true);\n }\n }\n /**\n * Polyfill of HTMLEmbedElement.\n *\n * @ignore\n * @internal\n */\n get nodeName() {\n return \"EMBED\";\n }\n /**\n * Polyfill of HTMLEmbedElement.\n *\n * @ignore\n * @internal\n */\n get src() {\n return this.attributes.getNamedItem(\"src\")?.value;\n }\n /**\n * Polyfill of HTMLEmbedElement.\n *\n * @ignore\n * @internal\n */\n set src(srcval) {\n if (srcval) {\n const attr = document.createAttribute(\"src\");\n attr.value = srcval;\n this.attributes.setNamedItem(attr);\n }\n else {\n this.attributes.removeNamedItem(\"src\");\n }\n }\n /**\n * @ignore\n * @internal\n */\n static get observedAttributes() {\n return [\"src\", \"width\", \"height\"];\n }\n /**\n * @ignore\n * @internal\n */\n attributeChangedCallback(name, oldValue, newValue) {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (this.isConnected && name === \"src\") {\n const src = this.attributes.getNamedItem(\"src\");\n if (src) {\n const getOptionString = (optionName) => this.attributes.getNamedItem(optionName)?.value ?? null;\n const options = getPolyfillOptions(src.value, getOptionString);\n this.load(options, true);\n }\n }\n }\n /**\n * Checks if the given element may be polyfilled with this one.\n *\n * @param elem Element to check.\n * @returns True if the element looks like a Flash embed.\n */\n static isInterdictable(elem) {\n const src = elem.getAttribute(\"src\");\n const type = elem.getAttribute(\"type\");\n // Don't polyfill when no file is specified.\n if (!src) {\n return false;\n }\n // Don't polyfill if the element is inside a specific node.\n if (isFallbackElement(elem)) {\n return false;\n }\n // Don't polyfill when the file is a YouTube Flash source.\n if (isYoutubeFlashSource(src)) {\n // Workaround YouTube mixed content; this isn't what browsers do automatically, but while we're here, we may as well.\n workaroundYoutubeMixedContent(elem, \"src\");\n return false;\n }\n return isSwf(src, type);\n }\n /**\n * Creates a RuffleEmbed that will polyfill and replace the given element.\n *\n * @param elem Element to replace.\n * @returns Created RuffleEmbed.\n */\n static fromNativeEmbedElement(elem) {\n const externalName = registerElement(\"ruffle-embed\", RuffleEmbedElement);\n const ruffleObj = document.createElement(externalName);\n copyElement(elem, ruffleObj);\n return ruffleObj;\n }\n /**\n * Polyfill of height getter\n *\n * @ignore\n * @internal\n */\n get height() {\n return this.getAttribute(\"height\") || \"\";\n }\n /**\n * Polyfill of height setter\n *\n * @ignore\n * @internal\n */\n set height(height) {\n this.setAttribute(\"height\", height);\n }\n /**\n * Polyfill of width getter\n *\n * @ignore\n * @internal\n */\n get width() {\n return this.getAttribute(\"width\") || \"\";\n }\n /**\n * Polyfill of width setter\n *\n * @ignore\n * @internal\n */\n set width(widthVal) {\n this.setAttribute(\"width\", widthVal);\n }\n /**\n * Polyfill of type getter\n *\n * @ignore\n * @internal\n */\n get type() {\n return this.getAttribute(\"type\") || \"\";\n }\n /**\n * Polyfill of type setter\n *\n * @ignore\n * @internal\n */\n set type(typeVal) {\n this.setAttribute(\"type\", typeVal);\n }\n}\n","import { copyElement, RufflePlayerElement } from \"./ruffle-player-element\";\nimport { getPolyfillOptions, isFallbackElement, isYoutubeFlashSource, workaroundYoutubeMixedContent, } from \"./inner\";\nimport { FLASH_ACTIVEX_CLASSID } from \"../../flash-identifiers\";\nimport { registerElement } from \"../register-element\";\nimport { RuffleEmbedElement } from \"./ruffle-embed-element\";\nimport { isSwf } from \"../../swf-utils\";\n/**\n * Find and return the first value in obj with the given key.\n * Many Flash params were case insensitive, so we use this when checking for them.\n *\n * @param obj Object to check\n * @param key Key to find\n * @param defaultValue Value if not found\n * @returns Value if found, else {@link defaultValue}\n */\nfunction findCaseInsensitive(obj, key, defaultValue) {\n key = key.toLowerCase();\n for (const [k, value] of Object.entries(obj)) {\n if (k.toLowerCase() === key) {\n return value;\n }\n }\n return defaultValue;\n}\n/**\n * Returns all flash params ({@link HTMLParamElement}) that are for the given object.\n *\n * @param elem Element to check.\n * @returns A record of every parameter.\n */\nfunction paramsOf(elem) {\n const params = {};\n for (const param of elem.children) {\n if (param instanceof HTMLParamElement) {\n const key = param.attributes.getNamedItem(\"name\")?.value;\n const value = param.attributes.getNamedItem(\"value\")?.value;\n if (key && value) {\n params[key] = value;\n }\n }\n }\n return params;\n}\n/**\n * A polyfill html element.\n *\n * This specific class tries to polyfill existing `<object>` tags,\n * and should not be used. Prefer {@link RufflePlayer} instead.\n *\n * @internal\n */\nexport class RuffleObjectElement extends RufflePlayerElement {\n constructor() {\n super(...arguments);\n this.params = {};\n }\n /**\n * @ignore\n * @internal\n */\n connectedCallback() {\n super.connectedCallback();\n this.params = paramsOf(this);\n let url = null;\n if (this.attributes.getNamedItem(\"data\")) {\n url = this.attributes.getNamedItem(\"data\")?.value;\n }\n else if (this.params[\"movie\"]) {\n url = this.params[\"movie\"];\n }\n if (url) {\n // Get the configuration options that have been overwritten for this movie.\n const attributeCheckOptions = [\n \"allowNetworking\",\n \"base\",\n \"bgcolor\",\n \"flashvars\",\n ];\n const getOptionString = (optionName) => findCaseInsensitive(this.params, optionName, attributeCheckOptions.includes(optionName)\n ? this.getAttribute(optionName)\n : null);\n const options = getPolyfillOptions(url, getOptionString);\n // Kick off the SWF download.\n this.load(options, true);\n }\n }\n debugPlayerInfo() {\n let result = \"Player type: Object\\n\";\n let url = null;\n if (this.attributes.getNamedItem(\"data\")) {\n url = this.attributes.getNamedItem(\"data\")?.value;\n }\n else if (this.params[\"movie\"]) {\n url = this.params[\"movie\"];\n }\n result += `SWF URL: ${url}\\n`;\n Object.keys(this.params).forEach((key) => {\n result += `Param ${key}: ${this.params[key]}\\n`;\n });\n Object.keys(this.attributes).forEach((key) => {\n result += `Attribute ${key}: ${this.attributes.getNamedItem(key)?.value}\\n`;\n });\n return result;\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n get nodeName() {\n return \"OBJECT\";\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n get data() {\n return this.getAttribute(\"data\");\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n set data(href) {\n if (href) {\n const attr = document.createAttribute(\"data\");\n attr.value = href;\n this.attributes.setNamedItem(attr);\n }\n else {\n this.attributes.removeNamedItem(\"data\");\n }\n }\n /**\n * Checks if the given element may be polyfilled with this one.\n *\n * @param elem Element to check.\n * @returns True if the element looks like a Flash object.\n */\n static isInterdictable(elem) {\n // Don't polyfill if the element is inside a specific node.\n if (isFallbackElement(elem)) {\n return false;\n }\n // Don't polyfill if there's already a <ruffle-object> or a <ruffle-embed> inside the <object>.\n if (elem.getElementsByTagName(\"ruffle-object\").length > 0 ||\n elem.getElementsByTagName(\"ruffle-embed\").length > 0) {\n return false;\n }\n const data = elem.attributes.getNamedItem(\"data\")?.value.toLowerCase();\n const type = elem.attributes.getNamedItem(\"type\")?.value ?? null;\n const params = paramsOf(elem);\n // Check for SWF file.\n let filename;\n if (data) {\n // Don't polyfill when the file is a YouTube Flash source.\n if (isYoutubeFlashSource(data)) {\n // Workaround YouTube mixed content; this isn't what browsers do automatically, but while we're here, we may as well.\n workaroundYoutubeMixedContent(elem, \"data\");\n return false;\n }\n filename = data;\n }\n else if (params && params[\"movie\"]) {\n // Don't polyfill when the file is a YouTube Flash source.\n if (isYoutubeFlashSource(params[\"movie\"])) {\n // Workaround YouTube mixed content; this isn't what browsers do automatically, but while we're here, we may as well.\n const movieElem = elem.querySelector(\"param[name='movie']\");\n if (movieElem) {\n workaroundYoutubeMixedContent(movieElem, \"value\");\n // The data attribute needs to be set for the re-fetch to happen.\n // It also needs to be set on Firefox for the YouTube object rewrite to work, regardless of mixed content.\n const movieSrc = movieElem.getAttribute(\"value\");\n if (movieSrc) {\n elem.setAttribute(\"data\", movieSrc);\n }\n }\n return false;\n }\n filename = params[\"movie\"];\n }\n else {\n // Don't polyfill when no file is specified.\n return false;\n }\n // Check ActiveX class ID.\n const classid = elem.attributes\n .getNamedItem(\"classid\")\n ?.value.toLowerCase();\n if (classid === FLASH_ACTIVEX_CLASSID.toLowerCase()) {\n // classid is an old-IE style embed that would not work on modern browsers.\n // Often there will be an <embed> inside the <object> that would take precedence.\n // Only polyfill this <object> if it doesn't contain a polyfillable <embed> or\n // another <object> that would be supported on modern browsers.\n return (!Array.from(elem.getElementsByTagName(\"object\")).some(RuffleObjectElement.isInterdictable) &&\n !Array.from(elem.getElementsByTagName(\"embed\")).some(RuffleEmbedElement.isInterdictable));\n }\n else if (classid) {\n // Non-Flash classid.\n return false;\n }\n return isSwf(filename, type);\n }\n /**\n * Creates a RuffleObject that will polyfill and replace the given element.\n *\n * @param elem Element to replace.\n * @returns Created RuffleObject.\n */\n static fromNativeObjectElement(elem) {\n const externalName = registerElement(\"ruffle-object\", RuffleObjectElement);\n const ruffleObj = document.createElement(externalName);\n // Avoid copying embeds-inside-objects to avoid double polyfilling.\n for (const embedElem of Array.from(elem.getElementsByTagName(\"embed\"))) {\n if (RuffleEmbedElement.isInterdictable(embedElem)) {\n embedElem.remove();\n }\n }\n // Avoid copying objects-inside-objects to avoid double polyfilling.\n // This may happen when Internet Explorer's conditional comments are used.\n for (const objectElem of Array.from(elem.getElementsByTagName(\"object\"))) {\n if (RuffleObjectElement.isInterdictable(objectElem)) {\n objectElem.remove();\n }\n }\n copyElement(elem, ruffleObj);\n return ruffleObj;\n }\n /**\n * Polyfill of height getter\n *\n * @ignore\n * @internal\n */\n get height() {\n return this.getAttribute(\"height\") || \"\";\n }\n /**\n * Polyfill of height setter\n *\n * @ignore\n * @internal\n */\n set height(height) {\n this.setAttribute(\"height\", height);\n }\n /**\n * Polyfill of width getter\n *\n * @ignore\n * @internal\n */\n get width() {\n return this.getAttribute(\"width\") || \"\";\n }\n /**\n * Polyfill of width setter\n *\n * @ignore\n * @internal\n */\n set width(widthVal) {\n this.setAttribute(\"width\", widthVal);\n }\n /**\n * Polyfill of type getter\n *\n * @ignore\n * @internal\n */\n get type() {\n return this.getAttribute(\"type\") || \"\";\n }\n /**\n * Polyfill of type setter\n *\n * @ignore\n * @internal\n */\n set type(typeVal) {\n this.setAttribute(\"type\", typeVal);\n }\n}\n","import { FLASH_MIMETYPE, FUTURESPLASH_MIMETYPE, FLASH7_AND_8_MIMETYPE, FLASH_MOVIE_MIMETYPE, } from \"./flash-identifiers\";\n/**\n * Replacement object for `MimeTypeArray` that lets us install new fake mime\n * types.\n *\n * Unlike plugins we can at least enumerate mime types in Firefox, so we don't\n * lose data.\n *\n * We also expose a method called `install` which adds a new plugin. This is\n * used to falsify Flash detection. If the existing `navigator.mimeTypes` has an\n * `install` method, you should not use `RuffleMimeTypeArray` as some other\n * plugin emulator is already present.\n */\nclass RuffleMimeTypeArray {\n constructor(mimeTypes) {\n this.__mimeTypes = [];\n this.__namedMimeTypes = {};\n if (mimeTypes) {\n for (let i = 0; i < mimeTypes.length; i++) {\n this.install(mimeTypes[i]);\n }\n }\n }\n /**\n * Install a MIME Type into the array.\n *\n * @param mimeType The mime type to install\n */\n install(mimeType) {\n const wrapper = new RuffleMimeType(mimeType);\n const index = this.__mimeTypes.length;\n this.__mimeTypes.push(wrapper);\n this.__namedMimeTypes[mimeType.type] = wrapper;\n this[wrapper.type] = wrapper;\n this[index] = wrapper;\n }\n item(index) {\n // This behavior is done to emulate a 32-bit uint,\n // which browsers use.\n return this.__mimeTypes[index >>> 0];\n }\n namedItem(name) {\n return this.__namedMimeTypes[name];\n }\n get length() {\n return this.__mimeTypes.length;\n }\n [Symbol.iterator]() {\n return this.__mimeTypes[Symbol.iterator]();\n }\n get [Symbol.toStringTag]() {\n return \"MimeTypeArray\";\n }\n}\n/**\n * Replacement object for the built-in MimeType object.\n * This only exists, because the built-in type is not constructable and we\n * need to spoof `window.MimeType`.\n */\nclass RuffleMimeType {\n constructor(mimeType) {\n this.__mimeType = mimeType;\n }\n get type() {\n return this.__mimeType.type;\n }\n get description() {\n return this.__mimeType.description;\n }\n get suffixes() {\n return this.__mimeType.suffixes;\n }\n get enabledPlugin() {\n return this.__mimeType.enabledPlugin;\n }\n get [Symbol.toStringTag]() {\n return \"MimeType\";\n }\n}\n/**\n * Equivalent object to `Plugin` that allows us to falsify plugins.\n */\nclass RufflePlugin extends RuffleMimeTypeArray {\n constructor(name, description, filename) {\n super();\n this.name = name;\n this.description = description;\n this.filename = filename;\n }\n}\n/**\n * Replacement object for `PluginArray` that lets us install new fake plugins.\n *\n * This object needs to wrap the native plugin array, since the user might have\n * actual plugins installed. Firefox doesn't let us enumerate the array, though,\n * which has some consequences. Namely, we can't actually perfectly wrap the\n * native plugin array, at least unless there's some secret \"unresolved object\n * property name handler\" that I've never known before in JS...\n *\n * We can still wrap `namedItem` perfectly at least.\n *\n * We also expose a method called `install` which adds a new plugin. This is\n * used to falsify Flash detection. If the existing `navigator.plugins` has an\n * `install` method, you should not use `RufflePluginArray` as some other plugin\n * emulator is already present.\n */\nclass RufflePluginArray {\n constructor(plugins) {\n this.__plugins = [];\n this.__namedPlugins = {};\n for (let i = 0; i < plugins.length; i++) {\n this.install(plugins[i]);\n }\n }\n install(plugin) {\n const index = this.__plugins.length;\n this.__plugins.push(plugin);\n this.__namedPlugins[plugin.name] = plugin;\n this[plugin.name] = plugin;\n this[index] = plugin;\n }\n item(index) {\n // This behavior is done to emulate a 32-bit uint,\n // which browsers use. Cloudflare's anti-bot\n // checks rely on this.\n return this.__plugins[index >>> 0];\n }\n namedItem(name) {\n return this.__namedPlugins[name];\n }\n refresh() {\n // Nothing to do, we just need to define the method.\n }\n [Symbol.iterator]() {\n return this.__plugins[Symbol.iterator]();\n }\n get [Symbol.toStringTag]() {\n return \"PluginArray\";\n }\n get length() {\n return this.__plugins.length;\n }\n}\n/**\n * A fake plugin designed to trigger Flash detection scripts.\n */\nexport const FLASH_PLUGIN = new RufflePlugin(\"Shockwave Flash\", \"Shockwave Flash 32.0 r0\", \"ruffle.js\");\nFLASH_PLUGIN.install({\n type: FUTURESPLASH_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"spl\",\n enabledPlugin: FLASH_PLUGIN,\n});\nFLASH_PLUGIN.install({\n type: FLASH_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"swf\",\n enabledPlugin: FLASH_PLUGIN,\n});\nFLASH_PLUGIN.install({\n type: FLASH7_AND_8_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"swf\",\n enabledPlugin: FLASH_PLUGIN,\n});\nFLASH_PLUGIN.install({\n type: FLASH_MOVIE_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"swf\",\n enabledPlugin: FLASH_PLUGIN,\n});\n/**\n * Install a fake plugin such that detectors will see it in `navigator.plugins`.\n *\n * This function takes care to check if the existing implementation of\n * `navigator.plugins` already accepts fake plugin entries. If so, it will use\n * that version of the plugin array. This allows the plugin polyfill to compose\n * across multiple plugin emulators with the first emulator's polyfill winning.\n *\n * @param plugin The plugin to install\n */\nexport function installPlugin(plugin) {\n if (navigator.plugins.namedItem(\"Shockwave Flash\")) {\n return;\n }\n if (!(\"install\" in navigator.plugins) || !navigator.plugins[\"install\"]) {\n Object.defineProperty(window, \"PluginArray\", {\n value: RufflePluginArray,\n });\n Object.defineProperty(navigator, \"plugins\", {\n value: new RufflePluginArray(navigator.plugins),\n writable: false,\n });\n }\n const plugins = navigator.plugins;\n plugins.install(plugin);\n if (plugin.length > 0 &&\n (!(\"install\" in navigator.mimeTypes) || !navigator.mimeTypes[\"install\"])) {\n Object.defineProperty(window, \"MimeTypeArray\", {\n value: RuffleMimeTypeArray,\n });\n Object.defineProperty(window, \"MimeType\", {\n value: RuffleMimeType,\n });\n Object.defineProperty(navigator, \"mimeTypes\", {\n value: new RuffleMimeTypeArray(navigator.mimeTypes),\n writable: false,\n });\n }\n const mimeTypes = navigator.mimeTypes;\n for (let i = 0; i < plugin.length; i += 1) {\n mimeTypes.install(plugin[i]);\n }\n}\n","import { RuffleObjectElement } from \"./internal/player/ruffle-object-element\";\nimport { RuffleEmbedElement } from \"./internal/player/ruffle-embed-element\";\nimport { installPlugin, FLASH_PLUGIN } from \"./plugin-polyfill\";\nimport { publicPath } from \"./public-path\";\nimport { isExtension } from \"./current-script\";\nconst globalConfig = window.RufflePlayer?.config ?? {};\nconst jsScriptUrl = publicPath(globalConfig) + \"ruffle.js\";\n/**\n * Polyfill native Flash elements with Ruffle equivalents.\n *\n * This polyfill isn't fool-proof: If there's a chance site JavaScript has\n * access to a pre-polyfill element, then this will break horribly. We can\n * keep native objects out of the DOM, and thus out of JavaScript's grubby\n * little hands, but only if we load first.\n */\nlet objects;\nlet embeds;\n/**\n * Check if this browser has pre-existing Flash support.\n *\n * @returns Whether this browser has a plugin indicating pre-existing Flash support.\n */\nfunction isFlashEnabledBrowser() {\n // If the user sets a configuration value not to favor Flash, pretend the browser does not support Flash so Ruffle takes effect.\n if (\"favorFlash\" in globalConfig && globalConfig[\"favorFlash\"] === false) {\n return false;\n }\n // Otherwise, check for pre-existing Flash support.\n return ((navigator.plugins.namedItem(\"Shockwave Flash\")?.filename ??\n \"ruffle.js\") !== \"ruffle.js\");\n}\n/**\n *\n */\nfunction polyfillFlashInstances() {\n try {\n // Create live collections to track embed tags.\n objects = objects ?? document.getElementsByTagName(\"object\");\n embeds = embeds ?? document.getElementsByTagName(\"embed\");\n // Replace <object> first, because <object> often wraps <embed>.\n for (const elem of Array.from(objects)) {\n if (RuffleObjectElement.isInterdictable(elem)) {\n const ruffleObject = RuffleObjectElement.fromNativeObjectElement(elem);\n elem.replaceWith(ruffleObject);\n }\n }\n for (const elem of Array.from(embeds)) {\n if (RuffleEmbedElement.isInterdictable(elem)) {\n const ruffleEmbed = RuffleEmbedElement.fromNativeEmbedElement(elem);\n elem.replaceWith(ruffleEmbed);\n }\n }\n }\n catch (err) {\n console.error(`Serious error encountered when polyfilling native Flash elements: ${err}`);\n }\n}\n/**\n * Inject Ruffle into <iframe> and <frame> elements.\n *\n * This polyfill isn't fool-proof either: On self-hosted builds, it may\n * not work due to browsers CORS policy or be loaded too late for some\n * libraries like SWFObject. These should be less of a problem on the\n * web extension. This polyfill should, however, do the trick in most\n * cases, but users should be aware of its natural limits.\n */\nlet iframes;\nlet frames;\n/**\n *\n */\nfunction polyfillFrames() {\n // Create live collections to track embed tags.\n iframes = iframes ?? document.getElementsByTagName(\"iframe\");\n frames = frames ?? document.getElementsByTagName(\"frame\");\n [iframes, frames].forEach((elements) => {\n for (const element of elements) {\n if (element.dataset[\"rufflePolyfilled\"] !== undefined) {\n // Don't re-polyfill elements with the \"data-ruffle-polyfilled\" attribute.\n continue;\n }\n element.dataset[\"rufflePolyfilled\"] = \"\";\n const elementWindow = element.contentWindow;\n // Cross origin requests may reach an exception, so let's prepare for this eventuality.\n const errorMessage = `Couldn't load Ruffle into ${element.tagName}[${element.src}]: `;\n try {\n if (elementWindow.document.readyState === \"complete\") {\n injectRuffle(elementWindow, errorMessage);\n }\n }\n catch (err) {\n if (!isExtension) {\n // The web extension should be able to load Ruffle into cross origin frames\n // because it has \"all_frames\" set to true in its manifest.json: RufflePlayer\n // config won't be injected but it's not worth showing an error.\n console.warn(errorMessage + err);\n }\n }\n // Attach listener to the element to handle frame navigation.\n element.addEventListener(\"load\", () => {\n injectRuffle(elementWindow, errorMessage);\n }, false);\n }\n });\n}\n/**\n * @param elementWindow The (i)frame's window object.\n * @param errorMessage The message to log when Ruffle cannot access the (i)frame's document.\n */\nasync function injectRuffle(elementWindow, errorMessage) {\n // The document is supposed to be completely loaded when this function is run.\n // As Chrome may be unable to access the document properties, we have to delay the execution a little bit.\n await new Promise((resolve) => {\n window.setTimeout(() => {\n resolve();\n }, 100);\n });\n let elementDocument;\n try {\n elementDocument = elementWindow.document;\n if (!elementDocument) {\n // Don't polyfill if the window has no document: the element may have been removed from the parent window.\n return;\n }\n }\n catch (err) {\n if (!isExtension) {\n console.warn(errorMessage + err);\n }\n return;\n }\n if (!isExtension &&\n elementDocument.documentElement.dataset[\"ruffleOptout\"] !== undefined) {\n // Don't polyfill elements with the \"data-ruffle-optout\" attribute.\n return;\n }\n if (!isExtension) {\n if (!elementWindow.RufflePlayer) {\n const script = elementDocument.createElement(\"script\");\n script.setAttribute(\"src\", jsScriptUrl);\n script.onload = () => {\n // Inject parent configuration once the script is loaded, preventing it from being ignored.\n elementWindow.RufflePlayer = {};\n elementWindow.RufflePlayer.config = globalConfig;\n };\n elementDocument.head.appendChild(script);\n }\n }\n else {\n if (!elementWindow.RufflePlayer) {\n elementWindow.RufflePlayer = {};\n }\n // Merge parent window and frame configurations, will likely be applied too late though.\n elementWindow.RufflePlayer.config = {\n ...globalConfig,\n ...(elementWindow.RufflePlayer.config ?? {}),\n };\n }\n}\n/**\n * Listen for changes to the DOM.\n */\nfunction initMutationObserver() {\n const observer = new MutationObserver(function (mutationsList) {\n // If any embed or object nodes were added, re-run the polyfill to detect any new instances.\n const embedOrObjectAdded = mutationsList.some((mutation) => Array.from(mutation.addedNodes).some((node) => [\"EMBED\", \"OBJECT\"].includes(node.nodeName) ||\n (node instanceof Element &&\n node.querySelector(\"embed, object\") !==\n null)));\n if (embedOrObjectAdded) {\n polyfillFlashInstances();\n polyfillFrames();\n }\n });\n observer.observe(document, { childList: true, subtree: true });\n}\n/**\n * Polyfills the detection of Flash plugins in the browser.\n */\nexport function pluginPolyfill() {\n installPlugin(FLASH_PLUGIN);\n}\n/**\n * Polyfills legacy Flash content on the page.\n */\nexport function polyfill() {\n if (!isFlashEnabledBrowser()) {\n polyfillFlashInstances();\n polyfillFrames();\n initMutationObserver();\n }\n}\n","import { currentScriptURL, isExtension } from \"./current-script\";\n/**\n * Attempt to discover the public path of the current Ruffle source. This can\n * be used to configure Webpack.\n *\n * A global public path can be specified for all sources using the RufflePlayer\n * config:\n *\n * ```js\n * window.RufflePlayer.config.publicPath = \"/dist/\";\n * ```\n *\n * If no such config is specified, then the parent path of where this script is\n * hosted is assumed, which should be the correct default in most cases.\n *\n * @param config The `window.RufflePlayer.config` object.\n * @returns The public path for the given source.\n */\nexport function publicPath(config) {\n // Default to the directory where this script resides.\n let path = currentScriptURL?.href ?? \"\";\n if (!isExtension &&\n \"publicPath\" in config &&\n config.publicPath !== null &&\n config.publicPath !== undefined) {\n path = config.publicPath;\n }\n // Webpack expects the paths to end with a slash.\n if (path !== \"\" && !path.endsWith(\"/\")) {\n path += \"/\";\n }\n return path;\n}\n","import { buildInfo } from \"../build-info\";\nimport { pluginPolyfill, polyfill } from \"../polyfills\";\nimport { registerElement } from \"./register-element\";\nimport { RufflePlayerElement } from \"./player/ruffle-player-element\";\n/**\n * The actual source API that describes this installation.\n * This isn't part of the public API and may contain extra details.\n */\nexport const internalSourceApi = {\n /**\n * The version of this particular API, as a string in a semver compatible format.\n */\n version: buildInfo.versionNumber + \"+\" + buildInfo.buildDate.substring(0, 10),\n /**\n * Start up the polyfills.\n *\n * Do not run polyfills for more than one Ruffle source at a time.\n */\n polyfill() {\n polyfill();\n },\n /**\n * Polyfill the plugin detection.\n *\n * This needs to run before any plugin detection script does.\n */\n pluginPolyfill() {\n pluginPolyfill();\n },\n /**\n * Create a Ruffle player element using this particular version of Ruffle.\n *\n * @returns The player element. This is a DOM element that may be inserted\n * into the current page as you wish.\n */\n createPlayer() {\n const name = registerElement(\"ruffle-player\", RufflePlayerElement);\n return document.createElement(name);\n },\n /**\n * Options specified by the user of this library.\n */\n options: {},\n};\n","// eslint-disable-next-line no-unused-vars\n/* global __webpack_public_path__:writable */\n\nimport { Setup } from \"ruffle-core\";\n\nlet currentScriptURL = null;\n\ntry {\n if (\n document.currentScript !== undefined &&\n document.currentScript !== null &&\n \"src\" in document.currentScript &&\n document.currentScript.src !== \"\"\n ) {\n let src = document.currentScript.src;\n\n // CDNs allow omitting the filename. If it's omitted, append a slash to\n // prevent the last component from being dropped.\n if (!src.endsWith(\".js\") && !src.endsWith(\"/\")) {\n src += \"/\";\n }\n\n currentScriptURL = new URL(\".\", src);\n }\n // eslint-disable-next-line no-unused-vars\n} catch (_e) {\n console.warn(\"Unable to get currentScript URL\");\n}\n\nfunction publicPath(config) {\n // Default to the directory where this script resides.\n let path = currentScriptURL?.href ?? \"\";\n if (\n \"publicPath\" in config &&\n config.publicPath !== null &&\n config.publicPath !== undefined\n ) {\n path = config.publicPath;\n }\n\n // Webpack expects the paths to end with a slash.\n if (path !== \"\" && !path.endsWith(\"/\")) {\n path += \"/\";\n }\n\n return path;\n}\n\nSetup.installRuffle(\"local\", {\n onFirstLoad: () => {\n __webpack_public_path__ = publicPath(window.RufflePlayer?.config);\n },\n});\n","import { PublicAPI } from \"./public-api\";\nimport { internalSourceApi } from \"../../internal/internal-source-api\";\n/**\n * Install this version of Ruffle into the current page.\n *\n * Multiple (or zero) versions of Ruffle may be installed at the same time,\n * and you should use `window.RufflePlayer.newest()` or similar to access the appropriate\n * installation at time of use.\n *\n * @param sourceName The name of this particular\n * Ruffle source. Common convention is \"local\" for websites that bundle their own Ruffle,\n * \"extension\" for browser extensions, and something else for other use cases.\n * Names are unique, and last-installed will replace earlier installations with the same name,\n * regardless of what those installations are or which version they represent.\n * @param options Any options used to configure this specific installation of Ruffle.\n */\nexport function installRuffle(sourceName, options = {}) {\n let publicAPI;\n if (window.RufflePlayer instanceof PublicAPI) {\n publicAPI = window.RufflePlayer;\n }\n else {\n publicAPI = new PublicAPI(window.RufflePlayer);\n window.RufflePlayer = publicAPI;\n }\n publicAPI.sources[sourceName] = internalSourceApi;\n internalSourceApi.options = options;\n // Install the faux plugin detection immediately.\n // This is necessary because scripts such as SWFObject check for the\n // Flash Player immediately when they load.\n // TODO: Maybe there's a better place for this.\n const polyfills = \"polyfills\" in publicAPI.config ? publicAPI.config.polyfills : true;\n if (polyfills !== false) {\n internalSourceApi.pluginPolyfill();\n }\n}\n"],"names":["inProgress","dataWebpackPrefix","Object","defineProperty","exports","value","classnames","isTruthy","v","isUnique","i","a","indexOf","emptyArray","classnamesToArray","Array","isArray","flatMap","filter","record","entries","map","key","list","length","join","undefined","__createBinding","this","create","o","m","k","k2","desc","getOwnPropertyDescriptor","__esModule","writable","configurable","enumerable","get","__exportStar","p","prototype","hasOwnProperty","call","createRef","h","createElement","setAttributes_1","utils_1","tag","attrs","children","finalTag","finalAttrs","applyTsxTag","element","createDomElement","setAttributes","applyChildren","current","defineCustomElement","jsx_runtime_1","name","constructor","options","customElements","define","props","jsx","jsxDEV","jsxs","tsx_dom_types_1","transferKnownProperties","source","target","keys","eventAttributeName","finalValue","setAttribute","test","finalName","replace","useCapture","eventName","toLowerCase","substring","addEventListener","style","innerHTML","toString","applyChild","child","Element","appendChild","document","createTextNode","console","warn","is","xmlns","createElementNS","tsxTag","includes","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","id","loaded","__webpack_modules__","d","definition","f","e","chunkId","Promise","all","reduce","promises","u","g","globalThis","Function","window","hmd","set","Error","obj","prop","l","url","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","head","r","Symbol","toStringTag","b","baseURI","self","location","href","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","Version","major","minor","patch","prIdent","buildIdent","fromSemver","versionString","buildSplit","split","prSplit","versionSplit","parseInt","isCompatibleWith","other","hasPrecedenceOver","isNumeric","numericThis","numericOther","intThis","intOther","numricThis","isEqual","isStableOrCompatiblePrerelease","VersionRange","requirements","satisfiedBy","fver","requirement","matches","comparator","version","fromRequirementString","components","component","match","exec","slice","index","trim","PublicAPI","sources","config","invoked","newestName","superseded","readyState","init","newestSourceName","newestVersion","kVersion","polyfills","polyfill","newest","satisfying","requirementString","valid","localCompatible","local","buildInfo","versionNumber","versionName","versionChannel","buildDate","commitHash","AutoPlay","Letterbox","UnmuteOverlay","LogLevel","WindowMode","RenderBackend","ContextMenu","PlayerRuntime","OpenURLMode","NetworkingAccessMode","DEFAULT_CONFIG","allowScriptAccess","parameters","autoplay","Auto","backgroundColor","letterbox","Fullscreen","unmuteOverlay","Visible","upgradeToHttps","compatibilityRules","favorFlash","warnOnUnsupportedContent","logLevel","showSwfDownload","contextMenu","On","preloader","splashScreen","maxExecutionDuration","base","menu","allowFullscreen","salign","forceAlign","quality","scale","forceScale","frameRate","wmode","Window","publicPath","playerVersion","preferredRenderer","openUrlMode","Allow","allowNetworking","All","openInNewTab","socketProxy","fontSources","defaultFonts","credentialAllowList","playerRuntime","FlashPlayer","FluentType","valueOf","FluentNone","super","scope","FluentNumber","opts","memoizeIntlObject","Intl","NumberFormat","format","err","reportError","FluentDateTime","DateTimeFormat","Date","toISOString","selector","PluralRules","select","getDefault","variants","star","resolvePattern","RangeError","getArguments","args","positional","named","arg","resolveExpression","expr","minimumFractionDigits","precision","params","ReferenceError","getTime","TypeError","resolveVariableReference","attr","bundle","_messages","attribute","attributes","resolveMessageReference","term","_terms","resolved","resolveTermReference","func","_functions","resolveFunctionReference","sel","variant","resolveSelectExpression","resolveComplexPattern","ptn","dirty","has","add","result","useIsolating","_useIsolating","elem","placeables","delete","_transform","Scope","errors","WeakSet","ctor","cache","_intls","JSON","stringify","locales","values","allowed","unwrapped","opt","NUMBER_ALLOWED","NUMBER","DATETIME_ALLOWED","DATETIME","Map","FluentBundle","functions","transform","stringLocale","memoizer","getMemoizerForLocale","hasMessage","getMessage","addResource","res","allowOverrides","body","entry","startsWith","formatPattern","pattern","RE_MESSAGE_START","RE_ATTRIBUTE_START","RE_VARIANT_START","RE_NUMBER_LITERAL","RE_IDENTIFIER","RE_REFERENCE","RE_FUNCTION_NAME","RE_TEXT_RUN","RE_STRING_RUN","RE_STRING_ESCAPE","RE_UNICODE_ESCAPE","RE_LEADING_NEWLINES","RE_TRAILING_SPACES","RE_BLANK_LINES","RE_INDENT","TOKEN_BRACE_OPEN","TOKEN_BRACE_CLOSE","TOKEN_BRACKET_OPEN","TOKEN_BRACKET_CLOSE","TOKEN_PAREN_OPEN","TOKEN_ARROW","TOKEN_COLON","TOKEN_COMMA","TOKEN_BLANK","FluentResource","lastIndex","cursor","next","parseMessage","SyntaxError","re","consumeChar","char","errorClass","consumeToken","match1","parsePattern","parseAttributes","first","parsePatternElements","Infinity","indent","parseIndent","elements","commonIndent","parsePlaceable","Math","min","lastElement","baked","Indent","parseInlineExpression","count","parseVariantKey","parseVariants","sigil","parseArgument","parseArguments","parseLiteral","parseNumberLiteral","parseEscapeSequence","parseStringLiteral","fraction","parseFloat","codepoint4","codepoint6","codepoint","String","fromCodePoint","start","makeIndent","text","blank","localeRe","RegExp","Locale","locale","isWellFormed","language","region","toUpperCase","thisRange","otherRange","part","clearVariants","clearRegion","addLikelySubtags","newLocale","loc","likelySubtagsMin","regionMatchingLangs","getLikelySubtagsMin","ar","be","da","el","en","fa","ja","ko","pt","sr","sv","ta","uk","zh","negotiateLanguages","requestedLocales","availableLocales","strategy","defaultLocale","supportedLocales","Set","availableLocalesMap","outer","reqLocStr","reqLocStrLC","requestedLocale","from","availableLocale","filterMatches","BUNDLED_TEXTS","bundles","files","filename","tryText","navigator","languages","textAsParagraphs","line","innerText","shortcutModifier","userAgent","ruffleShadowTemplate","content","class","preserveAspectRatio","viewBox","width","height","gradientUnits","x1","y1","x2","y2","spreadMethod","offset","fill","stroke","x","y","autocomplete","autocorrect","autocapitalize","cx","cy","for","title","max","step","FLASH_MIMETYPE","FUTURESPLASH_MIMETYPE","FLASH7_AND_8_MIMETYPE","FLASH_MOVIE_MIMETYPE","isSwf","mimeType","isSwfExtension","pathname","URL","_err","extension","isSwfFilename","allowExtraMimes","isSwfMimeType","currentScriptURL","isExtension","currentScript","endsWith","protocol","_e","RUFFLE_ORIGIN","LoadSwfError","swfUrl","InvalidSwfError","LoadRuffleWasmError","cause","InvalidOptionsError","isBuildOutdated","monthsPrior","setMonth","getMonth","CommonActions","OpenDemo","label","DownloadDesktop","UpdateRuffle","CreateReport","ShowDetails","createReportOrUpdate","openWiki","page","showPanicScreen","container","errorArray","errorText","actions","origin","outdated","createPanicError","panicBody","showDetails","classList","replaceChildren","readOnly","textContent","ref","action","onClick","issueLink","encodeURIComponent","issueBody","stackIndex","avmStackIndex","createPanicAction","bulkMemory","async","WebAssembly","validate","Uint8Array","referenceTypes","saturatedFloatToInt","signExtensions","simd","isNativeFunction","val","setPolyfillsOnLoad","Prototype","callback","len","Reflect","ownKeys","getOwnPropertyNames","getOwnPropertySymbols","nativeConstructors","createRuffleBuilder","progressCallback","extensionsSupported","every","Boolean","log","internalSourceApi","onFirstLoad","default","RuffleInstanceBuilder","ZipWriter","response","wasmUrl","wasmResponse","fetch","readableStreamProperlyDefined","ReadableStreamDefaultController","contentLength","headers","bytesLoaded","bytesTotal","Response","ReadableStream","controller","reader","getReader","read","byteLength","enqueue","close","fetchRuffle","constructors","privateRegistry","registerElement","elementName","elementClass","registration","tries","externalName","internalName","isExplicit","configureBuilder","builder","setAllowScriptAccess","setBackgroundColor","color","digit","isNaN","parseColor","setUpgradeToHttps","setCompatibilityRules","setLetterbox","setBaseUrl","setShowMenu","setAllowFullscreen","setStageAlign","setForceAlign","setQuality","orientation","setScale","setForceScale","setFrameRate","setWmode","setLogLevel","setMaxExecutionDuration","secs","parseDuration","setPlayerVersion","setPreferredRenderer","setOpenUrlMode","setAllowNetworking","setCredentialAllowList","setPlayerRuntime","proxy","addSocketProxy","host","port","proxyUrl","DIMENSION_REGEX","isAudioContextUnmuted","sanitizeParameters","URLSearchParams","output","Point","distanceTo","dx","dy","sqrt","InnerPlayer","debugPlayerInfo","onCallbackAvailable","contextMenuForceDisabled","isTouch","contextMenuSupported","_suppressContextMenu","panicked","rendererDebugInfo","longPressTimer","pointerDownPosition","pointerMoveMaxDistance","shadow","attachShadow","mode","delegatesFocus","cloneNode","dynamicStyles","getElementById","playButton","play","virtualKeyboard","virtualKeyboardInput","saveManager","videoModal","hardwareAccelerationModal","volumeControls","clipboardModal","addModalJavaScript","volumeSettings","addVolumeControlsJavaScript","backupSaves","querySelector","unmuteSvg","contextMenuOverlay","contextMenuElement","preserveMenu","preventDefault","stopPropagation","documentElement","checkIfTouch","showContextMenu","pointerDown","checkLongPressMovement","checkLongPress","clearLongPressTimer","fullScreenChange","instance","newZipWriter","onFSCommand","_readyState","ReadyState","HaveNothing","metadata","lastActivePlayingState","setupPauseOnTabHidden","modalElement","videoHolder","hideModal","modalArea","closeModal","volumeControlsModal","volumeMuteCheckbox","volumeMuteIcon","volumeIcons","volumeSlider","volumeSliderText","setVolumeIcon","isMuted","display","icon","iconIndex","round","volume","checked","disabled","valueAsNumber","set_volume","get_volume","hidden","is_playing","pause","updateStyles","sheet","cssRules","deleteRule","widthAttr","getNamedItem","htmlDimensionToCssDimension","insertRule","heightAttr","isUnusedFallbackObject","lookupElement","parent","nodeName","ensureFreshInstance","destroy","loadedConfig","showSplashScreen","zipWriterClass","onRuffleDownloadProgress","catch","panic","setVolume","addFont","arrayBuffer","names","setDefaultFont","build","renderer_debug_info","openHardwareAccelerationModal","once","actuallyUsedRendererName","renderer_name","is_wasm_simd_used","audioState","visibility","unmuteAudioContext","Off","Hidden","unmuteOverlayClicked","audioContext","audio_context","onstatechange","state","loadBar","outerLoadbar","Number","checkOptions","check","condition","reload","load","isPolyfillElement","isConnected","isFallbackElement","parseAllowScriptAccess","RufflePlayer","Transparent","stream_from","load_data","swfFileName","isPlaying","fullscreenEnabled","webkitFullscreenEnabled","isFullscreen","fullscreenElement","webkitFullscreenElement","setFullscreen","isFull","enterFullscreen","exitFullscreen","navigationUI","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","webkitExitFullscreen","webkitCancelFullScreen","set_fullscreen","saveFile","blob","blobURL","createObjectURL","link","download","click","revokeObjectURL","pointerType","base64ToArray","bytesBase64","byteString","atob","ia","charCodeAt","base64ToBlob","mimeString","ab","Blob","isB64SOL","solData","confirmReloadSave","solKey","b64SolData","localStorage","confirm","swfPath","swfHost","hostname","savePath","setItem","removeItem","populateSaves","replaceSOL","fileInput","FileReader","b64Regex","readAsDataURL","checkSaves","solName","pop","getItem","deleteSave","saveTable","row","keyCol","downloadCol","downloadSpan","className","replaceCol","replaceInput","accept","replaceLabel","htmlFor","deleteCol","deleteSpan","zip","duplicateNames","array","duplicate","addFile","save","remove","openSaveManager","openVolumeControls","downloadSwf","ok","pathName","lastIndexOf","input","string","eventType","dispatchEvent","KeyboardEvent","bubbles","openVirtualKeyboard","has_focus","focus","preventScroll","closeVirtualKeyboard","isVirtualKeyboardFocused","activeElement","contextMenuItems","CHECKMARK","fromCharCode","items","addSeparator","prepare_context_menu","item","separatorBefore","caption","run_context_menu_callback","enabled","clipboard","isSecureContext","writeText","getPanicData","flavor","open","pageX","pageY","startLongPressTimer","currentPosition","distance","suppressContextMenu","querySelectorAll","hideContextMenu","RightClickOnly","firstChild","menuItem","itemAction","playerRect","getBoundingClientRect","contextMenuRect","overflowX","clientX","clientWidth","overflowY","clientY","clientHeight","clear_custom_menu_items","resume","maxTouchPoints","audio","Audio","ArrayBuffer","dataView","DataView","sampleRate","setUint32","setUint16","btoa","then","out","callExternalInterface","call_exposed_callback","getObjectId","traceObserver","observer","set_trace_observer","platform","hideSplashScreen","originalError","addOpenInNewTabMessage","assign","stack","avmStack","searchParams","div","innerDiv","buttonDiv","onclick","prepend","displayRootMovieDownloadFailedMessage","invalidSwf","displayMessage","messageDiv","messageP","continueButton","displayUnsupportedVideo","video","controls","displayClipboardModal","accessDenied","description","setMetadata","Loaded","CustomEvent","LOADED_METADATA","LOADED_DATA","getPolyfillOptions","getOptionString","parseBoolean","isYoutubeFlashSource","workaroundYoutubeMixedContent","parentElement","tagName","access","_RufflePlayerElement_inner","__classPrivateFieldGet","receiver","kind","__classPrivateFieldSet","RufflePlayerElement","HTMLElement","connectedCallback","observedAttributes","attributeChangedCallback","_oldValue","_newValue","disconnectedCallback","PercentLoaded","copyElement","destination","specified","node","WeakMap","RuffleEmbedElement","optionName","srcval","createAttribute","setNamedItem","removeNamedItem","oldValue","newValue","isInterdictable","fromNativeEmbedElement","ruffleObj","widthVal","typeVal","paramsOf","param","HTMLParamElement","RuffleObjectElement","arguments","attributeCheckOptions","defaultValue","findCaseInsensitive","movieElem","movieSrc","classid","fromNativeObjectElement","embedElem","objectElem","RuffleMimeTypeArray","mimeTypes","__mimeTypes","__namedMimeTypes","install","wrapper","RuffleMimeType","namedItem","iterator","__mimeType","suffixes","enabledPlugin","RufflePluginArray","plugins","__plugins","__namedPlugins","plugin","refresh","FLASH_PLUGIN","globalConfig","jsScriptUrl","path","objects","iframes","polyfillFlashInstances","ruffleObject","replaceWith","ruffleEmbed","polyfillFrames","dataset","elementWindow","contentWindow","errorMessage","injectRuffle","elementDocument","pluginPolyfill","installPlugin","MutationObserver","mutationsList","mutation","addedNodes","observe","childList","subtree","createPlayer","sourceName","publicAPI"],"sourceRoot":""} |